首页 > CentOS, MongoDB > Mongodb Replica Set 配置

Mongodb Replica Set 配置

Mongodb有三种集群工作模式:Master-Slaver/ Replica Set / Sharding
其中 Master-Slaver 存在单点故障问题,而 Replica Set 自带heartbeat机制,实现了读写分离且能够自动进行故障转移和数据恢复,可以完全替代Master-Slaver,同时官方也建议使用Replica set。而 Sharding 主要是为了解决单点io瓶颈,对数据库进行分片处理(Shard key 对于分片至关重要)其复杂度稍高,通常会结合Replica Set一起使用,此处先略过不写。

首先看一下工作原理图
113123264

说明:所有mongod进程通过heartbeat机制进行通信,Primary 节点负责 数据的插入,Secondary节点负责数据的读取,由此做到读写分离。同时为了保证故障转移,节点总数必须大于2个。因为如果只有2个节点的话,其中一个出问题了,导致heartbeat通信异常,节点双方都无法确认是自己出问题了还是对方出问题,这个时候需要根据第三个节点进行判断,起到vote(投票)的作用。数据同步主要是通过Oplog(operations log)。Oplog负责记录写服务器(Primary)上所有对数据的更改(查询等对数据库不产生更改的操作不会被记录),复制集内的其他服务器通过获取Oplog 进行数据差异同步。oplog  保存在primary的local db下的oplog.rs collection 里。关于更细节的内容请移步
http://docs.mongodb.org/manual/core/replica-set-oplog/

1.mongodb 安装,此处略过,请参考 http://docs.mongodb.org/manual/installation/
2.服务器配置
由于服务器资源问题,这边我在一台机器上实现,通过启动不同的mongod进程来实现。

1. 127.0.0.1:27017  Primary //负责数据写入
2. 127.0.0.1:28017  Secondary//负责数据读取
3. 127.0.0.1:29017  Hidden //负责数据热备,同时具有vote功能

3.创建3个目录,用于存储mongodb数据文件

分别为/data/mongodb-primary,/data/mongodb-secondary,/data/mongodb-hidden

4.复制/etc/mongod.conf,创建并修改如下3个配置文件

/etc/mongodb-primary.conf,/etc/mongodb-secondary.conf,/etc/mongodb-hidden.conf

注意: 必须把 bind_ip=127.0.0.1 注释掉

4.1/etc/mongodb-primary.conf 内容如下

#日志输出目录
logpath=/var/log/mongodb/mongod-private.log
#已追加的方式记录日志
logappend=true
#后台运行
fork=true

#进程端口
port=27017
#数据保存目录
dbpath=/data/mongodb-primary
#进程文件句柄
pidfilepath=/var/run/mongodb/mongod-primary.pid

#Replica set name,此处务必保证所有的配置一样
replSet=juhe

#Oplog 大小设置,单位M
oplogSize=1024

4.2 /etc/mongodb-secondary.conf

logpath=/var/log/mongodb/mongod-secondary.log
logappend=true
fork=true
port=28017
dbpath=/data/mongodb-secondary
pidfilepath=/var/run/mongodb/mongod-secondary.pid
replSet=juhe
oplogSize=1024

4.3 /etc/mongodb-hidden.conf

logpath=/var/log/mongodb/mongod-hidden.log
logappend=true
fork=true
port=29017
dbpath=/data/mongodb-hidden
pidfilepath=/var/run/mongodb/mongod-hidden.pid
replSet=juhe
oplogSize=1024

5.启动mongod服务

执行如下命令

mongod -f /etc/mongodb-primary.conf  
mongod -f /etc/mongodb-secondary.conf  
mongod -f /etc/mongodb_hidden.conf

6.配置并启动Replica set

通过 mongo 127.0.0.1:27017 进入Primary

输入

config = {_id:"juhe",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:28017',priority:1},{_id:2,host:'127.0.0.1:29017',priority:0,hidden:true}]}

9E4615AA-4E44-4245-BAAF-9F8F61BD064A执行 rs.initiate(config);

4D82655D-0404-46AE-9140-5FD21554974B稍等片刻,接着输入  rs.status();

90F036A9-FDB5-482E-B7C3-D496B7FDE1CC

发现,已经配置成功。rs.status() 的相关参数说明请参考 http://docs.mongodb.org/manual/reference/command/replSetGetStatus/

Replica Set Member States 相关参数请参考

http://docs.mongodb.org/manual/reference/replica-states/

注意:hidden节点对application是不可见的,所以在输入db.isMaster();  会发现hidden节点不在里面,同时上面在配置config的时候,hidden节点priority值比如为0,参考:http://docs.mongodb.org/manual/tutorial/configure-a-hidden-replica-set-member/

E801EE01-9E1A-4BB4-87D2-C84850983897
现在可以在primary进行数据插入操作,同时进入secondary和hidden节点进行数据查看,确认数据是否同步。

在非primary节点进行数据查看的时候要先执行 rs.slaveOk();  (设置允许当前连接对secondary进行read操作)。

否则会报 error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }

现在来验证故障转移:通过杀掉primary进程,会发现secondary(127.0.0.1:28017)节点自动切换成primary节点了。

然后在 127.0.0.1:28017进行数据插入操作,完成之后再启动 127.0.0.1:27017,

稍后会发现之前插入到127.0.0.1:28017得数据自动同步到了127.0.0.1:27017上,

且127.0.0.1:27017升级成primary。

7.增加节点

通过复制/etc/mongodb-secondary.conf 生成一份新的/etc/mongodb-secondary02.conf

内容如下:

logpath=/var/log/mongodb/mongod-secondary02.log
logappend=true
fork=true
port=30017
dbpath=/data/mongodb-secondary02
pidfilepath=/var/run/mongodb/mongod-secondary02.pid
replSet=juhe
oplogSize=1024

启动该节点服务 mongod -f /etc/mongodb-secondary02.conf

通过mongo 127.0.0.1:27017 进入primary节点

执行 rs.add({_id: 3, host: “127.0.0.1:30017″, priority: 1})

过一会就可以看到节点已经成功添加,且数据同步完成。

8.删除节点

登陆需要被删除的节点服务,进入mongo shell,通过use admin 切换到admin库,执行 db.shutdownServer(); 进行数据库关闭操作。然后登陆primary节点,执行  rs.remove(“host:port”);即可。

另: mongodb drivers 请参考 http://docs.mongodb.org/ecosystem/drivers/

 注意:mongodb 在进行数据删除操作的时候,并不会释放本地磁盘空间,由此带来的一个问题就是磁盘日益吃紧,建议及时进行磁盘数据整理,常用的方式有导出导入(会对数据库上锁,无法继续对外服务),而对于replica set来说,可以通过顺序停止某个节点,删除本地data 目录之后,再启动服务,让集群去做数据同步,该方式优点在于能继续提供对外服务。

  1. 不弃
    2016年3月24日11:43 | #1

    replica set 如何开始auth认证。

    在primiry节点createUser会提示not master

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
*