Sharding

这里仅以分2片为例。

详细内容参考


环境依赖

  • MongoDB
  • 至少 6 台实体机(如果受环境限制可以使用一台实体机上部署 Docker 搭建)


创建指定路径

这里假定以下主机为候补集群。

  • 192.168.1.114
  • 192.168.1.115
  • 192.168.1.116
  • 192.168.1.117
  • 192.168.1.118
  • 192.168.1.119

为每个主机可以创建如下目录结构 [mongodbtest] 是自己指定的,下面的目录结构和位置并非官方标准的建议。

mkdir -p /data/mongodbtest/mongos/log
mkdir -p /data/mongodbtest/config/data
mkdir -p /data/mongodbtest/config/log
mkdir -p /data/mongodbtest/shard1/data
mkdir -p /data/mongodbtest/shard1/log
mkdir -p /data/mongodbtest/shard2/data
mkdir -p /data/mongodbtest/shard2/log


配置型服务器

选定至少 3 台服务器作为启动配置服务器。这里选择了 114、115、116。

可以不指定端口,没有指定的话为默认端口。

mongod --configsvr --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log --fork


路由型服务器

选定至少 1 台服务器作为路由服务器,这里选择了 119。

路由服务器需要关联上面已经启动的 3 台配置服务器,同样可以不指定端口,没有指定的话为默认端口。

mongos --configdb 192.168.1.114:21000,192.168.1.115:21000,192.168.1.116:21000 --port 20000 --logpath /data/mongodbtest/mongos/log/mongos.log --fork


配置各分片副本集

  • 因为要做两个分片,先把第一个分片对应的副本集关联起来,一共 3 台服务器。
  • 这里指定的是 114、115、116。
  • 端口依旧可以默认不写。
  • –replSet shard1 后面的名字可以自己指定,意味着 3 个副本集共同从属于第 1 个分片。
mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data  --logpath /data/mongodbtest/shard1/log/shard1.log --fork
  • 第 1 个分片关联完成后可以继续指定第 2 个分片的关联信息。
  • 这里指定的是 117 118 119。
  • 端口可以默认。
  • –replSet shard2 意味着 3 个副本集共同从属于第 2 个分片。
mongod --shardsvr --replSet shard2 --port 22001 --dbpath /data/mongodbtest/shard2/data  --logpath /data/mongodbtest/shard2/log/shard2.log --fork
  • 关联分片所有副本集的服务到这里都启动成功后,进入 114、115、116 任意一台机器进行分片 1 的配置关联。
  • 注意副本集包括一个仲裁,在配置的时候要指定出来 arbiterOnly:true
mongo --port 22001
>>> use admin
>>> config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.1.114:22001"},
                     {_id:1,host:"192.168.1.115:22001"},
                     {_id:2,host:"192.168.1.116:22001",arbiterOnly:true}
                ]
         }
>>> rs.initiate(config);
  • 上面配置完成后进入 117、118、119 任意一台机器进行分片 2 的配置关联.
  • 这里指定了 119 为仲裁,跟上面的 116 性质相同。
mongo --port 22001
>>> use admin
>>> config = { _id:"shard2", members:[
                     {_id:0,host:"192.168.1.117:22001"},
                     {_id:1,host:"192.168.1.118:22001"},
                     {_id:2,host:"192.168.1.119:22001",arbiterOnly:true}
                ]
         }
>>> rs.initiate(config);


配置 mongos

配置 mongos 关联所有分片。

  • 目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
  • 进入 119 进行分片的关联,端口 20000 是上面我们自己指定的,如果上面没有指定就写 27017。
  • 如果shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } ) 这样的命令加入,如果shard是副本集,用 db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],...]” }); 这样的格式表示。
mongo --port 20000
 
# 串联路由服务器与分配副本集1
>>> db.runCommand( { addshard : "shard1/192.168.1.113:22001,192.168.1.115:22001,192.168.1.116:22001"});
 
# 串联路由服务器与分配副本集2
>>> db.runCommand( { addshard : "shard2/192.168.1.117:22001,192.168.1.118:22001,192.168.1.119:22001"});
 
# 查看分片服务器的配置
>>> db.runCommand( { listshards : 1 } );

输出是如下的格式,每个分片副本集的仲裁节点在下面结果没有列出来。

{
         "shards" : [
                {
                        "_id" : "shard1",
                        "host" : "shard1/192.168.1.113:22001,192.168.1.115:22001"
                },
                {
                        "_id" : "shard2",
                        "host" : "shard2/192.168.1.117:22001,192.168.1.118:22001"
                }
        ],
        "ok" : 1
}
  • 最后配置 mongos 激活指定的数据库和表让上面的分片配置都生效。
  • 上面添加了两个分片,注意下面的 id 作用是指定成为片键的那个字段。
  • 根据 id 自动分片到 shard1、shard2 上面去,要这样设置是因为不是所有 mongodb 的数据库和表都需要分片。
# 指定testdb分片生效
>>> db.runCommand( { enablesharding :"testdb"});
 
#指定数据库里需要分片的集合和片键
>>> db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )

这样就完成集群分片。


FIXME

Jovi Meng 2017/09/08 07:38