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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容