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。已經成功了!不過分的好像不是很均勻,所以這個分片還是很有講究的,后續再深入討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM