MongoDB做集群,版本3.2官网推荐的集群方式Replica Set
准备服务器3台
两个standard节点(这两个节点直接可以互切primary secondary)。
一个arbiter节点,它手中握着一张选票,决定上面两个standard节点中的哪一个可以成为primay。
机器名称和预承担的角色如下:
test39 primary
test41 secondary
test42 arbiter
介绍一下涉及到的参数
--dbpath 数据文件路径
--logpath 日志文件路径
--port 端口号,默认是27017.我这里使用的也是这个端口号.
--replSet 复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test.
--replSet test/ 这个后面跟的是其他standard节点的ip和端口
--maxConns 最大连接数
--fork 后台运行
--logappend 日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。
操作流程:
1. 三台服务上分别启动mongo实例
bin/mongod --port 27017 --dbpath /home/baoshan/cluster/mongodb/data/mongodb --replSet baoshan
2. 添加replica sets配置,随意登录一台mongo实例
>use admin;
>cfg={_id:"baoshan", members:[ {_id:0,host:'test39:27017',priority:2}, {_id:1,host:'test41:27017',priority:1},{_id:2,host:'test42:27017',arbiterOnly:true}] };
>rs.initiate(cfg);
3. 验证是否成功
rs.status()通过这个命令,可以查看各个节点的ip、角色已经是否正常
rs.stepDown()这个命令可以强制primary和standard节点角色互换,从而验证是否能够实现failover功能。
或者primary上执行 use admin;db.shutdownServer();断掉primary看效果。
rs.isMaster()显示当前谁是primary
MongoDB replica sets中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。
遇到的问题及解决办法:
baoshan:SECONDARY> show dbs;
2017-04-28T21:43:46.801+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:760:19
shellHelper@src/mongo/shell/utils.js:650:15
@(shellhelp2):1:1
baoshan:SECONDARY> rs.slaveOk()
baoshan:SECONDARY> show dbs;
admin 0.000GB
local 0.567GB
metadata 0.001GB
service 2.547GB
test 0.094GB
如果原来主库中有数据,在刚搭建完成集群后,secondary库的rs.status()会显示STARTUP2状态:
mongodb replica set 集群,初始化的时候,一般都是copy不同的数据至各个结点,之后启动结点,添加至集群,之后查询状态会发现是 STARTUP2,这是因为集群初始化在同步数据,同步完数据之后,状态就变正常了!
附各状态:
- 1. STARTUP:刚加入到复制集中,配置还未加载
- 2. STARTUP2:配置已加载完,初始化状态
- 3. RECOVERING:正在恢复,不适用读
- 4. ARBITER: 仲裁者
- 5. DOWN:节点不可到达
- 6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂
- 7. REMOVED:移除复制集
- 8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
- 9. FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
- 10. PRIMARY:主节点
- 11. SECONDARY:备份节点
重新设置replica set时,使用force,强制执行
rs.initiate(ctf)
{
"info" : "try querying local.system.replset to see current configuration",
"ok" : ,
"errmsg" : "already initialized",
"code" :
}
rs.reconfig(ctf)
{
"ok" : ,
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",
"code" :
}
rs.reconfig(ctf, force: true)
--23T16::40.837+ E QUERY SyntaxError: Unexpected token :
rs.reconfig({ctf, force: true})
--23T16::48.546+ E QUERY SyntaxError: Unexpected token ,
rs.reconfig(ctf, { force: true})
{ "ok" : }
重要参考官方文档:https://docs.mongodb.com/manual/
参考文档:
Mongodb集群搭建的三种方式:http://blog.csdn.net/luonanqin/article/details/8497860
replica sets配置与搭建:http://blog.chinaunix.net/uid-23284114-id-2977686.html
重新设置repliceset:http://www.jianshu.com/p/c9609ce8a558