MongoDB数据库——MongoDB复制集
MongoDB复制集
什么是MongoDB复制集?
复制集是由一组拥有相同数据集的mongodb实例所组成的集群,在多台服务器之间同步数据,(差不多跟MySQL的主从复制一个概念)
复制集的优点:1.数据安全性更高,灾难恢复
2.数据可用性大,无需停机维护(比如备份、索引重建、故障转移)
3.读缩放(额外的副本读取),副本集对应用程序是透明的
复制集的工作原理(如下图所示)
MongoDB的复制集由多个节点构成(至少两个节点),其中一个是主节点,负责处理客户端的请求,其余的都是从节点,负责复制主节点上的数据
MongoDB一般由一主一从或者一主多从的方式搭配,主节点记录所有操作到oplog上,从节点再定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,保证和主节点的数据保持一致
复制集的选举原理
节点类型分为三种:
标准节点(host):存储数据,可能被选为活跃(primary)节点,有选举权
被动节点(passive):被动节点有完整副本,不可能成为活跃节点,有选举权
仲裁节点(arbiter):负责选举,不存储数据,不能充当主从节点
选举的规则:
1.只有标准节点才会被选举为活跃节点(passive),有选举权,被动节点有完整副本,但是不能被选举为活跃节点,有选举权,仲裁节点不会复制数据,不可能被选举成为活跃节点,只有选举权
2.标准节点和被动节点的区别:priority的值高的是标准节点,低的是被动节点
3.选举最后得票高的人获胜,priority的优先权为0~1000之间,相当于额外增加这么多票
配置搭建MongoDB复制集
1.下载安装完MongoDB后创建4个实例并启动(如下图所示)
2.编辑主配置文件
vim /usr/local/mongodb/bin/mongodb1.conf
注意:replSet这个参数的值后面会使用到
其他的配置文件修改一下port、dbpath、logpath参数即可
3.初始化配置复制集并登录
alias mongo="/usr/local/mongodb/bin/mongo"》mongo
> cfg={"_id":"wmz","members":[{"_id":0,"host":"192.168.0.102:27017"},{"_id":1,"host":"192.168.0.102:27018"},
{"_id":2,"host":"192.168.0.102:27019"}]}
补充:可以在配置的时候设置节点,比如
> cfg={"_id":"wmz","members":[{"_id":0,"host":"192.168.0.102:27017","priority":100},{"_id":1,"host":"192.168.0.102:27018","priority":100},
{"_id":2,"host":"192.168.0.102:27019","priority":0},{"_id":2,"host":"192.168.0.102:27019","arbiterOnly":true}]}
重新设置复制集:> rs.reconfig()
查看复制集的选举状态:> rs.isMaster()
4.查看复制集状态信息:> rs.status()
PRIMARY的状态:
两个SECONDARY的状态
注意:health为1代表健康,0代表宕机,state为1代表主节点,为2代表从节点
5.手动添加节点:> rs.add()
添加成功如下图:
删除节点:> rs.remove()
删除成功如下图:
5.测试故障自动转移
停止mongodb1的运行
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
确定27017端口的主节点停止
登录27018端口登录进入MongoDB数据库查看状态
mongo --port 27018
发现192.168.0.102:27018变成了主节点PRIMARY则说明成功
模拟故障还可以使用下面的命令
rs.freeze(30) //暂停30s不参与选举
rs.stepDown(60,30) //告诉主节点交出主节点位置,维持从节点状态不少于60秒,等待30秒使主节点和从节点日志同步
从节点默认无法读取数据:> rs.slaveOK()
复制集的管理
手动添加删除节点服务器
> rs.add()和> rs.remove()
查看复制状态信息
> rs.printReolicationInfo()
> rs.printSlaveReplicationInfo()
oplog日志
查看日志状态信息:> db.oplog.rs.stats()
更改oplog的大小:> db.runCommand()
复制集认证
认证方式:
通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权限认证来保证复制集的
单点认证
vim /usr/local/mongodb/bin/mongodb1.conf
auth=true
keyFile认证
1.修改配置文件:vim /usr/local/mongodb/bin/mongodb1.conf
clusterAuthMode=keyFile
keyFile=/usr/local/mongodb/.keyFile
2.创建kgcrskey文件加入内容
touch /usr/local/mongodb/.keyFile
3.配置keyFile文件再给权限
文件中的具体内容其实就是一行字符串,但复制集对keyFile文件有所要求
内容:以base64编码集中中的字符进行编写,即字符串只能包含a-z、A-Z、+、/
长度不能超过1000字节
权限最多到600 ,权限至少 chmod 600 keyFile
openssl rand -base64 102 > /usr/local/mongodb/.keyFile
chmod 600 /usr/local/mongodb/.keyFile
注意:每个节点都要进行该操作