您的位置:首页 > 数据库 > Mongodb

如何部署MongoDB分片集群?

2017-09-16 08:06 1016 查看


如何部署MongoDB分片集群?



恋上了贝壳的代码
1 个月前

关于这一章已经鸽了好久了,觉得不能再鸽了,于是勤奋一点,打起精神,牺牲周末时间来完成这一篇文章,希望能对大家有所帮助!
当然开头还是感谢缐总的指导!虽然只有两天的相处时间,感谢你对于hbase耐心细致的教学,之后我将会把如何部署zookeeeper+HDFS+hbase分布式数据库系统也以写文章的形式介绍给大家,里面包含我踩的各种坑,应该是十分傻瓜式的教学文档,但是其实部署起来有点复杂,成熟熟练的人可能要一整天时间,相对而说内容就更多,希望大家耐心等候!谢谢大家的关注!
下面那我们步入正题!
我这个部署方案是按照3台服务器来部署的,分成3个shard。如果没有服务器条件,就把服务器换成虚拟机。鉴于可能大多人都没有服务器条件,我们就用虚拟机来实现。
这里放出我们这个集群的示意图,顺便吐槽一下这个知乎文章的排版,对写文章的操作还是要多完善。
我这个图是为了让大家好理解mongodb的原理,我们可以把一个端口看成一个片,其实是横向来看的,大家可能会和我一样一开始时分不清楚复制集和分片还有那些节点。其实我们横向看,这3个shard1即使fbj1(分片一),而secondary就是primary的复制集,防止primary挂掉的时候数据不会丢失,并且能够恢复,这就是高可用性的体现。
而且对于不管是服务器还是复制集我都希望你们通过设置静态ip来实现连接,这样会方便很多。
这部分网上都有教学,我就不写了,问的人多我在写。



那进入我们配置阶段,这个图是非常重要的,通过这个图,我们知道哪些配置文件要配在哪些服务器(虚拟机)上,它们起什么作用,要连接的都是哪些端口。
1.首先我们要有一个mongodb-linux-x86_64-amazon-3.2.12.tgz的压缩包,当我们把服务器配置好以后,通过xshell里面的一个工具xftp将文件导入就行(不管你用什么方法,如果可以联网就通过网络下载)。
tar -zxvf mongodb-linux-x86_64-amazon-3.2.12.tgz
2.进入我们这个mongodb的文件夹(我的习惯是把解压的文件全部放入我新建的mongodb这个文件夹里)
创建一个conf文件夹 (这是用来添加mongod服务的配置文件)
mkdir conf
进入conf文件夹 cd conf/
创建mongod1.conf vi mongod1.conf
dbpath=/data/volume_b/mongodb/data/db1 //这个是database存储的路径,别忘了创建db1

logpath=/data/volume_b/mongodb/logs/mongodb1.log //创建log日志的路路径

pidfilepath = /data/volume_b/mongodb/logs/mongod1.pid //存储mongod1进程号

port=27017 //服务的端口号

fork=true //以守护进程的方式运行MongoDB,创建服务器进程

logappend=true //以追加的方式记录日志

journal=true //启用日志文件

quiet=true //安静模式,这个选项可以过滤掉一些无用的日志信息

replSet=fbj1 //这个副本集名称

oplogSize=102400 // 设置oplog的大小(MB)
创建mongod2.conf vi mongod2.conf
dbpath=/data/volume_b/mongodb/data/db2

logpath=/data/volume_b/mongodb/logs/mongodb2.log

pidfilepath = /data/volume_b/mongodb/logs/mongod2.pid

port=27018

fork=true

logappend=true

journal=true

quiet=true 

replSet=fbj2

oplogSize=102400
创建mongod3.conf vi mongod3.conf
dbpath=/data/volume_b/mongodb/data/db3

logpath=/data/volume_b/mongodb/logs/mongodb3.log

pidfilepath = /data/volume_b/mongodb/logs/mongod3.pid

port=27019

fork=true

logappend=true

journal=true

quiet=true 

replSet=fbj3

oplogSize=102400
创建congfig.conf vi config.conf 这是在配置config服务,它是用来指导mongos的
dbpath=/data/volume_b/mongodb/data/config

logpath=/data/volume_b/mongodb/logs/config.log

pidfilepath = /data/volume_b/mongodb/logs/config.pid

port=27027

fork=true

logappend=true

journal=true

quiet=true
创建mongos.conf vi mongos.conf
logpath=/data/volume_b/mongodb/logs/mongos.log

pidfilepath = /data/volume_b/mongodb/logs/mongos.pid

port=27037

fork=true

configdb=192.168.1.101:27027,192.168.1.102:27027,192.168.1.103:27027
注意:
path后的路径根据你们自己实际路径设置,我是把mongodb放在/usr/local/下的
举个例子就是dbpath=/usr/local/mongodb/db1以此类推
每个服务器(虚拟机)里面都要配置mongod1、2、3,因为我们由图可知,server1、2、3上分别都有mongod1、2、3这个三个服务,如果财大气粗,有9个服务器,就分别配置就行了
mongos服务相当于一个接口,用户的写入和查询操作通过mongos来下发到各个primary,再由primary同步到它底下的secondary中
再次提醒别忘了创建logs db1 db2 db3 config 这些文件夹,不然就会在你启动mongod、config、mongos服务中出错
出错了不要慌,哪个服务出错就去找哪个服务的log文件,cat这个文件就能看到哪里出错了
3.在各个节点启动我们的服务
numactl --interleave=all ./bin/mongod -config ./conf/mongod1.conf --setParameter replWriterThreadCount=32

numactl --interleave=all ./bin/mongod -config ./conf/mongod2.conf --setParameter replWriterThreadCount=32

numactl --interleave=all ./bin/mongod -config ./conf/mongod3.conf --setParameter replWriterThreadCount=32
个服务前面的numactl --interleave=all 可以不加,你们可以去百度一下numactl命令的用处,相当于是把所有资源node都给mongod服务,加快速度
4.在主节点进行下列操作
./mongo 192.168.1.101:27017

> use admin

switched to db admin

> config=({_id:"fbj1",members:[{_id:0,host:"192.168.1.101:27017"},{_id:1,host:"192.168.1.102:27017"},{_id:2,host:"192.168.1.103:27017"}]})

{

"_id" : "fbj1",

"members" : [

{

"_id" : 0,

"host" : "192.168.1.101:27017"

},

{

"_id" : 1,

"host" : "192.168.1.102:27017"

},

{

"_id" : 2,

"host" : "192.168.1.103:27017"

}

]

}

> rs.initiate(config)

{ "ok" : 1 }

./mongo 192.168.1.102:27018

> use admin

switched to db admin

> config=({_id:"fbj2",members:[{_id:0,host:"192.168.1.101:27018"},{_id:1,host:"192.168.1.102:27018"},{_id:2,host:"192.168.1.103:27018"}]})

{

"_id" : "fbj2",

"members" : [

{

"_id" : 0,

"host" : "192.168.1.101:27018"

},

{

"_id" : 1,

"host" : "192.168.1.102:27018"

},

{

"_id" : 2,

"host" : "192.168.1.103:27018"

}

]

}

> rs.initiate(config)

{ "o
dc80
k" : 1 }

./mongo 192.168.1.103:27019

> use admin

switched to db admin

> config=({_id:"fbj3",members:[{_id:0,host:"192.168.1.101:27019"},{_id:1,host:"192.168.1.102:27019"},{_id:2,host:"192.168.1.103:27019"}]})

{

"_id" : "fbj3",

"members" : [

{

"_id" : 0,

"host" : "192.168.1.101:27019"

},

{

"_id" : 1,

"host" : "192.168.1.102:27019"

},

{

"_id" : 2,

"host" : "192.168.1.103:27019"

}

]

}

> rs.initiate(config)

{ "ok" : 1 }

这里是我们这3个复制集部署好
5.在各个节点启动config服务
numactl --interleave=all ./bin/mongod --configsvr -config ./conf/config.conf
--configsvr声明这是一个集群的config服务
6.在各个节点启动mongos服务
numactl --interleave=all ./bin/mongos -config ./conf/mongos.conf
7.连接mongos,配置分片信息
./bin/mongo 192.168.1.101:27037

mongos> use admin

switched to db admin

mongos> db.runCommand( { addshard : "fbj1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017"});

{ "shardAdded" : "fbj1", "ok" : 1 }

mongos> db.runCommand( { addshard : "fbj2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018"});

{ "shardAdded" : "fbj2", "ok" : 1 }

mongos> db.runCommand( { addshard : "fbj3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019"});

{ "shardAdded" : "fbj3", "ok" : 1 }

mongos> db.runCommand( { listshards : 1 } );

{

"shards" : [

{

"_id" : "fbj1",

"host" : "fbj1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017"

},

{

"_id" : "fbj2",

"host" : "fbj2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018"

},

{

"_id" : "fbj3",

"host" : "fbj3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019"

}

],

"ok" : 1

}

这样我们的分片集群已经部署好了,下面测试什么的就给你们卖个关子,其实我也在一步一个坑的去踩这个东西,使用YCSB(在内网下配置真心醉了!),写完这个发现真的好累啊!hbase那么长的篇幅怎么办啊!希望大家多多支持吧!禁止商用!打了这么久的字,尊重一下劳动!下期再见!see you!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: