您的位置:首页 > 数据库 > Mongodb

Mongodb的Replica Set 副本集集群搭建

2015-11-24 16:00 615 查看
实验性的搭建一个集群做练手。
配置和环境:

win10(本机)和linux(CentOs7)内网服务器各一台。
Mongodb3.07
目标:Replica set 副本集结构,一个primary一个slave,实现读写分离的同步数据集群。

一、本机和内网服务器安装mongo
可参考我的另外两篇文章:
Mongodb在windows和linux平台的安装配置(/article/11902386.html
Mongodb权限管理(/article/11902385.html

二、集群配置

一切开始前,有个准备工作,当时配置集群时因为这个事儿耽误了很长时间,百度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");

此时打开slave节点的话,可能会提示"not master and slaveok=false"。解决办法是登录primary节点后,use admin; db.auth("xxx","yyy")认证身份,然后执行:
> rs.slaveOk();
即可。

其实正常来说还应该有个仲裁节点,但目前服务器数量不够,所以尝试用另一个外网机器做了下仲裁节点,于是遇到了修改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 连接认证问题 http://www.bubuko.com/infodetail-984255.html
mongoDB 3.0 安全权限访问控制 /article/9082886.html
浅析MongoDB用户管理 /article/1243390.html
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节点实例:/article/1243356.html
本文出自 “技术成长点滴” 博客,请务必保留此出处http://fykknd.blog.51cto.com/3175618/1716409
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: