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