05. 部署 MongoDB 分片集群
2020-06-16 本文已影响0人
闫军辉
简介
复制集仅仅解决了高可用和数据安全的痛点, 整个架构的写入性能会局限于主节点, 而且单个副本集限制在12节点以内, 当业务发展到一定规模, 终将到达副本集的天花板,再加上垂直扩展的成本考虑, 就有了基于副本集之上构建了一个支持横向扩展的分片集群架构.
分片集群是将数据"均匀"的分布到各个数据节点, 会根据请求数据所处节点来调度所有的读写操作, 因此, 不再有任何一个节点会成为整个集群的瓶颈. 当然, 与复制集相对比, 分片集群要更复杂.
为保证最低限度的高可用和数据安全, 生产环境给出如下建议:
- 至少要有 3 个或以上
Config
节点, 以保证所有的数据分片信息的数据安全 - 至少要有 2 个或以上
Shard
节点, 以保证所有分片数据的冗余安全 - 每一个
Shard
节点, 均由 一个三成员的复制集构成 - 至少要有 2 个或以上
Mongos
节点, 以保证路由调度的性能和高可用 - 以上节点均需单独部署, 以避免各服务互相抢占资源,导致性能无法满足需求
满足以上条件, 那我们至少需要 3(Config
) + 3(Replication
)*2(Shard
) + 2(Mongos
) = 11 台机器
当然为了控制成本, 在满足性能需求的前提下, 也可以有选择的将以上服务共同部署
架构规划
在开始之前一定要把各服务器信息汇总一个表格, 做好规划, 然后按照表格信息去配置服务器
计算机名 | IP | 角色 | replSetName |
---|---|---|---|
shard-01_01 | 192.168.31.201 | shard 成员一 节点一 | replData_01 |
shard-01_02 | 192.168.31.202 | shard 成员一 节点二 | |
shard-01_03 | 192.168.31.203 | shard 成员一 节点三 | |
shard-02_01 | 192.168.31.204 | shard 成员二 节点一 | replData_02 |
shard-02_02 | 192.168.31.205 | shard 成员二 节点二 | |
shard-02_03 | 192.168.31.206 | shard 成员二 节点三 | |
mongos-01 | 192.168.31.207 | mongos 节点一 | |
mongos-02 | 192.168.31.208 | mongos 节点二 | |
config-01 | 192.168.31.209 | config 节点一 | replConfig |
config-02 | 192.168.31.210 | config 节点二 | |
config-03 | 192.168.31.211 | config 节点三 |
部署 Shard
根据 04. 副本集 配置两组副本集作为两个 Shard 成员, 注意区分两组 Shard 的 replSetName
我们分别把 replSetName
设置为 replData_01
和 replData_02
Shard成员中每个Mongod实例, 需要增加以下配置, 以支持分片集群
sharding:
clusterRole: shardsvr
部署 Config
根据 04. 副本集 配置一组 Config
, 注意设置 Config
的 replSetName
, 我们这里设置为 replConfig
Config
的复制集 初始化参数需要增加 configsvr: true
.
rs.initiate(
{
_id: "replConfig",
version: 1,
configsvr: true,
members: [
{_id:0,host:"192.168.31.209:27017"},
{_id:1,host:"192.168.31.210:27017"},
{_id:2,host:"192.168.31.211:27017"}
]
});
部署 Mongos
- 安装
Mongos
服务
rpm -ivh https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.2/x86_64/RPMS/mongodb-org-mongos-4.2.6-1.el6.x86_64.rpm
- 配置
创建 /data/mongodb/mongos.conf
文件, 配置内容如下
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongos.log
security:
keyFile: /data/mongodb/mongo.key //config 复制集的Key
replication:
localPingThresholdMs: 10
# network interfaces
net:
port: 27000
bindIp: 0.0.0.0
sharding:
configDB: replConfig/192.168.31.209:27017,192.168.31.210:27017,192.168.31.211:27017
# Config 复制集各节点信息
- 启动 Mongos
nohup /usr/bin/mongos -f /data/mongodb/mongos.conf >/dev/null 2>&1 &
- 添加分片成员
use admin;
db.auth("root", "123456")
sh.addShard("replData_01/192.168.31.201:27017,192.168.31.202:27017,192.168.31.203:27017");
sh.addShard("replData_02/192.168.31.204:27017,192.168.31.205:27017,192.168.31.206:27017");
- 查看状态
sh.status();
集群状态信息
测试
use admin;
db.auth("root", "123456");
use sdb;
sh.enableSharding("sdb")
db.number.insert({"n":0,"name":"张三"});
db.number.ensureIndex({"n":1})
sh.shardCollection("sdb.number",{"n":1})
var arr=[];
for(var i=0;i<100000;i++){
var name = "name_" + i
arr.push({"n":i,"name":name});
}
db.number.insertMany(arr);
这时候, 我们可以另外开一个终端实时查看分片状态
use admin;
db.auth("root", "123456");
sh.status();
分片实时状态