一、概述
(1)MongoDB复制是将数据同步在多个服务器的过程。
(2)复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
(3)复制还允许您从硬件故障和服务中断中恢复数据。
注意:MongoDB Atlas上托管的所有数据库都配置为副本集。Atlas可以轻松添加和删除首选云提供商的任何区域中的副本集成员;副本集提供冗余和高可用性,是所有生产部署的基础。
1、冗余和数据可用性
复制提供冗余并提高数据可用性。通过在不同数据库服务器上提供多个数据副本,复制可提供一定程度的容错能力,以防止丢失单个数据库服务器。
在某些情况下,复制可以提供增加的读取容量,因为客户端可以将读取操作发送到不同的服 在不同数据中心维护数据副本可以增加分布式应用程序的数据位置和可用性。您还可以为专用目的维护其他副本,例如灾难恢复,报告或备份。
2、MongoDB复制原理
(1)mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
(2)mongodb各个节点常见的搭配方式为:一主一从、一主多从。
(3)主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下所示:
以上结构图中,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。
副本集特征:
(1)N 个节点的集群
(2)任何节点可作为主节点
(3)所有写入操作都在主节点上
(4)自动故障转移
(5)自动恢复
3、副本集成员
(1)primary:主服务器是副本集中唯一接收写入操作的成员。MongoDB在主服务器上应用写操作,然后在主服务器的oplog上记录操作。辅助成员复制此日志并将操作应用于其数据集。
(2)secondary:辅助节点从主节点复制操作以维护相同的数据集。辅助节点可能具有特殊使用配置文件的其他配置。例如:辅助可以是非投票或 优先级0。
1)优先级0副本集成员
不能成为主要的和不能触发 选举。除此之外,具有 正常辅助功能的辅助设备:它们维护数据集的副本,接受读取操作,并在选举中投票。
2)隐藏副本集成员
隐藏成员维护主 数据集的副本,但对客户端应用程序不可见。隐藏成员适用于具有与副本集中其他成员不同的使用模式的工作负载。隐藏成员必须始终 优先为0成员,因此不能成为主要成员。该db.isMaster()方法不显示隐藏的成员。然而,隐藏的成员可能会在 选举中投票。
备注:在分片群集中,mongos不要与隐藏成员交互。
3)延迟副本集成员
延迟成员包含副本集数据集的副本。但是,延迟成员的数据集反映了该集合的早期或延迟状态。
注意事项:
要求:
必须是 优先级为0的 成员。将优先级设置为0以防止延迟成员成为主要成员。
应该是 隐藏的 成员。始终阻止应用程序查看和查询延迟的成员。
做到在投票选举为primary,若members[n].votes设置为1。
行为:
延迟成员在延迟时从源oplog复制和应用操作。在选择延迟量时,请考虑延迟量:
必须等于或大于预期的维护窗口持续时间。
必须小于 oplog的容量。
(3)arbiter:仲裁器不具有数据集的副本,并不能成为主要的。副本集可能有仲裁者在主要选举中添加投票 。仲裁者 总是拥有恰当的1选举投票,因此允许副本集具有不均匀的投票成员数,而不会产生复制数据的额外成员的开销。
补充:
副本集的最小建议配置是三个成员副本集,其中包含三个数据承载成员:一个主成员和两个辅助成员。您也可以部署具有两个数据承载成员的三成员副本集:主要成员,辅助成员 和仲裁者,但具有至少三个数据承载成员的副本集提供更好的冗余。
副本集最多可包含50个成员,但只有7个投票成员。
二、mongodb集群(副本集模式)
1、数据库环境
2、暂时关闭防火墙和seliunx,测试完毕再开启安全规则
3、下载mongdb包
官方地址:https://www.mongodb.com/download-center/v2/community
4、上传包解压并创建目录
(1)解压
# tar -zxvf mongodb-linux-x86_64-rhel70-4.0.3.tgz
# mv mongodb-linux-x86_64-rhel70-4.0.3 mongodb
同样的,在node01和node02上也解压并改名(略)
(2)创建目录
[root@SQL_jiangjj ~]# mkdir -p /home/mongodb/primary
[root@SQL_jiangjj ~]# mkdir -p /etc/mongodb/
[root@node01 ~]# mkdir -p /home/mongodb/secondary/
[root@node01 ~]# mkdir -p /etc/mongodb/
[root@node02 ~]# mkdir -p /home/mongodb/arbiter/
[root@node02 ~]# mkdir -p /etc/mongodb/
5、新建配置文件
参数详细说明:https://my.oschina.net/pwd/blog/399374
(1)主配置文件
# vim /etc/mongodb/primary.conf
#PRIMARY.CONF
dbpath=/home/mongodb/primary
logpath=/home/mongodb/primary.log
pidfilepath=/home/mongodb/primary.pid
#keyFile=/home/mongodb/mongodb.key //节点间用户验证文件,内容必须一致,权限600,仅副本集模式有效
directoryperdb=true //数据库是否分目录存放
logappend=true //日志追加方式存放
replSet=google //Replica set的名字
bind_ip=192.168.56.147
port=27017
#auth=true
oplogSize=100 //设置oplog的大小,单位MB
fork=true //启动到后台,守护进程方式启动
noprealloc=true
#maxConns=4000
(2)备节点
[root@node01 ~]# cat /etc/mongodb/secondary.conf
(3)仲裁节点
6、启动服务
# ./mongodb/bin/mongod -f /etc/mongodb/primary.conf
[root@node01 ~]# ./mongodb/bin/mongod -f /etc/mongodb/secondary.conf
[root@node02 ~]# ./mongodb/bin/mongod -f /etc/mongodb/arbiter.conf
7、将节点配置组成集群
在任意节点启动配置,这里使用SQL_jiangjj节点
登录数据库
[root@SQL_jiangjj ~]# ./mongodb/bin/mongo 192.168.56.147:27017
> use admin
> cfg={ _id:"google",members:[{_id:0,host:'192.168.56.147:27017',priority:2},{_id:1,host:'192.168.56.242:27017',priority:1},{_id:2,host:'192.168.56.245:27017',arbiterOnly:true}] };
#配置生效命令
> rs.initiate(cfg)
说明:
(1)cfg名字可选,只要跟mongodb参数不冲突,_id为Replica Set名字,members里面的优先级priority值高的为主节点;
(2)对于仲裁点一定要加上arbiterOnly:true,否则主备模式不生效。
# 查看是否生效:> rs.status()
下面会显示字样:"ok" : 1
8、测试
(1)新建库
> use jiangjj
(2)插入文档
> db.jiangjj.insert({"name":"jiangjj"},{"titile":"标题行"},{"content":"副本集测试"})
查看两个节点数据
备注:重启系统后服务不会自启,如需请自行配置开启自启即可
三、副本集用户验证设置
1、创建验证秘钥文件
keyFile文件的作用: 集群之间的安全认证,增加安全认证机制KeyFile(开启keyfile认证就默认开启了auth认证了,为了保证后面可以登录,我已创建了用户)
# touch .keyFile
# chmod 600 .keyFile
# openssl rand -base64 102 > .keyFile
102:是文件大小
注意:创建keyFile前,需要先停掉副本集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。
2、在主副本上添加两个用户
user01:PRIMARY> use admin
user01:PRIMARY> use jiangjj
3、更新所有节点配置文件
keyFile=/home/data/.keyFile
auth=true
4、启动副本集,测试
登录验证
root用户
查看数据
验证jiangjj用户
权限配置详细请参考官方文档