mongodb3.4带验证的副本集实例+暴力重配

场景:

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


mongodb3.4带验证的副本集实例+暴力重配_第1张图片

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处于停机状态。


mongodb3.4带验证的副本集实例+暴力重配_第2张图片

2. 然后安装supervosor

apt-get install supervisor

安装完成后运行supervisord以验证安装正常。


mongodb3.4带验证的副本集实例+暴力重配_第3张图片

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'}]})   初始化副本集


mongodb3.4带验证的副本集实例+暴力重配_第4张图片

退出再登陆,你会发现提示符已经改变了。提醒你登录的是副本集的主机

把通讯证书文件拷贝到其他的主机相同位置,

运行 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,达不到绝大多数的程度(绝大多数不是按存活主机算的,而是按副本集群里所有的机器计算),那么剩下的机器就选举不出来主机了,一个没有主机的副本集群是无法读的!.副本集群保持奇数的机器数量也是为了选举的需要.

你可能感兴趣的:(mongodb3.4带验证的副本集实例+暴力重配)