Mongodb集群搭建的三种方式
<h1>
<span class="link_title"><a href="/luonanqin/article/details/8497860">
Mongodb集群搭建的三种方式
</a></span>
</h1>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/mongodb" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">mongodb</a><a href="http://www.csdn.net/tag/Mongodb" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Mongodb</a><a href="http://www.csdn.net/tag/MongoDb" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">MongoDb</a><a href="http://www.csdn.net/tag/mongoDB" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">mongoDB</a><a href="http://www.csdn.net/tag/MongoDB" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">MongoDB</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2013-01-13 23:40</span>
<span class="link_view" title="阅读次数">76145人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(14)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Mongodb集群搭建的三种方式','8497860');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(8497860,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('1325615','luonanqin','top','8497860');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">DB<em>(1)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/luonanqin/article/category/1325615" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_1325615">
</ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key-Value形式。关于Mongodb的特点,这里就不多介绍了,大家可以去看看官方说明:http://docs.mongodb.org/manual/
今天主要来说说Mongodb的三种集群方式的搭建:Replica Set / Sharding / Master-Slaver。这里只说明最简单的集群搭建方式(生产环境),如果有多个节点可以此类推或者查看官方文档。OS是Ubuntu_x64系统,客户端用的是Java客户端。Mongodb版本是mongodb-Linux-x86_64-2.2.2.tgz
Replica Set
中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。
介绍完了集群方案,那么现在就开始搭建了。
1.建立数据文件夹
一般情况下不会把数据目录建立在mongodb的解压目录下,不过这里方便起见,就建在mongodb解压目录下吧。
- mkdir -p /mongodb/data/master
- mkdir -p /mongodb/data/slaver
- mkdir -p /mongodb/data/arbiter
- #三个目录分别对应主,备,仲裁节点
2.建立配置文件
由于配置比较多,所以我们将配置写到文件里。
- #master.conf
- dbpath=/mongodb/data/master
- logpath=/mongodb/log/master.log
- pidfilepath=/mongodb/master.pid
- directoryperdb=true
- logappend=true
- replSet=testrs
- bind_ip=10.10.148.130
- port=27017
- oplogSize=10000
- fork=true
- noprealloc=true
- #slaver.conf
- dbpath=/mongodb/data/slaver
- logpath=/mongodb/log/slaver.log
- pidfilepath=/mongodb/slaver.pid
- directoryperdb=true
- logappend=true
- replSet=testrs
- bind_ip=10.10.148.131
- port=27017
- oplogSize=10000
- fork=true
- noprealloc=true
- #arbiter.conf
- dbpath=/mongodb/data/arbiter
- logpath=/mongodb/log/arbiter.log
- pidfilepath=/mongodb/arbiter.pid
- directoryperdb=true
- logappend=true
- replSet=testrs
- bind_ip=10.10.148.132
- port=27017
- oplogSize=10000
- fork=true
- noprealloc=true
dbpath:数据存放目录
logpath:日志存放路径
pidfilepath:进程文件,方便停止mongodb
directoryperdb:为每一个数据库按照数据库名建立文件夹存放
logappend:以追加的方式记录日志
replSet:replica set的名字
bind_ip:mongodb所绑定的ip地址
port:mongodb进程所使用的端口号,默认为27017
oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
fork:以后台方式运行进程
noprealloc:不预先分配存储
3.启动mongodb
进入每个mongodb节点的bin目录下
注意配置文件的路径一定要保证正确,可以是相对路径也可以是绝对路径。
4.配置主,备,仲裁节点
可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
- ./mongo 10.10.148.130:27017 #ip和port是某个节点的地址
- >use admin
- >cfg={ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1},
- {_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] };
- >rs.initiate(cfg) #使配置生效
配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:
- {
- "set" : "testrs",
- "date" : ISODate("2013-01-05T02:44:43Z"),
- "myState" : 1,
- "members" : [
- {
- "_id" : 0,
- "name" : "10.10.148.130:27017",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 200,
- "optime" : Timestamp(1357285565000, 1),
- "optimeDate" : ISODate("2013-01-04T07:46:05Z"),
- "self" : true
- },
- {
- "_id" : 1,
- "name" : "10.10.148.131:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 200,
- "optime" : Timestamp(1357285565000, 1),
- "optimeDate" : ISODate("2013-01-04T07:46:05Z"),
- "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),
- "pingMs" : 0
- },
- {
- "_id" : 2,
- "name" : "10.10.148.132:27017",
- "health" : 1,
- "state" : 7,
- "stateStr" : "ARBITER",
- "uptime" : 200,
- "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),
- "pingMs" : 0
- }
- ],
- "ok" : 1
- }
同时可以查看对应节点的日志,发现正在等待别的节点生效或者正在分配数据文件。
现在基本上已经完成了集群的所有搭建工作。至于测试工作,可以留给大家自己试试。一个是往主节点插入数据,能从备节点查到之前插入的数据(查询备节点可能会遇到某个问题,可以自己去网上查查看)。二是停掉主节点,备节点能变成主节点提供服务。三是恢复主节点,备节点也能恢复其备的角色,而不是继续充当主的角色。二和三都可以通过rs.status()命令实时查看集群的变化。
Sharding
和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种是最复杂的。部署图如下:
1.启动数据节点
- ./mongod --fork --dbpath ../data/set1/ --logpath ../log/set1.log --replSet test #192.168.4.43
- ./mongod --fork --dbpath ../data/set2/ --logpath ../log/set2.log --replSet test #192.168.4.44
- ./mongod --fork --dbpath ../data/set3/ --logpath ../log/set3.log --replSet test #192.168.4.45 决策 不存储数据
2.启动配置节点
- ./mongod --configsvr --dbpath ../config/set1/ --port 20001 --fork --logpath ../log/conf1.log #192.168.4.30
- ./mongod --configsvr --dbpath ../config/set2/ --port 20002 --fork --logpath ../log/conf2.log #192.168.4.31
3.启动路由节点
- ./mongos --configdb 192.168.4.30:20001,192.168.4.31:20002 --port 27017 --fork --logpath ../log/root.log #192.168.4.29
这里我们没有用配置文件的方式启动,其中的参数意义大家应该都明白。一般来说一个数据节点对应一个配置节点,仲裁节点则不需要对应的配置节点。注意在启动路由节点时,要将配置节点地址写入到启动命令里。
4.配置Replica Set
这里可能会有点奇怪为什么Sharding会需要配置Replica Set。其实想想也能明白,多个节点的数据肯定是相关联的,如果不配一个Replica Set,怎么标识是同一个集群的呢。这也是人家mongodb的规定,咱们还是遵守吧。配置方式和之前所说的一样,定一个cfg,然后初始化配置。
- ./mongo 192.168.4.43:27017 #ip和port是某个节点的地址
- >use admin
- >cfg={ _id:"testrs", members:[ {_id:0,host:'192.168.4.43:27017',priority:2}, {_id:1,host:'192.168.4.44:27017',priority:1},
- {_id:2,host:'192.168.4.45:27017',arbiterOnly:true}] };
- >rs.initiate(cfg) #使配置生效
5.配置Sharding
- ./mongo 192.168.4.29:27017 #这里必须连接路由节点
- >sh.addShard("test/192.168.4.43:27017") #test表示replica set的名字 当把主节点添加到shard以后,会自动找到set里的主,备,决策节点
- >db.runCommand({enableSharding:"diameter_test"}) #diameter_test is database name
- >db.runCommand( { shardCollection: "diameter_test.dcca_dccr_test",key:{"__avpSessionId":1}})
到这里Sharding也已经搭建完成了,以上只是最简单的搭建方式,其中某些配置仍然使用的是默认配置。如果设置不当,会导致效率异常低下,所以建议大家多看看官方文档再进行默认配置的修改。
Master-Slaver
这个是最简答的集群搭建,不过准确说也不能算是集群,只能说是主备。并且官方已经不推荐这种方式,所以在这里只是简单的介绍下吧,搭建方式也相对简单。
- ./mongod --master --dbpath /data/masterdb/ #主节点
- ./mongod --slave --source <masterip:masterport> --dbpath /data/slavedb/ 备节点
以上三种集群搭建方式首选Replica Set,只有真的是大数据,Sharding才能显现威力,毕竟备节点同步数据是需要时间的。Sharding可以将多片数据集中到路由节点上进行一些对比,然后将数据返回给客户端,但是效率还是比较低的说。
我自己有测试过,不过具体的机器配置已经不记得了。Replica Set的ips在数据达到1400w条时基本能达到1000左右,而Sharding在300w时已经下降到500ips了,两者的单位数据大小大概是10kb。大家在应用的时候还是多多做下性能测试,毕竟不像Redis有benchmark。
Mongodb现在用的还是比较多的,但是个人觉得配置太多了。。。。我看官网都看了好多天,才把集群搭建的配置和注意要点弄明白。而且用过的人应该知道mongodb吃内存的问题,解决办法只能通过ulimit来控制内存使用量,但是如果控制不好的话,mongodb会挂掉。。。
过段时间我会写一篇关于项目里使用mongodb所涉及到的具体业务,各位有兴趣可以关注下。
<div id="digg" articleid="8497860">
<dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
<dt>顶</dt>
<dd>23</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
<dt>踩</dt>
<dd>0</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('1325615','luonanqin','foot','8497860');">DB<em>(1)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/luonanqin/article/details/9107609" id="foot_aritcle_9107609undefined8798281586865622" target="_blank" title="Mongodb入门篇">Mongodb入门篇</a><span>2013-06-16</span><label><i>阅读</i><b>6165</b></label></li> </ul>
<ul class="similar_list fr"></ul>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('1325615', 'luonanqin','foot','8497860');
});
</script>
<dt><span>猜你在找</span></dt>
<div id="adCollege" style="width: 42%;float: left;">
<script src="http://csdnimg.cn/jobreco/job_reco.js" type="text/javascript"></script>
<script type="text/javascript">
csdn.position.showEdu({
sourceType: "blog",
searchType: "detail",
searchKey: "8497860",
username: "liuguoyun_123456",
recordcount: "5",
containerId: "adCollege" //容器DIV的id。
});
</script>
<div class="tracking-ad" data-mod="popu_84"><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/873" title="360度解析亚马逊AWS数据存储服务" strategy="v4:content" target="_blank">360度解析亚马逊AWS数据存储服务</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/895" title="高并发集群架构超细精讲" strategy="v4:content" target="_blank">高并发集群架构超细精讲</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/2540" title="基于MyCat的MySQL高可用读写分离集群" strategy="v4:content" target="_blank">基于MyCat的MySQL高可用读写分离集群</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/2850" title="MySQL数据库分布式集群就业培训班" strategy="v4:content" target="_blank">MySQL数据库分布式集群就业培训班</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/1798" title="mongodb精简教程" strategy="v4:content" target="_blank">mongodb精简教程</a></dd></div></div>
<div id="res" data-mod="popu_36" class="tracking-ad" style="width: 42%; float: left; margin-right: 30px; display: block;"><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/nysyxxg/article/details/27102313" title="Mongodb集群搭建的三种方式" strategy="SearchAlgorithm" target="_blank">Mongodb集群搭建的三种方式</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/luonanqin/article/details/8497860" title="Mongodb集群搭建的三种方式" strategy="SearchAlgorithm" target="_blank">Mongodb集群搭建的三种方式</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/lmocm/article/details/37564283" title="Mongodb学习及三种方式集群搭建文档" strategy="SearchAlgorithm" target="_blank">Mongodb学习及三种方式集群搭建文档</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/shmnh/article/details/41922677" title="Mongodb集群搭建的三种方式" strategy="SearchAlgorithm" target="_blank">Mongodb集群搭建的三种方式</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/pangguoming/article/details/50619410" title="Mongodb集群搭建的三种方式" strategy="SearchAlgorithm" target="_blank">Mongodb集群搭建的三种方式</a></dd></div>
<div id="ad_cen">
<div id="ad_bot">
</div>
<a id="d-top-a" class="btn btn-top backtop" style="display: none;" title="返回顶部" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_huidaodingbu'])">
<img src="http://static.blog.csdn.net/images/top.png" alt="TOP">
</a>
<h5>
<a href="http://www.csdn.net/tag/" target="_blank">核心技术类目</a></h5>
<div class="classify">
全部主题
Hadoop
AWS
移动游戏
Java
Android
iOS
Swift
智能硬件
Docker
OpenStack
VPN
Spark
ERP
IE10
Eclipse
CRM
JavaScript
数据库
Ubuntu
NFC
WAP
jQuery
BI
HTML5
Spring
Apache
.NET
API
HTML
SDK
IIS
Fedora
XML
LBS
Unity
Splashtop
UML
components
Windows Mobile
Rails
QEMU
KDE
Cassandra
CloudStack
FTC
coremail
OPhone
CouchBase
云计算
iOS6
Rackspace
Web App
SpringSide
Maemo
Compuware
大数据
aptech
Perl
Tornado
Ruby
Hibernate
ThinkPHP
HBase
Pure
Solr
Angular
Cloud Foundry
Redis
Scala
Django
Bootstrap
<div class="clear">
</div>
</div>
arbiter 似乎没有那么重要啊, 还是 对于当时版本来说, arbiter 作用挺大的啊
[root@localhost bin]# ./mongos --configdb 192.168.1.201:20001,192.168.1.202:20002 --port 27017 --fork --logpath ../data/logs/router.log
BadValue need either 1 or 3 configdbs
try './mongos --help' for more information
表示只能有一个或者3个configdbs,我想问一下楼主这种问题你遇到过吗?配置服务器和路由服务器是什么关系啊?
Caused by: java.io.EOFException
dbs = new ArrayList<>();
ServerAddress master = new ServerAddress("192.168.3.118",27017);
ServerAddress salver = new ServerAddress("192.168.3.119",27017);
dbs.add(master);
dbs.add(salver);
mg = new MongoClient(dbs);
运行正常,但是,当主从切换时,客户端直接抛出如下异常,然后,客户端就挂掉了,不知是何道理?
./monood -f master.conf 时报了一个错:
note: noprealloc may hurt performance in many applications
about to fork child process, waiting until server is ready for connections.
forked process: 5394
ERROR: child process failed, exited with error number 1
在google上查了半天没找到解决方法,请问你知道是什么原因吗?我相信其他人也会碰到这个问题的!
期待你的回复哦!