mongodb叢集安裝及到現在遇到的一些問題

來源:互聯網
上載者:User

標籤:等等   步驟   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叢集安裝及到現在遇到的一些問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.