MongoDB 分片:无法刷新平衡器设置

问题描述

我想向我的 mongodb 集群添加一个远程分片,但它不起作用。

这是我的 docker-compose.yml 文件

server1.example.com

    int data_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

server2.example.com

version: '3.7'
networks:
  mongo-net:
    name: mongo-net
services:
  mongoset2:
    container_name: mongoset2
    image: mongo
    entrypoint: ["/usr/bin/mongod","--shardsvr","--keyFile","/data/file.key","--replSet","rs","--journal","--bind_ip_all","--port","27017","--dbpath","/data/db"]
    ports:
    - "27018:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/set2:/data/db"

  mongoset1:
    container_name: mongoset1
    image: mongo
    entrypoint: ["/usr/bin/mongod","/data/db"]
    ports:
    - "27019:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/set1:/data/db"

  mongoset0:
    container_name: mongoset0
    image: mongo
    command: bash -c "/usr/bin/mongod --shardsvr --keyFile /data/file.key --replSet rs --journal --bind_ip_all --port 27017 --dbpath /data/db" 
    ports:
    - "27017:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/setup.sh:/scripts/setup.sh"
    - "./scripts/file.key:/data/file.key"
    - "./dump:/dump"
    - "./volumes/set0:/data/db"

  configset2:
    container_name: configset2
    image: mongo
    entrypoint: [ "/usr/bin/mongod","--configsvr","configrs","/data/db" ]
    ports:
    - "27022:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/config2:/data/db"

  configset1:
    container_name: configset1
    image: mongo
    entrypoint: [ "/usr/bin/mongod","/data/db" ]
    ports:
    - "27021:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/config1:/data/db"

  configset0:
    container_name: configset0
    image: mongo
    command: bash -c "/usr/bin/mongod --configsvr --keyFile /data/file.key --replSet configrs --bind_ip_all --port 27017 --dbpath /data/db" 
    ports:
    - "27020:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/configsetup.sh:/scripts/setup.sh"
    - "./scripts/file.key:/data/file.key"
    - "./dump:/dump"
    - "./volumes/config0:/data/db"
  
  routerset:
    container_name: routerset
    image: mongo
    command: bash -c "/usr/bin/mongos --keyFile /data/file.key --configdb configrs/server1.example.com:27020,server1.example.com:27021,server1.example.com:27022 --bind_ip_all --port 40000" 
    ports:
    - "40000:40000"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/setup.sh:/scripts/setup.sh"
    - "./scripts/file.key:/data/file.key"
    - "./dump:/dump"
    - "./volumes/set0:/data/db"

两台服务器上的所有密钥文件都相同。

在 server1.example.com 上,我有一个名为“rs”的副本集在端口 27017-27019 上运行,一个名为“configrs”的配置副本集在端口 27020-27022 上运行。

在 server2.example.com 上,我有一个名为“rs1”的副本集在端口 27017-27019 上运行。 Mongos 能够连接到两台服务器上的配置。

我还可以从两台服务器连接到各个 mongod 实例。在 server1.example.com 上,我可以添加任何托管在 server1 上的分片,没有任何问题。但是,如果我尝试添加托管在 server2.example.com 上的分片,则会出现此错误

version: '3.7'
networks:
  mongo-net:
    name: mongo-net
services:
  mongoset2:
    container_name: mongoset2
    image: mongo
    entrypoint: [ "/usr/bin/mongod","rs1","27017" ]
    ports:
    - "27018:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/set2:/data/db"

  mongoset1:
    container_name: mongoset1
    image: mongo
    entrypoint: [ "/usr/bin/mongod","27017" ]
    ports:
    - "27019:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/file.key:/data/file.key"
    - "./volumes/set1:/data/db"

  mongoset0:
    container_name: mongoset0
    image: mongo
    command: bash -c "/usr/bin/mongod --keyFile /data/file.key --replSet rs1 --shardsvr --bind_ip_all --port 27017" 
    ports:
    - "27017:27017"
    restart: always
    networks:
      - mongo-net
    volumes:
    - "./scripts/setup.sh:/scripts/setup.sh"
    - "./scripts/file.key:/data/file.key"
    - "./dump:/dump"
    - "./volumes/set0:/data/db"

我初始化了所有的副本集,并且每个副本集都选择了一个主副本。所有副本集的辅助节点都运行良好。

我用来初始化副本集的示例:(它与 server1.example.com 和配置服务器相同,除了“host”字段更改为 server1 并且“_id”为“rs”或“configrs” )

{
        "ok" : 0,"errmsg" : "Failed to refresh the balancer settings :: caused by :: Could not find host matching read preference { mode: \"nearest\" } for set configrs","code" : 133,"codeName" : "FailedToSatisfyReadPreference","operationTime" : Timestamp(1611315488,1),"$clusterTime" : {
                "clusterTime" : Timestamp(1611315489,"signature" : {
                        "hash" : BinData(0,"+c2FEjazBmDu29xu7uUEBPHNv9U="),"keyId" : NumberLong("6920547010965667861")
                }
        }
}

这是我用来添加远程分片的命令:

var cfg = {
        "_id": "rs1","version": 1,"members": [
            {
                "_id": 0,"host": "server2.example.com:27017","priority": 2
            },{
                "_id": 1,"host": "server2.example.com:27018","priority": 1
            },{
                "_id": 2,"host": "server2.example.com:27019","priority": 1
            }
        ]
    };
    rs.initiate(cfg,{ force: true });

请帮我解决这个问题我已经被困了太久了

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)