配置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}下分別執行:
mkdir -p /data/shard11
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard11/ -logpath=/data/shard11.log --fork再在另一臺機器上也分別執行:
mkdir -p /data/shard12
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard12/ -logpath=/data/shard12.log --fork正常情況下你能啟動這兩個節點的。如果啟動不成功。那就是mkdir -p /data/shard11沒有成功創建。
在Ubuntu系統下你需要root權限:
sudo mkdir /data/shard11 sudo chmod -R 777 /data/shard11然后啟動。在終端中分別執行檢查Mongod進程是否成功啟動:
ps -ef |grep mongod如果任何一臺沒有啟動成功,重復上面的,直到找出原因。
OK,現在我們成功的分別在2太計算機上啟動了1個mongod實例,mongod是真正存儲數據的進程。進群中還需要一個配置服務器,用來存儲在各個節點中共享的配置信息,存儲數據的元信息[METADATA],也如上面我結構圖中config.
config不會占用太多資源的。我們在其中任何一臺上面啟動Mono的Config,shell如:
#config也是存儲少量數據的,不要忘了給它創建存儲數據的文件夾 mkdir /data/config
bin/mongod -configsvr -dbpath=/data/config -port 20000 -logpath=/data/config.log --fork
也許你已經注意到,在2臺shard的啟動參數中加了-shardsvr,在配置實例中加了-configsvr。 mongo就是這樣進行區分的。當然復制的配置應該是: -replSet setName。 setName就是復制集群的別名。
當以上都啟動成功,我們可以開啟mongos服務了。在任何一臺機器上執行:
#mongos進程不需要dbpath,但是需要logpath #mongos啟動參數中,chunkSize這一項是用來指定chunk的大小的,單位是MB,默認大小為200MB 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]:
bin/mongo ip:30000/admin注意后邊的admin,配置分片必須要鏈接admin集合。鏈接成功后你就可以把分片加入集群:
db.runCommand({"addshard":"192.168.1.23:27017"}) db.runCommand({"addshard":"192.168.1.22:27017"})上邊的兩個ip都是第一次啟動的shard的ip地址,不是config 。
如果順利,你應該能看到{ ”ok“ : 1}的字樣。這樣你就成功的把兩個shard加入了分片。現在你還需要制定分片的規則。
db.runCommand({"shardcollection":"dbname.tablename", "key":{"primaryKey":1}})最后你還需要激活分片的設置。
db.runCommand({"enablesharding": "ndmongo"})OK,走到最后你應該成功的配置了分片。
現在你需要在剛才指定dbname和tablename插入一定數量的數據。測試集群:
db.printShardingStatus()你能看到類似如下的輸出[shard中有2臺機器,并且databases也存在你的dbname的partitioned為true的信息]:
現在你應該能體驗自己的分片了。
如果你的機器是64位的,你用我的配置應該很容易的就成功了。如果你用的32位的,你應該還要注意在啟動shard的時候加上:
--journal因為64位默認啟動開啟journal的,32位沒有。至于journal什么作用我也不太清楚,讀者自己google吧。
因為我開始測試時用的機器32,64都有,出現了這么多煩人的問題。 希望其他跟我一樣的人不要重蹈復轍。