閱讀756 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MongoDB單機, 主從, 分布式部署

MongoDB是最易用的NoSQL,比較適合取代MySQL做一些存儲,不過不是強一致性的。本文介紹一下MongoDB各種部署方式,並分享一些感受。前兩部分“單機部署”和“主從部署”是“分片部署”的基礎。


MongoDB單機部署

啟動下載來的MongoDB包的bin目錄下的mongod.exe即可打開MongoDB服務,可以添加的基本配置是:

./mongod.exe --dbpath ~/db/data --port 127.0.0.1:10000 --logpath ~/db/log

默認的端口是27017。啟動的時候必須有一個data目錄,讓mongod讀寫數據。寫入數據後,data目錄裏的文件如圖:


.lock文件如果在下次啟動時候還存在,需要刪除才能成功啟動。"article"和"config"是數據庫名字,可以特別注意一下每個文件塊的大小(16M, 32M, 64M, 128M)。


MongoDB主從部署

主從配置是MongoDB特色之一,使之具備了容錯,故障恢複等性能。主節點要聲明"master",從節點們要聲明"slave"和"--source"。最簡單的主從配置如下:

./mongod.exe --dbpath ~/db/master --port 10000 --master
./mongod.exe --dbpath ~/db/slave --port 10001 --slave --source localhost:10001
從節點直接從主節點同步數據,從節點之間不互相同步。容錯性更強的部署是一個主從集群,互相都能成為“主節點”,叫做Replica Set。在Replica Set裏會有一個活躍節點和若幹個備份節點。配置的時候,整個Replica Set要取個名字,然後每台都要指明一個或幾個夥伴:

./mongod.exe --dbpath ~/db/node1 --port 10001 --replSet setname/localhost:10002
./mongod.exe --dbpath ~/db/node2 --port 10002 --replSet setname/localhost:10001

./mongod.exe --dbpath ~/db/node3 --port 10003 --replSet setname/localhost:10001

誰成為活躍節點取決於優先級,優先級默認是1,也可以啟動mongod進行設置(不具體介紹了),總之是內部的選舉機製。


MongoDB分片部署

介紹完以上,組合起來就可以搭建一個比較強壯的分布式MongoDB集群。分片類似分布式,MongoDB以新增分片的方式,擴展自己的容量,並且能給讀寫負載均衡。

1. 每一個啟動的mongod都是實際存放數據的地方,都能作為別人的sharding

2. 分片部署需要一個mongos,起路由分發的作用;需要一個配置服務器和若幹個分片服務器(都是mongod)

3. 單機的時候,應用連接的是mongod;分布式的時候,應用連接的是mongos。

最簡單的分片部署是單個的配置服務器,一個config(即mongod),一個mongos,幾個sharding(即mongod):

./mongod.exe --dbpath ~/db/config --port 20000
./mongos.exe --configdb 127.0.0.1:20000 --port 30000
./mongod.exe --dbpath ~/db/shard1 --port 10001
./mongod.exe --dbpath ~/db/shard2 --port 10002
如果有時候啟動不了某個mongod,可能和端口有關。在windows下,這樣一個集群會打開很多shell窗口。這種情況下,還是三個獨立的mongd,要打開上麵的mongos,輸入命令加入sharding片:

> use admin
> db.runCommand({addshard : "localhost:10001", allowLocal : true})
> db.runCommand({addshard : "localhost:10002", allowLocal : true})

> db.runCommand({"enablesharding" : "dbname"})

還要設置片建,以提供負載均衡的依據:

> db.runCommand({"shardcollection" : "dbname.collection", "key" : {"_id":1}})
dbname.collection是自己的數據庫的數據集。設置的"key"需要已經建立索引。

mongos下還有一些查看分片情況的命令,方便集群的管理和監控,可以自己體驗下:

> db.shards.find()
> db.chunks.find()
> db.printShardingStatus()
也可以通過runCommand的其他命令添加新的片,刪除已有的片,而且添加的片可以是舊的mongod。

測試開發的時候像上麵這樣的一組可能夠了,真正健壯的集群可能要具備下麵三個條件:

1. 多個配置服務器config1, config2, config3(可以都經過一個mongos來路由)

2. 每個sharding都是Replica Set

3. 每一台物理物理服務器承擔若幹個不同的進程(mongos, shards, config)

就像下麵這種圖呈現的一樣:


我們可以這樣理解mongos, shards, config三樣東西:

1. shards是一些實際存數據的可以單獨使用的db,他們能分配給任何config server,而且添加刪除都很方便。

2. 每個shard裏有若幹個地位平等的mongods,所以每個是一個Replica Set(副本集)

3. 一個config手下帶領好幾個shards,目的是負載和擴容,他們之間需要mongos來路由

4. mongos是一個路由,可以路由一個或多個config servers,不需要很大的分配空間

5. 每一個客戶端的應用,每一張數據庫表,最好對應一個config server和一個mongos

以上內容裏的"--port" 部分改為IP:port就可以分布式環境了。比較合理的節省物理服務器的配置方法可以像下圖這樣:


不把所有雞蛋扔一個籃子裏。


(全文完)


最後更新:2017-04-03 22:31:03

  上一篇:go 傳歐盟今日將向微軟開出數億美元罰單
  下一篇:go HttpClient PostMethod模擬帶文件上傳+普通字段的http請求(可解決文件為網絡文件的問題)