主頁 > 資料庫 > 一次redis主從切換導致的資料丟失與陷入只讀狀態故障

一次redis主從切換導致的資料丟失與陷入只讀狀態故障

2023-05-22 08:07:05 資料庫

背景

最近一組業務redis資料不斷增長需要擴容記憶體,而擴容記憶體則需要重啟云主機,在按計劃擴容升級執行主從切換時意外發生了資料丟失與master進入只讀狀態的故障,這里記錄分享一下,

業務redis高可用架構

該組業務redis使用的是一主一從,通過sentinel集群實作故障時的自動主從切換,這套架構已經平穩運行數年,經歷住了多次實戰的考驗,
高可用架構大體如下圖所示:
image
簡單說一下sentinel實作高可用的原理:
集群的多個(2n+1,N>1)哨兵會定期輪詢redis的所有master/slave節點,如果sentinel集群中超過一半的哨兵判定redis某個節點已經主觀下線,就會將其判定為客觀下線進行相應處理:

  1. 如果下線節點是master,選定一個正常work的slave將其選定為新的master節點,
  2. 如果下線節點是slave,將其從slave節點中移除,

如果已經被客觀下線的節點恢復了正常,sentinel中超過一半哨兵確認后則將其加回可用的slave節點,
所有需要讀寫redis的server并不需要直接寫死redis 主從配置,而是通過訪問sentinel獲取當前redis的主從可用狀態,具體實作方式可以定時查詢sentinel詢問更新,也可以通過訂閱機制讓sentinel在主從變動時主動通知訂閱方更新,
sentinel實作高可用的詳細原理這里不做過多贅述,有興趣的小伙伴可以移步參考文獻中的相關資料,

具體記憶體擴容流程

sentinel可以在檢測到故障時自動切換redis主從,也可以主動執行sentinel failover mastername 命令實作手動切換主從,所以這次的記憶體擴容重啟流程設計如下(A代表初始master所在云主機,B代表初始slave所在云主機):

  1. 升級主機B記憶體配置,重啟主機B
  2. 檢查B重啟后其上的redis slave是否重新同步master資料完成,包括:
    2.1 查看slave redis log是否例外,無例外pass
    2.2 使用info keyspace命令check master、slave 各db key數量是否一致,無例外pass
    2.3 在master寫入一個測驗key,在slave上check是否同步成功
    2.4 觀察依賴server log是否有例外
  3. 使用sentinel failover mastername命令手動主從切換,主機A變成新slave,主機B變成新master,根據以前手動切換的經驗走到這一步基本上就穩了--因為這里本質上和一次普通主從切換已經沒有區別了,
  4. 升級主機A記憶體配置,重啟主機A,執行以下check:
    4.1 查看新slave redis log是否例外
    4.2 使用info keyspace命令check 新master、新slave 各db key數量是否一致,無例外pass
    4.3 在新master寫入測驗key,在新slave上check是否同步成功
    4.4 觀察依賴server log是否有例外

至此,若以上步驟都正常通過,一個完美的redis記憶體升級作業就完成了,

主從切換后資料丟失

結果正是沒有想過可能會出問題的步驟3反而出現了問題,直接導致了主從切換后丟掉了部分資料,并且新master進入只讀狀態將近十分鐘,
當時的情況是這樣的:
在執行完步驟3后,check 新slave redis log無例外,正在考慮觀察一會兒后執行主機A的升級重啟操作,api的分鐘級別例外監控觸發了一小波redis相關報警,第一反應在新master與新slave上執行了info keyspace查看key數量是否已經不一致,結果發現master/slave的key數量是一致的--但是再仔細一看:和切換前的key總數百萬級相比切換后key總數降到了十萬級--大部分key資料被丟失了,
查看新master、新slave log都沒有發現明顯log可以解釋為什么主從切換后會丟失一大半資料這一現象,這時小伙伴第一次提到了是不是記憶體不夠了,當時自己略一思考馬上回復到:新master剛升級了記憶體,不可能內容擴大后反而記憶體不足的,所以應該不是這個問題,
n分鐘后...
小伙伴再一次提出了是不是maxmemory問題,這一下子點中了關鍵點,馬上想到主機B升級了記憶體是不會有系統層面記憶體不足的問題,但是redis的記憶體使用實際上還會受到maxmemory引數限制,馬上在新master上執行config get maxmemory, 只有3GB,而升級前資料實際使用記憶體超過了6GB!
立刻調大了新master的maxmemory引數,redis很快恢復了可讀寫正常狀態,一大波redis只讀引發的告警通知開始快速下降,

原因定位

緊張又刺激的故障處理就這么過去了,在優先處理完丟失key資料恢復作業之后,開始回顧整理故障的詳細原因,總共有如下幾個疑問:

  1. 明確記得上個月給主機A、B上的redis都通過config set maxmemory設定為了7GB,為什么出現問題時查詢B上redis 的maxmemory配置卻變成了3GB?
  2. 如果主機B的maxmemory是3GB,其作為slave時為什么從master同步超過6GB的資料時不會有問題?--在主從切換前無論是查看info keyspace還是在master上寫入測驗key同步check都是OK的,
  3. 為什么主從切換后主機B上的key資料會丟失?這個是因為maxmemory設定過小,是故障的直接原因,
  4. 為什么新master由于maxmemory引數超限進入只讀狀態且洗掉部分資料后,新master中實際資料占用的大小依然超過>3GB?

如上四個疑問除了問題3已經明確了,剩下三個問題都讓人疑惑--事出詭異必有妖,經過一番探尋得出其答案:

  1. 上個月修改redis maxmemory時,只通過config set命令修改了其運行時配置,而沒有修改對應配置redis.conf上maxmemory的值,主機B上redis在重啟后就會從redis.conf上載入該maxmemory,該配置正是3GB,同時maxmemory引數是redis節點獨立的配置,slave并不會從master同步該值,
  2. 在redis5.0版本之后,redis引入了一個新的引數replica-ignore-maxmemory,其官方檔案定義如下:
Maxmemory on replicas
By default, a replica will ignore maxmemory (unless it is promoted to master after a failover or manually). It means that the eviction of keys will be handled by the master, sending the DEL commands to the replica as keys evict in the master side.
This behavior ensures that masters and replicas stay consistent, which is usually what you want. However, if your replica is writable, or you want the replica to have a different memory setting, and you are sure all the writes performed to the replica are idempotent, then you may change this default (but be sure to understand what you are doing).
Note that since the replica by default does not evict, it may end up using more memory than what is set via maxmemory (since there are certain buffers that may be larger on the replica, or data structures may sometimes take more memory and so forth). Make sure you monitor your replicas, and make sure they have enough memory to never hit a real out-of-memory condition before the master hits the configured maxmemory setting.
To change this behavior, you can allow a replica to not ignore the maxmemory. The configuration directives to use is:
replica-ignore-maxmemory no

大意是redis作為slave時默認會無視maxmemory引數,這樣可以保證主從的資料始終保持一致,當master/slave實際資料大小均小于其maxmemory設定時,這個引數沒有任何影響,而這次丟失資料的原因正是因為主機B重啟后作為slave時maxmemory(3GB)小于實際資料大小(6GB+),此時replica-ignore-maxmemory 默認開啟保證作為slave時直接無視maxmemory的限制,而當執行sentinel failover mastername將主機B切換為新master后,新master不會受replica-ignore-maxmemory影響,發現自身maxmemory<實際資料大小后直接開始主動淘汰key,從而導致了資料丟失,
4. 至于主機B作為master執行淘汰key策略并最終進入只讀狀態后,其實際資料大小依然>3GB的原因,則是由于線上redis配置的策略是volatile-lru策略,該策略只會淘汰有過期時間的key,對于不過期的key是不淘汰的,

總結

總的來看這次故障的根本原因還是個人對于redis的配置、操作經驗不足,如果在調整運行時maxmemory時能做到以下二者之一,這次故障就不會出現了:

  1. 調整運行時maxmemory時同時調整組態檔maxmemory保持一致,
  2. 將組態檔maxmemory設定為0--表示不限制記憶體使用,

正是因為對redis的認識和經驗不足,沒有想過到運行時配置與靜態配置不一致可能導致的問題,這次不可避免的踩坑了,
但是,作為一個本職RD,半路接手基本靠自學的兼職運維,要考慮到maxmemory的運行配置與靜態配置一致性問題好像也確實不是那么的理所當然??,
處理完這次故障后,特意在網上搜索了一番redis主從切換的注意事項、踩坑文章,想看看有沒有人提到類似的坑,但是并無所獲,難道這個坑真的沒其他人踩(分享)過?陷入思考...
如果有經驗豐富的小伙伴看到這里,也歡迎不吝賜教指導一下redis主從的切換的各類常識與常見大坑!

轉載請注明出處,原文地址:https://www.cnblogs.com/AcAc-t/p/redis_master_switch_failure.html

參考

https://redis.io/docs/management/replication/
https://www.cnblogs.com/buttercup/p/14051301.html
https://zhuanlan.zhihu.com/p/151740247
https://www.cnblogs.com/AcAc-t/p/redis_master_switch_failure.html
https://zhuanlan.zhihu.com/p/320651292

簽名:擁抱開源,擁抱自由

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

標籤:NoSQL

上一篇:es筆記三之term,match,match_phrase 等查詢方法介紹

下一篇:返回列表

標籤雲
其他(159440) Python(38156) JavaScript(25441) Java(18078) C(15229) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7203) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4574) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1940) python-3.x(1918) C++(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(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
最新发布
  • 一次redis主從切換導致的資料丟失與陷入只讀狀態故障

    ## 背景 最近一組業務redis資料不斷增長需要擴容記憶體,而擴容記憶體則需要重啟云主機,在按計劃擴容升級執行主從切換時意外發生了資料丟失與master進入只讀狀態的故障,這里記錄分享一下。 ## 業務redis高可用架構 該組業務redis使用的是一主一從,通過sentinel集群實作故障時的自動主 ......

    uj5u.com 2023-05-22 08:07:05 more
  • es筆記三之term,match,match_phrase 等查詢方法介紹

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記三之term,match,match_phrase 等查詢方法介紹](https://mp.weixin.qq.com/s/3tzD8dEr592WNJFH_1bKRw) 首先介紹一下在 es 里有兩種存盤字串的欄位型別,一個是 ke ......

    uj5u.com 2023-05-21 07:59:05 more
  • es筆記三之term,match,match_phrase 等查詢方法介紹

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記三之term,match,match_phrase 等查詢方法介紹](https://mp.weixin.qq.com/s/3tzD8dEr592WNJFH_1bKRw) 首先介紹一下在 es 里有兩種存盤字串的欄位型別,一個是 ke ......

    uj5u.com 2023-05-21 07:58:42 more
  • 記一次 Oracle 下的 SQL 優化程序

    # 1. 介紹 事情是這樣的,UAT 環境的測驗小伙伴向我扔來一個小 bug,說是一個放大鏡的查詢很慢,轉幾分鐘才出資料,我立馬上開發環境試了一下,很快啊我說😏,放大鏡的資料立馬就出來了,然后我登錄 UAT 環境一看,誒是有些慢😕 ,于是開始了我的排查之旅... # 2. 程序 首先我立馬拿到了 ......

    uj5u.com 2023-05-20 08:35:31 more
  • boot-admin 專案資料庫預設欄位設計之最佳實踐

    資料庫(Database)中的預設欄位(也稱為默認欄位),就是在一般情況下,每個資料表(Table)必須包含的欄位(Field),這類欄位用于滿足特定的資料需求,欄位值的填充或更改一般遵照一定的邏輯要求。預設欄位的設計應該考慮到資料的完整性和一致性,以確保資料的正確與可靠,設計合理的表欄位對于資料的 ......

    uj5u.com 2023-05-20 08:35:20 more
  • es 筆記二之基礎查詢

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記二之基礎查詢](https://mp.weixin.qq.com/s/VW0QCuW-ONEH-TRB2WF4GQ) 這一篇筆記介紹 es 的基礎查詢。 基礎查詢包括很多,比如排序,類似資料庫 limit 的操作,like 操作,與或非 ......

    uj5u.com 2023-05-20 08:30:06 more
  • 升級 AIR_ORDER_FLIGHT

    ```sql # kais ``` ......

    uj5u.com 2023-05-20 08:20:38 more
  • 記一次 Oracle 下的 SQL 優化程序

    # 1. 介紹 事情是這樣的,UAT 環境的測驗小伙伴向我扔來一個小 bug,說是一個放大鏡的查詢很慢,轉幾分鐘才出資料,我立馬上開發環境試了一下,很快啊我說😏,放大鏡的資料立馬就出來了,然后我登錄 UAT 環境一看,誒是有些慢😕 ,于是開始了我的排查之旅... # 2. 程序 首先我立馬拿到了 ......

    uj5u.com 2023-05-20 08:14:43 more
  • boot-admin 專案資料庫預設欄位設計之最佳實踐

    資料庫(Database)中的預設欄位(也稱為默認欄位),就是在一般情況下,每個資料表(Table)必須包含的欄位(Field),這類欄位用于滿足特定的資料需求,欄位值的填充或更改一般遵照一定的邏輯要求。預設欄位的設計應該考慮到資料的完整性和一致性,以確保資料的正確與可靠,設計合理的表欄位對于資料的 ......

    uj5u.com 2023-05-20 08:09:31 more
  • 升級 AIR_ORDER_FLIGHT

    ```sql # kais ``` ......

    uj5u.com 2023-05-20 08:09:11 more