场景:
1. 一台mongodb服务器,已开启安全验证。现在需要创建一个有3台机器的最小副本集。
环境:
系统:ubuntu server 16.04
monodb: 3.4
服务器:
1 192.168.1.104 主服务器
2
3
步骤如下:
第一步:创建通讯证书文件。
因为是开启身份验证的mongodb,所以在集群中的通讯被加密了,mongodb的加密依赖证书。证书的创建方法如下:
1.mkdir -p /home/mongodb_key/ 创建一个目录存放证书。
2.openssl rand -base64 756 > /home/mongodb_key/autokey 生成证书。
3. chmod 400 /home/mongodb_key/autokey 修改权限为只读。
4.拷贝autokey文件到所有集群中的机器上。
第二步.:修改主服务器配置文件。
主要有3个地方需要配置一下:
sudo vi /etc/mongod.conf
1.networking interfaces部分,
net:
port: 27017
# bindIp: 192.168.1.104
确保没有绑定在127.0.0.1这个地址,port部分,记下端口号,有用。
2.security部分
authorization: enabled
keyFile: /home/mongodb_key/autokey
第一个是开启身份验证。
.keyFile就是通讯证书的位置。这一项不设置的话,会报找不到其他机器,很容易让人误以为是防火墙或者网络问题,容易误导人。切记要小心。
3.副本集部分
replication:
oplogSizeMB: 1024
replSetName: rs0
第一个是oplog集合的大小,这个集合记录了数据库的操作日志。直接决定了副本机器断开后,能坚持多久还能同步回来,此集合为固定大小集合。如果这个集合过小,能够记录的操作有限,那么如果副本机器断开过久的话,此集合被写满,然后覆盖更久的日志,这时候副本机器即使连接上了也会丢失一部分数据。但这个集合又不能无限的大。因为此集合一旦设定就无法更改了。一般建议是磁盘空间得到5%大小,我这里是虚拟机,设置的是1g。
第二个replSetName是副本集的名字。此副本集中的所有机器的这一项必须设置成一致的。
第三步:关闭服务,并以配置文件方式重启
1. service mongod stop
(不要以service的方式启动mongodb,这时候你启动不起来。)
service mongod status
确认mongod处于停机状态。
2. 然后安装supervosor
apt-get install supervisor
安装完成后运行supervisord以验证安装正常。
3.使用supervisor管理mongodb
新建一个配置文件。27017.conf 内容如下(不包含分割线):
####################分割线##############################
[program: 27017]
command = mongod --config /etc/mongod.conf
directory = / ; 运行的脚本的目录
autostart = true ; 随supervisor自动启动
autorestart = unexpected ; 出错重启
startsecs = 3 ; 启动后3秒不报错就认为程序启动成功
startretries = 3 ; 程序失败的重试次数web
###########################分割线###############################
27017是给程序起的名字。
第一行
末尾没有分号。
然后拷贝此文件到 /etc/supervisor/conf.d/ 下面
然后 supervisorctl update 重新加载配置文件
supervisorctl start 27017启动mongodb
4.配置副本集
mongo打开客户端
use admin 切换数据库
db.auth(‘your_root’,'your_passwd') 登录
执行 rs.initiate({_id:'rs0',members:[{_id:1,host:'192.168.1.104:27017'}]}) 初始化副本集
退出再登陆,你会发现提示符已经改变了。提醒你登录的是副本集的主机
把通讯证书文件拷贝到其他的主机相同位置,
运行 chmod 400 /home/mongodb_key/autokey 修改权限,不然下面会报错。
其他的也按照主服务器的配置,只是不要执行《配置副本集》这一步。
用mongo客户端登录到主服务器。
use admin 切换数据库
db.auth(‘your_root’,'your_passwd') 登录
然后你可以用rs.add命令加入副本集中的其他主机。
rs.add("其他成员的ip:27017")
注意,这个命令有第二个参数,是个boolean值,用来添加仲裁主机的。
rs.add("其他成员的ip:27017", true)
如果你出现“NodeNotFound”的错误,检查你的证书文件是否一致?
你也可以用rs.status()查看副本集状态。
共计有十种状态:
0 STARTUP 成员刚加入时的状态,这是成员加入的最早状态,应该很快转为STARTUP2状态
1 PRIMARY 主服务器状态,唯一默认可以读写的服务器.能投票.
2 SECONDARY 副本服务器,可以投票.
3 RECOVERING 服务器处于自我检查,过度完成,回滚或者重新同步的状态,可以投票.
5 STARTUP2 服务器已加入副本集,并开始进行初始化同步.
6 UNKNOWN 服务器处于未知状态.
7 ARBITER 仲裁者服务器,不复制数据,只参加投票.
8 DOWN 从主服务器来看,此服务器处于不可访问状态.
9 ROLLBACK 服务器处于回滚状态,此刻的服务器处于不可读取状态.
10 REMOVED 成员服务器处于被删除状态.
如果你的副本集配置出了问题,你可以新建一个配置,并强制重新配置副本集.
配置副本集的一般操作是:
1. 创建一个副本集配置字典.
config={_id:"rs0",members:[{_id:0, "host":"ip+port"}]}
2. 强制配置副本集
rs.reconfig(config,{force:true})
3. 副本集信息的存放位置.
local.system.replset
接下来,我们演示暴力重新配置一个副本集合实例:
已有副本集:my_set
三台机器: server_0,server_1,server_2 0是主机.
无安全验证.
已配置成副本集my_set并运行.
现在暴力拆除此副本集并重新配置(不remove服务器),新副本集的配置信息如下:
副本集名称: test_set
三台机器: server_0,server_1,server_2 其中server_2是主机.
开启安全验证
第一步,停机,先停副本机器,再停主机.
第二步,修改配置文件
先修改server_2的配置文件.修改副本集的名称 replSetName: test_set
再删除配置的数据库(需要切换到单机模式,无身份验证)
use local
db.system.replset.find({})
第三步 重启server2
第四步 配置server2
新建一个配置文件
config = {"_id" : "test_set","version" : 1,"members" : [{"_id" : 0,"host" : "server_2:port"}]}
第五步 修改其他服务器副本集名称
先删除对应的主机的配置库,mongo登录对应的主机。
use local
db.system.replset.find({})
然后重命名副本集
replSetName: test_set
最后重启对应的服务器。
第六步 在主机上使用rs.add("ip:port")加入其他副本主机。
提醒:
1.如果你希望某台主机优先成为primary服务器,那么你需要把这台主机的priority设置的比别人高一点(默认的是1,你可以设置1.5),但不要是别人的2倍!,举个例子,比如三台机器的副本集群,主机设置的priority是2,2台副本机器的priority设置的是1,那么当主服务器宕机的时候,由于剩下的2台主机的投票权加起来只有2,达不到绝大多数的程度(绝大多数不是按存活主机算的,而是按副本集群里所有的机器计算),那么剩下的机器就选举不出来主机了,一个没有主机的副本集群是无法读的!.副本集群保持奇数的机器数量也是为了选举的需要.