MongoDB分布式分片集群部署与架构设计
MongoDB分片集群(架构简介):
- config server必须为复制集,但是不支持Arbiter仲裁者。
Config server:
- 存储集群所有节点、分片数据路由信息。默认需要配置3个 Config Server节点。
Mongos:
- 提供对外应用访问,所有操作均通过 mongos执行。一般有多个 mongos节点。数据迁移和数据自动平衡。
Mongod:
- 存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。
默认分片规则:
初始1个chunk
缺省chunk大小:64MB
MongoDB:自动拆分并迁移chunk默认是在存储数据时先在第一个节点开辟一个chunk开始存数据,当存满了以后会分裂出一个新的chunk继续存储。
在MongoDB空闲时,均衡器(balancer)会自动把第一个节点的数据进行对所有节点平均分配,也就是迁移chunk。
MongoDB自动迁移chunk块图:
范围分片:
1)必须为分片 collection定义分片键。
2)基于一个或多个列(类似一个索引)。
3)分片键定义数据空间。
4)想象 key space类似一条线上一个点数据。
5)一个 key range是一条线上一段数据。
6)我们可以按照分片键进行Range和Hash分片。
本次部署分片集群环境:
MongoDB分片集群(部署):
环境:
hostnamectl set-hostname mongodb-01 #data01数据集
hostnamectl set-hostname mongodb-02 #data02数据集
hostnamectl set-hostname mongodb-03 #configserver信息数据集
hostnamectl set-hostname mongos #用于连接使用配置数据集
地址:(所有节点)
cat >>/etc/hosts<<EOF
10.0.0.10 mongodb-01
10.0.0.20 mongodb-02
10.0.0.30 mongodb-03
10.0.0.40 mongos
EOF
- 每个节点安装三个实例,3个节点9个实例做成3个集群。
- 每个节点拿出两个实例做两个一主一从一仲裁的集群环境
- 另外一个实例做为config server,做一主两从集群环境
data01分片集群配置:(其他实例根据实例端口修改监听端口)(mongodb-01节点)
systemLog:
destination: file
path: "/mongodb/28017/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/28017/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.10
port: 28017
replication:
oplogSizeMB: 2048
replSetName: data01
sharding:
clusterRole: shardsvr
data02分片集群配置:(其他实例根据实例端口修改监听端口)(mongodb-02节点)
systemLog:
destination: file
path: "/mongodb/28017/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/28017/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.20
port: 28017
replication:
oplogSizeMB: 2048
replSetName: data02
sharding:
clusterRole: shardsvr
configserver集群配置:(其他实例根据实例端口修改监听端口)(mongodb-03节点)
systemLog:
destination: file
path: "/mongodb/28017/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/28017/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.30
port: 28017
replication:
oplogSizeMB: 2048
replSetName: configserver
sharding:
clusterRole: configsvr
重启多实例:(所有节点)
systemctl restart mongodb-28017
systemctl restart mongodb-28018
systemctl restart mongodb-28019
最终多实例环境为:
data01构建复制集群:(mongodb-01节点)
mongo --port 28017 10.0.0.10
config = {_id: 'data01', members: [
{_id: 0,host: '10.0.0.10:28017'},
{_id: 1,host: '10.0.0.10:28018'},
{_id: 2,host: '10.0.0.10:28019'}, "arbiterOnly": true]
}
rs.initiate(config)
data02构建复制集群:(mongodb-02节点)mongo --port 28017 10.0.0.20
config = {_id: 'data02', members: [
{_id: 0,host: '10.0.0.20:28017'},
{_id: 1,host: '10.0.0.20:28018'},
{_id: 2,host: '10.0.0.20:28019'}, "arbiterOnly": true]
}
rs.initiate(config)
configserver构建复制集群:(mongodb-03节点)mongo --port 28017 10.0.0.30
config = {_id: 'configserver', members: [
{_id: 0,host: '10.0.0.30:28017'},
{_id: 1,host: '10.0.0.30:28018'},
{_id: 2,host: '10.0.0.30:28019'}]
}
rs.initiate(config)
此时,每个节点都是一个复制集群:--------------------------------------------------------------------
配置mongs:(mongos节点)vim /mongodb/conf/mongos.conf
就是默认安装MongoDB后配置文件写成mongos需要的文件
#configDB的复制集名称要和配置的复制集名称一致,IP地址逗号也不能有空格。否者报错(注意!!!)
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"
logAppend: true
net:
bindIp: 10.0.0.40
port: 28017
sharding:
configDB: configserver/10.0.0.30:28017,10.0.0.30:28018,10.0.0.30:28019
processManagement:
fork: true
启动mongos并连接configsvr:/mongodb/bin/mongos -f /mongodb/conf/mongos.conf
echo '/mongodb/bin/mongos -f /mongodb/conf/mongos.conf' >>/etc/rc.local
连接到mongs的admin数据库:
#管理mongodb需要进入admin验证库
su - mongod
mongo 10.0.0.40:28017/admin
添加数据节点到分片集群中:
#data01是复制集名称
sh.addShard("data01/10.0.0.10:28017,10.0.0.10:28018,10.0.0.10:28019")
sh.addShard("data02/10.0.0.20:28017,10.0.0.20:28018,10.0.0.20:28019")
检查复制集添加状态:
#不显示数据节点的仲裁者节点
db.runCommand( { listshards : 1 } )
---------------------------------------------------------
{
"shards" : [
{
"_id" : "data01",
"host" : "data01/10.0.0.10:28017,10.0.0.10:28018",
"state" : 1
},
{
"_id" : "data02",
"host" : "data02/10.0.0.20:28017,10.0.0.20:28018",
"state" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1551278902, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1551278902, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
显示详细集群状态信息:
sh.status()
---------------------------------------------------------
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5c7650b39f3c1a902392b07d")
}
shards:
{ "_id" : "data01", "host" : "data01/10.0.0.10:28017,10.0.0.10:28018", "state" : 1 }
{ "_id" : "data02", "host" : "data02/10.0.0.20:28017,10.0.0.20:28018", "state" : 1 }
active mongoses:
"3.6.10" : 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
MongoDB分片集群(管理分片):
配置分片键策略:--------------------------------------------------------------------------(范围分片)
对olda库下的student表进行范围分片
进入mongos连接:(mongos节点)
su - mongod
mongo 10.0.0.40:28017/admin
激活数据库分片功能:(mongos节点)
#'指定olda库开启分片功能
use admin
db.runCommand( { enablesharding : "olda" } )
指定表名创建索引:(mongos节点)
#'以id列为索引(范围索引)(例如1..100)
use olda
db.student.ensureIndex( { id: 1 } )
开启分片:(mongos节点)
#'对olda库下的student表开始分片
use admin
db.runCommand( { shardcollection : "olda.student",key : {id: 1} } )
集群分片测试:(mongos节点)
#插入10万条数据到student表
use olda
for(i=1;i<100000;i++){ db.student.insert({"id":i,"name":"olda","age":20,"date":new Date()}); }
在data的某一个复制集中:(data节点,具体哪个不一定)
#mongo --port 28018 10.0.0.10 或 mongo --port 28018 10.0.0.20
#当前才插入了19万行数据
use olda
db.student.count()
#'191553
配置分片键策略:--------------------------------------------------------------------------(哈希分片)
对oldb库下的student表进行哈希分片
进入mongos连接:(mongos节点)
su - mongod
mongo 10.0.0.40:28017/admin
激活数据库分片功能:(mongos节点)
#'指定oldb库开启分片功能
use admin
db.runCommand( { enablesharding : "oldb" } )
开启分片功能:(mongos节点)
#'对oldb库下的student表开始分片
use oldb
sh.shardCollection( "oldb.student", { id: "hashed" } )
集群分片测试:(mongos节点)
#插入10万条数据到student表
use oldb
for(i=1;i<100000;i++){ db.student.insert({"id":i,"name":"oldb","age":21,"date":new Date()}); }
在data的某一个复制集中:(data节点,具体哪个不一定)
#mongo --port 28018 10.0.0.10 或 mongo --port 28018 10.0.0.20
#当前才插入了19万行数据
use oldb
db.student.count()
#'191553
检查是否为shard集群:(mongos节点)db.runCommand({ isdbgrid : 1})
列出开启分片的数据库:(mongos节点)
use config
db.databases.find( { "partitioned": true } ) 或者 db.databases.find()
查看分片的片键:(mongos节点)db.collections.find().pretty()
查看分片的详细信息:(mongos节点)
use admin
db.printShardingStatus() 或者 sh.status()
查看blancer是否在工作:(mongos节点)sh.getBalancerState()
添加数据节点到分片集群中:(mongos节点)sh.addShard("data02/10.0.0.20:28017,10.0.0.20:28018,10.0.0.20:28019")
删数集群数据节点(谨慎):(mongos节点)db.runCommand( { removeShard: "data02" } )
databases.find( { “partitioned”: true } ) 或者 db.databases.find()
**查看分片的片键:**(mongos节点)
`db.collections.find().pretty()`
**查看分片的详细信息:**(mongos节点)
```shell
use admin
db.printShardingStatus() 或者 sh.status()
查看blancer是否在工作:(mongos节点)sh.getBalancerState()
添加数据节点到分片集群中:(mongos节点)sh.addShard("data02/10.0.0.20:28017,10.0.0.20:28018,10.0.0.20:28019")
删数集群数据节点(谨慎):(mongos节点)db.runCommand( { removeShard: "data02" } )
注意:删除操作一定会立即触发blancer。