亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MongoDB添加secondary節(jié)點的2種方法詳解

 更新時間:2018年10月12日 10:59:31   作者:天子笑  
這篇文章主要給大家總結(jié)介紹了關(guān)于MongoDB添加secondary節(jié)點的2種方法,以及MongoDB secondary節(jié)點出現(xiàn)recovering狀態(tài)的解決方法,文中介紹的非常詳細,需要的朋友可以參考下

前言

前段時間維護的一個事業(yè)群的其中一條業(yè)務線的開發(fā)找到運維,提出來了一個MongoDB的優(yōu)化問題,那段時間MongoDB正在從op管理移交給db進行維護,整個部門都對MongoDB的運維經(jīng)驗缺乏,MongoDB的優(yōu)化更是一個未知的挑戰(zhàn)。當op找到我,核心系統(tǒng)的公共服務平臺用來進行短信服務的MongoDB集群想進行一次優(yōu)化,我當仁不能讓的承擔了這項我都覺得可能搞不定的任務。

開發(fā)找到我提出了兩點兒問題,并尋求運維團隊解決這個問題,不過最終在我的理性的思考和他感性的思維碰撞下,最終我還是以勝利者的姿態(tài)勝出。我成功說服了他,并解答了他一些疑問,得到了滿意的答復后再也沒找我了。當然這里肯定不會就憑幾句話,任你理論再怎么豐富,態(tài)度如何曖昧,不拿點兒真實數(shù)據(jù),做點兒什么,怎么能說服經(jīng)驗豐富的開發(fā)認定的事兒。溝通了大半天,占據(jù)了我白天的工作時間,不過他提出來的問題還是很值得討論。

根據(jù)開發(fā)的邏輯,是想橫向擴充secondary節(jié)點,把其他要求不高的業(yè)務放到secondary節(jié)點上,減輕primary節(jié)點的壓力,達到部分讀寫分離,使得主要業(yè)務優(yōu)先保障。我覺得這個出發(fā)點是好的,但并沒有就此作出回應,其一是他沒有認識到這個他認為的有延遲并不是數(shù)據(jù)庫集群的問題(這里不詳細講述排查的過程,下一篇文章會講些MongoDB的寫入與業(yè)務邏輯),其二是我們確實缺乏有效的資源硬件去進行擴充節(jié)點。

不同的業(yè)務場景應用不同的架構(gòu)策略,擴充secondary節(jié)點有時候不能解決問題,尤其是那些實時性很高的業(yè)務,但有時候擴充secondary節(jié)點確實有效,比如硬件升級后需要做的服務遷移,需要在線擴充secondary節(jié)點來滿足業(yè)務需要的更高的硬件要求。

MongoDB的secondary節(jié)點的擴充,我總結(jié)起來有兩種方式:

1、rs.add()直接擴充

2、一致性備份后進行擴充(個人叫法)

1、rs.add("HOST_NAME:PORT")

具體的實現(xiàn)方式是登陸擴充節(jié)點的機器,編輯好配置文件,并建立相應的目錄和權(quán)限,啟動MongoDB實例就可以了。

需要注意的一點兒是這種擴充方式要保證同步源的數(shù)據(jù)量級,即保證在同步完數(shù)據(jù)前MongoDB的oplog不會被覆蓋,這點兒類似與MySQL的redo log日志,如果被覆蓋那么同步的數(shù)據(jù)出現(xiàn)不一致,導致同步失敗。

需要注意的另一點是同步數(shù)據(jù)的過程中,當集群數(shù)據(jù)達到一定量級時,同步數(shù)據(jù)的大小很大就會對網(wǎng)絡(luò)造成一定的壓力,可能對業(yè)務的核心交換機造成影響,因此需要用TC工具對同步流量做限速處理。這個限速需要考慮同步源可能不會是primary,也可能是同樣角色的secondary節(jié)點,令外限速同步勢必會增大同步時間,這個會增大oplog被覆蓋的概率,具體限速值還是要經(jīng)過計算才能把握好。

2、一致性快照快速添加secondary節(jié)點(自我命名,歡迎各位交流)

  a)primary節(jié)點上進行一致性快照備份

  b)secondary節(jié)點上進行一致性快照恢復,僅僅對數(shù)據(jù)部分進行恢復,暫時不要對oplog進行恢復

     c)初始化oplog.rs集合,并恢復oplog記錄

     d)初始化local數(shù)據(jù)庫的其他兩個集合db.replset.election,db.system.replset

  e)修改數(shù)據(jù)庫配置并重啟數(shù)據(jù)庫(這一步操作前實例不開啟認證模式、復制集的配置),rs.add("HOST_NAME:PORT")將secondary添加進集群并觀察同步狀態(tài)、校驗數(shù)據(jù)的完整和一致性

實踐的詳細實踐過程如下(僅供參考交流,生產(chǎn)環(huán)境慎用):

1、primary上進行一致性快照備份

#primary節(jié)點或者其他secondary節(jié)點備份數(shù)據(jù)
[root@172-16-3-190 mongodb]# /opt/app/mongodb/bin/mongodump -uroot -ppwd4mysql --authenticationDatabase=admin --port=27017 --oplog -o /tmp/dump_mongo/
2018-08-20T15:42:47.028+0800 writing admin.system.users to 
2018-08-20T15:42:47.030+0800 done dumping admin.system.users (1 document)
2018-08-20T15:42:47.030+0800 writing admin.system.version to 
2018-08-20T15:42:47.031+0800 done dumping admin.system.version (2 documents)
2018-08-20T15:42:47.032+0800 writing super_hero.user_address to 
2018-08-20T15:42:47.032+0800 writing super_hero.user_info to 
2018-08-20T15:42:47.033+0800 done dumping super_hero.user_address (1 document)
2018-08-20T15:42:47.033+0800 done dumping super_hero.user_info (1 document)
2018-08-20T15:42:47.034+0800 writing captured oplog to 
2018-08-20T15:42:47.036+0800 dumped 1 oplog entry

#查看備份的文件
[root@172-16-3-190 mongodb]# ls -lh /tmp/dump_mongo/
total 12K
drwxr-xr-x 2 root root 4.0K Aug 20 15:42 admin
-rw-r--r-- 1 root root 110 Aug 20 15:42 oplog.bson
drwxr-xr-x 2 root root 4.0K Aug 20 15:42 super_hero

#傳遞備份到準備添加為secondary的節(jié)點上
[root@172-16-3-190 tmp]# scp -r -P22222 /tmp/dump_mongo/ liyingxiao@172.16.3.189:/tmp

2、secondary節(jié)點一致性快照恢復

#auth=true
#replSet = repl_mongo
#clusterAuthMode=keyFile
#keyFile=/opt/app/mongodb/keyfile/mongodb.key

##恢復數(shù)據(jù)
[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongorestore --oplogReplay --port=27017 /tmp/dump_mongo/      
2018-08-20T15:56:32.161+0800 preparing collections to restore from
2018-08-20T15:56:32.193+0800 reading metadata for super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.metadata.json
2018-08-20T15:56:32.194+0800 reading metadata for super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.metadata.json
2018-08-20T15:56:32.222+0800 restoring super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.bson
2018-08-20T15:56:32.300+0800 restoring super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.bson
2018-08-20T15:56:32.867+0800 no indexes to restore
2018-08-20T15:56:32.867+0800 finished restoring super_hero.user_address (1 document)
2018-08-20T15:56:32.881+0800 no indexes to restore
2018-08-20T15:56:32.881+0800 finished restoring super_hero.user_info (1 document)
2018-08-20T15:56:32.881+0800 restoring users from /tmp/dump_mongo/admin/system.users.bson
2018-08-20T15:56:32.993+0800 replaying oplog
2018-08-20T15:56:32.997+0800 done

3、初始化oplog.rs集合,并恢復oplog記錄

創(chuàng)建oplog.rs集合并初始化大小

 use local
 db.createCollection("oplog.rs",{"capped":true,"size":100000000})

恢復一致性備份的oplog.rs集合的數(shù)據(jù)到secondary節(jié)點

[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongorestore -d local -c oplog.rs --port=27017 /tmp/dump_mongo/oplog.bson 
2018-08-20T16:12:49.848+0800 checking for collection data in /tmp/dump_mongo/oplog.bson
2018-08-20T16:12:49.852+0800 restoring local.oplog.rs from /tmp/dump_mongo/oplog.bson
2018-08-20T16:12:49.925+0800 no indexes to restore
2018-08-20T16:12:49.925+0800 finished restoring local.oplog.rs (1 document)
2018-08-20T16:12:49.925+0800 done

4、初始化db.replset.election,db.system.replset集合,其中replset.election需要查詢主節(jié)點數(shù)據(jù)并將這些數(shù)據(jù)存儲到secondary節(jié)點,或者兩個結(jié)合自行save到secondary節(jié)點。另集合system.replset加入復制集后可自動識別primary節(jié)點內(nèi)容(這里我采取自行同步數(shù)據(jù))

 #primary節(jié)點
 repl_mongo:PRIMARY> db.replset.election.find()
 { "_id" : ObjectId("5b7a6ee5de7a24b82a686139"), "term" : NumberLong(1), "candidateIndex" : NumberLong(0) }
 #secondary節(jié)點
 db.replset.election.save({ "_id" : ObjectId("5b7a6ee5de7a24b82a686139"), "term" : NumberLong(1), "candidateIndex" : NumberLong(0) })

5、修改數(shù)據(jù)庫配置并重啟,添加secondary節(jié)點到復制集群中

#auth=true
#replSet = repl_mongo
#clusterAuthMode=keyFile
#keyFile=/opt/app/mongodb/keyfile/mongodb.key

[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongod --shutdown -f /opt/app/mongodb/mongo.conf 
killing process with pid: 5331
[root@172-16-3-189 we_ops_admin]# vim /opt/app/mongodb/mongo.conf #注釋去掉并重啟
[root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongod -f /opt/app/mongodb/mongo.conf   
about to fork child process, waiting until server is ready for connections.
forked process: 5722
child process started successfully, parent exiting

#添加secondary節(jié)點
repl_mongo:PRIMARY> rs.add({"_id":1,"host":"172.16.3.189:27017"})
{
  "ok" : 1,
  "operationTime" : Timestamp(1534752953, 1),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1534752953, 1),
    "signature" : {
      "hash" : BinData(0,"Tt9nzhoVYdUtGFZnc1Kg1exl0Hc="),
      "keyId" : NumberLong("6591702943026642945")
    }
  }
}

6、登錄添加的secondary節(jié)點,驗證復制集狀態(tài),數(shù)據(jù)完整和一致性。

 [root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongo -uroot -ppwd4mysql --authenticationDatabase=admin --port=27017

重點介紹第二種省時省心但費力費操作的添加secondary節(jié)點的方法,實踐過程中數(shù)據(jù)庫實例前期去掉認證和復制集參數(shù),是方便我們下面的一些需要用戶權(quán)限的操作,避免建立管理員賬號,后續(xù)加入集群后自行同步了primary節(jié)點的賬號。重啟后登錄secondary節(jié)點驗證服務的可用性和數(shù)據(jù)一致性時,使用集群的管理賬號進入,否則會報認證的錯誤。

總結(jié)如上兩種擴充方式,對于方式1的擴充簡單省事,需要保證oplog不被覆蓋和評估同步流量的影響問題,是我們通常進行橫向復制集添加secondary節(jié)點的方法。對于第二種方式,操作繁瑣但不用擔心oplog被覆蓋,且操作期間不會過多擔憂網(wǎng)絡(luò)流量的問題,僅僅考慮網(wǎng)絡(luò)傳輸?shù)牧髁坑绊?。第一種方式操作時間周期長,不可控的影響范圍大費時費精力,第二種方式操作時間短,操作的步驟多,容易出現(xiàn)其他問題。

MongoDB secondary節(jié)點出現(xiàn)recovering狀態(tài)

MongoDB做了replica sets之后,secondary節(jié)點出現(xiàn)recovering狀態(tài)

在一次mongo集群掛掉后,重啟,發(fā)現(xiàn)有一臺服務器的mongo節(jié)點一直處于recovering狀態(tài),不能變?yōu)閟econdary或者primary。

查詢官方文檔后,找到解決方案,在此記錄。

出現(xiàn)原因

備份節(jié)點的工作原理過程可以大致描述為,備份節(jié)點定期輪詢主節(jié)點上的數(shù)據(jù)操作,然后對自己的數(shù)據(jù)副本進行這些操作,從而保證跟主節(jié)點的數(shù)據(jù)同步。

至于主節(jié)點上的所有數(shù)據(jù)庫狀態(tài)改變的操作,都會存放在一張?zhí)囟ǖ南到y(tǒng)表中。備份節(jié)點則是根據(jù)這些數(shù)據(jù)進行自己的數(shù)據(jù)更新。

上面提到的數(shù)據(jù)庫狀態(tài)改變的操作,稱為oplog(operation log,主節(jié)點操作記錄)。oplog存儲在local數(shù)據(jù)庫的"oplog.rs"表中。副本集中備份節(jié)點異步的從主節(jié)點同步oplog,然后重新執(zhí)行它記錄的操作,以此達到了數(shù)據(jù)同步的作用。

關(guān)于oplog有幾個注意的地方:

  • oplog只記錄改變數(shù)據(jù)庫狀態(tài)的操作
  • 存儲在oplog中的操作并不是和主節(jié)點執(zhí)行的操作完全一樣,例如"$inc"操作就會轉(zhuǎn)化為"$set"操作
  • oplog存儲在固定集合中(capped collection),當oplog的數(shù)量超過oplogSize,新的操作就會覆蓋舊的操作

數(shù)據(jù)同步

在副本集中,有兩種數(shù)據(jù)同步方式:

  • initial sync(初始化):這個過程發(fā)生在當副本集中創(chuàng)建一個新的數(shù)據(jù)庫或其中某個節(jié)點剛從宕機中恢復,或者向副本集中添加新的成員的時候,默認的,副本集中的節(jié)點會從離它最近的節(jié)點復制oplog來同步數(shù)據(jù),這個最近的節(jié)點可以是primary也可以是擁有最新oplog副本的secondary節(jié)點。
  • 該操作一般會重新初始化備份節(jié)點,開銷較大
  • replication(復制):在初始化后這個操作會一直持續(xù)的進行著,以保持各個secondary節(jié)點之間的數(shù)據(jù)同步。

initial sync

當遇到上面例子中無法同步的問題時,只能使用以下兩種方式進行initial sync了

  • 第一種方式就是停止該節(jié)點,然后刪除目錄中的文件,重新啟動該節(jié)點。這樣,這個節(jié)點就會執(zhí)行initial sync
    注意:通過這種方式,sync的時間是根據(jù)數(shù)據(jù)量大小的,如果數(shù)據(jù)量過大,sync時間就會很長
    同時會有很多網(wǎng)絡(luò)傳輸,可能會影響其他節(jié)點的工作
  • 第二種方式,停止該節(jié)點,然后刪除目錄中的文件,找一個比較新的節(jié)點,然后把該節(jié)點目錄中的文件拷貝到要sync的節(jié)點目錄中

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 記一次MongoDB性能問題(從MySQL遷移到MongoDB)

    記一次MongoDB性能問題(從MySQL遷移到MongoDB)

    最近忙著把一個項目從MySQL遷移到MongoDB,在導入舊數(shù)據(jù)的過程中,遇到了些許波折,犯了不少錯誤,但同時也學到了不少知識,遂記錄下來,需要的朋友可以參考下
    2017-03-03
  • MongoDB數(shù)據(jù)庫的特色和優(yōu)點介紹

    MongoDB數(shù)據(jù)庫的特色和優(yōu)點介紹

    這篇文章主要介紹了MongoDB數(shù)據(jù)庫的特色和優(yōu)點介紹,本文總結(jié)了每個開發(fā)人員都應該知道的5個MongoDB特點,需要的朋友可以參考下
    2015-05-05
  • MongoDB快速入門筆記(七)MongoDB的用戶管理操作

    MongoDB快速入門筆記(七)MongoDB的用戶管理操作

    這篇文章主要介紹了MongoDB快速入門筆記(七)MongoDB的用戶管理操作 的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • Centos7安裝和卸載Mongodb數(shù)據(jù)庫的方法

    Centos7安裝和卸載Mongodb數(shù)據(jù)庫的方法

    MongoDB是一個跨平臺,面向文檔的數(shù)據(jù)庫,提供高性能,高可用性和易于擴展。MongoDB是工作在集合和文檔上一種概念。下面通過本文給大家分享Centos7安裝和卸載Mongodb數(shù)據(jù)庫的方法,需要的朋友參考下吧
    2017-11-11
  • windows下安裝mongodb以及node.js連接mongodb實例

    windows下安裝mongodb以及node.js連接mongodb實例

    本篇文章主要介紹了windows下安裝mongodb以及node.js連接mongodb實例,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • 詳解MongoDB范圍片鍵和哈希片鍵

    詳解MongoDB范圍片鍵和哈希片鍵

    這篇文章主要介紹了MongoDB范圍片鍵和哈希片鍵的相關(guān)資料,幫助大家更好的理解和學習使用MongoDB,感興趣的朋友可以了解下
    2021-03-03
  • Java操作MongoDB數(shù)據(jù)庫方法詳解

    Java操作MongoDB數(shù)據(jù)庫方法詳解

    本文給大家分享的是使用Java操作MongoDB的一些基本方法,包含多種數(shù)據(jù)庫的連接方式,增刪改查等方法,非常的實用,有需要的小伙伴可以參考下
    2018-01-01
  • centos8安裝MongoDB的詳細過程

    centos8安裝MongoDB的詳細過程

    MongoDB由MongoDB Inc開發(fā),并根據(jù)SSPL(服務器端公共許可證)進行分發(fā),是一個開源,跨平臺,面向文檔的數(shù)據(jù)庫管理系統(tǒng),本文重點給大家介紹centos8安裝MongoDB的詳細過程,感興趣的朋友一起看看吧
    2021-10-10
  • MongoDB 管道的介紹及操作符實例

    MongoDB 管道的介紹及操作符實例

    這篇文章主要介紹了MongoDB 管道的介紹及操作符實例的相關(guān)資料,MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理,需要的朋友可以參考下
    2017-07-07
  • mongodb BSON的基本使用教程

    mongodb BSON的基本使用教程

    這篇文章主要給大家介紹了關(guān)于mongodb BSON的基本使用教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12

最新評論