mongodb 分片集群搭建
环境介绍:
10.9.21.178
10.9.21.179
10.9.21.114
1.数据分片(Shards)
用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是
一个副本集。在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。
可以将所有shard的副本集放在一个
服务器多个mongodb实例中。
sharding的每个node的database中的集合可以是分片也可以不分片,每个db都有一个
primary shard,未分片的集合就是存在其各自的primary shard中的。
2.查询路由 mongos(Query Routers)
路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的
Shard上去。mongos第一次启动或者关掉重启就会从 config server加载配置信息,以后如
果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos就能继续
准确路由。一个Sharding集群,可以有一个mongos,也可以为每个App Server配置一
个mongos以减轻路由压力,注意这里的mongos并不需要配置为rs,因为只是个路由,并不存储数据,配置多个mongos的意思是配置多个单独的mongos实例。理论上可以部署无数个mongos路由,但是要考虑到config server的压力!
3.配置服务器(Config servers)
保存集群的元数据(metadata),包含各个Shard的路由规则。3.2版本以后config server可以配置为副本集,3.4以后config server必须配置为副本集。生产上建议config server的rs至少要有3个副本集成员。
整体规划:
其中mongos 的如下(生产上需要创建多个mongos,然后借助haproxy 或者lvs做高可用):
10.9.21.114 27022
其中config server的副本集架构如下:
10.9.21.178 27018
10.9.21.179 27018
10.9.21.114 27018
分片节点(3个分片节点,都是副本集架构):
分片1 (副本集)
10.9.21.178 27019
10.9.21.179 27019
10.9.21.114 27019
分片2 (副本集)
10.9.21.178 27020
10.9.21.179 27020
10.9.21.114 27020
分片3 (副本集)
10.9.21.178 27021
10.9.21.179 27021
10.9.21.114 27021
具体搭建过程:
一:目录创建:
1.关于分片节点的目录,注意需要在114和178以及179都要创建!
1)关于27021分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/log
2)关于27020分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/log
3)关于27019分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/log
2.关于mongos的相关目录创建:
mkdir -p /data/mongodb/mongodb_sharding/mongos/config
mkdir -p /data/mongodb/mongodb_sharding/mongos/db
mkdir -p /data/mongodb/mongodb_sharding/mongos/log
3.关于config server的相关目录的创建:
mkdir -p /data/mongodb/mongodb_sharding/config_server/db
mkdir -p /data/mongodb/mongodb_sharding/config_server/log
mkdir -p /data/mongodb/mongodb_sharding/config_server/config
4.修改目录的数组
chown -R mongod.mongod /data/mongodb/mongodb_sharding/
5.创建安装mongodb软件的目录:
mkdir -p /usr/bin/percona_mongodb
chown mongod.mongo /usr/bin/percona_mongodb
二:下载mongodb的安装包;
我这里采用了percona的版本,我选择了使用.tar.gz包,解压就能用!
多实例安装的时候,建议使用.tar.gz包,清晰明了,个人感觉
https://www.percona.com/downloads/percona-server-mongodb-4.0/LATEST/
将下载好的安装包上传到服务器上,然后解压,移动到你想安装mongodb软件的目录,我这里选择了
/data/mongodb/mongodb_sharding/software/(自定义目录), 具体如下操作:
tar -xf percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz
[root@beijing-fuli-hadoop-04 mongodb]# ll
total 119428
drwxrwxr-x 3 root root 4096 Sep 2 09:13 percona-server-mongodb-4.0.12-6
-rw-r--r-- 1 root root 122286692 Dec 10 11:52 percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz
[root@beijing-fuli-hadoop-04 mongodb]# cd percona-server-mongodb-4.0.12-6
[root@beijing-fuli-hadoop-04 mongodb]#mv bin /data/mongodb/mongodb_sharding/software/
三:修改配置文件
一定注意配置项和具体值之间需要有空格例如:clusterRole: shardsvr
冒号和shardsvr之间需要有空格,不能设置成clusterRole:shardsvr !
报错:Error parsing YAML config file: yaml-cpp: error at line 18, column 4: end of map not found
1.修改分片节点的配置文件
如下文件是27019的分片节点的mongodb的配置文件
然后依次copy对应的别的端口的对应目录下,并且修改相关内容
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27020/
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27021/
需要修改1.端口,2.副本集的名字,3.相关目录,因为我的都是以(ip+端口)来区分的,所以可以直接批量替换:
sed -i 's/27019/27020/g' /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf
sed -i 's/27019/27021/g' /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf
然后copy到各个机器对应目录下:
scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf mongod@10.9.21.179`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf mongod@10.9.21.179`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf mongod@10.9.21.179`pwd`
2.修改config server的配置文件,它与mongodbf副本集的区别是 clusterRole: configsvr和replSetName:configserver27018,同时修改路径和端口号;
然后依次scp到别的机器上的特定目录下
scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf mongod@10.9.21.179`pwd`
3.修改mongos的配置文件:
四:生成秘钥文件
注意这个mongodb.key文件需要copy到mongodb mongos 以及config server的对应目录中,并且权限需要保证为600!我的这次安装percona mongodb 4.0版本需要先不开启验证,也就是你可以在你搭建好整个架构后再生成key文件!
[root@beijing-fuli-hadoop-02 mongodb]# openssl rand -base64 756 >/data/mongodb/config/mongodb.key
需要保证mongodb.key的权限为 600,否则启动会报错:
permissions on /export/mongodb/keyfile are too open
这是因为mongo key文件权限过大造成的 !
具体关于file key的相关操作如下(只演示了21.114机器上的操作):
1.生成file key
[mongod@beijing-fuli-hadoop-04 config]$ openssl rand -base64 756 >/data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key
2.复制file key到mongodb的27020和27021对应目录下:
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key
3.复制file key到mongos的对应目录下:
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongos/config/mongodb.key
4.复制file key到config server的对应目录下:
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
5.修改文件的权限:
chmod 600 /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key
chmod 600 /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key
chmod 600 /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key
chmod 600 /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
chmod 600 /data/mongodb/mongodb_sharding/mongos/config/mongodb.key
6.把file key传给其余机器;
scp mongodb.key mongod@10.9.21.179:`pwd`
scp mongodb.key mongod@10.9.21.178:`pwd`
然后再在21.178和21.179上的操作和之前21.114上一样;
五:启动服务:
启动之前最好先注释安全验证相关的参数,mongod、mongos、以及config server都注释掉,最后搭建成功再把注释去掉
5.1:启动mongodb实例(在在21.144和178以及179都启动来之后然后再启动config server)
这里我的shard节点是副本集的结构,所以需要初始化成副本集!
/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf
/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf
/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf
注意:
percona 4.0.12 的版本需要首先把安全的参数注释,否则你会报错:
requires authentication而无法进行任何操作
!新版本的MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员,percona 3.4版本以及社
区版本的4.0版本就不需要保证有一个管理员账号就可以初始化成功!
#security:
# keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
# authorization: enabled
初始化成副本集(先启动的就是主节点)如下是三个副本集节点的初始化命令:
rs.initiate({_id:'s1092111427019',members: [{ _id: 0 , host: "10.9.21.178:27019"},{ _id: 1 , host: "10.9.21.179:27019"},{ _id: 2 , host: "10.9.21.114:27019"}]})
rs.initiate({_id:'s1092111427020',members: [{ _id: 0 , host: "10.9.21.178:27020"},{ _id: 1 , host: "10.9.21.179:27020"},{ _id: 2 , host: "10.9.21.114:27020"}]})
rs.initiate({_id:'s1092111427021',members: [{ _id: 0 , host: "10.9.21.178:27021"},{ _id: 1 , host: "10.9.21.179:27021"},{ _id: 2 , host: "10.9.21.114:27021"}]})
创建管理员账号:
use admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.2:启动config server 副本集实例:
/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/config_server/config/mongod.conf
初始化副本集,也需要先关闭安全验证相关的参数!
rs.initiate({_id:'configserver27018',members: [{ _id: 0 , host: "10.9.21.178:27018"},{ _id: 1 , host: "10.9.21.179:27018"},{ _id: 2 , host: "10.9.21.114:27018"}]})
5.3:启动mongos 实例,并添加分片节点:
/data/mongodb/mongodb_sharding/software/bin/mongos -f /data/mongodb/mongodb_sharding/mongos/config/mongod.conf
5.3.1.登录mongos
/data/mongodb/mongodb_sharding/software/bin/mongo --port=27017 --host=10.9.21.114
5.3.2 添加副本集分片:
sh.addShard('s1092111427019/10.9.21.114:27019,10.9.21.179:27019,10.9.21.178:27019')
sh.addShard('s1092111427020/10.9.21.114:27020,10.9.21.179:27020,10.9.21.178:27020')
sh.addShard('s1092111427021/10.9.21.114:27021,10.9.21.179:27021,10.9.21.178:27021')
5.3.3 创建管理员账号:
use admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.3.4最后把所有的shard、config server、以及mongos配置中都开启验证,也就是把注释去掉
然后启动服务:
security:
keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
authorization: enabled
六:操作验证:
创建库 liuhe
mongos> use liuhe
switched to db liuhe
数据库启动分片,这样才能对数据库liuhe下的集合做分片!
mongos> sh.enableSharding("liuhe");
查看分片状态:可以看到liuhe这个库的主分片是
s1092111427021,当你创建的没有分片的集合的时候,就会创建到s1092111427021分片上!注意:主分片与副本集中的主节点不同:主分片指的是组成分片的整个副本集(当然如果你的分片是个单点的那么他就是单个的mongodb)。而副本集中的主节点是指副本集中能够处理写请求的单台服务器
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5df6063235d6298affb1bc49")
}
shards:
{ "_id" : "s1092111427019", "host" : "s1092111427019/10.9.21.114:27019,10.9.21.178:27019,10.9.21.179:27019", "state" : 1 }
{ "_id" : "s1092111427020", "host" : "s1092111427020/10.9.21.114:27020,10.9.21.178:27020,10.9.21.179:27020", "state" : 1 }
{ "_id" : "s1092111427021", "host" : "s1092111427021/10.9.21.114:27021,10.9.21.178:27021,10.9.21.179:27021", "state" : 1 }
active mongoses:
"4.0.12-6" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
s1092111427019 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : s1092111427019 Timestamp(1, 0)
{ "_id" : "he", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("3e8f2fda-d08c-43be-a0ab-0e2031afc183"), "lastMod" : 1 } }
{ "_id" : "liuhe", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"), "lastMod" : 1 } }
{ "_id" : "liuwenhe", "primary" : "s1092111427020", "partitioned" : true, "version" : { "uuid" : UUID("af30c5bd-9389-482f-95f9-fbb0438baa21"), "lastMod" : 1 } }
创建集合并开启分片过程:
1.创建数据库,直接use 即可,没有的话,如果你创建集合了,他就自动创建了!
use liuwenhe
2.插入数据,如果hezi集合不存在,则自动创建
for (var i = 0; i < 100; i++) { db.hezi.insert({name: i}); }
3.为hezi集合的id列添加索引,因为如果要以name列作为分片键,需要有索引;
如果集合是空的,可以不创建索引直接进行下一步的分片,会自动创建索引;如果集合不为空,必须为分片建创建索引才行!,如果你要以hash规则分片,需要先创建hash索引!
mongos> db.hezi.createIndex({"name":1})
mongos> db.hh.createIndex({name:'hashed'}); 创建hash索引
4.为数据库开启分片:
mongos> sh.enableSharding("liuwenhe");
5.开启集合hezi的分片!
1:升序,-1降序,hashed:哈希分布
sh.shardCollection("liuwenhe.hezi",{name:1}) ----基于值的分片
sh.shardCollection("liuwenhe.hezi", { "name" : "hashed" }) ----hash规则分片
6.查看集合是否开启分片:
mongos> db.hezi.stats().sharded
true
7.sh.status() 查看分片的信息:
可以看到liuhe库的主分片是s1092111427021,然后liuhe.hezi这个集合的分片键是name列升序,liuhe.hezi这个集合目前就1个chunk,在s1092111427021节点上,所以这个时候你去别的节点,例如s1092111427020上看,是没有这个库和这个集合的,当你向liuhe.hezi插入数据,直到触发发生chunk迁移之后,这时候在别的分片才会有可能有这个集合!
mongos>sh.status()
{ "_id" : "liuwehehe", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"), "lastMod" : 1 } }
liuwenhe.hezi
shard key: { "name" : 1 }
unique: true
balancing: true
chunks:
s1092111427021 1
{ "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : s1092111427021 Timestamp(1, 0)
8.当数据超过1个chunk之后,均匀分布在多个节点上,如下所示:
不断插入数据,直到触发chunk迁移:
for (var i = 0; i < 1000000000000000; i++) { db.hezi.insert({name: i}); }
不断查看分片集群状态:
mongos>sh.status()
liuwenhe.hezi
shard key: { "name" : 1 }
unique: false
balancing: true
chunks:
s1092111427019 20
s1092111427020 19
s1092111427021 20
至此生产标准的分片架构搭建完毕。。。。