現在網上很多教程都在講MongoDB分片配置,但大多都沒有經過實戰,胡亂轉載。而且用的MongoDB版本不同各種配置眼花寮亂,讓入門者莫衷一是。
最近我也做了MongoDB分片,貼出自己的配置。並且把需要注意的問題和大夥聊聊,不恰當的地方希望大家指正。 也同時希望讓後來者能繞過這些問題。
正式環境爲了保證數據安全都要進行備份的,關於分片複製請見alibaba教程:http://www.taobaodba.com/html/525_525.html
我配置的集羣是測試用的,沒有複製。只是簡單的分片存儲數據進行測試。在測試的時候又分片,又複製,那麼多機器也麻煩。這一點網上的很多例子都是錯誤的,爲此我也花了很多時間。
我配置完成後的結構圖爲:
我的Mongo版本爲:mongodb-linux-x86_64-2.0.8,計算機爲普通Pc。
在這裏我要特別說明:
1.大數據情況下最好是64位機器,32位機器不能創建大於2GB的單個文件。 小數據量無所謂 2.集羣中的每臺計算機的系統最好都是一樣的,不要32位,64位搭配 -- 我在開始做測試就是這樣,2臺64,2臺32.當注入300W左右的數據,索引大於3-4G時32位機器出錯了,32位系統上不能創建大於2GB的單個文件。整個集羣癱瘓,我爲此找了很長時間的原因 |
讓我們開始吧!
mongo從下載後解壓後的目錄結構如下:我們視安裝目錄爲:${MONGO_INSTALL}
先在第一臺計算機上在${MONGO_INSTALL}下分別執行:
1 |
mkdir -p
/data/shard11 |
1 |
bin/mongod
-shardsvr -port 27017 -dbpath=/data/shard11/ -logpath=/data/shard11.log --fork |
1 |
mkdir -p
/data/shard12 |
1 |
bin/mongod
-shardsvr -port 27017 -dbpath=/data/shard12/ -logpath=/data/shard12.log --fork |
在Ubuntu系統下你需要root權限:
1 |
sudo mkdir /data/shard11 |
2 |
sudo chmod -R
777 /data/shard11 |
1 |
ps -ef
| grep mongod |
OK,現在我們成功的分別在2太計算機上啓動了1個mongod實例,mongod是真正存儲數據的進程。進羣中還需要一個配置服務器,用來存儲在各個節點中共享的配置信息,存儲數據的元信息[METADATA],也如上面我結構圖中config.
config不會佔用太多資源的。我們在其中任何一臺上面啓動Mono的Config,shell如:
1 |
#config也是存儲少量數據的,不要忘了給它創建存儲數據的文件夾 |
2 |
mkdir /data/config |
1 |
bin/mongod
-configsvr -dbpath=/data/config -port 20000 -logpath=/data/config.log --fork |
也許你已經注意到,在2臺shard的啓動參數中加了-shardsvr,在配置實例中加了-configsvr。 mongo就是這樣進行區分的。當然複製的配置應該是: -replSet setName。 setName就是複製集羣的別名。
當以上都啓動成功,我們可以開啓mongos服務了。在任何一臺機器上執行:
1 |
#mongos進程不需要dbpath,但是需要logpath |
2 |
#mongos啓動參數中,chunkSize這一項是用來指定chunk的大小的,單位是MB,默認大小爲200MB |
3 |
bin/mongos
-configdb ip:20000 -port 30000 -chunkSize 512 -logpath=/data/mongos.log --fork |
請注意上面的IP,這個IP應該是你啓動config的那臺機器ip和port。,執行命令時使用具體的ip。
如果順利的話,你也應該能輕鬆的啓動mongos進程的。可以執行查看:ps -ef |grep mongos現在就剩下配置了。讓mongos進程知道哪些機器是需要加入到分片的。在任何一臺機器上執行[mongosip爲啓動mongos服務的機器IP]:
1 |
bin/mongo
ip:30000/admin |
1 |
db.runCommand({ "addshard" : "192.168.1.23:27017" }) |
2 |
db.runCommand({ "addshard" : "192.168.1.22:27017" }) |
如果順利,你應該能看到{ ”ok“ : 1}的字樣。這樣你就成功的把兩個shard加入了分片。現在你還需要制定分片的規則。
1 |
db.runCommand({ "shardcollection" : "dbname.tablename" , "key" :{ "primaryKey" :1}}) |
1 |
db.runCommand({ "enablesharding" : "ndmongo" }) |
現在你需要在剛纔指定dbname和tablename插入一定數量的數據。測試集羣:
1 |
db.printShardingStatus() |
現在你應該能體驗自己的分片了。
如果你的機器是64位的,你用我的配置應該很容易的就成功了。如果你用的32位的,你應該還要注意在啓動shard的時候加上:
--journal因爲64位默認啓動開啓journal的,32位沒有。至於journal什麼作用我也不太清楚,讀者自己google吧。
因爲我開始測試時用的機器32,64都有,出現了這麼多煩人的問題。 希望其他跟我一樣的人不要重蹈覆轍