激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務器之家 - 數(shù)據(jù)庫 - Redis - Redis主從集群切換數(shù)據(jù)丟失的解決方案

Redis主從集群切換數(shù)據(jù)丟失的解決方案

2021-07-31 21:22不清不慎 Redis

這篇文章主要介紹了Redis主從集群切換數(shù)據(jù)丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、數(shù)據(jù)丟失的情況

 

異步復制同步丟失

集群產(chǎn)生腦裂數(shù)據(jù)丟失

1.異步復制丟失

對于redis主節(jié)點與從節(jié)點之間的數(shù)據(jù)復制,是異步復制的,當客戶端發(fā)送寫請求給master節(jié)點的時候,客戶端會返回ok,然后同步到各個slave節(jié)點中。

如果此時master還沒來得及同步給slave節(jié)點時發(fā)生宕機,那么master內(nèi)存中的數(shù)據(jù)會丟失;

要是master中開啟持久化設置數(shù)據(jù)可不可以保證不丟失呢?答案是否定的。在master 發(fā)生宕機后,sentinel集群檢測到master發(fā)生故障,重新選舉新的master,如果舊的master在故障恢復后重啟,那么此時它需要同步新master的數(shù)據(jù),此時新的master的數(shù)據(jù)是空的(假設這段時間中沒有數(shù)據(jù)寫入)。那么舊master中的數(shù)據(jù)就會被刷新掉,此時數(shù)據(jù)還是會丟失。

2.集群產(chǎn)生腦裂

首先我們需要理解集群的腦裂現(xiàn)象,這就好比一個人有兩個大腦,那么到底受誰來控制呢?在分布式集群中,分布式協(xié)作框架zookeeper很好的解決了這個問題,通過控制半數(shù)以上的機器來解決。

那么在redis中,集群腦裂產(chǎn)生數(shù)據(jù)丟失的現(xiàn)象是怎么樣的呢?

假設我們有一個redis集群,正常情況下client會向master發(fā)送請求,然后同步到salve,sentinel集群監(jiān)控著集群,在集群發(fā)生故障時進行自動故障轉(zhuǎn)移。

Redis主從集群切換數(shù)據(jù)丟失的解決方案

此時,由于某種原因,比如網(wǎng)絡原因,集群出現(xiàn)了分區(qū),master與slave節(jié)點之間斷開了聯(lián)系,sentinel監(jiān)控到一段時間沒有聯(lián)系認為master故障,然后重新選舉,將slave切換為新的master。但是master可能并沒有發(fā)生故障,只是網(wǎng)絡產(chǎn)生分區(qū),此時client任然在舊的master上寫數(shù)據(jù),而新的master中沒有數(shù)據(jù),如果不及時發(fā)現(xiàn)問題進行處理可能舊的master中堆積大量數(shù)據(jù)。在發(fā)現(xiàn)問題之后,舊的master降為slave同步新的master數(shù)據(jù),那么之前的數(shù)據(jù)被刷新掉,大量數(shù)據(jù)丟失。

Redis主從集群切換數(shù)據(jù)丟失的解決方案

在了解了上面的兩種數(shù)據(jù)丟失場景后,我們?nèi)绾伪WC數(shù)據(jù)可以不丟失呢?在分布式系統(tǒng)中,衡量一個系統(tǒng)的可用性,我們一般情況下會說4個9,5個9的系統(tǒng)達到了高可用(99.99%,99.999%,據(jù)說淘寶是5個9)。對于redis集群,我們不可能保證數(shù)據(jù)完全不丟失,只能做到使得盡量少的數(shù)據(jù)丟失。

二、如何保證盡量少的數(shù)據(jù)丟失?

 

在redis的配置文件中有兩個參數(shù)我們可以設置:

?
1
2
min-slaves-to-write 1
min-slaves-max-lag 10

min-slaves-to-write默認情況下是0,min-slaves-max-lag默認情況下是10。

以上面配置為例,這兩個參數(shù)表示至少有1個salve的與master的同步復制延遲不能超過10s,一旦所有的slave復制和同步的延遲達到了10s,那么此時master就不會接受任何請求。

我們可以減小min-slaves-max-lag參數(shù)的值,這樣就可以避免在發(fā)生故障時大量的數(shù)據(jù)丟失,一旦發(fā)現(xiàn)延遲超過了該值就不會往master中寫入數(shù)據(jù)。

那么對于client,我們可以采取降級措施,將數(shù)據(jù)暫時寫入本地緩存和磁盤中,在一段時間后重新寫入master來保證數(shù)據(jù)不丟失;也可以將數(shù)據(jù)寫入kafka消息隊列,隔一段時間去消費kafka中的數(shù)據(jù)。

通過上面兩個參數(shù)的設置我們盡可能的減少數(shù)據(jù)的丟失,具體的值還需要在特定的環(huán)境下進行測試設置。

補充:redis cluster 會丟數(shù)據(jù)嗎?

redis cluster 不保證強一致性,在一些特殊場景,客戶端即使收到了寫入確認,還是可能丟數(shù)據(jù)的。

場景1:異步復制

 

Redis主從集群切換數(shù)據(jù)丟失的解決方案

client 寫入 master b

master b 回復 ok

master b 同步至 slave b1 b2 b3

b 沒有等待 b1 b2 b3 的確認就回復了 client,如果在 slave 同步完成之前,master 宕機了,其中一個 slave 會被選為 master,這時之前 client 寫入的數(shù)據(jù)就丟了。

wait 命令可以增強這種場景的數(shù)據(jù)安全性。

wait 會阻塞當前 client 直到之前的寫操作被指定數(shù)量的 slave 同步成功。

wait 可以提高數(shù)據(jù)的安全性,但并不保證強一致性。

因為即使使用了這種同步復制方式,也存在特殊情況:一個沒有完成同步的 slave 被選舉為了 master。

場景2:網(wǎng)絡分區(qū)

 

6個節(jié)點 a, b, c, a1, b1, c1,3個master,3個slave,還有一個client,z1。

Redis主從集群切換數(shù)據(jù)丟失的解決方案

發(fā)生網(wǎng)絡分區(qū)之后,形成了2個區(qū),a, c, a1, b1, c1 和 b z1。

Redis主從集群切換數(shù)據(jù)丟失的解決方案

這時 z1 還是可以向 b 寫入的,如果短時間內(nèi)分區(qū)就恢復了,那就沒問題,整個集群繼續(xù)正常工作,但如果時間一長,b1 就會成為所在分區(qū)的 master,z1 寫入 b 的數(shù)據(jù)就丟了。

maximum window(最大時間窗口) 可以減少數(shù)據(jù)損失,可以控制 z1 向 b 寫入的總數(shù):

過去一定時間后,分區(qū)的多數(shù)邊就會進行選舉,slave 成為 master,這時分區(qū)少數(shù)邊的 master 就會拒絕接收寫請求。

這個時間量是非常重要的,稱為節(jié)點過期時間。

一個 master 在達到過期時間后,就被認為是故障的,進入 error 狀態(tài),停止接收寫請求,可以被 slave 取代。

小結(jié)

 

redis cluster 不保證強一致性,存在丟失數(shù)據(jù)的場景:

異步復制

在 master 寫成功,但 slave 同步完成之前,master 宕機了,slave 變?yōu)?master,數(shù)據(jù)丟失。

wait 命令可以給為同步復制,但也無法完全保證數(shù)據(jù)不丟,而且影響性能。

網(wǎng)絡分區(qū)

分區(qū)后一個 master 繼續(xù)接收寫請求,分區(qū)恢復后這個 master 可能會變?yōu)?slave,那么之前寫入的數(shù)據(jù)就丟了。

可以設置節(jié)點過期時間,減少 master 在分區(qū)期間接收的寫入數(shù)量,降低數(shù)據(jù)丟失的損失。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://blog.csdn.net/qq_37142346/article/details/89435458

延伸 · 閱讀

精彩推薦
  • RedisRedis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數(shù)db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現(xiàn)高可用的...

    李留廣10222021-08-09
  • RedisRedis的配置、啟動、操作和關(guān)閉方法

    Redis的配置、啟動、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關(guān)閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis實現(xiàn)排行榜功能

    redis實現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農(nóng)5812019-11-18
  • RedisRedis 事務知識點相關(guān)總結(jié)

    Redis 事務知識點相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務相關(guān)總結(jié),幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復制與部分復制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
主站蜘蛛池模板: 亚州精品天堂中文字幕 | 亚洲视频在线免费看 | 欧美毛片| 亚洲电影免费观看国语版 | 在线成人免费av | 成人免费看片a | 高清一区二区在线观看 | 九九热精品视频在线 | 久久精品亚洲国产奇米99 | 国产精品中文在线 | 一区二区三区日韩视频在线观看 | 国产午夜亚洲精品午夜鲁丝片 | 成人在线视频在线观看 | 久久综合色区 | 午夜在线视频观看 | 大号bbwassbigav头交 | 国产精品视频一区二区三区四区五区 | 综合图区亚洲 | 毛毛片在线看 | 欧美成人一区在线观看 | 国产精品久久久久免费视频 | 久久777国产线看观看精品 | 7777欧美| 99re色 | 欧美一级高潮片免费的 | 91精品国产777在线观看 | 欧美激情精品久久久久久黑人 | 色网站综合 | 亚洲无限资源 | 国产一区精品在线观看 | 精品免费国产一区二区三区 | 精品国产乱码一区二区三区四区 | 久久久久一区二区三区四区五区 | 亚洲精品欧美二区三区中文字幕 | 51国产偷自视频区视频小蝌蚪 | 得得啪在线视频 | 国产伦精品一区二区三区 | 国产视频99 | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | av在线电影网址 | 欧美毛片|