轉載自http://my.oschina.net/zhzhenqin/blog/97268
現在網上很多教程都在講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 |
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard11/ -logpath=/data/shard11.log --fork |
再在另一台機器上也分別執行:
1 |
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard12/ -logpath=/data/shard12.log --fork |
正常情況下你能啟動這兩個節點的。如果啟動不成功。那就是mkdir -p /data/shard11沒有成功建立。
在Ubuntu系統下你需要root許可權:
1 |
sudo mkdir /data/shard11 |
2 |
sudo chmod -R 777 /data/shard11 |
然後啟動。在終端中分別執行檢查Mongod進程是否成功啟動:
如果任何一台沒有啟動成功,重複上面的,直到找出原因。
OK,現在我們成功的分別在2太電腦上啟動了1個mongod執行個體,mongod是真正儲存資料的進程。進群中還需要一個設定管理員,用來儲存在各個節點中共用的配置資訊,儲存資料的元資訊[METADATA],也如上面我結構圖中config.
config不會佔用太多資源的。我們在其中任何一台上面啟動Mono的Config,shell如:
1 |
#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。
如果順利的話,你也應該能輕鬆的啟動mongos進程的。可以執行查看:ps -ef |grep mongos
現在就剩下配置了。讓mongos進程知道哪些機器是需要加入到分區的。在任何一台機器上執行[mongosip為啟動mongos服務的機器IP]:
1 |
bin/mongo ip:30000/admin |
注意後邊的admin,配置分區必須要連結admin集合。連結成功後你就可以把分區加入叢集:
1 |
db.runCommand({ "addshard" : "192.168.1.23:27017" }) |
2 |
db.runCommand({ "addshard" : "192.168.1.22:27017" }) |
上邊的兩個ip都是第一次啟動的shard的ip地址,不是config 。
如果順利,你應該能看到{ ”ok“ : 1}的字樣。這樣你就成功的把兩個shard加入了分區。現在你還需要制定分區的規則。
1 |
db.runCommand({ "shardcollection" : "dbname.tablename" , "key" :{ "primaryKey" :1}}) |
最後你還需要啟用分區的設定。
1 |
db.runCommand({ "enablesharding" : "ndmongo" }) |
OK,走到最後你應該成功的配置了分區。
現在你需要在剛才指定dbname和tablename插入一定數量的資料。測試叢集:
1 |
db.printShardingStatus() |
你能看到類似如下的輸出[shard中有2台機器,並且databases也存在你的dbname的partitioned為true的資訊]:
現在你應該能體驗自己的分區了。
如果你的機器是64位的,你用我的配置應該很容易的就成功了。如果你用的32位的,你應該還要注意在啟動shard的時候加上:
--journal
因為64位預設啟動開啟journal的,32位沒有。至於journal什麼作用我也不太清楚,讀者自己google吧。
因為我開始測試時用的機器32,64都有,出現了這麼多煩人的問題。 希望其他跟我一樣的人不要重蹈複轍。