实验性的搭建一个集群做练手。
配置和环境:
win10(本机)和linux(CentOs7)内网服务器各一台。
Mongodb3.07
目标:Replica set 副本集结构,一个primary一个slave,实现读写分离的同步数据集群。
一、本机和内网服务器安装mongo
可参考我的另外两篇文章:
Mongodb在windows和linux平台的安装配置(http://fykknd.blog.51cto.com/3175618/1716343)
Mongodb权限管理(http://fykknd.blog.51cto.com/3175618/1716369)
二、集群配置
一切开始前,有个准备工作,当时配置集群时因为这个事儿耽误了很长时间,百度google都没结果,最后是问了一个运维的朋友才知道的。就是要先做一个key认证!!表示集群间的机器是互相可靠的。
具体操作可参考官网说明,在文章末尾有链接地址。
# openssl rand -base64 741 > /usr/local/mongodb/mongodb-keyfile # chmod 600 /usr/local/mongodb/mongodb-keyfile
这两步就是创建一个秘钥文件,用于集群的机器使用。生成文件后,把这个文件复制到每个成员的对应目录下,然后再启动mongo。
作为集群的一份子,启动时要加一个Repl Set参数,就像一个团队的名字一样,表示是这个团队的成员。先写出启动命令,然后进行说明。
# mongod --config /etc/mongo.conf --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/log.l --port=27017 --auth --fork --replSet rs0 --keyFile /usr/local/mongodb/mongodb-keyfile
这是命令行加参数方式启动,也可以把参数写在mongo.conf里。(我这3.07版本是解压直接用的,默认没有配置文件,需要自己创建一个:/etc/mongo.conf)配置文件的写法看官方文档的说明(在文章最后链接里),2.6以后的文件写法采用YAML方式。
参数说明:
--config 配置文件位置
--dbpath 数据存放位置
--logpath 日志存放位置
--port 端口(可不写)
--auth 以认证方式启动
--fork 后台运行
--replSet 副本集名称
--keyFile 秘钥文件位置
接下来配置集群config变量(记得先进行认证操作,否则没有权限配置集群,我使用root用户进行的):
> config={ _id : ‘dbset‘, members : [ { _id : 1, host : ‘192.168.0.46‘ }, { _id : 2, host : ‘192.168.0.207:27017‘ } ] }
写好config后,进行初始化:
> rs.initiate(config)
如果一切正常的话,可以用rs.status()查看目前集群的状态:
状态说明:
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:备份节点
添加或者删除节点(需要在主节点上进行):
添加 rs.addArb("192.168.0.207");
删除 rs.remove("192.168.0.207");
其实正常来说还应该有个仲裁节点,但目前服务器数量不够,所以尝试用另一个外网机器做了下仲裁节点,于是遇到了修改config的配置问题。网上给的答案基本删掉目前设置重新搞,其实有更简便的方法,强行修改config配置(例如上面我没有指定config中的priority参数,值是个整形。值越大越优先成为primary节点。前提是配置文件没有指定谁是主节点,并且启动参数里也没有--master参数)。例如新的config为:
> config={ _id : ‘dbset‘, members : [ { _id : 1, host :192.168.0.46, priority: 1 }, { _id : 2, host :192.168.0.207:27017, priority: 0 } ] }
此时rs.initiate(config)是无效的,需要执行:
> rs.reconfig(config);
那么到底怎么添加仲裁节点呢?很简单:在config里加一个节点,后面写上arbiterOnly:true即可。比如:{_id:3, host:"192.168.0.207:27018", arbiterOnly:true},然后再重新reconfig即可。然而我并没有成功,因为我是在207上启动了两个不同的端口模拟的,但并未成功。附件贴上错误信息,哪位大神指出下错误?感激不尽!
此外还可以查看集群配置:rs.conf();
注:本文主要参考来源
mongoDB3.0.3 以上GUI 连接认证问题
mongoDB 3.0 安全权限访问控制 http://blog.csdn.net/gsying1474/article/details/47813059
浅析MongoDB用户管理 http://www.jb51.net/article/53830.htm
mongo官网-key认证:https://docs.mongodb.org/manual/tutorial/enable-internal-authentication/
mongo官网-配置文件写法:https://docs.mongodb.org/manual/reference/configuration-options/
mongodb强制一个成员为主:http://www.361way.com/mongodb-forced-primary/1704.html
Mongodb增加、移除Arbiter节点实例:http://www.jb51.net/article/59597.htm