自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

調(diào)研Redis高可用兩種方案

新聞 系統(tǒng)運維 Redis
本文作者深入分析了Redis高可用的方方面面,并且做了有效總結(jié),相信對廣大讀者可以起到很好的領(lǐng)路作用。

導(dǎo)讀:Redis是被廣泛使用的基礎(chǔ)軟件之一。對于工程師和,架構(gòu)師,運維人員來說,了解Redis的高可用方案和背后的原理,是必備的基礎(chǔ)知識。本文作者深入分析了Redis高可用的方方面面,并且做了有效總結(jié),相信對廣大讀者可以起到很好的領(lǐng)路作用。

作者 codedump codedump.info 博主,多年從事互聯(lián)網(wǎng)服務(wù)器后臺開發(fā)工作??稍L問作者博客閱讀 codedump 更多文章。

Redis中為了實現(xiàn)高可用(High Availability,簡稱HA),采用了如下兩個方式:

  • 主從復(fù)制數(shù)據(jù)。

  • 采用哨兵監(jiān)控數(shù)據(jù)節(jié)點的運行情況,一旦主節(jié)點出現(xiàn)問題由從節(jié)點頂上繼續(xù)進行服務(wù)。

主從復(fù)制

Redis中主從節(jié)點復(fù)制數(shù)據(jù)有全量復(fù)制和部分復(fù)制之分。

舊版本全量復(fù)制功能的實現(xiàn)

全量復(fù)制使用snyc命令來實現(xiàn),其流程是:

  • 從服務(wù)器向主服務(wù)器發(fā)送sync命令。

  • 主服務(wù)器在收到sync命令之后,調(diào)用bgsave命令生成***的rdb文件,將這個文件同步給從服務(wù)器,這樣從服務(wù)器載入這個rdb文件之后,狀態(tài)就會和主服務(wù)器執(zhí)行bgsave命令時候的一致。

  • 主服務(wù)器將保存在命令緩沖區(qū)中的寫命令同步給從服務(wù)器,從服務(wù)器執(zhí)行這些命令,這樣從服務(wù)器的狀態(tài)就跟主服務(wù)器當(dāng)前狀態(tài)一致了。

調(diào)研Redis高可用兩種方案

舊版本全量復(fù)制功能,其***的問題是從服務(wù)器斷線重連時,即便在從服務(wù)器上已經(jīng)有一部分?jǐn)?shù)據(jù)了,也需要進行全量復(fù)制,這樣做的效率很低,于是新版本的Redis在這部分做了改進。

新版本全量復(fù)制功能的實現(xiàn)

新版本Redis使用psync命令來代替sync命令,該命令既可以實現(xiàn)完整全同步也可以實現(xiàn)部分同步。

復(fù)制偏移量

執(zhí)行復(fù)制的雙方,主從服務(wù)器,分別會維護一個復(fù)制偏移量:

  • 主服務(wù)器每次向從服務(wù)器同步了N字節(jié)數(shù)據(jù)之后,將修改自己的復(fù)制偏移量+N。

  • 從服務(wù)器每次從主服務(wù)器同步了N字節(jié)數(shù)據(jù)之后,將修改自己的復(fù)制偏移量+N。

復(fù)制積壓緩沖區(qū)

主服務(wù)器內(nèi)部維護了一個固定長度的先進先出隊列做為復(fù)制積壓緩沖區(qū),其默認(rèn)大小為1MB。

在主服務(wù)器進行命令傳播時,不僅會將寫命令同步到從服務(wù)器,還會將寫命令寫入復(fù)制積壓緩沖區(qū)。

調(diào)研Redis高可用兩種方案

服務(wù)器運行ID

每個Redis服務(wù)器,都有其運行ID,運行ID由服務(wù)器在啟動時自動生成,主服務(wù)器會將自己的運行ID發(fā)送給從服務(wù)器,而從服務(wù)器會將主服務(wù)器的運行ID保存起來。

從服務(wù)器Redis斷線重連之后進行同步時,就是根據(jù)運行ID來判斷同步的進度:

  • 如果從服務(wù)器上面保存的主服務(wù)器運行ID與當(dāng)前主服務(wù)器運行ID一致,則認(rèn)為這一次斷線重連連接的是之前復(fù)制的主服務(wù)器,主服務(wù)器可以繼續(xù)嘗試部分同步操作。

  • 否則,如果前后兩次主服務(wù)器運行ID不相同,則認(rèn)為是完成全同步流程。

psync命令流程

有了前面的準(zhǔn)備,下面開始分析psync命令的流程:

  • 如果從服務(wù)器之前沒有復(fù)制過任何主服務(wù)器,或者之前執(zhí)行過slaveof no one命令,那么從服務(wù)器就會向主服務(wù)器發(fā)送psync ? -1命令,請求主服務(wù)器進行數(shù)據(jù)的全量同步。

  • 否則,如果前面從服務(wù)器已經(jīng)同步過部分?jǐn)?shù)據(jù),那么從服務(wù)器向主服務(wù)器發(fā)送psync <runid> <offset>命令,其中runid是上一次主服務(wù)器的運行id,offset是當(dāng)前從服務(wù)器的復(fù)制偏移量。

前面兩種情況主服務(wù)器收到psync命令之后,會出現(xiàn)以下三種可能:

  • 主服務(wù)器返回+fullresync <runid> <offset>回復(fù),表示主服務(wù)器要求與從服務(wù)器進行完整的數(shù)據(jù)全量同步操作。其中,runid是當(dāng)前主服務(wù)器運行id,而offset是當(dāng)前主服務(wù)器的復(fù)制偏移量。

  • 如果主服務(wù)器應(yīng)答+continue,那么表示主服務(wù)器與從服務(wù)器進行部分?jǐn)?shù)據(jù)同步操作,將從服務(wù)器缺失的數(shù)據(jù)同步過來即可。

  • 如果主服務(wù)器應(yīng)答-err,那么表示主服務(wù)器版本低于2.8,識別不了psync命令,此時從服務(wù)器將向主服務(wù)器發(fā)送sync命令,執(zhí)行完整的全量數(shù)據(jù)同步。

調(diào)研Redis高可用兩種方案

哨兵機制概述

Redis使用哨兵機制來實現(xiàn)高可用(HA),其大概工作原理是:

  • Redis使用一組哨兵(sentinel)節(jié)點來監(jiān)控主從redis服務(wù)的可用性。

  • 一旦發(fā)現(xiàn)Redis主節(jié)點失效,將選舉出一個哨兵節(jié)點作為***(leader)。

  • 哨兵***再從剩余的從Redis節(jié)點中選出一個Redis節(jié)點作為新的主Redis節(jié)點對外服務(wù)。

以上將Redis節(jié)點分為兩類:

  • 哨兵節(jié)點(sentinel):負(fù)責(zé)監(jiān)控節(jié)點的運行情況。

  • 數(shù)據(jù)節(jié)點:即正常服務(wù)客戶端請求的Redis節(jié)點,有主從之分。

以上是大體的流程,這個流程需要解決以下幾個問題:

  • 如何對Redis數(shù)據(jù)節(jié)點進行監(jiān)控?

  • 如何確定一個Redis數(shù)據(jù)節(jié)點失效?

  • 如何選擇出一個哨兵***節(jié)點?

  • 哨兵節(jié)點選擇新的主Redis節(jié)點的依據(jù)是什么?

以下來逐個回答這些問題。

三個監(jiān)控任務(wù)

哨兵節(jié)點通過三個定時監(jiān)控任務(wù)監(jiān)控Redis數(shù)據(jù)節(jié)點的服務(wù)可用性。

info命令

每隔10秒,每個哨兵節(jié)點都會向主、從Redis數(shù)據(jù)節(jié)點發(fā)送info命令,獲取新的拓?fù)浣Y(jié)構(gòu)信息。

Redis拓?fù)浣Y(jié)構(gòu)信息包括了:

  • 本節(jié)點角色:主或從。

  • 主從節(jié)點的地址、端口信息。

這樣,哨兵節(jié)點就能從info命令中自動獲取到從節(jié)點信息,因此那些后續(xù)才加入的從節(jié)點信息不需要顯式配置就能自動感知。

調(diào)研Redis高可用兩種方案

向__sentinel__:hello頻道同步信息

每隔2秒,每個哨兵節(jié)點將會向Redis數(shù)據(jù)節(jié)點的__sentinel__:hello頻道同步自身得到的主節(jié)點信息以及當(dāng)前哨兵節(jié)點的信息,由于其他哨兵節(jié)點也訂閱了這個頻道,因此實際上這個操作可以交換哨兵節(jié)點之間關(guān)于主節(jié)點以及哨兵節(jié)點的信息。

這一操作實際上完成了兩件事情: * 發(fā)現(xiàn)新的哨兵節(jié)點:如果有新的哨兵節(jié)點加入,此時保存下來這個新哨兵節(jié)點的信息,后續(xù)與該哨兵節(jié)點建立連接。 * 交換主節(jié)點的狀態(tài)信息,作為后續(xù)客觀判斷主節(jié)點下線的依據(jù)。

調(diào)研Redis高可用兩種方案

向數(shù)據(jù)節(jié)點做心跳探測

每隔1秒,每個哨兵節(jié)點向主、從數(shù)據(jù)節(jié)點以及其他sentinel節(jié)點發(fā)送ping命令做心跳探測,這個心跳探測是后續(xù)主觀判斷數(shù)據(jù)節(jié)點下線的依據(jù)。

調(diào)研Redis高可用兩種方案

主觀下線和客觀下線

主觀下線

上面三個監(jiān)控任務(wù)中的第三個探測心跳任務(wù),如果在配置的down-after-milliseconds之后沒有收到有效回復(fù),那么就認(rèn)為該數(shù)據(jù)節(jié)點“主觀下線(sdown)”。

調(diào)研Redis高可用兩種方案

為什么稱為“主觀下線”?因為在一個分布式系統(tǒng)中,有多個機器在一起聯(lián)動工作,網(wǎng)絡(luò)可能出現(xiàn)各種狀況,僅憑一個節(jié)點的判斷還不足以認(rèn)為一個數(shù)據(jù)節(jié)點下線了,這就需要后面的“客觀下線”。

客觀下線

當(dāng)一個哨兵節(jié)點認(rèn)為主節(jié)點主觀下線時,該哨兵節(jié)點需要通過”sentinel is-master-down-by addr”命令向其他哨兵節(jié)點咨詢該主節(jié)點是否下線了,如果有超過半數(shù)的哨兵節(jié)點都回答了下線,此時認(rèn)為主節(jié)點“客觀下線”。

調(diào)研Redis高可用兩種方案

選舉哨兵***

當(dāng)主節(jié)點客觀下線時,需要選舉出一個哨兵節(jié)點做為哨兵***,以完成后續(xù)選出新的主節(jié)點的工作。

這個選舉的大體思路是:

  • 每個哨兵節(jié)點通過向其他哨兵節(jié)點發(fā)送”sentinel is-master-down-by addr”命令來申請成為哨兵***。

  • 而每個哨兵節(jié)點在收到一個”sentinel is-master-down-by addr”命令時,只允許給***個節(jié)點投票,其他節(jié)點的該命令都會被拒絕。

  • 如果一個哨兵節(jié)點收到了半數(shù)以上的同意票,則成為哨兵***。

  • 如果前面三步在一定時間內(nèi)都沒有選出一個哨兵***,將重新開始下一次選舉。

可以看到,這個選舉***的流程很像raft中選舉leader的流程。

調(diào)研Redis高可用兩種方案

選出新的主節(jié)點

在剩下的Redis從節(jié)點中,按照以下順序來選擇新的主節(jié)點:

  • 過濾掉“不健康”的數(shù)據(jù)節(jié)點:比如主觀下線、斷線的從節(jié)點、五秒內(nèi)沒有回復(fù)過哨兵節(jié)點ping命令的節(jié)點、與主節(jié)點失聯(lián)的從節(jié)點。

  • 選擇slave-priority(從節(jié)點優(yōu)先級)***的從節(jié)點,如果存在則返回不存在則繼續(xù)后面的流程。

  • 選擇復(fù)制偏移量***的從節(jié)點,這意味著這個從節(jié)點上面的數(shù)據(jù)最完整,如果存在則返回不存在則繼續(xù)后面的流程。

  • 到了這里,所有剩余從節(jié)點的狀態(tài)都是一樣的,選擇runid最小的從節(jié)點。

調(diào)研Redis高可用兩種方案

提升新的主節(jié)點

選擇了新的主節(jié)點之后,還需要***的流程讓該節(jié)點成為新的主節(jié)點:

  • 哨兵***向上一步選出的從節(jié)點發(fā)出“slaveof no one”命令,讓該節(jié)點成為主節(jié)點。

  • 哨兵***向剩余的從節(jié)點發(fā)送命令,讓它們成為新主節(jié)點的從節(jié)點。

  • 哨兵節(jié)點集合會將原來的主節(jié)點更新為從節(jié)點,當(dāng)其恢復(fù)之后命令它去復(fù)制新的主節(jié)點的數(shù)據(jù)。

調(diào)研Redis高可用兩種方案

如果過程中哨兵***失效怎么辦?

原文地址:

https://www.codedump.info/post/20190409-redis-sentinel/

參考閱讀:

  • 主流微服務(wù)注冊中心淺析和對比

  • 一圖了解Google工具棧

  • Facebook F4架構(gòu)解讀:千億級圖片存儲Haystack的演進

  • 被視為代替Kafka的消息隊列:Apache Pulsar設(shè)計簡介

責(zé)任編輯:張燕妮 來源: 頭條科技
相關(guān)推薦

2010-06-07 17:41:42

Sendmail 配置

2018-06-04 09:43:53

分層存儲Linux

2022-07-22 20:00:01

高可用路由

2018-08-24 09:26:13

Redis高可用方式

2018-08-21 10:32:43

數(shù)據(jù)庫Redis高可用技術(shù)

2010-03-11 10:38:34

Python運算符

2010-05-28 09:49:48

MySQL遠程連接

2010-09-30 14:35:36

JS浮點溢出

2010-03-26 18:41:51

Nginx 502錯誤

2011-12-02 10:10:34

RedisFailover

2019-11-14 08:42:57

Redis數(shù)據(jù)庫Linux

2010-09-29 10:10:06

J2ME代碼優(yōu)化

2023-02-13 22:41:24

RedisMQRocketMQ

2010-03-11 14:34:47

Python環(huán)境

2018-07-10 08:42:45

Oracle高可用集群

2011-03-03 10:26:04

Pureftpd

2020-01-06 14:54:31

RDBAOFRedis

2009-11-16 09:45:51

PHP上傳文件大小

2022-05-23 11:35:16

jiekou冪等性

2010-01-25 17:14:53

核心交換機
點贊
收藏

51CTO技術(shù)棧公眾號