日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

中发生数据丢失_如何防止Redis脑裂导致数据丢失?

發(fā)布時間:2023/12/10 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中发生数据丢失_如何防止Redis脑裂导致数据丢失? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所謂的腦裂,就是指在主從集群中,同時有兩個主節(jié)點,它們都能接收寫請求。而腦裂最直接的影響,就是客戶端不知道應該往哪個主節(jié)點寫入數(shù)據(jù),結(jié)果就是不同的客戶端會往不同的主節(jié)點上寫入數(shù)據(jù)。而且,嚴重的話,腦裂會進一步導致數(shù)據(jù)丟失。

為什么會發(fā)生腦裂?

1.確認是不是數(shù)據(jù)同步出現(xiàn)了問題

在主從集群中發(fā)生數(shù)據(jù)丟失,最常見的原因就是主庫的數(shù)據(jù)還沒有同步到從庫,結(jié)果主庫發(fā)生了故障,等從庫升級為主庫后,未同步的數(shù)據(jù)就丟失了。如果是這種情況的數(shù)據(jù)丟失,我們可以通過比對主從庫上的復制進度差值來進行判斷,也就是計算 master_repl_offset 和 slave_repl_offset 的差值。如果從庫上的 slave_repl_offset 小于原主庫的 master_repl_offset,那么,我們就可以認定數(shù)據(jù)丟失是由數(shù)據(jù)同步未完成導致的。

2.排查客戶端的操作日志,發(fā)現(xiàn)腦裂現(xiàn)象

在排查客戶端的操作日志時,我們發(fā)現(xiàn),在主從切換后的一段時間內(nèi),有一個客戶端仍然在和原主庫通信,并沒有和升級的新主庫進行交互。這就相當于主從集群中同時有了兩個主庫。根據(jù)這個跡象,我們就想到了在分布式主從集群發(fā)生故障時會出現(xiàn)的一個問題:腦裂。

但是,不同客戶端給兩個主庫發(fā)送數(shù)據(jù)寫操作,按道理來說,只會導致新數(shù)據(jù)會分布在不同的主庫上,并不會造成數(shù)據(jù)丟失。那么,為什么我們的數(shù)據(jù)仍然丟失了呢?

3.發(fā)現(xiàn)是原主庫假故障導致的腦裂

我們是采用哨兵機制進行主從切換的,當主從切換發(fā)生時,一定是有超過預設數(shù)量(quorum 配置項)的哨兵實例和主庫的心跳都超時了,才會把主庫判斷為客觀下線,然后,哨兵開始執(zhí)行切換操作。哨兵切換完成后,客戶端會和新主庫進行通信,發(fā)送請求操作。

但是,在切換過程中,既然客戶端仍然和原主庫通信,這就表明,原主庫并沒有真的發(fā)生故障(例如主庫進程掛掉)。

為什么腦裂會導致數(shù)據(jù)丟失?

主從切換后,從庫一旦升級為新主庫,哨兵就會讓原主庫執(zhí)行 slave of 命令,和新主庫重新進行全量同步。而在全量同步執(zhí)行的最后階段,原主庫需要清空本地的數(shù)據(jù),加載新主庫發(fā)送的 RDB 文件,這樣一來,原主庫在主從切換期間保存的新寫數(shù)據(jù)就丟失了。

如何應對腦裂問題?

Redis 已經(jīng)提供了兩個配置項來限制主庫的請求處理,分別是 min-slaves-to-write 和 min-slaves-max-lag。

  • min-slaves-to-write:這個配置項設置了主庫能進行數(shù)據(jù)同步的最少從庫數(shù)量;
  • min-slaves-max-lag:這個配置項設置了主從庫間進行數(shù)據(jù)復制時,從庫給主庫發(fā)送 ACK 消息的最大延遲(以秒為單位)。

我們可以把 min-slaves-to-write 和 min-slaves-max-lag 這兩個配置項搭配起來使用,分別給它們設置一定的閾值,假設為 N 和 T。這兩個配置項組合后的要求是,主庫連接的從庫中至少有 N 個從庫,和主庫進行數(shù)據(jù)復制時的 ACK 消息延遲不能超過 T 秒,否則,主庫就不會再接收客戶端的請求了。

即使原主庫是假故障,它在假故障期間也無法響應哨兵心跳,也不能和從庫進行同步,自然也就無法和從庫進行 ACK 確認了。這樣一來,min-slaves-to-write 和 min-slaves-max-lag 的組合要求就無法得到滿足,原主庫就會被限制接收客戶端請求,客戶端也就不能在原主庫中寫入新數(shù)據(jù)了。

往期推薦

一個幾乎每個系統(tǒng)必踩的坑兒:訪問數(shù)據(jù)庫超時

設計模式行為型:觀察者模式(ObserverPattern)

API和SDK有什么區(qū)別?

雪花算法的實現(xiàn)思想

設計模式行為型:中介模式(MediatorPattern)

網(wǎng)絡資源加載很慢?CDN加速服務了解一下!

如何保證核心鏈路穩(wěn)定性的流控和熔斷機制?

總結(jié)

以上是生活随笔為你收集整理的中发生数据丢失_如何防止Redis脑裂导致数据丢失?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。