mongoDB集群配置

mongoDB分片+复制集集群配置文档

所用版本 mongodb 3.2.7
参考文档:http://docs.mongoing.com/manual-zh/tutorial/deploy-shard-cluster.html

本文架构

用途IP端口备注安装路径
ConfigeServer外网 Ip 1/内网 Ip 133000/db2/config_server
外网 Ip 2/内网 Ip 233000/db2/config_server
外网 Ip 3/内网 Ip 333000/db2/config_server
rs0外网 Ip 1/内网 Ip 143000rs0主节点/db2/rs0
外网 Ip 2/内网 Ip 243000rs0副本节点/db2/rs0
外网 Ip 3/内网 Ip 343000rs0副本节点/db2/rs0
rs1外网 Ip 1/内网 Ip 143002rs1主节点/db2/rs1
外网 Ip 2/内网 Ip 243002rs1副本节点/db2/rs1
外网 Ip 3/内网 Ip 343002rs1副本节点/db2/rs1
mongos外网 Ip 1/内网 Ip 153001/db2/mongos
外网 Ip 2/内网 Ip 253001/db2/mongos
外网 Ip 3/内网 Ip 353001/db2/mongos

注:IP 说明:前者是外网 IP 后者是内网 IP, 在集群内部配置的时候一定要用内网 IP, 这在下面还会提到

3.2 版本更改:官网文档建议我们配置3台 ConfigServer 这样如果其中的一台挂掉,其他的还能顶上去,接着用

So,我们配置3台 config_server 两个分片 每个分片配置三个复制集,其中外网 Ip 1/内网 Ip 1 是 primary 节点,剩下的两个是 secondary 节点,其实在复制集中,如果主节点挂了,另外两个副本节点会通过心跳检测自动推选出新的主节点.所以上文申明的主节点只是配置的时候的设置.

下面来说具体的配置

0.写在前面的话:

为了方便以后复用,我们都是用来配置文件的方式,来保存配置,我们把所有的配置文件都传到/ db2/conf 文件夹中,方便管理,为了隐私,本文的 ip 使用内网 ip1-3 外网 ip1-3代替.

1.配置 config_server(3台服务器都需要配置)

config_server 的配置文件是 config_server.conf
首先我们需要把这个文件传到服务器上,路径随便选.
然后执行 mongod -f /db2/conf/config_server.conf
正常情况下,我们会看到 端口已经打开,等待连接的提示(ps. 当然是用英语的,大意就是这样了)

三台服务器的 config_server 都后台运行了,我们登录到 config_server 的主服务器 把这三台服务器关联起来.
mongo 内网 Ip 1:33000
rs.initiate( {
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "内网 Ip 1:33000" },
{ _id: 1, host: "内网 Ip 2:33000" },
{ _id: 2, host: "内网 Ip 3:33000" }
]
} )
注意:这里要用内网 IP ,外网 IP 之后会出现很奇葩的问题.

2.配置 mongos

mongons 的配置文件是 mongos.conf
同样的先上传配置文件
然后执行 mongos -f /db2/conf/mongos.conf

3.配置分片

我们这里用到两个分片,事实上,后期可以再加入分片,只要再重新执行步骤3就可以了.
根据官方文档所说,生产环境中,每个分片建议都是一个复制集.
首先,写好配置文件: rs0.conf 注意:注意:注意:bindIp 一定要配,而且要配成所启动服务器的内网 ip 否则在添加复制集的时候就没有办法互相连接了
将配置文件分别上传到三台服务器上,并分别执行
mongod -f /db2/conf/rs0.conf
这样三个分片就都可以启动了,然后在主服务器(外网 Ip 1)上连接到 mongod上:
mongo 内网 Ip 1:43000
然后执行rs.initiate()初始化配置
执行rs.conf()显示配置,这里我们可以看到控制台显示出 primary 的字样,说明一切正常
之后,添加另外两个复制集
rs.add("内网 Ip 2:43000")
rs.add("内网 Ip 3:43000")
正常情况都会显示 ok:1
最后用rs.status()这条命令来查看配置,可以看到不同的配置集和他们的级别,是 primary 还是 secondary
分片的复制集的配置到这里就结束了
下面向集群中添加这个分片:
如果我们之前把 mongos config_server 关掉的话,现在要重新打开.
然后我们连接到 mongos 终端 命令如下:
mongo 内网 Ip 1:53001
然后键入加入分片的命令sh.addShard("rs0/内网 Ip 1:43000")
至此,完整的配置一个分片的任务就结束了,后期需要增加分片,只需要重新执行以下这个步骤,修改必要的参数就可以了
这部分的官方文档:http://docs.mongoing.com/manual-zh/tutorial/deploy-replica-set.html

4.为数据库/集合开启分片

4.1通过 mongo登录到 mongos 终端 mongo 内网 Ip 1:53001
4.2使用sh.enableSharding("<database>")开启所需要数据库的分片
4.3为集合设置分片.sh.shardCollection("<database>.<collection>", shard-key-pattern) 其中 shard-key-pattern 是片键,表示分片的依据,如果集合非空,需要使用 ensureIndex()在片键上创建索引.如果集合是空的,MongoDB会在sh.shardCollection() 过程中自动创建索引.我们选择_id 作为片键,所以输入命令如下:
sh.shardCollection("testsharding.testshardtable",{_id: 1})
片键的选择,需要考虑最频繁的查询字段,比如我们一般都用age 来查询,则片键选择为 age.

5.测试

为了很快看到结果,我们把chunk 的大小改为1MB(默认是64MB) 方法可以看http://docs.mongoing.com/manual-zh/tutorial/modify-chunk-size-in-sharded-cluster.html
测试程序见 xx.py 注意:因为要看到自动分片,所以数据量不能太小,我们在程序中插入100W 条数据,事实证明还是可以的.
运行结束后,需要登录到 mongos 上,然后,进入到目标数据库中
db.testshardtable.stats()
db.printShardingStatus()
db.testshardtable.getShardDistribution()
上面的几个命令都是查看分片的状态,我们通过第二个命令可以看出数据在逐渐的在两个分片之间迁移,这说明一切成功.成功的效果是这样的:
mongos> db.printShardingStatus()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("578f5a4a38172faf34f12ff2")
}
shards:
{ "_id" : "rs0", "host" : "rs0/内网 Ip 1:43000,内网 Ip 3:43000,内网 Ip 2:43000" }
{ "_id" : "rs1", "host" : "rs1/内网 Ip 1:43002,内网 Ip 3:43002,内网 Ip 2:43002" }
active mongoses:
"3.2.7" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
60 : Success
databases:
{ "_id" : "testsharding", "primary" : "rs0", "partitioned" : true }
testsharding.testshardtable
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 61
rs1 60
too many chunks to print, use verbose if you want to force print
(ps:如果发现并没有分片,请等待,我们可以逐渐看到 rs0 和 rs1 在慢慢变得平衡)

6.常见问题
6.1我们登录mongod的时候,有时会遇到端口被占用的情况,这时候执行killall -15 mongod, 再重新登录,一般可以解决问题
6.2如果中间的某步启动出问题,比如初始化 config_server 出错,或者分片出问题,最稳妥的办法是(好吧,也是我能想到的唯一办法),删除出问题的文件夹里 data 的所有东西,重新配置,比如config_server 出错,则

cd /db2/config_server/data
rm -rf *

6.3通过ps -fe|grep mongod来查看 mongod 的运行
6.4启动 mongos 时会出现ERROR: child process failed, exited with error number 51,这时需要新建相关目录,路径就是mongos.conf配的那个
6.5关于分片的仲裁节点,如果我们的复制集节点数是偶数个,则需要一个仲裁节点arbiters.conf,如果是奇数个,则不需要仲裁节点.配置仲裁节点的配置文件已经写好,arbiters.conf,使用的时候只需把这个文件上传到所需要的服务器上,通过mongod -f /db2/conf/arbiters.conf启动服务,在复制集上的主节点下,使用rs.addArb("内网 Ip 3:43100")来添加仲裁节点就可以了.记得在有仲裁节点的机器的run.sh增加启动仲裁节点的语句.配仲裁节点的参考文档是:https://docs.mongodb.com/manual/tutorial/add-replica-set-arbiter/
6.5最后,建议大家,一定要看官方文档,但不能只依靠官方文档,版本不同真的会害死人的,比如说配置 sharding 的分片里面的 bindIp 选项,就是官方文档没有提到的,是我从 Google 的某个网页找到的,我现在都忘了怎么找的了…充分说明这活也看人品~~(更新:后来发现不配 bindIp 也是可以的,反正用的话一定要内网 Ip, 外网是肯定不可以的)

配这货一定要仔细,把所有的服务都打开 config_server mongos sharding 这些都是有依赖关系的

7.读写端口
读写都可以从 mongos 的 ip+ 端口(外网 Ip 1:53001)(外网 Ip 2:53001)(外网 Ip 3:53001)进行,由集群自己进行数据迁移和查找数据.
8.写成批处理文件

我们可以把每个服务器的启动命令,携程批处理文件run.sh,上传到服务器上,这样每次启动集群只需要在每台服务器上运行这个批处理即可
本文的配置文件可以从 github上获得

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值