MongoDB Replication Set 的配置

MongoDB Replication Set的特点:
replica set可以实现自动的failover和自动的recovery。
replica set由两个或者更多的节点组成,实现彼此的复制。
replica set自动选择primary节点,没有一个节点是固定的primary。
mongos会自动发现一个replica set的primary节点发生变化,并将写操作发送给这个新的primary节点。
应用场景
数据冗余。自动failover,提供高可用性的服务。分散读的负载。简化维护(相对于master-slave来说)。灾难恢复。
环境:虚拟机ubuntu12.04 64bit。IP:192.168.100.199
在同一台服务器上安装三个mongodb实例,如下:

安装目录
mongodb27017
mongodb27018
mongodb27019

端口
27017
27018
27019

配置文件
/etc/mongodb27017.conf
/etc/mongodb27018.conf
/etc/mongodb27019.conf

启动脚本
/etc/init.d/mongodb27017
/etc/init.d/mongodb27018
/etc/init.d/mongodb27019

web端口
28017
28018
28019

配置文件中需要注意修改以下内容:

dbpath = /usr/local/mongodb27017/data/db
logpath = /usr/local/mongodb27017/log/mongodb.log
logappend = true
port = 27017
fork = true
rest = true
replSet = rs0

分别打开三个实例的mongo shell

mongodb27017/bin/mongo 192.168.100.199:27017
mongodb27018/bin/mongo 192.168.100.199:27018
mongodb27019/bin/mongo 192.168.100.199:27019

在27017端口的实例上初始化replica set

rs.initiate()

显示当前的replica set配置:

rs.conf()

在Primary上执行添加其他两个实例:

rs.add("192.168.100.199:27018")
rs.add("192.168.100.199:27019")

显示replica set的状态:

rs.status()

使SECONDARY节点可读:

rs.slaveOk()

在Primary上执行以在剩余的Secondary里重新选举一个Primary

rs.stepDown()

rs.help()可以查看帮助,更多方法请参见官网

另外需要注意:
如果要实现一定容灾的话,至少需要三个节点来做replica set,当其中一个down掉之后,另外两个会重新选举一个primary。但是如果其中两个都down掉的话,另外一台不管之前是primary还是secondary,都会降级为secondary,这时mongodb会不可写。
避免这种情况更简单的办法是加入一个arbiter节点,只负责选举,不负责数据存储。这样一来结构就变成了primary,secondary,arbiter三个角色,任何一个down掉的话,都不会影响mongodb的使用,当然,如果两个都down掉那就没辙了。。。。
常用命令

* use admin

* #增加或修改用户密码

* db.addUser('admin','pwd')

* #查看用户列表

* db.system.users.find()

* #用户认证

* db.auth('admin','pwd')

* #删除用户

* db.removeUser('mongodb')

* #查看所有用户

* show users

* #查看所有数据库

* show dbs
* #查看所有的collection

* show collections

* #查看各collection的状态

* db.printCollectionStats()

* #查看主从复制状态

* db.printReplicationInfo()

* #修复数据库

* db.repairDatabase()

* #设置记录profiling,0=off 1=slow 2=all

* db.setProfilingLevel(1)

* #查看profiling

* show profile

* #拷贝数据库
* db.copyDatabase('mail_addr','mail_addr_tmp')

* #删除collection

* db.mail_addr.drop()

* #删除当前的数据库

* db.dropDatabase()

参考:

http://docs.mongodb.org/manual/tutorial/deploy-replica-set/

http://snoopyxdy.blog.163.com/blog/static/60117440201241694254441/

http://blog.nosqlfan.com/html/2523.html

http://virusswb.blog.51cto.com/115214/792897