配置MongoDB集群分片

jopen 12年前發布 | 27K 次閱讀 MongoDB NoSQL數據庫

現在網上很多教程都在講MongoDB分片配置,但大多都沒有經過實戰,胡亂轉載。而且用的MongoDB版本不同各種配置眼花寮亂,讓入門者莫衷一是。

最近我也做了MongoDB分片,貼出自己的配置。并且把需要注意的問題和大伙聊聊,不恰當的地方希望大家指正。 也同時希望讓后來者能繞過這些問題。

正式環境為了保證數據安全都要進行備份的,關于分片復制請見alibaba教程:http://www.taobaodba.com/html/525_525.html

我配置的集群是測試用的,沒有復制。只是簡單的分片存儲數據進行測試。在測試的時候又分片,又復制,那么多機器也麻煩。這一點網上的很多例子都是錯誤的,為此我也花了很多時間。

我配置完成后的結構圖為:

配置MongoDB集群分片

我的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}

配置MongoDB集群分片

先在第一臺計算機上在${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的信息]:

配置MongoDB集群分片

現在你應該能體驗自己的分片了。

如果你的機器是64位的,你用我的配置應該很容易的就成功了。如果你用的32位的,你應該還要注意在啟動shard的時候加上: 

--journal
因為64位默認啟動開啟journal的,32位沒有。至于journal什么作用我也不太清楚,讀者自己google吧。

因為我開始測試時用的機器32,64都有,出現了這么多煩人的問題。 希望其他跟我一樣的人不要重蹈復轍。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!