標籤:等等 步驟 ural recover start tle ica 資料庫執行個體 資料庫名
叢集搭建
只有3台伺服器,開始搭建mongodb叢集裡主要參照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,連接埠的設定也是mongos為 20000, config server 為 21000, shard1為 22001 , shard2為22002, shard3為22003。其大體思路為:
在每台伺服器上啟動config服務
在每台伺服器上啟動mongos服務,並指定每個mongos服務包含的config服務地址(前一步啟動的3個config服務)https://docs.mongodb.com/manual/reference/program/mongos/#cmdoption--configdb
每台伺服器上,為每個分區或其複本啟動mongod執行個體https://docs.mongodb.com/manual/tutorial/deploy-replica-set/#start-each-member-of-the-replica-set-with-the-appropriate-options
登入任意一台伺服器,配置每個分區的複本集包含的執行個體https://docs.mongodb.com/manual/reference/method/rs.initiate/#example
登入mongos,在mongos服務中添加啟動好的分區https://docs.mongodb.com/manual/reference/command/addShard/#definition
最後在資料庫層面和資料集層面開啟分區功能。
經過上述幾個步驟,就搭出了的叢集。(圖片來自http://www.lanceyan.com/tech/arch/mongodb_shard1.html)
原理、基本命令及參數說明基本命令
mongod --configsvr 把該mongod執行個體啟動為某個分區集的config Server。這樣一來,只能通過admin或config來向資料庫寫資料?
mongod --fork 把mongod執行個體啟動為後台進程
mongod --dbpath 指定執行個體的目錄
mongod --logpath 指定執行個體的日誌路徑
mongod --shardsrv 把該執行個體啟動為【分區集】的一個【分區】
mongod --replSet 該執行個體為【複本集】的一個執行個體
mongod --oplogSize 配置local資料庫中oplog.rs集合的大小(單位M)。執行個體同步時,在多個執行個體之間進行同步時,oplog.rs集合用來儲存資料庫的改變。一旦建立該表大小就固定了,填滿後如果又來了新的更改,後來的修改就覆蓋前面的。由於在裝叢集時開始設定太小,後面插入操作又特別多,導致多執行個體同步跟不上oplog.rs表覆寫的速度,造成too stale to 更新的錯誤。後面有更改oplig.rs大小的過程。
mongod --port 指定該執行個體啟動的連接埠號碼
mongos mongos是為分區的mogodb叢集作為路由服務的,說白了就是來了一個操作,我給你指定你到哪個分區上去執行。
mongos --configdb 指定分區集的config servers
mongos --dbpath 同上
mongos --logpath 同上
mongos --port 同上
mongos --fork 同上
為分區集開啟一個佈建服務(每台機器一個,如果有損壞,路由伺服器可以讀取其它佈建服務)
mongod --configsvr --dbpath /data/dbmongo/config/data --port 21000 --logpath /data/dbmongo/config/log/config.log --fork
為分區集開啟路由服務(每台機器一個,如果有損壞,程式可以調其它的路由繼續工作)?
mongos --configdb ip1:21000,ip2:21000,ip3:21000 --port 20000 --logpath /data/dbmongo/mongos/log/mongos.log --fork
開啟每個分區對應的每個mongod資料庫執行個體(每台機器上都有3個資料庫執行個體)??
mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/dbmongo/shard1/data --logpath /data/dbmongo/shard1/log/shard1.log --fork --oplogSize 10240mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork --oplogSize 10240mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/dbmongo/shard3/data --logpath /data/dbmongo/shard3/log/shard3.log --fork --oplogSize 10240
登入一個mongod資料執行個體,並初始化複本集?
mongo 127.0.0.1:22001 use admin config = { _id:"複本名字", members:[ {_id:0,host:"ip1:22001",arbiterOnly:true}, {_id:1,host:"ip2:22001"}, {_id:2,host:"ip3:22001"} ] } rs.initiate(config);
在分區中加入相應的複本集?
mongo 127.0.0.1:20000 use admin db.runCommand( { addshard : "shard1/ip1:22001,ip2:22001,ip3:22001"}); db.runCommand( { addshard : "shard2/ip1:22002,ip2:22002,ip3:22002"}); db.runCommand( { addshard : "shard3/ip1:22003,ip2:22003,ip3:22003"});
開啟資料庫分區並對集合進行分區??
db.runCommand( { enablesharding :"資料庫名"}); db.runCommand( { shardcollection : "資料庫名.集合名",key : {_id: 1} } )
更改oplogSize值
oplogSize是設定的local資料庫裡的oplog.rs集合的大小,如果啟動時oplogSize設定太小,一旦建立就不能再增大了。複本資料庫一旦down掉一段時間,主要資料庫有可能把oplog.rs表填滿之後又來了新的修改把表覆蓋了,那麼複本資料庫再啟起來就會一直處於Recovering狀態,日誌裡提示too stale to catch up。這個時候可以:
1。把複本資料庫全清掉,重新啟動複本資料庫執行個體,這樣複本資料庫會初始把主要資料庫裡的資料全拷貝一遍。
2。把複本資料庫全清掉,從主要資料庫裡複製好data放過來並重啟。(沒試過)
3。線上的修改oplogSize的值,原理就是把資料庫關掉後,啟動成單一實例的模式,然後刪掉oplog.rs並重建立一個更大的oplog.rs。這個官方文檔裡有說明:Change the Size of the Oplog?
更改步驟
- (可選)對於Primary節點,要降成非Primary節點
rs.stepDown()
- 關閉資料庫
use admin db.shutdownServer()
- 啟動為獨立的資料庫執行個體
mongod --port 22004 --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork
- (可選)備份oplog.rs檔案Back Up with mongodump?
mongodump --db local --collection ‘oplog.rs‘ --port 22004
- 把oplog.rs裡最後更新的一條備份出來,建立oplog.rs,並匯入備份的這一條。(以後複本集裡的不同複本之間相互同步時,要找到本地的最後一次修改(備份的這一條),在其它oplog.rs裡找到這一條,更新其之後的修改)
use local db = db.getSiblingDB(‘local‘) db.temp.drop() db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() ) db.oplog.rs.drop() db.runCommand( { create: "oplog.rs", capped: true, siz10 * 1024 * 1024 * 1024) } ) db.oplog.rs.save( db.temp.findOne() )
- 關閉資料庫並啟動為叢集的一個分區的複本集的一個複本。
use admin db.shutdownServer()mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork
too many open files錯誤
這個很有可能是由於unix系統對程式的資源使用限制造成的,具體可以參見文檔:UNIX ulimit Settings?
修改方法為修改/etc/security/limits.d/99-mongodb-nproc.conf
# Default limit for number of user’s processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. # # * soft nproc 4096 # root soft nproc unlimited * soft nofile 64000* hard nofile 64000* soft fsize unlimited* hard fsize unlimited* soft cpu unlimited* hard cpu unlimited* soft nproc 64000* hard nproc 64000
另外還有盡量不以root使用者開啟mongod執行個體等等,具體修改忘記了,大體是這樣
http://www.lanceyan.com/tech/arch/mongodb_shard1.html
http://www.cnblogs.com/wilber2013/p/4154406.html
mongodb叢集安裝及到現在遇到的一些問題