MongoDB分布式分區叢集[四]
MongoDB的分布式分區叢集(sharding cluster)配置
Sharding cluster介紹
這是一種可以水平擴充的模式,在資料量很大時特給力,實際大規模應用一般會採用這種架構去構建monodb系統。
要構建一個 MongoDB Sharding Cluster,需要三種角色:
Shard Server: mongod 執行個體,用於儲存實際的資料區塊,實際生產環境中一個shard server角色可由幾台機器組個一個relica set承擔,防止主機單點故障.
Config Server: mongod 執行個體,儲存了整個 Cluster Metadata,其中包括 chunk 資訊。
Route Server: mongos 執行個體,前端路由,用戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。
實驗環境:
192.168.3.206 #IP地址
mongod shard11:27017 #27017連接埠為分區伺服器11
mongod shard21:27018 #27018連接埠為分區伺服器21
mongod config01:20000 #20000連接埠為設定管理員01
mongos01:30000 #30000連接埠為路由伺服器01
192.168.3.210 #IP地址
mongod shard12:27017 #27017連接埠為分區伺服器12
mongod shard22:27018 #27018連接埠為分區伺服器22
mongod config02:20000 #20000連接埠為設定管理員02
mongos02:30000 #30000連接埠為路由伺服器02
192.168.3.201 #IP地址
mongod shard13:27017 #27017連接埠為分區伺服器13
mongod shard23:27018 #27018連接埠為分區伺服器23
mongod config03:20000 #20000連接埠為設定管理員03
mongos03:30000 #30000連接埠為路由伺服器03
備忘:
分別在3台機器運行一個mongod執行個體(稱為mongod shard11,mongod shard12,mongod shard13)組織replica 1905_01,作為cluster的shard_1905_01
分別在3台機器運行一個mongod執行個體(稱為mongod shard21,mongod shard22,mongod shard23)組織replica 1905_02,作為cluster的shard_1905_02
每台機器運行一個mongod執行個體,作為3個config server
每台機器運行一個mongs進程,用於用戶端串連
1.安裝方法
參照http://blog.csdn.net/liu331095659/article/details/37870323來安裝。安裝成功後,不要用部落格上面的啟動命令。
2.建立資料目錄
192.168.3.206伺服器上面操作如下:
mkdir -p /data/mongodb/shard11
mkdir -p /data/mongodb/shard21
mkdir -p /data/mongodb/config
192.168.3.210伺服器上面操作如下:
mkdir -p /data/mongodb/shard12
mkdir -p /data/mongodb/shard22
mkdir -p /data/mongodb/config
192.168.3.201伺服器上面操作如下:
mkdir -p /data/mongodb/shard13
mkdir -p /data/mongodb/shard23
mkdir -p /data/mongodb/config
3.配置replice sets(複本集):
3.1配置shard_1905_01所用到的replica sets:
192.168.3.206伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard11 --logpath /data/logs/mongodb/shard11.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
192.168.3.210伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard12 --logpath /data/logs/mongodb/shard12.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
192.168.3.201伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard13 --logpath /data/logs/mongodb/shard13.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
3.2初始化replica set
用mongo串連其中一個mongod,執行:
/usr/local/mongodb/bin/mongo localhost:27017
config = {_id:"shard_1905_01",members:[{_id:0,host:'192.168.3.206:27017'},{_id:1,host:'192.168.3.210:27017'},{_id:2,host:'192.168.3.201:27017'}]}
rs.initiate(config);
3.3配置shard_1905_02所用到的replica sets:
192.168.3.206伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard21 --logpath /data/logs/mongodb/shard21.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
192.168.3.210伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard22 --logpath /data/logs/mongodb/shard22.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
192.168.3.201伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard23 --logpath /data/logs/mongodb/shard23.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
3.4初始化replica set
用mongo串連其中一個mongod,執行:
/usr/local/mongodb/bin/mongo localhost:27018
config = {_id:"shard_1905_02",members:[{_id:0,host:'192.168.3.206:27018'},{_id:1,host:'192.168.3.210:27018'},{_id:2,host:'192.168.3.201:27018'}]}
rs.initiate(config);
#到此就配置好了二個replica sets,也就是準備好了二個shards
4.配置三台config server
192.168.3.206伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
192.168.3.210伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
192.168.3.201伺服器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
5.配置mongs
192.168.3.206伺服器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
192.168.3.210伺服器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
192.168.3.201伺服器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
6.串連到其中一個mongos進程,並切換到admin資料庫做以下配置
6.1串連到mongs,並切換到admin
/usr/local/mongodb/bin/mongo 192.168.3.206:30000/admin
mongos> db #mongodb命令
6.2. 加入shards
#如裡shard是單台伺服器,用>db.runCommand( { addshard : “<serverhostname>[:<port>]” } )這樣的命令加入,
#如果shard是replica sets,用replicaSetName/<serverhostname>[:port][,serverhostname2[:port],…]這樣的格式表示,例如本例執行:
mongos>db.runCommand( { addshard : "shard_1905_01/192.168.3.206:27017,192.168.3.210:27017,192.168.3.201:27017",name:"s1",maxsize:20480} );
mongos>db.runCommand( { addshard : "shard_1905_02/192.168.3.206:27018,192.168.3.210:27018,192.168.3.201:27018",name:"s2",maxsize:20480} );
注意:在添加第二個shard時,出現error:test database 已經存在的錯誤,這裡用mongo命令串連到第二個replica set,用db.dropDatabase()命令把test資料庫給刪除然後就可加入
name:用於指定每個shard的名字,不指定的話系統將自動分配
maxsize:指定各個shard可使用的最大磁碟空間,單位megabytes
6.3Listing shards
mongos> db.runCommand( { listshards : 1 } ) #mongodb命令
{
"shards" : [
{
"_id" : "s1",
"host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017"
},
{
"_id" : "s2",
"host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018"
}
],
"ok" : 1
}
#如果列出了以上二個你加的shards,表示shards已經配置成功
6.4 啟用資料庫分區
mongos>db.runCommand({enablesharding:”<dbname>”})
#通過執行以上命令,可以讓資料庫跨shard,如果不執行這步,資料庫只會存放在一個shard,一旦啟用資料庫分區,資料庫中不同的 collection將被存放在不同的shard上,
#但一個collection仍舊存放在同一個shard上,要使單個collection也分區,還 需單獨對collection作些操作。
如:
mongos> db.runCommand({enablesharding:"test"}) #mongodb命令
{ "ok" : 1 } #返回結果
查看數否生效:
mongos> db.printShardingStatus() #mongodb命令
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("53c76f7a9adee90a8b860eea")
}
shards:
{ "_id" : "s1", "host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017" }
{ "_id" : "s2", "host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "s2" }
注釋:
一旦enable了個資料庫,mongos將會把資料庫裡的不同資料集放在不同的分區上。除非資料集被分區(下面會設定),否則一個資料集的所有資料將放在一個分區上。
6.5collecton分區:
注釋:
#要使單個collection也分區儲存,需要給collections指定一個分區key,如下:
#> db.runCommand( {shardcollection : “<namespace>”,key : <shardkeypatternobject> })
#a. 分區的collection系統會自動建立一個索引(也可使用者提前建立好)
#b. 分區的collection只能有一個在分區key上的唯一索引,其它唯一索引不被允許
分區collection例子:
mongos> db.runCommand({shardcollection:"test.liu_user",key:{id:1}}) #mongodb命令
{ "collectionsharded" : "test.liu_user", "ok" : 1 } #返回結果
mongos> use test #mongodb命令
#類比向liu_user集合插入測試資料200003條:
mongos> for(var i =0; i<200003; i++) db.liu_user.save({id:i,value:"111111"}) #mongodb命令
mongos> db.liu_user.find().count() #mongodb命令
225366
mongos> db.liu_user.stats() #mongodb命令
{
"sharded" : true,
"systemFlags" : 1,
"userFlags" : 1,
"ns" : "test.liu_user",
"count" : 225366,
"numExtents" : 14,
"size" : 25240992,
"storageSize" : 48979968,
"totalIndexSize" : 13662096,
"indexSizes" : {
"_id_" : 7342048,
"id_1" : 6320048
},
"avgObjSize" : 112,
"nindexes" : 2,
"nchunks" : 6,
"shards" : {
"s1" : {
"ns" : "test.liu_user",
"count" : 25363,
"size" : 2840656,
"avgObjSize" : 112,
"storageSize" : 11182080,
"numExtents" : 6,
"nindexes" : 2,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 1553440,
"indexSizes" : {
"_id_" : 833952,
"id_1" : 719488
},
"ok" : 1
},
"s2" : {
"ns" : "test.liu_user",
"count" : 200003,
"size" : 22400336,
"avgObjSize" : 112,
"storageSize" : 37797888,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 15290368,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 12108656,
"indexSizes" : {
"_id_" : 6508096,
"id_1" : 5600560
},
"ok" : 1
}
},
"ok" : 1
}
#看到上面內容一樣說明分區成功。我感覺神奇的是為什麼我插入的是200003記錄,怎麼變成225366這麼多了。還得繼續研究...