首页 > 代码库 > MongoDB副本集
MongoDB副本集
一、副本集概念
什么是副本?可能第一印象想到的是游戏副本,游戏副本就是为了让每个玩家都有一个独立的游戏环境,这种环境的复制就是副本的一种体现。MongoDB也提供了对副本的支持,副本集中有多个副本保证数据库的容错性,即使一个副本挂掉了还是会存在很多副本;并且支持副本间的自动选举,切换,解决了上一篇博文讲到的主从复制的故障恢复得人工进行的问题。其实主从复制就是一个单副本,缺少扩展性,容错性。
二、副本集原理及图解
应用服务器,也就是客户端,连接到MongoDB的整个副本集,副本集中有一台主服务器负责整个副本集的读写,副本节点定期同步主节点的数据和oplog,以保证数据的一致性,一旦主节点宕机或挂掉,副本节点会通过心跳机制检测到,并根据事先副本集创建时设置的节点优先级进行主节点的重新选举,从而保证高可用。如此,客户端完全不必关心副本集的健康状况,MongoDB集群也可以长期保持高可用。
副本集提供了MongoDB集群故障的自动回复机制,扩展性高,容错性强,是MongoDB官方强烈推荐使用的集群解决方案。
三、副本集使用说明
以三个奇数节点为例,ip,端口,日志以及数据存放路径如下
节点1
地址:localhost:1001
日志存放路径:E:\replset\logs\node1\log1.txt
数据存放路径:E:\replset\db\node1
节点2
地址:localhost:1002
日志存放路径:E:\replset\logs\node2\log2.txt
数据存放路径:E:\replset\db\node2
节点3
地址:localhost:1003
日志存放路径:E:\replset\logs\node3\log3.txt
数据存放路径:E:\replset\db\node3
分别启动三个节点命令如下,其中必须制定master节点
启动节点1:
mongod --dbpath E:\replset\db\node1 --logpath E:\replset\logs\node1\log1.txt --logappend --port 1001 --replSet yukai/localhost:1002 --master
启动节点2:
mongod --dbpath E:\replset\db\node2 --logpath E:\replset\logs\node2\log2.txt --logappend --port 1002 --replSet yukai/localhost:1001
启动节点3:
mongod --dbpath E:\replset\db\node3 --logpath E:\replset\logs\node3\log3.txt --logappend --port 1003 --replSet yukai/localhost:1001,localhost:1002
启动节点命令解释
dbpath: 数据存放路径
logpath:日志存放路径
logappend : 日志拼接声明
replSet:声明是副本集,后面格式为 副本集名称/与之位于同一个副本集的节点地址(副本集要求至少要有两个节点,一个主,一个从)
master:声明该节点是主节点
初始化节点(只能初始化一次)
mongo localhost:1001/admin
db.runCommand({
"replSetInitiate":{
"_id":“yukai",
"members":[
{
"_id":1,
"host":"localhost:1001",
"priority":3},
{
"_id":2,
"host":"localhost:1002",
"priority":2},
{ "_id":3,
"host":"localhost:1003",
"priority":1}
]
}
});
初始化节点命令解释
db.runCommand:执行数据库指令函数
replSetInitiate:节点初始化信息,json
_id:副本集名称,与启动节点中的名称保持一致
host:副本集成员地址
priority:优先级,即选举成为新master的优先级
验证
登录主节点,即优先级最高的master节点,输入是否主节点的命令:db.$cmd.findOne ( {ismaster: 1 } );
将该主节点关闭,登录优先级第二的从节点,输入是否主节点的命令:db.$cmd.findOne ( {ismaster: 1 } ); 发现在主节点宕机后,优先级较高的节点被选举为了master节点,继续负责读写的工作,从而持续地提供服务,保持集群高可用。
四、仲裁者节点及其作用
当集群中的节点数量为偶数个时,投票选举机制会根据数据最后操作,更新时间戳,优先级等来判定谁将成为master节点,如果出现以上条件都符合的情况,且票数相等,此投票环节需要等待若干分钟,这对于客户端来说是无法接受的。
仲裁节点的出现打破了这个僵局,仲裁节点并不需要太多系统资源,也并不持有数据本身,而是参与投票并有效协调从节点争master的撕逼。
集群中部署多仲裁节点时,需在初始化副本集时,添加属性arbiterOnly:true。
MongoDB副本集