配置MongoDB集羣分片(一)

現在網上很多教程都在講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
正常情況下你能啓動這兩個節點的。如果啓動不成功。那就是mkdir -p /data/shard11沒有成功創建。

在Ubuntu系統下你需要root權限:

1 sudo mkdir /data/shard11
2 sudo chmod -R 777 /data/shard11
然後啓動。在終端中分別執行檢查Mongod進程是否成功啓動:
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
注意後邊的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都有,出現了這麼多煩人的問題。 希望其他跟我一樣的人不要重蹈覆轍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章