mongodb副本集搭建注意事项说明

本文利用配置文件的方式启动mongodb,mongodb创建副本集的启动配置文件mongod.conf示例如下:

systemLog:
  destination: file
  path: /usr/local/mongodb/log/mongod.log
  logAppend: true
storage:
  dbPath: /usr/local/mongodb/data/db
  journal:
    enabled: true
processManagement:
  fork: true
net:
  bindIp: localhost,192.168.0.200
  port: 27017
replication:
  replSetName: myrs

这里配置文件中需要注意的有两个地方:
1、bindIp这里最好通过ifconfig查看主机的可供外部网络访问的ip地址,然后将这个ip地址明确指定进行绑定,这里的ip地址是192.168.0.200。这样做的好处是在副本集初始化的时候默认的成员host就会配置为明确的"192.168.0.200:27017",减少可能出现的网络访问的问题。

2、相比单mongodb服务,这里多了个replSetName副本集名称,我们需要在副本集所有成员的启动配置文件中都统一配置这个副本集名称。

然后在所有副本集成员节点启动完成后,我们的副本集任然是不可用的,一定还需要做一个初始化副本集的操作:
操作方式为连接上任意一个成员节点,然后执行 rs.initiate() 即可。

执行

rs.initiate()

返回示例如下:

> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",
        "me" : "192.168.0.200:27017",
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1582734524, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1582734524, 1)
}
myrs:SECONDARY>
myrs:PRIMARY>

初始化完成后还需要添加从成员节点,将其它从成员节点加入到副本集:
示例:

rs.add("192.168.0.201:27017")

返回如下:

myrs:PRIMARY> rs.add("192.168.0.201:27017")
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1582737996, 2),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1582737996, 2)
}

最后最好拿一台成员部署为仲裁节点,这样可以防止主节点挂掉后,mongodb依据自身的主节点选举规则重新自动产生新的主节点,防止副本集的不可用。
示例:

rs.addArb("192.168.0.202:27017")

返回如下:

myrs:PRIMARY> rs.addArb("192.168.0.202:27017")
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1582738332, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1582738332, 1)
}

这样一个完整的mongodb副本集的搭建便没有什么大问题了。

最后再啰嗦一下,我们知道从节点是不可以写入数据的,只可以读,但是默认情况下读也是不可用的:
例如会产生如下错误提示:

myrs:SECONDARY> show dbs
2020-02-28T17:03:40.675+0800 E  QUERY    [js] uncaught exception: Error: listDatabases failed:{
        "operationTime" : Timestamp(1582880613, 1),
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1582880613, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:135:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:87:12
shellHelper.show@src/mongo/shell/utils.js:906:13
shellHelper@src/mongo/shell/utils.js:790:15
@(shellhelp2):1:1
myrs:SECONDARY>

需要在从节点进行如下命令操作才可以读:

rs.slaveOk()

注意这个命令是没有任何返回的,不要以为没有执行成功。执行完以后就可以正常操作读取数据了。

你可能感兴趣的:(mongodb)