在docker上部署mongodb分布式分片副本集群

dhso
2017/12/26 23:01
统计中

使用 Sharded cluster 时,通常是要解决如下2个问题

  1. 存储容量受单机限制,即磁盘资源遭遇瓶颈。
  1. 读写能力受单机限制(读能力也可以在复制集里加 secondary 节点来扩展),可能是 CPU、内存或者网卡等资源遭遇瓶颈,导致读写能力无法扩展。

Sharded模式图

创建3个配置服务(configsvr)

docker run -d -p 40001:40001 --privileged=true -v cnf40001:/data/db --name cnf_c1 mongo:latest --configsvr --port 40001 --dbpath /data/db --replSet crs

docker run -d -p 40002:40002 --privileged=true -v cnf40002:/data/db --name cnf_c2 mongo:latest --configsvr --port 40002 --dbpath /data/db --replSet crs

docker run -d -p 40003:40003 --privileged=true -v cnf40003:/data/db --name cnf_c3 mongo:latest --configsvr --port 40003 --dbpath /data/db --replSet crs

任意选择crs分片的一个副本

mongo --port 40001

切换数据库

use admin

写配置文件

config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.31.82:40001"}, {_id:1,host:"192.168.31.82:40002"}, {_id:2,host:"192.168.31.82:40003"} ] }

初始化副本集配置

rs.initiate(config)

如果已经初始化过,使用下面的强制配置

rs.reconfig(config,{force:true})

查看副本集状态

rs.status()

创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。

docker run -d -p 20001:20001 --privileged=true -v db20001:/data/db --name rs1_c1 mongo:latest --shardsvr --port 20001 --dbpath /data/db --replSet rs1

docker run -d -p 20002:20002 --privileged=true -v db20002:/data/db --name rs1_c2 mongo:latest --shardsvr --port 20002 --dbpath /data/db --replSet rs1

docker run -d -p 20003:20003 --privileged=true -v db20003:/data/db --name rs1_c3 mongo:latest --shardsvr --port 20003 --dbpath /data/db --replSet rs1

任意选择rs1分片的一个副本

mongo --port 20001

切换数据库

use admin

写配置文件

config = {_id:"rs1",members:[ {_id:0,host:"192.168.31.82:20001"}, {_id:1,host:"192.168.31.82:20002"}, {_id:2,host:"192.168.31.82:20003",arbiterOnly:true} ] }

初始化副本集配置

rs.initiate(config)

如果已经初始化过,使用下面的强制配置

rs.reconfig(config,{force:true})

查看副本集状态

rs.status()

结果

rs1:RECOVERING> rs.status()
{
    "set" : "rs1",
    "date" : ISODate("2016-12-20T09:01:16.108Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.31.82:20001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 7799,
            "optime" : {
                "ts" : Timestamp(1482224415, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-12-20T09:00:15Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1482224414, 1),
            "electionDate" : ISODate("2016-12-20T09:00:14Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.31.82:20002",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 71,
            "optime" : {
                "ts" : Timestamp(1482224415, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-12-20T09:00:15Z"),
            "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
            "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:15.376Z"),
            "pingMs" : NumberLong(1),
            "syncingTo" : "192.168.30.200:20001",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.31.82:20003",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 71,
            "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
            "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:11.334Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 1
        }
    ],
    "ok" : 1
}

创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。

docker run -d -p 30001:30001 --privileged=true -v db30001:/data/db --name rs2_c1 mongo:latest --shardsvr --port 30001 --dbpath /data/db --replSet rs2

docker run -d -p 30002:30002 --privileged=true -v db30002:/data/db --name rs2_c2 mongo:latest --shardsvr --port 30002 --dbpath /data/db --replSet rs2

docker run -d -p 30003:30003 --privileged=true -v db30003:/data/db --name rs2_c3 mongo:latest --shardsvr --port 30003 --dbpath /data/db --replSet rs2

任意选择rs2分片的一个副本

mongo --port 30001

切换数据库

use admin

写配置文件

config = {_id:"rs2",members:[ {_id:0,host:"192.168.31.82:30001"}, {_id:1,host:"192.168.31.82:30002"}, {_id:2,host:"192.168.31.82:30003",arbiterOnly:true} ] }

初始化副本集配置

rs.initiate(config)

如果已经初始化过,使用下面的强制配置

rs.reconfig(config,{force:true})

查看副本集状态

rs.status()

创建2个路由服务(mongos)

docker run -d -p 50001:50001 --privileged=true --name ctr50001 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50001 --bind_ip 0.0.0.0

docker run -d -p 50002:50002 --privileged=true --name ctr50002 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50002 --bind_ip 0.0.0.0

通过mongos添加分片关系到configsvr。

选择路由服务

mongo --port 50001

切换数据库

use admin

添加shard

db.runCommand({addshard:"rs1/192.168.31.82:20001,192.168.31.82:20002,192.168.31.82:20003"})

db.runCommand({addshard:"rs2/192.168.31.82:30001,192.168.31.82:30002,192.168.31.82:30003"})

查询结果 [仲裁节点不显示]

db.runCommand({listshards:1})

{
    "shards" : [
        {
            "_id" : "rs1",
            "host" : "rs1/192.168.31.82:20001,192.168.31.82:20002"
        },
        {
            "_id" : "rs2",
            "host" : "rs2/192.168.31.82:30001,192.168.31.82:30002"
        }
    ],
    "ok" : 1
}

测试示例

设置数据库、集合分片 [说明:并不是数据库中所有集合都分片,只有设置了shardcollection才分片,因为不是所有的集合都需要分片。]

db.runCommand({enablesharding:"mydb"})
db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})

测试分片

use mydb
for (i =0; i<10000;i++){
db.person.save({id:i, company:"baidu"})}

测试结果

db.person.stats()

本文为 dhso 原创

发布在 http://blog.minws.com/zai-dockershang-bu-shu-mongodbfen-bu-shi-fen-pian-fu-ben-ji-qun/

如有转载,请标明来源!

作者信息
姓名:dhso
热评文章
最新评论
文章概览