zoukankan      html  css  js  c++  java
  • mongodb集群shard_replica的搭建方法

    参考官方文档,大致步骤

    第一步:创建Config Server实例,配置Config Server实例成Replica Set

    第二步:创建Shard Server实例,配置Shard Server实例成Replica Set

    第三步:创建Route Server实例,把Config Server实例和Shard Server实例配置进来

    第四步:创建数据库并执行db.printShardingStatus()命令验证



    涉及replSet、shardsvr、configsvr几个参数

    replSet:配置replica set,replica set中的所有主机必须具有相同的replica set名称。

    shardsvr:将此mongod实例配置为分片集群中的分片。默认端口是27018。

    configsvr:声明此mongod实例作为分片集群的配置服务器。默认端口是27019,默认的dbpath目录是/data/configdb,配置服务器存储集群的元数据和配置设置。从MongoDB 3.4开始,配置服务器必须部署为一个replicate set副本集,为了防止这个配置服务是单点服务。如果你的集群只有一个配置服务器,一旦这个配置服务器出现故障则集群将不可用


    涉及Config Server、Shard Server、Route Server几个实例

    1. Config Server: mongod实例,存储了整个Cluster Metadata,其中包括Chunk信息。

    2. Shard Server: mongod实例,用于存储实际的数据块,实际生产环境中一个Shard Server角色可由几台机器组个一个Replica Set承担,防止主机单点故障。

    3. Route Server: mongos实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。



    部署规划

    2台物理设备服务器,ip分别为172.22.138.157、172.22.138.158

    两台服务器上分别创建端口是29001的Config Server实例,这两台服务器上的Config Server实例组成Replica Set模式

    两台服务器上分别创建端口分别是28001、28002、28003的shard server实例,两台服务器上相同端口的shard server实例组成Replica Set模式

    两台服务器上分别创建端口是27001的Route Server实例


    部署架构

    外部程序-->Route Server实例-->Config Server实例-->shard server实例

    Route Server实例不是单点,两台服务器上都有,配置都是一样,都是指向一样的Config Server实例

    Config Server实例不是单点,是Replica Set模式

    shard server实例不是单点,是Replica Set模式




    第一步:

    创建Config Server实例,配置Config Server实例成Replica Set


    1.1、在两台服务器上分别编辑如下文件(两个重点参数configsvr、replSet)

    cat /mongodb/configsvr29001.conf

    port=29001

    dbpath=/mongodb/mongoconfig29001

    logpath=/mongodb/log/mongoconfig29001.log

    configsvr=true

    replSet=config29001

    fork=true

    logappend=true

    directoryperdb=true

    bind_ip=0.0.0.0

    pidfilepath=/mongodb/mongoconfig29001.pid


    1.2、两台服务器上分别启动Config Server实例

    mongod -f /mongodb/configsvr29001.conf


    1.3、配置两台服务器的Config Server实例成Replica Set

         登录任意一台服务器执行如下操作即可

    mongo --host 172.22.138.157 --port 29001

    rs.initiate(

      {

        _id: "config29001",

        configsvr: true,

        members: [

          { _id : 0, host : "172.22.138.157:29001" },

          { _id : 1, host : "172.22.138.158:29001" }

        ]

      }

    )





    第二步

    创建Shard Server实例,配置Shard Server实例成Replica Set


    2.1、在两台服务器上分别编辑如下三个文件(两个重点参数shardsvr、replSet)

    cat /mongodb/shardsvr28001.conf

    port=28001

    dbpath=/mongodb/mongoshard28001

    logpath=/mongodb/log/mongoshard28001.log

    shardsvr=true

    replSet=shard28001

    fork=true

    logappend=true

    directoryperdb=true

    verbose=true

    bind_ip=0.0.0.0

    pidfilepath=/mongodb/mongoshard28001.pid


    cat /mongodb/shardsvr28002.conf

    port=28002

    dbpath=/mongodb/mongoshard28002

    logpath=/mongodb/log/mongoshard28002.log

    shardsvr=true

    replSet=shard28002

    fork=true

    logappend=true

    directoryperdb=true

    verbose=true

    bind_ip=0.0.0.0

    pidfilepath=/mongodb/mongoshard28002.pid


    cat /mongodb/shardsvr28003.conf

    port=28003

    dbpath=/mongodb/mongoshard28003

    logpath=/mongodb/log/mongoshard28003.log

    shardsvr=true

    replSet=shard28003

    fork=true

    logappend=true

    directoryperdb=true

    verbose=true

    bind_ip=0.0.0.0

    pidfilepath=/mongodb/mongoshard28003.pid


    2.2、两台服务器上分别启动Shard Server实例

    mongod -f /mongodb/shardsvr28001.conf

    mongod -f /mongodb/shardsvr28002.conf

    mongod -f /mongodb/shardsvr28003.conf


    2.3、配置两台服务器的3个Shard Server实例成Replica Set

         登录任意一台服务器执行如下操作即可

    mongo --host 172.22.138.157 --port 28001

    rs.initiate(

      {

        _id: "shard28001",

        members: [

          { _id : 0, host : "172.22.138.157:28001" },

          { _id : 1, host : "172.22.138.158:28001" }

        ]

      }

    )


    mongo --host 172.22.138.157 --port 28002

    rs.initiate(

      {

        _id: "shard28002",

        members: [

          { _id : 0, host : "172.22.138.157:28002" },

          { _id : 1, host : "172.22.138.158:28002" }

        ]

      }

    )


    mongo --host 172.22.138.157 --port 28003

    rs.initiate(

      {

        _id: "shard28003",

        members: [

          { _id : 0, host : "172.22.138.157:28003" },

          { _id : 1, host : "172.22.138.158:28003" }

        ]

      }

    )





    第三步

    创建Route Server实例


    3.1、在两台服务器上分别编辑如下文件(重点参数configdb,把上面第一步的Config Server实例配置进来)

    cat /mongodb/Routesvr27001.conf

    port=27001

    logpath=/mongodb/log/mongoRoute27001.log

    configdb=config29001/172.22.138.157:29001,172.22.138.158:29001

    fork=true

    bind_ip=0.0.0.0

    pidfilepath=/mongodb/mongoRoute27001.pid


    3.2、两台服务器上分别启动Config Server实例

    mongos -f /mongodb/Routesvr27001.conf


    3.3、添加shard分片到集群,把上面第二步的Shard Server实例配置进来

         登录任意一台服务器执行如下操作即可

    mongo --host 172.22.138.157 --port 27001

    sh.addShard( "shard28001/172.22.138.157:28001,172.22.138.158:28001")

    sh.addShard( "shard28002/172.22.138.157:28002,172.22.138.158:28002")

    sh.addShard( "shard28003/172.22.138.157:28003,172.22.138.158:28003")






    第四步

    验证


    登录任意一台mongos实例,创建四个数据库

    mongo --host 172.22.138.157 --port 27001

    mongos> use TDB1

    mongos> db.createCollection("test01")

    mongos> db.test01.insert({hid:1,hname:"w001"})

    mongos> use TDB2

    mongos> db.createCollection("test02")

    mongos> db.test02.insert({hid:11,hname:"x001"})

    mongos> use TDB3

    mongos> db.createCollection("test03")

    mongos> db.test03.insert({hid:111,hname:"y001"})

    mongos> use TDB4

    mongos> db.createCollection("test04")

    mongos> db.test04.insert({hid:1111,hname:"z001"})


    连接任意一台mongos实例,都可以看到这四个数据库,执行db.printShardingStatus()看到四个数据库被分到了不同的shard上了,TDB1分到了shard28001上,TDB2TDB3分到了shard28002上,TDB4分到了shard28003上,登录mongod实例shard集群分片28001端口只看到TDB1数据库,登录mongod实例集群分片28002端口只看到TDB2、TDB3数据库,登录mongod实例集群分片28003端口只看到TDB4数据库,通过mongos,用户看到所有数据库,底下的shard server对用户而言是可以不用了解的


    mongo --host 172.22.138.158 --port 27001

    mongos> show dbs

    TDB1    0.000GB

    TDB2    0.000GB

    TDB3    0.000GB

    TDB4    0.000GB

    admin   0.000GB

    config  0.001GB

    mongos> db.printShardingStatus()

    --- Sharding Status ---

      sharding version: {

            "_id" : 1,

            "minCompatibleVersion" : 5,

            "currentVersion" : 6,

            "clusterId" : ObjectId("5d09cd1c38fe676e9fb94a92")

      }

      shards:

            {  "_id" : "shard28001",  "host" : "shard28001/172.22.138.157:28001,172.22.138.158:28001",  "state" : 1 }

            {  "_id" : "shard28002",  "host" : "shard28002/172.22.138.157:28002,172.22.138.158:28002",  "state" : 1 }

            {  "_id" : "shard28003",  "host" : "shard28003/172.22.138.157:28003,172.22.138.158:28003",  "state" : 1 }

      active mongoses:

            "3.6.12" : 2

      autosplit:

            Currently enabled: yes

      balancer:

            Currently enabled:  yes

            Currently running:  no

            Failed balancer rounds in last 5 attempts:  0

            Migration Results for the last 24 hours:

                    No recent migrations

      databases:

            {  "_id" : "TDB1",  "primary" : "shard28001",  "partitioned" : false }

            {  "_id" : "TDB2",  "primary" : "shard28002",  "partitioned" : false }

            {  "_id" : "TDB3",  "primary" : "shard28002",  "partitioned" : false }

            {  "_id" : "TDB4",  "primary" : "shard28003",  "partitioned" : false }

            {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

                    config.system.sessions

                            shard key: { "_id" : 1 }

                            unique: false

                            balancing: true

                            chunks:

                                    shard28001      1

                            { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard28001 Timestamp(1, 0)



    mongo --host 172.22.138.157 --port 28001

    shard28001:PRIMARY> show dbs

    TDB1    0.000GB

    admin   0.000GB

    config  0.000GB

    local   0.000GB


    mongo --host 172.22.138.157 --port 28002

    shard28002:PRIMARY> show dbs

    TDB2    0.000GB

    TDB3    0.000GB

    admin   0.000GB

    config  0.000GB

    local   0.000GB


    mongo --host 172.22.138.157 --port 28003

    shard28003:PRIMARY> show dbs

    TDB4    0.000GB

    admin   0.000GB

    config  0.000GB

    local   0.000GB





    第五步

    如果想对某个数据库里面的表分片存储,即A表一部分放入shared1,一部分放入shard2,就需要先使用sh.enableSharding("db_name")对这个数据库启用分片,数据库启用分片后,上面第四步验证结果"partitioned" : false就变成了"partitioned" : true。如果该表已包含数据,则必须在使用shardCollection()对表分片之前使用db.collection.createIndex()方法在分片键上创建索引。如果表为空,MongoDB将创建索引作为shardCollection()的一部分。


    mongo --host 172.22.138.158 --port 27001

    mongos> use testdb

    mongos> db.createCollection("table1")

    mongos> db.printShardingStatus() --此时testdb对应的数据库"partitioned" : false

    mongos> sh.enableSharding("testdb")

    mongos> db.printShardingStatus() --此时testdb对应的数据库"partitioned" : true


    对表testdb.table1按age字段范围分片(代号为1),指定散列分片键对空集合进行分片时最初要创建的块数为5

    mongos> sh.shardCollection("testdb.table1",{age:1},{numInitialChunks:5})

    mongos> for (var i=0;i<150000;i++) db.table1.save({name:"u_"+i,age:0+i,sex:i%2,class:"number2",grade:"number3",birthd:"shanghai",motk:"shanghai",controyload:"chian",birthn:3030303030303030303,horbity:"footboll"})


    对表testdb.table2按age字段范围分片(代号为1),指定散列分片键对空集合进行分片时最初要创建的块数为1

    mongos> db.createCollection("table2")

    mongos> sh.shardCollection("testdb.table2",{age:1},{numInitialChunks:1})

    mongos> for (var i=0;i<100000;i++) db.table2.save({name:"u_"+i,age:0+i,sex:i%2,class:"number2",grade:"number3",birthd:"shanghai",motk:"shanghai",controyload:"chian",birthn:3030303030303030303,horbity:"footboll"})


    对表testdb.table3按age字段范围分片(代号为hashed),指定散列分片键对空集合进行分片时最初要创建的块数为1

    mongos> db.createCollection("table3")

    mongos> sh.shardCollection("testdb.table2",{age:"hashed"},{numInitialChunks:1})

    mongos> for (var i=0;i<100000;i++) db.table3.save({name:"u_"+i,age:0+i,sex:i%2,class:"number2",grade:"number3",birthd:"shanghai",motk:"shanghai",controyload:"chian",birthn:3030303030303030303,horbity:"footboll"})


    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2648154/,如需转载,请注明出处,否则将追究法律责任。

  • 相关阅读:
    Go 接口
    Go 参数传递
    Go 结构体
    Go 指针
    使用ContentType处理大量的外键关系
    django的render的特殊用法
    restframework中的那些参数你知道吗?
    scrapy框架
    numpy如何使用
    HTML 5 audio标签
  • 原文地址:https://www.cnblogs.com/seasonzone/p/14953990.html
Copyright © 2011-2022 走看看