MongoDB添加secondary節點的兩種方法

来源:https://www.cnblogs.com/liyingxiao/archive/2018/10/10/9768003.html
-Advertisement-
Play Games

前段時間維護的一個事業群的其中一條業務線的開發找到運維,提出來了一個MongoDB的優化問題,那段時間MongoDB正在從op管理移交給db進行維護,整個部門都對MongoDB的運維經驗缺乏,MongoDB的優化更是一個未知的挑戰。當op找到我,核心系統的公共服務平臺用來進行簡訊服務的MongoDB ...


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

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

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

  不同的業務場景應用不同的架構策略,擴充secondary節點有時候不能解決問題,尤其是那些實時性很高的業務,但有時候擴充secondary節點確實有效,比如硬體升級後需要做的服務遷移,需要線上擴充secondary節點來滿足業務需要的更高的硬體要求。

    MongoDB的secondary節點的擴充,我總結起來有兩種方式:1、rs.add()直接擴充 2、一致性備份後進行擴充(個人叫法)

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

  具體的實現方式是登陸擴充節點的機器,編輯好配置文件,並建立相應的目錄和許可權,啟動MongoDB實例就可以了。

  需要註意的一點兒是這種擴充方式要保證同步源的數據量級,即保證在同步完數據前MongoDB的oplog不會被覆蓋,這點兒類似與MySQL的redo log日誌,如果被覆蓋那麼同步的數據出現不一致,導致同步失敗。

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

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

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

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

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

     d)初始化local資料庫的其他兩個集合db.replset.election,db.system.replset

    e)修改資料庫配置並重啟資料庫(這一步操作前實例不開啟認證模式、複製集的配置),rs.add("HOST_NAME:PORT")將secondary添加進集群並觀察同步狀態、校驗數據的完整和一致性

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

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

 

 1 #primary節點或者其他secondary節點備份數據
 2 [root@172-16-3-190 mongodb]# /opt/app/mongodb/bin/mongodump -uroot -ppwd4mysql --authenticationDatabase=admin --port=27017 --oplog -o /tmp/dump_mongo/
 3 2018-08-20T15:42:47.028+0800 writing admin.system.users to 
 4 2018-08-20T15:42:47.030+0800 done dumping admin.system.users (1 document)
 5 2018-08-20T15:42:47.030+0800 writing admin.system.version to 
 6 2018-08-20T15:42:47.031+0800 done dumping admin.system.version (2 documents)
 7 2018-08-20T15:42:47.032+0800 writing super_hero.user_address to 
 8 2018-08-20T15:42:47.032+0800 writing super_hero.user_info to 
 9 2018-08-20T15:42:47.033+0800 done dumping super_hero.user_address (1 document)
10 2018-08-20T15:42:47.033+0800 done dumping super_hero.user_info (1 document)
11 2018-08-20T15:42:47.034+0800 writing captured oplog to 
12 2018-08-20T15:42:47.036+0800 dumped 1 oplog entry
13 
14 #查看備份的文件
15 [root@172-16-3-190 mongodb]# ls -lh /tmp/dump_mongo/
16 total 12K
17 drwxr-xr-x 2 root root 4.0K Aug 20 15:42 admin
18 -rw-r--r-- 1 root root 110 Aug 20 15:42 oplog.bson
19 drwxr-xr-x 2 root root 4.0K Aug 20 15:42 super_hero
20 
21 #傳遞備份到準備添加為secondary的節點上
22 [root@172-16-3-190 tmp]# scp -r -P22222 /tmp/dump_mongo/ liyingxiao@172.16.3.189:/tmp

 

2、secondary節點一致性快照恢復

 1 #auth=true
 2 #replSet = repl_mongo
 3 #clusterAuthMode=keyFile
 4 #keyFile=/opt/app/mongodb/keyfile/mongodb.key
 5 
 6 ##恢複數據
 7 [root@172-16-3-189 we_ops_admin]# /opt/app/mongodb/bin/mongorestore --oplogReplay --port=27017 /tmp/dump_mongo/                                          
 8 2018-08-20T15:56:32.161+0800 preparing collections to restore from
 9 2018-08-20T15:56:32.193+0800 reading metadata for super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.metadata.json
10 2018-08-20T15:56:32.194+0800 reading metadata for super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.metadata.json
11 2018-08-20T15:56:32.222+0800 restoring super_hero.user_address from /tmp/dump_mongo/super_hero/user_address.bson
12 2018-08-20T15:56:32.300+0800 restoring super_hero.user_info from /tmp/dump_mongo/super_hero/user_info.bson
13 2018-08-20T15:56:32.867+0800 no indexes to restore
14 2018-08-20T15:56:32.867+0800 finished restoring super_hero.user_address (1 document)
15 2018-08-20T15:56:32.881+0800 no indexes to restore
16 2018-08-20T15:56:32.881+0800 finished restoring super_hero.user_info (1 document)
17 2018-08-20T15:56:32.881+0800 restoring users from /tmp/dump_mongo/admin/system.users.bson
18 2018-08-20T15:56:32.993+0800 replaying oplog
19 2018-08-20T15:56:32.997+0800 done

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

  創建oplog.rs集合併初始化大小

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

  恢復一致性備份的oplog.rs集合的數據到secondary節點

1 [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  
2 2018-08-20T16:12:49.848+0800 checking for collection data in /tmp/dump_mongo/oplog.bson
3 2018-08-20T16:12:49.852+0800 restoring local.oplog.rs from /tmp/dump_mongo/oplog.bson
4 2018-08-20T16:12:49.925+0800 no indexes to restore
5 2018-08-20T16:12:49.925+0800 finished restoring local.oplog.rs (1 document)
6 2018-08-20T16:12:49.925+0800 done

4、初始化db.replset.election,db.system.replset集合,其中replset.election需要查詢主節點數據並將這些數據存儲到secondary節點,或者兩個結合自行save到secondary節點。另集合system.replset加入複製集後可自動識別primary節點內容(這裡我採取自行同步數據)

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

5、修改資料庫配置並重啟,添加secondary節點到複製集群中

#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節點
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節點,驗證複製集狀態,數據完整和一致性。

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

  重點介紹第二種省時省心但費力費操作的添加secondary節點的方法,實踐過程中資料庫實例前期去掉認證和複製集參數,是方便我們下麵的一些需要用戶許可權的操作,避免建立管理員賬號,後續加入集群後自行同步了primary節點的賬號。重啟後登錄secondary節點驗證服務的可用性和數據一致性時,使用集群的管理賬號進入,否則會報認證的錯誤。

  總結如上兩種擴充方式,對於方式1的擴充簡單省事,需要保證oplog不被覆蓋和評估同步流量的影響問題,是我們通常進行橫向複製集添加secondary節點的方法。對於第二種方式,操作繁瑣但不用擔心oplog被覆蓋,且操作期間不會過多擔憂網路流量的問題,僅僅考慮網路傳輸的流量影響。第一種方式操作時間周期長,不可控的影響範圍大費時費精力,第二種方式操作時間短,操作的步驟多,容易出現其他問題。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 伺服器端安裝 1、安裝倉庫 rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm 2、安裝軟體包 yum install zabbix-server-mysql zab ...
  • 查看僵屍進程 lsof grep deleted; 用於查看已經停止但還在占用存儲的進程 ...
  • 有些用戶在把Win7/Win8.1升級到Win10正式版後,發現屏幕一直不停閃爍,以至於無法正常使用。出現這種情況的原因可能有很多,微軟社區的論壇審閱人Alex_Shen給出了一種解決方案:進入安全模式停止兩個服務。好系統官網將其提供的方法進行整理後供大家參考。 工具/原料 好系統重裝助手 具體操作 ...
  • 本文來自:https://www.breakyizhan.com/sql/5648.html1. 儲存與管理資料儲存與管理資料一直是資訊應用上最基本、也是最常見的技術。在還沒有使用電腦來管理你的資料時,你可能會使用這樣的方式來保存世界上所有的國家資料:這樣的作法在生活中是很常見的,例如親友的通訊錄,... ...
  • 看了網上好多種教程,自己嘗試失敗了好多次,最後總算弄好了,具體如下 zip下載地址:https://dev.mysql.com/downloads/mysql/ 之後點擊No thanks, just start my download. 下載之後解壓文件 然後配置環境變數,這樣可以直接在cmd中輸 ...
  • 第二篇這裡嘗試聊聊緩存的主從(Master-Slave),以及相關的高可用實現(High-Availability)(具體應用依然以Redis 舉例) 1.1 關於主從分離的取捨觀點 是否採用主從分離(這裡特指讀寫分離),個人目前的觀點是,它在很多場景里,並不是一個很好的方案。 我更想說的是,甚至任... ...
  • 一偽分佈模式 特點:在單機上,模擬一個分散式的環境,具備Hadoop的所有功能 HDFS:NameNode + DataNode + SecondaryNameNode Yarn:ResourceManager + NodeManager (*)hadoop-env.sh JAVA_HOME /ro ...
  • 背景 考慮以下場景: InfoTable(信息表): | Name | Gender | Age | Score | | | | | | | 張三 | 男 | 21 | 90 | | 李四 | 女 | 20 | 87 | | 王五 | 男 | 22 | 92 | | 趙六 | 女 | 19 | 94 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...