关于MongoDB 3.4 的分片与原来还是有一些区别,网上没找到完整的操作手册,只能自己摸索。
本文仅是记录一下自己的操作步骤,以免忘记,……
第一步: 准备数据节点
我们准备两个单节点,当然,你也可以使用副本集作为数据节点,只是我的PC实在跑不动……
必须添加–shardsvr参数。
mongod --logpath /data/shard/log/d0.log --dbpath /data/shard/db0 --port 32770 --shardsvr
mongod --logpath /data/shard/log/d1.log --dbpath /data/shard/db1 --port 32771 --shardsvr
第二步:config server
3.4要求配置服务器必须也是副本集,好吧,我们需要这样弄一个,我暂时只用一个节点做rs。
先不启mongos。再启一个配置服务器
mongod —logpath /data/config/log/config0.log —datapath /data/config/db0 —port 26010 --configsvr --replSet cs
嗯,我只用一个节点,凑合着先跑起来,当然这样是不好的……
用robomongo连上 26010 ,初始化一下副本集cs:
use admin
cfg = {
_id:'cs',
configsvr:true,
members:[
{_id:0,host:'192.168.57.151:26010'}
]
};
rs.initiate(cfg);
你应该有多个configserver,所以需要添加第二个
rs.add({_id:1,host:'192.168.57.151:26011'})
第三步:启mongos
mongos --configdb cs/192.168.57.151:26010 --logpath /data/mongos.log --port 8001
因为我上面的cs中只有一个节点,所以是这样的,如果你有多个,应该这样写:
mongos --configdb cs/192.168.57.151:26010,192.168.57.151:26011 --logpath /data/mongos.log --port 8001
第四步:配置分片节点
同样使用robomongo 连上 8100 ,添加片节点,并启用aedata库的分片:
sh.addShard('192.168.57.151:32770')
sh.addShard('192.168.57.151:32771')
sh.status()
sh.enableSharding('aedata')
然后还有一件事,片键的设置
sh.shardCollection('aedata.ac01_test',{'id':1,'idcard':1})
至此,应该已经可以使用了。
第五步:创建用户
如果要加上鉴权,官网说只要在mongos上操作即可,所以连上 8100,简单地添加一个用户:
use aedata
db.createUser({
user:'aedata',
pwd:'111111',
roles:[
{role:'readWrite',db:'aedata'}
]
})
这样就可以了。
再来看看副本集的鉴权配置,这次我们换到Docker环境中来弄吧,开一堆命令行窗口都晕。
1)先准备一个Docker脚本
就叫run.sh吧,让它可执行。
#!/bin/bash
docker run -d --name mongo-$1 -p $1:27017 -v /Users/yancheng/workspace/mongodb/conf:/conf mongo:3.4 -f /conf/mongod.conf
2)准备上面那个mongod.conf 配置文件
简单的写一下即可:
security:
keyFile: /conf/key-file
replication:
replSetName: rs0
3)再准备上面说的那个key-file
key-file 生成命令见官网说明
openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>
当然,你随便写一个字串也无所谓了。
4)启动第一个副本节点
启动一个副本节点32880 ,命令行执行./run.sh 32880
即可
然后我们需要用docker exec 进入容器进行副本集和用户的设置,因为我们在启动时添加了keyfile,外部暂时无法登录了,只能通过本机登录。
分别做以下几件事
4.1)初始化副本集 ,注意,因为我们是暴露端口方式,不能用缺省值,必须写清楚IP地址
rs.status()
rs.initilate({
_id:'rs0',
members:[
{_id:0,host:'192.168.40.145:32880'}
]
})
只建一个即可,以后添加可以从外部操作,没关系了。
4.2) 当前节点变成PRIMARY时,创建一个超级用户
rs0:PRIMARY> db.createUser({
user:'root',
pwd:'root',
roles:[
{role:'userAdminAnyDatabase',db:'admin'},{role:'clusterAdmin',db:'admin'}]
})
这里我添加的角色有两个,userAdminAnyDatabase,可以让root用户可以为任何数据库添加新用户,而clusterAdmin则可以为副本集添加新节点。
5)添加节点和用户
现在可以从外部操作了。用Robomongo连32880,添加副本,加上 32881,32882,(必须有3个才能选举)
rs.add({_id:1,host:'192.168.40.145:32881'})
rs.add({_id:2,host:'192.168.40.145:32882'})
然后可以创建一个普通用户
use aedata
db.createUser({
user:'aedata',
pwd:'111111',
roles:[{role:'readWrite',db:'aedata'}]
})
现在可以用aedata/111111 去操作数据库了。