部署副本集
这篇文章介绍如何搭建副本集群,帮助我们熟悉mongodb的副本集的搭建过程,能够在以后的工作中快速的搭建。
环境准备
在我测试的环境中,主要使用虚拟机来搭建多实例,具体环境如下:
- mongodb 4.4.18
- 三台虚拟机
- 192.168.56.101 (fedora)
- 192.168.56.102(centos)
- 192.168.56.103(centos)
mongodb安装
mongodb的安装,可以使用压缩包或者通过rpm的方式安装,我这里主要介绍压缩包的状态方式
1.从官网下载tgz的压缩包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.18.tgz
2.解压压缩包
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.18.tgz
3.进入到mongodb的解压目录, 并创建config配置文件
cd mongodb-linux-x86_64-rhel70-4.4.18 touch mognod.cnf
4.填充配置文件
vi mongod.cnf # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # Where and how to store data. storage: dbPath: /var/lib/mongo journal: enabled: true # engine: # wiredTiger: # how the process runs processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo # network interfaces net: port: 27017 # bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting. bindIpAll: true #security: #operationProfiling: #replication: #sharding: ## Enterprise-Only Options #auditLog: #snmp:
5. 启动Mongod实例
./bin/mongod -f mongod.cnf
搭建副本集群
以上配置在每个虚拟机上的配置基本保持一致,在三台机器上启动mongod实例完成后,就可以开始组件副本集群。
1.为每个实例配置副本集名称
replication: replSetName: "rs0"
该配置是放在mongod.cnf的配置文件中,这里需要注意,当处于同一个集群中的实例需要保持一致的名称。否则会报错。
在不同的副本集群中,最好设置不同的名称,否则在应用使用的时候也会出现错误。
2.重启mongod实例
./bin/mongod -f mongod.cnf
3. 初始化副本集群
./bin/mongo rs.initiate({ "_id": "rs0", "members": [ { "_id": 0, "host": "192.168.56.101:27017" }, { "_id": 1, "host": "192.168.56.102:27017" }, { "_id": 2, "host": "192.168.56.103:27017" } ] })
通过这种方式,就初始化完成了副本集群。这个时候可以通过rs.status()
以及 rs.conf()
命令的方式查看初始化情况。
当然,也可以通过命令行的方式启动Mongod的实例,例如:
mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --oplogSize 128
向集群中加入仲裁者
仲裁者其实也是一个Mongod的实例,只是并不会存储实际的数据和被选举成为primary, 只是参与投票。在加入仲裁者可以通过rs.addArb()
的方式向副本集群加入仲裁者信息。
还是以上面已经有的集群为例,在已有的集群上,通过命令行的方式加入仲裁者节点。
1.请动仲裁者节点
仲裁者节点的启动和一般节点的启动并没有区别,则可以通过创建仲裁者的数据存放目录/var/lib/mongodb/arb
,命令如下:
mkdir -p /var/lib/mongodb/arb ./bin/mongod --port 27018 --dbpath /var/lib/mongodb/arb --replSet rs0 --bind_ip 0.0.0.0
2.在节点启动完成后,将当前实例添加为仲裁者
rs.addArb("192.168.56.103:27018")
当配置没有问题时,此时在primary节点上执行以上命令,将返回添加成功的信息
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1668588199), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1668588199) }
- 我们也可以通过
rs.conf()
或者rs.status()
查看具体的情况
这里需要注意一点,通过手工的方式加入仲裁者节点时,如果节点配置有误,或者其他原因并不会报错,这时可以通过
rs.status()
查看错误新并加以改正
将独立运行的实例加入到集群
如果mongod实例最开始以独立的模式运行时,此时需要将该实例加入到集群中,主要有需要设置一下步骤:
- 为实例指定replSetName设置集群的名称可以通过命令行
--replSet
或者配置文件replication.replSetName
进行配置,并且需要和已有的集群名称保持一致。 - 通过
rs.add()
方法向集群中添加实例
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )
移除节点
当某些节点因为一些原因需要从副本集中移除时,主要有两种方式可以实现,
- 通过
rs.reconfig()
的方式重新配置副本集 - 通过
rs.remove()
的方式移除某个具体的节点,节点移除时需要指定域名和端口,例如rs.remove("192.168.56.102:27017")
问题列表
- 在集群初始化完成后,在secondary上执行查询出现
not master and slaveOk=false
的提示当初始化完成副本集之后,只能在primary上执行读写操作,所有的secondary是不支持读操作的,此时需要在每个secondary节点上执行:rs.secondaryOk()
通过以上命令,再次在secondary上执行查询操作,将不会报错。