本文旨在搭建一个2分片的分片集群

环境要求:3台 Linux 虚拟机(推荐4核8G)

准备工作

配置域名解析

image

在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的自动均衡机制。