日期:2014-05-16  浏览次数:20602 次

【转】Mongodb Replica Sets 副本集架构实战(架设、扩充、容灾、修复、客户端代码连入)

mongodb单机可靠性比较低,我们投入生产环境往往需要多台服务器的容灾和负载均衡,mongodb推荐使用Replica Sets来进行小的容灾和负载解决方案。我相信很多中小型互联网公司3-4台mongodb服务器的配置无论从抗压和稳定角度来说都已经足够了,至少数据量在千万级以下都不需要考虑sharding分片和cluster集群。
我们公司最近将mongodb投入生产,本文将对架设,模拟灾难(包括断电,断网,数据损坏),修复和客户端(node.js)连接mongodb副本集做一个比较详细的分享,如有错误,欢迎指出,板砖轻拍啊。
[参考资料]
参考:mongodb 官方API?
http://www.mongodb.org/display/DOCS/Replica+Sets
参考:Kristina Chodorow's 博客(mongodb开发程序员的博客)http://www.snailinaturtleneck.com/blog/2012/05/07/replica-set-internals-bootcamp-part-iv-syncing/

参考:
Kristina 写的3本mongodb书籍 《MongoDB 权威指南》、《Scaling MongoDB》和《50 Tips and Tricks for MongoDB Developers》
参考:noSqlFan上的相关文章?
http://blog.nosqlfan.com/tags/MongoDB


1、架设

我们首先需要3台mongodb服务器,(除去仲裁服务器,最好是4台,之后会说明,这里我是用了mongodb v2.0版本),作为最基本的mongodb副本集搭建基础,还要保证这3台服务器网络互通。
a\启动
首先我们分别启动3台mongodb,命令如下:
四台mongodb服务器的ip分别为:10.1.10.31,? 10.1.10.28,? 10.1.10.30, 10.1.49.225(仲裁服务器)
mongod --replSet wzh --rest --dbpath /usr/local/wzhdb/ --journal --port 10001
简单说明一下:
--replSet wzh:表示副本集的名字为“wzh”,这里的名字可以任意取;
--rest:是打开web监控页面,比如我们这里监听10001端口,则打开http://10.1.49.225:11001/就可以看到这个mongodb数据库进程的信息
--journal:打开日志,我们这里模拟生产环境,所以建议将日志打开,以防不测。日志将会记录在/usr/local/wzhdb/journal/下,也就是你的数据库目录下(仲裁服务器不存储数据,不用打开此选项)
另外:这里没有使用后台运行,为了便于查看连接,我尽量模拟生产环境。


b\初始化
我们现在暂时将10.1.10.28作为master,于是我们用mongo命令登录10.1.10.28,来初始化副本集。
有3种方式可以初始化一个副本集:
1、db.runCommand( { replSetInitiate : <config_object> } )
2、rs.initiate(<config_object>)
3、rs.initiate()//先初始化,再通过rs.add等方法修改
这里的config_object会记录在local.system.replset这个集合内,这个集合会自动的在副本集成员之间广播,而且我们不能直接修改他们,需要使用命令来改变它,例如(replSetInitiate 命令)。
我们来看下config_object可以包括那些东西,下面是一个config对象的例子:

{
? _id :<setname>,