Rumah > Artikel > pangkalan data > mongodb复制集的搭建
副本集是一组,由N个mongo节点组成并协同工作的,提供自动的故障集群转移。 通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,其中有一个主服务器(primary),用户处理客户端请求,还有多个备份服务器(secondary),
副本集是一组,由N个mongo节点组成并协同工作的,提供自动的故障集群转移。
通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,其中有一个主服务器(primary),用户处理客户端请求,还有多个备份服务器(secondary),用户保存主服务器的数据副本。并且当主库奔溃时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。同时需要三台服务器或者数据库就可以满足。以上也是其的主要优势所在。
建立一个副本集需要步骤,1、需要启动每个节点,2、然后进行初始化设置。在这里,我们将配置一组(三个节点,可以使用两个数据节点一个仲裁节点),一般三个节点也是标准设置。一旦mongod节点启动,我们将发出一个命令,以正确地初始化设置。几秒钟后,将选举产生一个主节点,你就可以开始写和查询集。
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
具体搭建如下:
1.启动三个节点(两个数据节点,一个仲裁节点)
介绍一下涉及到的参数
--dbpath 数据文件路径
--logpath 日志文件路径
--port 端口号,默认是27017.我这里使用的也是这个端口号.
--replSet 复制集的名字,一个replicasets中的每个节点的这个参数都要用一个复制集名字
--replSet replcopy / 这个后面跟的是其他standard节点的ip和端口
--maxConns 最大连接数
--fork 后台运行
--logappend 日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。
1>启动第一个standard节点(ip:192.168.191.151)
/u01/mongo/bin/mongod--dbpath=/u01/mongodb/data/ --logpath=/u01/mongodb/logs/node1.log--oplogSize400 --maxConns=2000 --replSet replcopy/192.168.191.151:27017 --fork
2>启动第二个standard节点 (ip:192.168.191.150)
/u01/mongo/bin/mongod--dbpath=/u01/mongodb/data/ --logpath=/u01/mongodb/logs/node2.log --oplogSize 400--maxConns=2000 --replSet replcopy/192.168.191.150:27017 --fork
3>启动arbiter节点,也就是仲裁节点 (ip:192.168.191.150)。注意!--replSet replcopy/后面写的是两个standard节点的ip和端口
/u01/mongo/bin/mongod--dbpath=/u01/mongodb/arbiter/ --port 20000 --logpath=/u01/mongodb/logs/arbiter.log--replSet replcopy/192.168.191.150:27017,192.168.191.151:27017 --fork
2.很关键的一步,配置完上面,下面开始初始化各个节点。在第一个启动的节点上,运行mongo
cfg = { _id: "replcopy", members:[ { _id:0,host:"192.168.191.150:27017"}, { _id:1, host:"192.168.191.151:27017"} ]}
rs.initiate(cfg)
3.加入arbiter(仲裁)节点
1.PRIMARY>rs.addArb("192.16.191.150:2000");
到了这里,这个集群已经配置完成,三个节点的角色已经分配完毕,怎么查看是否正常呢
1.rs.status()通过这个命令,可以查看各个节点的ip、角色已经是否正常
2.rs.stepDown() 这个命令可以强制primary和standard节点角色互换,从而验证是否能够实现failover功能,在主节点上运行。
注意:添加新节点前,一定要配置好防火墙,开放对应的IP及PORT。
添加普通数据节点
PRIMARY>rs.add("ip:port")
删除节点
PRIMARY>rs.remove("ip:port")
显示当前谁是primay
PRIMARY> rs.isMaster()
注mongodb复制为什么要三台机器以上
首先介绍一下在replicaset里分为三种节点类型:
1>primary 负责client的读写。
2 >secondary作为热备节点,应用Primary的oplog读取的操作日志,和primary保持一致,不提供读写操作!
secondary有两种类型:
1)normal secondary 随时和Primay保持同步,
2)delayed secondary 延时指定时间和primary保持同步,防止误操作.
3 >arbiter.它不负责任何读写,只作为一个仲裁者,负责primary down的时候剩余节点的选举操作
为什么我们要添加一个仲裁节点,具体说明如下:
如果创建两节点的Replica Sets,一主一备secondary,如果Secondary宕机,Primary会变成Secondary!这时候集群里没有Primary了!为什么会出现这样的情况呢。
这是和MongoDB的Primary选举策略有关的,如果情况不是Secondary宕机,而是网络断开,那么两个节点都会选取自己为Primary,因为他们能连接上的只有自己这一个节点。而这样的情况在网络恢复后就需要处理复杂的一致性问题。而且断开的时间越长,时间越复杂。所以MongoDB选择的策略是如果集群中只有自己一个节点,那么不选取自己为Primary。
所以正确的做法应该是添加两个以上的节点,或者添加arbiter,当然最好也最方便的做法是添加arbiter,aribiter节点只参与选举,几乎不会有压力,所以你可以在各种闲置机器上启动arbiter节点,这不仅会避免上面说到的无法选举Primary的情况,更会让选取更快速的进行。因为如果是三台数据节点,一个节点宕机,另外两个节点很可能会各自选举自己为Primary,从而导致很长时间才能得出选举结果。实际上集群选举主库上由优先级和数据的新鲜度这两个条件决定的。
db.getMongo().setSlaveOk() 在slave上可以使备库可读,从而实现负载的转移。
程序连接字符串形式:
mongodb://localhost,localhost:27018,localhost:27019
连接到三台服务器组成的Replica Sets,把所有写操作集中在主库,读操作分布在各丛库