主頁 > 資料庫 > 現場填坑系列:mongodb 復制集跨機房同步網路問題探查

現場填坑系列:mongodb 復制集跨機房同步網路問題探查

2020-09-11 06:16:52 資料庫

接到現場報告,客戶MongoDB間資料延遲越來越大,有的已經超過2-3個小時,造成有些打到延遲mongodb上面的資料庫請求無法反應資料庫的最新更改,這個問題反復出現在高峰期尤其明顯,持續近一月,

架構

客戶為異地雙機房架構,兩地機房相隔上千公里,帶寬250M,光纖,具體鏈路情況不明

               F5                              |                    F5

             N中心                           |                   S中心

業務服務  ...  業務服務              |          業務服務 .... 業務服務

mongodb4 ...  mongodb6   <----|-----   mongodb1(主) ... mongdb2

 

所有資料庫在一個復制集共6臺(其中一臺不參與選舉),使用的是mongodb replicaSet 進行同步,

現象

S中心資料庫反復產生延遲,其中一次rs.printSlaveReplicationInfo()查詢集群情況顯示如下,資料庫4,5,6三臺延遲(此處不是每次都是三臺同時延遲,有時只是這三臺中的兩臺或者一臺出現延遲,但是1,2從不延遲),延遲時間最多達到2-3個小時,非高峰期可以恢復,

?

  • 客戶在兩個機房間通過ping命令發現南北網路有延遲現象,
  • 在發生延遲時,有時可以通過切換同步源的方式,暫時解決問題,

插入圖

分析

首先查看有問題的機器,發現4,5,6三臺均在N中心,1,2均在S中心,而用rs.status查看,可以發現當延遲時,這三臺都以1為同步源,也就是發生跨網路同步,

由于三臺出現同步的機器都在N中心,可猜測與鏈路有關,客戶ping命令未顯示延遲,說明ping的資料量可能不夠或者問題是由某種條件觸發的,

是否有可能同步帶寬超過了鏈路限制,我們和網路方面的人進行了溝通,得到的訊息是我們的應用使用的帶寬沒有達到上限,最高也就極限帶寬的2/3左右,為確認帶寬情況,我們自己也對帶寬進行了分析,

帶寬使用分析

南北中心業務高峰期正常情況下帶寬占用70Mb/s,也沒有達到理論高度,而且正常情況下某些瞬時,帶寬可以超過150Mb/s,也證明服務遠遠沒有達到帶寬上線,我們進一步對產生延遲的情況下的帶寬進行分析,發現了一個奇怪的情況

:在產生延遲的情況下,資料庫用來同步的帶寬遠遠不足60Mb/s ,只有不到15Mb/s,也就是說,資料庫有大量堆積,產生延遲的時候,資料庫同步反而變慢了

同時我們監控了S中心內未延遲節點與通中心主節點同步時的帶寬約為17Mb/s ,由于mongodb每臺slave都是復制同樣的資料,可以推知其他機器都應該按照這個速率進行同步,而延遲節點只有4.5Mb/s左右,

我們又查看了延遲節點的監控,查看了延時節點從正常狀態轉入延遲狀態的帶寬情況,發現其使用帶寬會在某種情況下發生驟降

 

到底是什么導致這種狀況呢?是mongodb本身的問題嗎?

這種情況我們還是決定圍繞核心現象來進行分析:這幾臺服務器和正常的服務器有什么不同,我們一一排查了機器配置,軟體配置的問題,確保出問題的服務器和正常服務器沒有原則不同,同時也查了這幾臺服務器在延遲時的表現,發現延遲時,這幾臺mongo的指標遠遠沒有到達瓶頸,所以唯一可疑的不同還是在網路上,即使ping沒有發現問題,我們還是決定要進一步抓包,

抓包

因為抓包對性能有顯著影響,為了抓出特征包,我們選在節點開始延遲,并且延遲時間還在增大時進行抓包,抓包時間在1分鐘以內,

抓包陳述句 tcpdump -i eth0 port xxx -w /home/tcpdump.cap

下面是我們看到的情況(使用Wireshark)

?

網路中出現了大量的Dup ACK,這個說明了TCP出現了資料丟失導致了重傳,

Dup ACK

TCP的流程是面向連接,會盡力保證資料的完整性,所以有失敗重傳機制,Dup ACK 就是這個機制的一部分,

每個包都有一個Seq號和一個包長度,正常情況下,某一端所有發送的包的Seq號是連續的,比如

第一個包的Seq是1,長度是2,

則第二個包Seq=1+2=3,長度4,

第三個包的Seq=3+4,長度若干,

以此類推,當接收端收到這個包時會將這個包放到緩沖區,緩沖區里可能有很多從另一端發來的包,他們必須能連續起來,接收端會向發送端發包時告知會帶上我接收到的最后一個連續的包的Seq是多少,這個資料會放在ACK里傳送,

上面注意:

  • 發送端和接收端是相對的,兩邊都遵循這個規則,
  • 不是每一個包都ACK,這樣開銷太大,
  • 也不一定有專門用于ACK的包,事實上ACK包往往也可能是對上一個或者幾個包的回復,順便就進行了ACK,

插入圖

假如丟失了一個包會怎么樣?接收端發現快取里的包丟失了,而后面的包已經到了,就會觸發上面的Dup ACK,告知我接收到的連續的資料的序號到哪里為止,也就是DupACK包的ACK,這個請求會反復發送,直到服務端發送缺失包(retransmit),在收到缺失包前,后續的包即使收到也不會ack,這個是retransmit的流程,

上面的流程在dump中典型的例子用wireshark打開會是下面的樣子:注意這里包括【TCP Previous segment not captured】【Dup ACK】 等內容都是wireshark的分析結果,TCP包中并不包含這些標簽,

首先從端發現丟包【TCP Previous segment not captured】然后引發從端大量發送dup ack,直到主端重傳通過TCP Fast Retransmition 或Retransmition 重傳missing package,見下圖,重傳期間所有有缺失的包會暫存入buffer,

?

 

在wireshark中可以對重傳的包進行過濾  tcp.analysis.retransmission 

過濾結果為32條,占所抓包的0.3%,這個統計可以看做是就是丟包的統計,然而由于這樣的丟包,觸發tcp進行反復溝通引起的混亂遠遠大于此,如果統計所有由此引起的dup Ack, Out of Order,Fast Retransmit,Transmit,window_update 等,可以看到這些處理丟包的請求占到了5.5%之多,

同時剛才提到發送端可能發送很多包,但是只是其中一個丟了,這些沒有丟掉的包會放在一個緩沖區中,這個緩沖區叫做window,由于后續包不斷到來,而失去的包沒有補上,所以tcp不能向上層轉發,于是就會更改window的大小,這個也是非常消耗資源的行為,

總結來說:

從庫的dump中,共抓包16.81秒10176個包,錯誤重傳造成的dup ack和重傳包達到562 占 5.5%;

主庫(同步源)的dump中,共抓包12秒 3501個包,錯誤重傳以及dup ack相關的包占到325,占比9.3%;

而同機房內部節點完全未見丟包與重傳,且在跨機房節點處于無延遲正常狀態也未見丟包重傳,

重傳與流量下降間的關系

為了確保這個現象只在跨機房呼叫中出現,我們也抓取了同機房同步,以及跨機房無延遲時的情況,這兩種情況下均無上述問題,重傳錯誤與流量的關系可見下圖,折線為吞吐,柱形為error包數量,可見流量的重大轉折均伴隨有相關錯誤,下圖也展現了window scaling的情況,展示出由于錯誤發生,windows size 的修改情況,可見6分鐘左右發生了一次大的scaling,正對應了dump中的錯誤,

?

結論與解決方法

在丟包率0.3%的情況下,mongodb的replicaSet發生了比較嚴重的問題,表現為同步速率大幅下降,然后產生延遲,

客戶網路情況比較復雜,鏈路是運營商鏈路,還有許多第三方廠商的設備,難以在短時間內排查原因,所以再發生同步時,我們采用rs.syncFrom腳本切換同步源臨時解決這個問題:即當腳本監測延遲>10分鐘時,立刻切換到另外一個資料源,

此方法基于在產生延遲后,立即切換另外一個資料源可以重新打開同步鏈路快速同步,瞬間同步時速可以到達160Mb/s,延時資料能很快消失,

但是在執行程序中,出現過切換同時,mongodb由于大量寫入而影響業務的情況,所以后來改為在非高峰先講需要修改的節點改為hide節點再進行處理,

未來最終解決方案

解決網路延遲:這個是最直接的解決辦法,畢竟同機房同步未見問題,

減少replicaSet的量:檢查業務中的寫入更新洗掉邏輯,減少生成量,具體分析和處理方法將另文描述,

使用mongoshake等第三方同步工具:由于尚未明晰重傳為何導致復制集處理速度下降,所以不使用復制集也可能可以解決這個問題,且復制集對源的選擇有自己的演算法,雖然可以短時間的切換,但是更多時候是根據mongodb自身的演算法進行選擇,比如在本案中,三臺N節點Mongo都到S節點同步,造成帶寬乘以3倍,雖然可以手動制定其中兩臺從同節點一臺復制,但mongodb還是有可能自動根據自己的演算法切換源,而使用第三方同步工具可以解決上面的兩個問題,但是要檢查第三方工具在0.3%網路丟包下的作業情況,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/4604.html

標籤:NoSQL

上一篇:現場填坑系列:使用bulk操作提高性能,解決mongoshake 向ES同步延遲。

下一篇:一篇文章徹底理解Redis持久化:RDB和AOF

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more