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

Redis 高可用之 Sentinel

開(kāi)發(fā) 前端
Sentinel 本身我們可以理解為一個(gè)特殊的 Redis 服務(wù)器, 它也可以通過(guò) redis-server xxx.conf --sentinel啟動(dòng)。

Sentinel 結(jié)構(gòu)

在 redis3.0 以前的版本要實(shí)現(xiàn)集群一般是借助哨兵 sentinel 工具來(lái)監(jiān)控 master 節(jié)點(diǎn)的狀態(tài),如果 master 節(jié)點(diǎn)異常,則會(huì)做主從切換,將某一臺(tái) slave 作為 master,哨兵的配置略微復(fù)雜,并且性能和高可用性等各方面表現(xiàn)一般,特別是在主從切換的瞬間存在訪問(wèn)瞬斷的情況,而且哨兵模式只有一個(gè)主節(jié)點(diǎn)對(duì)外提供服務(wù),沒(méi)法支持很高的并發(fā),且單個(gè)主節(jié)點(diǎn)內(nèi)存也不宜設(shè)置得過(guò)大,否則會(huì)導(dǎo)致持久化文件過(guò)大,影響數(shù)據(jù)恢復(fù)或主從同步的效率。

Sentinel 初始化

Sentinel(哨兵)是 Redis 高可用(high availability) 解決方案,由一個(gè)或者多個(gè) Sentinel 實(shí)例(instance)組成的 Sentinel 系統(tǒng)(system)可以監(jiān)視一個(gè)或者多個(gè) Redis 主服務(wù)器和其跟隨的從服務(wù)器,并且在被監(jiān)視的主服務(wù)進(jìn)入下線狀態(tài)時(shí),自動(dòng)進(jìn)行將當(dāng)前主服務(wù)器的從服務(wù)器其中一個(gè)升級(jí)為主服務(wù)器,然后將下線的主服務(wù)器設(shè)置為新主服務(wù)器的從節(jié)點(diǎn)。

Sentinel 本身我們可以理解為一個(gè)特殊的 Redis 服務(wù)器, 它也可以通過(guò) redis-server xxx.conf --sentinel啟動(dòng)。

下面是我們實(shí)驗(yàn)環(huán)境的一個(gè) Sentinel 服務(wù)器和 Redis 服務(wù)器列表(由于實(shí)驗(yàn)都在本機(jī)進(jìn)行,我們采用端口的方式來(lái)區(qū)分多個(gè)服務(wù)),服務(wù)和端口大致如下:

IP

端口

集群

127.0.0.1

6379

Master

127.0.0.1

6380

Slave

127.0.0.1

6381

Slave

127.0.0.1

26379

Sentinel

127.0.0.1

26380

Sentinel

127.0.0.1

26381

Sentinel

首先我們找到 Redis 的配置文件目錄,修改 redis-sentinel.conf文件中的以下參數(shù):

# sentinel 端口
port 26381
# 后臺(tái)運(yùn)行
daemonize yes
# 監(jiān)控主服務(wù)器和有一個(gè) slave 節(jié)點(diǎn)
sentinel monitor mymaster 127.0.0.1 6379 2

Sentinel 啟動(dòng)命令如下:

redis-server redis-sentinel-26379.conf --sentinel
redis-server redis-sentinel-26380.conf --sentinel
redis-server redis-sentinel-26381.conf --sentinel

登錄到 Sentinel 節(jié)點(diǎn), 查詢集群狀態(tài), 使用 info命令即可。

sentinel 服務(wù)和其他 redis 服務(wù)節(jié)點(diǎn)啟動(dòng)區(qū)別,就是在啟動(dòng)的過(guò)程中,不會(huì)加載 RDB 或者 AOF 來(lái)還原數(shù)據(jù)。

Sentinel 和 Redis 服務(wù)之間的通訊

  • _命令連接_,建立一個(gè)鏈接接收主/從服務(wù)器的回復(fù) (默認(rèn) 10 秒一次發(fā)送請(qǐng)求 info 信息獲取節(jié)點(diǎn)狀態(tài),故障轉(zhuǎn)移的時(shí)候會(huì)變?yōu)?1 秒一次。并且每一秒向服務(wù)器節(jié)點(diǎn)發(fā)一個(gè) PING 命令判斷服務(wù)是否在線)

  • 訂閱鏈接,用于訂閱主服務(wù)器的 __sentinel__:hello 頻道。

我們先驗(yàn)證一下在主節(jié)點(diǎn)上查詢,執(zhí)行 SUBSCRIBE __sentinel__:hello。

主節(jié)點(diǎn)服務(wù)上的同步信息,我們可以通過(guò) INFO 命令來(lái)查詢。

從節(jié)點(diǎn)服務(wù)器上通過(guò) INFO 命令查詢同步信息。

Sentinel 之間通訊

  • 對(duì)于監(jiān)視同一個(gè)主/從服務(wù)器的多個(gè) Sentinel 節(jié)點(diǎn),他們會(huì)以每?jī)擅胍淮蔚念l率,向被監(jiān)視的服務(wù)器的 __sentinel__:hello 頻道發(fā)送消息來(lái)宣告自己存在。
  • Sentinel 之間不會(huì)創(chuàng)建訂閱鏈接,通過(guò)命令通訊。因?yàn)橐呀?jīng)可以通過(guò)主/從服務(wù)器獲取未知的 Sentinel 服務(wù)節(jié)點(diǎn)。

Sentinel 獲取 Redis 節(jié)點(diǎn)列表

** Sentinel 會(huì)默認(rèn) 10 秒一次向主服務(wù)器信息,通過(guò)發(fā)送 info 命令**,的回復(fù)來(lái)獲取當(dāng)前主服務(wù)器的信息。

# Server
run_id:5e4d6e3ee147ff231d540ae2add485e906944f2a

...

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=2712947,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=2712947,lag=0
master_replid:f2163cc41b43c20998a54c14647ba5b106dc4677
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2713213
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1664638
repl_backlog_histlen:1048576

....

通過(guò)分析主服務(wù)器的 info 命令可以獲取到以下兩方面的信息:

  • 關(guān)于服務(wù)器本身的信息,包括 run_id 記錄服務(wù)器運(yùn)行的 id, 以及服務(wù)器 role 角色等。
  • 另外一方面就是獲取主服務(wù)器下面的所有從服務(wù)器信息,比如:slave0:ip=127.0.0.1,port=6381,state=online,offset=2712947,lag=0這樣就不需要我們?cè)?conf 文件中配置從服務(wù)器的信息,Sentinel 可以自動(dòng)發(fā)現(xiàn)。

當(dāng) Sentinel 從主服務(wù)器獲取到從服務(wù)器信息過(guò)后,也會(huì) 10 秒鐘向從服務(wù)器發(fā)送 INFO 命令來(lái)獲取從服務(wù)器信息 我們可以執(zhí)行命令 redis-cli -h 127.0.0.1 -p 6380 info 得到以下信息:

# Server 
run_id:7ef635af0d3e0b1d60d2776eba0a15883db06245

...

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2779874
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f2163cc41b43c20998a54c14647ba5b106dc4677
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2779874
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1731299
repl_backlog_histlen:1048576

...

我們從結(jié)果中可以得到以下信息:

  • 服務(wù)器的運(yùn)行 Id run_id。
  • 服務(wù)器的角色 role。
  • 主服務(wù)器的信息 master_host, master_port。
  • 主從服務(wù)器的連接狀態(tài) master_link_status。
  • 從服務(wù)器的優(yōu)先級(jí) slave_priority
  • 從服務(wù)器的復(fù)制偏移量 slave_repl_offset。

服務(wù)下線

主觀下線:一臺(tái) sentinel 判斷下線 客觀下線:主觀下線后會(huì)詢問(wèn)其他的 sentinel 節(jié)點(diǎn)判斷是否該主節(jié)點(diǎn)下線,如果是真的下線了,那么就是客觀下線。

判斷下線的方式

sentinel 配置文件中 down-after-millseconds 選項(xiàng)制定了 sentinel 實(shí)例進(jìn)入主觀下線所需的時(shí)間;如果一個(gè)實(shí)例在 down-after-millseconds毫秒內(nèi),連續(xù)向 Sentinel 返回?zé)o效回復(fù),那么 Sentinel 會(huì)修改這個(gè)實(shí)例所對(duì)應(yīng)的實(shí)例結(jié)構(gòu),在結(jié)構(gòu)的 flags 屬性中打開(kāi) SIR_S_DOWN 標(biāo)示,來(lái)表示這個(gè)實(shí)例主觀下線。當(dāng)超過(guò)一半的哨兵節(jié)監(jiān)測(cè)到一個(gè)redis 節(jié)點(diǎn)下線后此刻在該集群中該節(jié)點(diǎn)才算真正被判斷為下線,也叫客觀下線。

選舉領(lǐng)頭 sentinel

當(dāng)發(fā)生 master 節(jié)點(diǎn)客觀下線后,會(huì)進(jìn)行 sentinel 選舉,進(jìn)行選舉出領(lǐng)頭 sentinel 對(duì) redis sentinel 集群做故障轉(zhuǎn)移。領(lǐng)頭 sentinel 選舉規(guī)則:

  • 所有在線的 sentinel 都具有選舉資格。
  • 每次選舉后,不管是否選舉成功,sentinel 配置紀(jì)元(configuration epoch)都會(huì)自增一次。
  • 每個(gè)配置紀(jì)元里面都有一次將某個(gè) sentinel 設(shè)置為局部領(lǐng)頭 sentinel 的機(jī)會(huì),且局部領(lǐng)頭 sentinel 一旦設(shè)置當(dāng)前配置紀(jì)元里面不可修改。
  • 每個(gè)發(fā)現(xiàn)主服務(wù)器客觀下線的 sentinel 都會(huì)要求其他的 sentinel 將自己設(shè)置為局部的 領(lǐng)頭 sentinel
  • sentinel 局部領(lǐng)頭 sentinel 的規(guī)則是先到先的,最先向目標(biāo) sentinel 發(fā)送設(shè)置要求的 sentinel 先設(shè)置成功,之后的都會(huì)被拒絕
  • 如果某個(gè) sentinel 被半數(shù)以上的 sentinel 設(shè)置成了局部領(lǐng)頭 sentinel ,那么這個(gè) sentinel 就成為領(lǐng)頭 sentinel
  • 因?yàn)轭I(lǐng)頭 sentinel 產(chǎn)生需要半數(shù)的 sentinel 的支持,并且每個(gè)配置紀(jì)元里面只能設(shè)置一次 領(lǐng)頭 sentinel ,所以只會(huì)出現(xiàn)一個(gè)領(lǐng)頭 sentinel
  • 如果在指定的時(shí)間內(nèi)沒(méi)有產(chǎn)生領(lǐng)頭 sentinel 那么就會(huì)進(jìn)行再次選舉,直到選出領(lǐng)頭 sentinel 為止。

故障轉(zhuǎn)移

故障轉(zhuǎn)移分為三個(gè)步驟:

  • 在已經(jīng)下線的主服務(wù)器下的所有服務(wù)器里中,選擇一個(gè)從服務(wù)器,將器作為主服務(wù)器。
  • 讓已經(jīng)下線的主服務(wù)器下的所有從服務(wù)器復(fù)制新的主服務(wù)器。
  • 將已經(jīng)下線的主服務(wù)器設(shè)置為新主服務(wù)器的從服務(wù)器,當(dāng)這個(gè)舊的主服務(wù)器重新上線后它就會(huì)成為新的主服務(wù)器的從服務(wù)器。

選擇新主服務(wù)器

  • 對(duì)從服務(wù)器進(jìn)行過(guò)濾。
  • 刪除處于下線的從服務(wù)器,保證都是正常在線的。
  • 刪除列表中所有 5 秒沒(méi)有回復(fù)過(guò) sentinle leader 的 info 命令的服務(wù)器,可以保證列表中剩余的從服務(wù)器通訊正常。
  • 保證從服務(wù)器的數(shù)據(jù)是最新的,主要是刪除與主服務(wù)器斷開(kāi)鏈接超過(guò) down-after-millseconds * 10 毫秒的服務(wù)器。保證沒(méi)有過(guò)早的斷開(kāi)鏈接。
  • 最后按照上面的篩選過(guò)后,進(jìn)行排序,選擇其中優(yōu)先級(jí)最高的。

1) 如果存在多個(gè)相同優(yōu)先級(jí)的,考慮偏移量(slave_repl_offset)最大的從服務(wù)器,因?yàn)槠屏孔畲笳f(shuō)明保存的數(shù)據(jù)是最新的。

2) 如果還是存在相同的偏移量的從服務(wù)器,那么就選擇運(yùn)行 id(run_id)最小的從服務(wù)器。

發(fā)生故障轉(zhuǎn)移后 Server2 升級(jí)為主服務(wù)器

修改從服務(wù)器的復(fù)制目標(biāo)

當(dāng)新的主服務(wù)器出現(xiàn)后 ,領(lǐng)頭的 Sentinel 會(huì)讓其他的服務(wù)器節(jié)點(diǎn),去復(fù)制新的主節(jié)點(diǎn)的數(shù)據(jù)可以通過(guò)向從服務(wù)器發(fā)送 saveof 命令來(lái)實(shí)現(xiàn)。

將舊的主服務(wù)器變成從服務(wù)器

故障轉(zhuǎn)移的最后操作,就是將已經(jīng)下線的的主服務(wù)器設(shè)置為新的主服務(wù)的從服務(wù)器。

責(zé)任編輯:武曉燕 來(lái)源: 運(yùn)維開(kāi)發(fā)故事
相關(guān)推薦

2021-04-01 08:50:54

SentinelRedis 集群原理

2021-09-07 10:38:37

RabbitMQ 高可用消費(fèi)

2022-06-21 07:51:06

Redis高可用哨兵進(jìn)程

2024-07-25 08:39:48

2024-12-09 00:00:09

2022-05-31 08:04:03

Redis高可用集群

2024-02-27 09:48:25

Redis集群數(shù)據(jù)庫(kù)

2010-06-21 14:37:18

2019-05-15 10:59:50

開(kāi)發(fā)者技能工具

2020-07-24 08:50:17

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

2023-03-01 22:28:15

Redis高可用

2023-11-13 09:03:10

2018-08-24 09:26:13

Redis高可用方式

2024-02-28 10:14:47

Redis數(shù)據(jù)硬盤

2017-09-22 10:05:48

Redis備份容災(zāi)

2018-08-21 10:32:43

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

2011-12-02 10:10:34

RedisFailover

2023-11-12 00:10:07

Redis高可用

2021-03-17 10:05:42

KubernetesRedis數(shù)據(jù)庫(kù)

2021-04-21 09:55:24

Redis應(yīng)用限流
點(diǎn)贊
收藏

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