frankliuch

导航

mongodb 在windows下面进行分片

mongodb 更新很快,在做分片的时候,查找了不少文章,但是很多已经过时了。现在把我搭建的过程及命令分享给大家。我用的是最新版本windows版3.4.7。

命令中使用到的目录,需要手动创建。

首先确定各个组件的数量,mongos 1个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,,总共需要部署10个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了1台机器,在同一台机器只要端口不同就可以。,看一下物理部署图:

 

启动两个副本集

mongod --shardsvr --replSet shard-a --dbpath "C:\mongo\data\rs-a-1" --port 3000 --logpath "C:\mongo\log\rs-a-1.log" --nojournal --serviceName "mongodb_rs_1" --serviceDisplayName "mongodb_rs_1" --install

 

 

mongod --shardsvr --replSet shard-a --dbpath "C:\mongo\data\rs-a-2" --port 3001 --logpath "C:\mongo\log\rs-a-2.log" --nojournal  --serviceName "mongodb_rs_2" --serviceDisplayName "mongodb_rs_2" --install

 

mongod --shardsvr --replSet shard-a --dbpath "C:\mongo\data\rs-a-3" --port 3002 --logpath "C:\mongo\log\rs-a-3.log" --nojournal  --serviceName "mongodb_rs_3" --serviceDisplayName "mongodb_rs_3" --install

 

连接3000,初始化副本集配置,命令如下:

mongo 127.0.0.1:3000

config = { _id:"shard-a", members:[

                     {_id:0,host:"localhost:3000"},

                     {_id:1,host:"localhost:3001"},

                     {_id:2,host:"localhost:3002",arbiterOnly:true}

                ]

         }

 

rs.initiate(config);

 

 

 

mongod --shardsvr --replSet shard-b --dbpath "C:\mongo\data\rs-b-1" --port 30100 --logpath "C:\mongo\log\rs-b-1.log" --nojournal  --serviceName "mongodb_rs_b1" --serviceDisplayName "mongodb_rs_b1" --install

 

mongod --shardsvr --replSet shard-b --dbpath "C:\mongo\data\rs-b-2" --port 30101 --logpath "C:\mongo\log\rs-b-2.log" --nojournal  --serviceName "mongodb_rs_b2" --serviceDisplayName "mongodb_rs_b2" --install

 

mongod --shardsvr --replSet shard-b --dbpath "C:\mongo\data\rs-b-3" --port 30102 --logpath "C:\mongo\log\rs-b-3.log" --nojournal  --serviceName "mongodb_rs_b3" --serviceDisplayName "mongodb_rs_b3" --install

 

连接30100,初始化副本集配置,命令如下:

mongo 127.0.0.1:30100

 

config = { _id:"shard-b", members:[

                     {_id:0,host:"localhost:30100"},

                     {_id:1,host:"localhost:30101"},

                     {_id:2,host:"localhost:30102",arbiterOnly:true}

                ]

         }

 

rs.initiate(config);

 

启动配置服务器

 

 

mongod --configsvr --replSet config-a --dbpath "C:\mongo\data\config-1" --port 27019 --logpath "C:\mongo\log\config-1.log"  --serviceName "mongodb_config_1" --serviceDisplayName "mongodb_config_1" --install

 

 

mongod --configsvr  --replSet config-a --dbpath "C:\mongo\data\config-2" --port 27020 --logpath "C:\mongo\log\config-2.log"  --serviceName "mongodb_config_2" --serviceDisplayName "mongodb_config_2" --install

 

mongod --configsvr  --replSet config-a --dbpath "C:\mongo\data\config-3" --port 27021 --logpath "C:\mongo\log\config-3.log"   --serviceName "mongodb_config_3" --serviceDisplayName "mongodb_config_3" --install

 

 

连接27019,初始化副本集配置,命令如下:

mongo 127.0.0.1: 27019

 

rs.initiate(

  {

    _id: "config-a",

    configsvr: true,

    members: [

      { _id : 0, host : "127.0.0.1:27019" },

      { _id : 1, host : "127.0.0.1:27020" },

      { _id : 2, host : "127.0.0.1:27021" }

    ]

  }

)

服务安装错误,使用删除MongoDB服务:SC DELETE mongos-a

如果MongoDB服务处于运行状态,请先停止该服务:mongos-a

 

 开启mongos服务器

mongos --configdb config-a/127.0.0.1:27019,localhost:27020,localhost:27021 --logpath "C:\mongo\log\mongos.log" --port 40005  --serviceName "mongos-a" --serviceDisplayName "mongos-a" --install

 

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

 

配置Sharding

连接40005,命令如下:

mongo 127.0.0.1: 40005

 

sh.addShard( "shard-a/localhost:3000")

 

sh.addShard( "shard-b/localhost:30100")

 

#查看分片服务器的配置

db.runCommand( { listshards : 1 } );

#内容输出

{

        "shards" : [

                {

                        "_id" : "shard-a",

                        "host" : "shard-a/localhost:3000,localhost:3001",

                        "state" : 1

                },

                {

                        "_id" : "shard-b",

                        "host" : "shard-b/localhost:30100,localhost:30101",

                        "state" : 1

                }

        ],

        "ok" : 1

}

因为3002,30102是每个分片副本集的仲裁节点,所以在上面结果没有列出来。

 

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。

连接在mongos上,准备让指定的数据库、指定的集合分片生效。

#指定testliu分片生效

sh.enableSharding("testliu")

 

#指定数据库里需要分片的集合和片键

sh.shardCollection("testliu.accounts", {"name":1} )

我们设置testliu的accounts表需要分片,根据 id 自动分片到 shard-a ,shard-b 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!

#插入测试数据

for (var i = 1; i <= 100000; i++)db.accounts.insert({name:i,"test1":"testval1"});

 

#查看分片情况如下,部分无关信息省掉了

db.accounts.stats();

{

        "sharded" : true,

        "capped" : false,

        "ns" : "testliu.accounts",

        "count" : 305,

        "size" : 31346,

        "storageSize" : 77824,

        "totalIndexSize" : 147456,

        "indexSizes" : {

                "_id_" : 73728,

                "name_1" : 73728

        },

        "avgObjSize" : 102.65901639344263,

        "nindexes" : 2,

        "nchunks" : 3,

        "shards" : {

                "shard-a" : {

                        "ns" : "testliu.accounts",

                        "count" :42183,

                        "ok" : 1

                },

                "shard-b" : {

                        "ns" : "testliu.accounts",

                        "count" : 57817,                      

                        "ok" : 1

                }

        },

        "ok" : 1

}

 

可以看到数据分到2个分片,各自分片数量为:shard-a “count” : 42183,shard-b “count” : 57817。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。

posted on 2017-09-15 14:53  frankliuch  阅读(1332)  评论(2编辑  收藏  举报