本文旨在搭建一个2分片的分片集群
环境要求:3台 Linux 虚拟机(推荐4核8G)
准备工作
配置域名解析
在3台虚拟机上分别执行以下3条命令,注意替换实际 IP 地址
echo "192.168.1.25 demo1 member1.sunce.wang member2.sunce.wang" >> /etc/hosts
echo "192.168.1.26 demo2 member3.sunce.wang member4.sunce.wang" >> /etc/hosts
echo "192.168.1.27 demo3 member5.sunce.wang member6.sunce.wang" >> /etc/hosts
准备分片目录
在各服务器上创建数据目录,我们使用 /data
,请按自己需要修改为其他目录
- 在member1 / member3 / member5 上执行以下命令:
mkdir -p /data/shard1/
mkdir -p /data/config/
- 在member2 / member4 / member6 上执行以下命令:
mkdir -p /data/shard2/
mkdir -p /data/mongos/
搭建分片
搭建shard1
- 在
member1
/member3
/member5
上执行以下命令。
mongod --bind_ip 0.0.0.0 --replSet shard1 --dbpath /data/shard1 --logpath /data/shard1/mongod.log --port 27010 --fork --shardsvr --wiredTigerCacheSizeGB 1
参数说明:
-
shardsvr : 表示这不是一个普通的复制集,而是分片集的一部分
-
wiredTigerCacheSizeGB:该参数表示MongoDB能够使用的缓存大小。默认值为 `(RAM - 1GB) / 2
-
bind_ip: 生产环境中强烈建议不要绑定外网IP,此处为了方便演示绑定了所有IP地址。类似的道理,生产环境中应开启认证
--auth
,此处为演示方便并未使用 -
fork:后台启动
-
replSet: 复制集名称
-
dbpath:数据目录
-
logpath:日志目录
用这三个实例搭建shard1复制集:
- 任意连接到一个实例,例如我们连接到
member1.sunce.wang
:
mongo --host member1.sunce.wang:27010
- 初始化
shard1
复制集。我们使用如下配置初始化复制集:
rs.initiate({
_id: "shard1",
"members" : [
{
"_id": 0,
"host" : "member1.sunce.wang:27010"
},
{
"_id": 1,
"host" : "member3.sunce.wang:27010"
},
{
"_id": 2,
"host" : "member5.sunce.wang:27010"
}
]
});
搭建config
与 shard1
类似的方式,我们可以搭建 config
服务器。在 member1
/member3
/member5
上执行以下命令:
- 运行
config
实例
mongod --bind_ip 0.0.0.0 --replSet config --dbpath /data/config --logpath /data/config/mongod.log --port 27019 --fork --configsvr --wiredTigerCacheSizeGB 1
- 连接到
member1
:
mongo --host member1.sunce.wang:27019
- 初始化
config
复制集:
rs.initiate({
_id: "config",
"members" : [
{
"_id": 0,
"host" : "member1.sunce.wang:27019"
},
{
"_id": 1,
"host" : "member3.sunce.wang:27019"
},
{
"_id": 2,
"host" : "member5.sunce.wang:27019"
}
]
});
搭建mongos
mongos的搭建比较简单,我们在 member2
/member4
/member6
上搭建3个mongos。注意以下参数:
-
configdb
: 表示config使用的集群地址; -
运行mongos进程:
mongos --bind_ip 0.0.0.0 --logpath /data/mongos/mongos.log --port 27017 --configdb config/member1.sunce.wang:27019,member3.sunce.wang:27019,member5.sunce.wang:27019 --fork
- 连接到任意一个mongos,此处我们使用
member1
mongo --host member1.sunce.wang:27017
- 将
shard1
加入到集群中
sh.addShard("shard1/member1.sunce.wang:27010,member3.sunce.wang:27010,member5.sunce.wang:27010");
测试分片集
上述示例中我们搭建了一个只有1个分片的分片集。在继续之前我们先来测试一下这个分片集。
- 连接到分片集
mongo --host member1.sunce.wang:27017
sh.status();
- 创建一个分片表:
sh.enableSharding("foo");
sh.shardCollection("foo.bar", {_id: 'hashed'});
sh.status();
- 任意写入若干数据
use foo
for (var i = 0; i < 10000; i++) {
db.bar.insert({i: i});
}
向分片集加入新的分片
下面我们搭建 shard2
并将其加入分片集中,观察发生的效果。
使用类似 shard1
的方式搭建 shard2
。在 member2
/member4
/member6
上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet shard2 --dbpath /data/shard2 --logpath /data/shard2/mongod.log --port 27011 --fork --shardsvr --wiredTigerCacheSizeGB 1
用这三个实例搭建 shard2
复制集:
- 任意连接到一个实例,例如我们连接到
member2.sunce.wang
:
mongo --host member2.msb.com:27011
- 初始化
shard2
复制集。我们使用如下配置初始化复制集
rs.initiate({
_id: "shard2",
"members" : [
{
"_id": 0,
"host" : "member2.sunce.wang:27011"
},
{
"_id": 1,
"host" : "member4.sunce.wang:27011"
},
{
"_id": 2,
"host" : "member6.sunce.wang:27011"
}
]
});
- 连接到任意一个mongos。此处使用
member1
:
mongo --host member1.sunce.wang:27017
- 将
shard2
加入到集群中:
sh.addShard("shard2/member2.sunce.wang:27011,member4.sunce.wang:27011,member6.sunce.wang:27011");
- 观察
sh.status()
:
sh.status();
可以发现原本 shard1
上的两个chunk被均衡到了 shard2
上,这就是MongoDB的自动均衡机制。
- 本文链接: https://www.sunce.wang/archives/mongodb-fen-pian-ji-qun-da-jian
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!