MongoDB分片
主机 |
ip |
服务和端口 |
mydb1 |
192.168.1.101 |
Shard1 master 7001 |
Shard2 slave 7002 |
||
Shard3 slave 7003 |
||
Config Server 27001 |
||
mongos 37001 |
||
mydb2 |
192.168.1.102 |
Shard1 slave 7001 |
Shard2 master 7002 |
||
Shard3 slave 7003 |
||
Config Server 27001 |
||
mongos 37001 |
||
mydb3 |
192.168.1.103 |
Shard1 slave 7001 |
Shard2 slave 7002 |
||
Shard3 master 7003 |
||
Config Server 27001 |
||
mongos 37001 |
1、创建三个复制集
安装略
以复制集模式启动
三个副本集分别取名为shard1、shard2和shard3,每台机器需要使用不同端口启动三个MongoDB实例
使用命令:
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7001/mongodb.config
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7002/mongodb.config
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7003/mongodb.config
注意参数,注意端口
# cat mongodb.config
fork=true
port=7001
quiet=true
dbpath=/app/mongodb/7001/db
logpath=/app/mongodb/7001/log/mongodb.log
logappend=true
journal=true
directoryperdb=true
wiredTigerDirectoryForIndexes=true
maxConns=65535
profile=1
slowms=500
replSet=shard1 #指定副本集
oplogSize=40960
storageEngine=wiredTiger
wiredTigerCacheSizeGB=1
wiredTigerCollectionBlockCompressor=snappy
shardsvr=true #配置节点角色(>=3.4 shard节点专用)
#configsvr=true #指定config节点角色(>=3.4 config节点专用)
#configdb=MSCHOST #指定config
#keyFile=/app/mongodb/7001/keyFile
setParameter=enableLocalhostAuthBypass=1
初始化复制集
mydb1登录到mongo客户端初始化shard1副本集,使用命令如下:
# /usr/local/mongodb/bin/mongo --port 7001
进入mongos>后输入
>rs.initiate()
>rs.add("192.168.1.102:7001")
>rs.add("192.168.1.103:7001")
mydb2登录到mongo客户端初始化shard2副本集,使用命令如下:
# /usr/local/mongodb/bin/mongo --port 7002
进入mongos>后输入
>rs.initiate()
>rs.add("192.168.1.101:7002")
>rs.add("192.168.1.103:7002")
mydb3登录到mongo客户端初始化shard3副本集,使用命令如下:
# /usr/local/mongodb/bin/mongo --port 7003
进入mongos>后输入
>rs.initiate()
>rs.add("192.168.1.101:7003")
>rs.add("192.168.1.102:7003")
rs.status();
2、创建分片需要的Config Server,Route Process
启动Config Server,Route Process
mydb1使用命令启动Config Server:
# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config
mydb2使用命令启动Config Server:
# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config
mydb3使用命令启动Config Server:
# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config
注意参数,注意端口
# cat mongodb.config
fork=true
port=27001
quiet=true
dbpath=/app/mongodb/27001/db
logpath=/app/mongodb/27001/log/mongodb.log
logappend=true
journal=true
directoryperdb=true
wiredTigerDirectoryForIndexes=true
maxConns=65535
profile=1
slowms=500
replSet=configReplSet #指定副本集
oplogSize=40960
storageEngine=wiredTiger
wiredTigerCacheSizeGB=1
wiredTigerCollectionBlockCompressor=snappy
#shardsvr=true #配置节点角色(>=3.4 shard节点专用)
configsvr=true #指定config节点角色(>=3.4 config节点专用)
#configdb=MSCHOST #指定config
#keyFile=/app/mongodb/27001/keyFile
setParameter=enableLocalhostAuthBypass=1
因为MongoDB 3.4版本多个Config Server必须要以副本集的形式才能添加,所以mydb1登录到mongo客户端初始化config副本集,使用命令如下:
# /usr/local/mongodb/bin/mongo --port 27001
进入mongos>后输入
>rs.initiate()
>rs.add("192.168.1.102:27001")
>rs.add("192.168.1.103:27001")
mydb1使用命令启动mongos:
# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config
mydb2使用命令启动mongos:
# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config
mydb3使用命令启动mongos:
# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config
注意参数,注意端口
# cat mongodb.config
fork=true
port=37001
quiet=true
logpath=/app/mongodb/37001/log/mongodb.log
logappend=true
configdb=configReplSet/192.168.1.101:27001,192.168.1.102:27001,192.168.1.103:27001
#keyFile=/app/mongodb/37001/keyFile
setParameter=enableLocalhostAuthBypass=1
3、配置分片
配置分片也就是把复制集添加为分片节点,这是分片+副本集区别与分片集群的重要步骤,在其中一台机子中进入mongos>执行配置命令,使用命令如下:
# /usr/local/mongodb/bin/mongo --port 37001
进入mongos>后输入
>use admin
>db.runCommand({addshard:"shard1/mydb1:7001,192.168.1.102:7001,192.168.1.103:7001" })
>db.runCommand({addshard:"shard2/192.168.1.101:7002,mydb2:7002,192.168.1.103:7002" })
>db.runCommand({addshard:"shard3/192.168.1.101:7003,192.168.1.102:7003,mydb3:7003" })
添加成功后输出信息为:
{ "shardAdded" : "shard1", "ok" : 1 }
{ "shardAdded" : "shard2", "ok" : 1 }
{ "shardAdded" : "shard3", "ok" : 1 }
注意shard1和shard2以及shard3分别对应我们上面创建的三个复制集中创建的副本集名称以及下属的name。需要注意的是name中ip与主机名不能自动识别替换,所以name要与副本集中rs.status()命令查看的一致,具体的名称可以用如下命令查看:
# /usr/local/mongodb/bin/mongo --port 7001
# /usr/local/mongodb/bin/mongo --port 7002
# /usr/local/mongodb/bin/mongo --port 7003
进入PRIMARY>
输入命令
>rs.status()
4、对数据库mytest启用分片
在任意机子中进入mongos,比如在mydb1机子中使用命令:
# /usr/local/mongodb/bin/mongo --port 37001
然后切换到admin数据库,对mytset数据库设置分片,因为MongoDB中的数据库都会自动创建,所以我们这里不需要先新建mytest数据库。
>use admin
>sh.enableSharding("mytest")
5、集合启用分片
对数据库mytest中的集合student启用分片,设置片键。
在任意机子中进入mongos,比如在mydb1机子中使用命令:
# /usr/local/mongodb/bin/mongo --port 37001
对mytest数据库中的student集合启用分片和设置片键,因为MongoDB中的集合会自动创建,所以我们这里不需要先新建student集合。
区间片键方式
把mytest数据库student集合的_id字段设置为区间片键,使用命令:
>sh.shardCollection( "mytest.student", { _id:1 } )
哈希片键方式
把mytest数据库teacher集合的_id字段设置为哈希片键,使用命令:
>sh.shardCollection( "mytest.teacher", { _id: "hashed" } )
6、分片集群插入数据测试
在mongos>中使用命令:
>use mytest
>for(var i=1; i<=60000; i++) db.student.insert({age:i,name:"marry",addr:"bj",country:"China"})
>for(var i=1; i<=60000; i++) db.teacher.insert({age:i,name:"allen",addr:"sh",country:"China"})
执行可能需要一小会时间,我们直接在工具中查看config集合中的chunks元数据信息,就可以看到随着数据的写入分了多少片,以及片键的最小到最大的范围。
3个shard服务器里可以看到都有了mytest数据库以及student,teacher集合。
7、增加安全认证机制KeyFile,集群添加用户
将keyFile复制到其他机器上,shard,configserver,mongos都要做
配置文件加keyFile部分
在mongos>中使用命令:
>use admin
>db.createUser(
{
user: "root",
pwd: "abc123",
roles: [ { role: "root", db: "admin" } ]
}
)
>use mytest
>db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "mytest" },
{ role: "read", db: "reporting" } ]
}
)
重启
8、集群管理
启动时先启动Config Server
# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config
再启动shard节点
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7001/mongodb.config
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7002/mongodb.config
# /usr/local/mongodb/bin/mongod -f /app/mongodb/7003/mongodb.config
最后启动mongos
# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config
客户端连接
# /usr/local/mongodb/bin/mongo 192.168.1.101:37001/admin -u root -p abc123
# /usr/local/mongodb/bin/mongo 192.168.1.101:37001/mytest -u myTester -p xyz123
分片键:手动分片,自动分片
以范围为基础的分片
基于哈希的分片
片键的选择决定了三个重要的方面:
- 读和写的分布
- 数据块的大小
- 每个查询命中的分片数目
数据均衡的维护:
分裂
均衡
在集群中增加或者删除分片
https://www.cnblogs.com/littleatp/p/8563273.html
https://www.cnblogs.com/vadim/p/7100683.html