<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Redis 系列】redis 的哨兵模式詳解和實(shí)戰(zhàn)

          共 6625字,需瀏覽 14分鐘

           ·

          2021-08-28 14:50

          上一次我們說到的主從復(fù)制是這樣搭建的

          主機(jī)可以讀,可以寫

          從機(jī)只能讀,不能寫

          想一想,那么我們是不是也可以這樣呢?

          多個(gè) redis-server 首尾相連

          那么咱們部署的時(shí)候就是  6379  – 6380 – 6381

          此時(shí),若主機(jī) 6379 宕機(jī)掉,6380 會(huì)不會(huì)變成主機(jī)呢?

          127.0.0.1:6379> info replication
          # Replication
          role:master
          connected_slaves:1
          slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=1
          master_failover_state:no-failover
          master_replid:f1e3db9e5e438f5d98e4cad23f684b12d790ae56
          master_replid2:0000000000000000000000000000000000000000
          master_repl_offset:0
          second_repl_offset:-1
          repl_backlog_active:1
          repl_backlog_size:1048576
          repl_backlog_first_byte_offset:1
          repl_backlog_histlen:0
          復(fù)制代碼

          我們可以看到 6379 有一個(gè)從機(jī),6380 自身也是作為從機(jī)(雖然 6380 是 6381 的主機(jī))

          此時(shí)將 6379 宕機(jī)掉,發(fā)現(xiàn) 6380 仍然是 slave

          127.0.0.1:6379> shudown
          not connected>
          復(fù)制代碼

          我們?nèi)藶榈膶?reids 6380 的服務(wù)器修改為主機(jī),看看 6379 redis-server 起來之后,是否可以把 master 搶回去

          使用 slaveof no one 可以將自己設(shè)置成 master

          啟動(dòng) 6379 redis-server

          redis-server /usr/local/redis/redis-6.2.5/6379.conf
          復(fù)制代碼

          發(fā)現(xiàn) 6380 仍然是主機(jī),6379 成為了光桿司令

          實(shí)際項(xiàng)目中,我們肯定不會(huì)采取上面和上一次文章說到的部署方式,他們抵御風(fēng)險(xiǎn)的能力太低了

          因?yàn)閷?shí)際生產(chǎn)環(huán)境中,主機(jī)宕機(jī)了,若從機(jī)沒有辦法成為主機(jī)的話,豈不是在主機(jī)回復(fù)之前再也不能做寫入操作了嗎?這是很嚴(yán)重的問題

          下面我們來詳細(xì)看看 哨兵模式是如何解決上述問題的

          哨兵模式

          自動(dòng)選舉 master 的模式

          介紹

          主動(dòng)切換 master 的方法是:

          當(dāng)主機(jī)服務(wù)器宕機(jī)后,以往的情況咱們需要手動(dòng)把某一個(gè)從機(jī)服務(wù)器修改為主機(jī)服務(wù)器,需要人為處理,耗時(shí)耗力,且會(huì)造成一段時(shí)間內(nèi)服務(wù)不可用的情況,這種做法是不可取的

          所以有了哨兵模式,哨兵模式是 redis 2.8 版本開始真是提供的 sentinel 架構(gòu)來解決上述的問題

          哨兵模式,能夠監(jiān)控后臺(tái)的主機(jī)服務(wù)器是否故障,若出現(xiàn)了故障,則會(huì)投票選舉出一個(gè)從機(jī)服務(wù)器來做主機(jī)

          哨兵模式是一種特殊的模式,Redis 提供了哨兵的命令

          哨兵其實(shí)是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行

          其原理就是哨兵通過發(fā)送命令,等到 Redis 服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè) Redis 實(shí)例

          實(shí)際演練

          上圖中的架構(gòu)圖,哨兵有 2 個(gè)作用:

          • 通過發(fā)送命令,Redis 服務(wù)器返回監(jiān)控狀態(tài)信息,包括主服務(wù)器和從服務(wù)器的

          • 若哨兵檢測到主服務(wù)器宕機(jī),會(huì)自動(dòng)將slave 切換 master,然后通過發(fā)布訂閱通知其他從服務(wù)器,修改配置文件,讓他成為主機(jī)

          可是一個(gè)哨兵來監(jiān)控一個(gè) redis 集群,出現(xiàn)問題的可能性會(huì)大很多,因此,我們的哨兵也可以是集群的,每隔哨兵之間還會(huì)互相監(jiān)控的,就像下面這張圖

          主觀下線

          例如咱們舉一個(gè)例子,如果 master  服務(wù)器宕機(jī)了,那么其中一個(gè)哨兵就會(huì)檢測到,系統(tǒng)并不會(huì)馬上執(zhí)行 failover 的過程,僅僅是當(dāng)前這個(gè)哨兵,判斷 master 不可用,這個(gè)就是主觀下線

          主觀下線

          當(dāng)其他兩個(gè)哨兵也發(fā)現(xiàn) master 服務(wù)器不可用的時(shí)候,那么哨兵之間就會(huì)產(chǎn)生投票,具體的投票算法我們后續(xù)再寫,投票的結(jié)構(gòu)由一個(gè)哨兵發(fā)起,進(jìn)行 failover 故障轉(zhuǎn)移的操作,切換成功之后,就會(huì)通過發(fā)布訂閱模式,讓每一個(gè)監(jiān)控的哨兵把自己監(jiān)控的服務(wù)器切換到這個(gè) master 服務(wù)器上, 這個(gè)就是 客觀下線

          我們來配置和開啟一個(gè)哨兵:

          同樣在我們的配置文件目錄,與 redis 是同級的目錄下,創(chuàng)建一個(gè) sentinel.conf 文件, 并寫入配置,這個(gè)文件安裝 redis 默認(rèn)也會(huì)生成一個(gè)

          如上,咱們關(guān)注的命令是

          sentinel monitor mymaster   127.0.0.1   6379   1
          復(fù)制代碼

          配置一個(gè)哨兵,進(jìn)行監(jiān)控 redis 集群

          開啟 哨兵 進(jìn)程

          root@iZuf66y3tuzn4wp3h02t7pZ:/usr/local/redis/redis-6.2.5# redis-sentinel sentinel.conf
          18148:X 26 Aug 2021 22:22:36.187 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
          18148:X 26 Aug 2021 22:22:36.187 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=18148, just started
          18148:X 26 Aug 2021 22:22:36.187 # Configuration loaded
          18148:X 26 Aug 2021 22:22:36.188 * monotonic clock: POSIX clock_gettime
          _._
          _.-``__ ''-._
          _.-`` `. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit
          .-`` .-```. ```\/ _.,_ ''-._
          ( ' , .-` | `, ) Running in sentinel mode
          |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
          | `-._ `._ / _.-' | PID: 18148
          `-._ `-._ `-./ _.-' _.-'
          |`-._`-._ `-.__.-' _.-'_.-'|
          | `-._`-._ _.-'_.-' | https://redis.io
          `-._ `-._`-.__.-'_.-' _.-'
          |`-._`-._ `-.__.-' _.-'_.-'|
          | `-._`-._ _.-'_.-' |
          `-._ `-._`-.__.-'_.-' _.-'
          `-._ `-.__.-' _.-'
          `-._ _.-'
          `-.__.-'

          18148:X 26 Aug 2021 22:22:36.189 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
          18148:X 26 Aug 2021 22:22:36.193 # Sentinel ID is 7e01f5aa31aadb7fc54ed8ef2579c77120682dc9
          18148:X 26 Aug 2021 22:22:36.193 # +monitor master mymaster 127.0.0.1 6379 quorum 1
          18148:X 26 Aug 2021 22:22:36.193 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
          18148:X 26 Aug 2021 22:22:36.196 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
          復(fù)制代碼

          我們可以看到,開啟哨兵進(jìn)程之后,開始監(jiān)控到 redis 集群,并輸出了監(jiān)控的 redis 的 ip 和端口

          此時(shí),咱們查看一個(gè) master redis 服務(wù)器的信息,可以看到目前有 2 個(gè) slave ,現(xiàn)在咱們讓主機(jī)宕機(jī)

          查看哨兵的日志,咱們可以看到 哨兵進(jìn)程在 30 秒之后,開始進(jìn)行投票選舉主機(jī)

          根據(jù)日志,我們可以看出,6379 的主機(jī)宕機(jī)之后,哨兵選舉了 6381 的從機(jī)作為新的主機(jī),自動(dòng)故障恢復(fù)成功,nice

          查看 6381 的 master 主機(jī)進(jìn)程,查看到自己是主機(jī),有1 個(gè)從機(jī)

          由于 6379 默認(rèn)配置就是 主機(jī),因此將 6379 服務(wù)器再次啟動(dòng)的時(shí)候,6379 就變成了光桿司令,從機(jī)就變成了 0 個(gè)

          root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-server /usr/local/redis/redis-6.2.5/6379.conf
          root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-cli -p 6379
          127.0.0.1:6379> info replication
          # Replication
          role:master
          connected_slaves:0
          master_failover_state:no-failover
          master_replid:80843f8a6497705983f6463b92d71ebd451ef385
          master_replid2:0000000000000000000000000000000000000000
          master_repl_offset:0
          second_repl_offset:-1
          repl_backlog_active:0
          repl_backlog_size:1048576
          repl_backlog_first_byte_offset:0
          repl_backlog_histlen:0
          復(fù)制代碼

          sentinel.conf 配置文件里面的配置項(xiàng)也不多,下面咱們詳細(xì)的一一說明一下:

          哨兵模式詳細(xì)配置如下:

          • port

          哨兵 sentinel 實(shí)例運(yùn)行的端口 , 默認(rèn)是26379,如果有哨兵集群,我們還需要配置每個(gè)哨兵端口

          • dir

          哨兵sentinel的工作目錄

          • sentinel monitor

          哨兵 sentinel 監(jiān)控的 redis 主節(jié)點(diǎn)的 ip port

          master-name  ,可以自己命名的主節(jié)點(diǎn)名字 只能由字母A-Z、數(shù)字0-9、這三個(gè)字符"  .   -  _ "組成。

          quorum 配置多少個(gè) sentinel 哨兵統(tǒng)一認(rèn)為master主節(jié)點(diǎn)失聯(lián)那么這時(shí)客觀上認(rèn)為主節(jié)點(diǎn)失聯(lián)了

          • sentine1 auth-pass

          當(dāng)在 Redis 實(shí)例中開啟了requirepass foobared 授權(quán)密碼這樣所有連接 redis 實(shí)例的客戶端都要提供密碼

          設(shè)置哨兵 sentinel 連接主從的密碼注意必須為主從設(shè)置一樣的驗(yàn)證密碼

          • sentinel down-after-mi 11i seconds  <mi 11iseconds>

          指定多少毫秒之后主節(jié)點(diǎn)沒有應(yīng)答哨兵sentine1 此時(shí)哨兵主觀上認(rèn)為主節(jié)點(diǎn)下線默認(rèn)30秒

          • sentinel  paralle1-syncs

          指定了在發(fā)生 failover 主備切換時(shí)最多可以有多少個(gè) slave 同時(shí)對新的 master 進(jìn)行同步

          這個(gè)數(shù)字越小,完成 failover  所需的時(shí)間就越長

          但是如果這個(gè)數(shù)字越大,就意味著越多的 slave 因?yàn)?replication 而 不可用

          可以通過將這個(gè)值設(shè)為 1 來保證每次只有一個(gè) slave 處于不能處理命令請求的狀態(tài)

          • sentinel  failover-timeout

          故障轉(zhuǎn)移的超時(shí)時(shí)間failover-timeout 可以用在以下這些方面:

          1、同一個(gè) sentinel 對同一 個(gè) master 兩次 failover 之間的間隔時(shí)間

          2、當(dāng)一個(gè) slave 從一 個(gè)錯(cuò)誤的 master 那里同步數(shù)據(jù)開始計(jì)算時(shí)間

          直到 slave 被糾正為向正確的 master 那里同步數(shù)據(jù)時(shí)

          3、當(dāng)想要取消一個(gè)正在進(jìn)行的 failover 所需要的時(shí)間

          4、當(dāng)進(jìn)行 failover 時(shí),配置所有 slave 指向新的master所需的最大時(shí)間

          不過,即使過了這個(gè)超時(shí),slaves 依然會(huì)被正確配置為指向 master , 但是就不按 parallel-syncs所配置的規(guī)則來了

          5、默認(rèn)時(shí)間是三分鐘

          • sentinel notification-script

          當(dāng) sentinel  有任何警告級別的事件發(fā)生時(shí)(比如說redis實(shí)例的主觀失效和客觀失效等等),將會(huì)去調(diào)用這個(gè)腳本

          這時(shí)這個(gè)腳本應(yīng)該通過郵件,SMS 等方式去通知系統(tǒng)管理員關(guān)于系統(tǒng)不正常運(yùn)行的信息

          調(diào)用該腳本時(shí),將傳給腳本兩個(gè)參數(shù)

          1、事件的類型

          2、事件的描述

          如果 sentinel . conf 配置文件中配置了這個(gè)腳本路徑,那么必須保證這個(gè)腳本存在于這個(gè)路徑,并且是可執(zhí)行的,否則 sentinel  無法正常啟動(dòng)成功

          • sentinel  client-reconfig-script

          該配置是客戶端重新配置主節(jié)點(diǎn)參數(shù)腳本

          當(dāng)一個(gè) master 由于 failover 而發(fā)生改變時(shí),這個(gè)腳本將會(huì)被調(diào)用,通知相關(guān)的客戶端關(guān)于master 地址已經(jīng)發(fā)生改變的信息

          以下參數(shù)將會(huì)在調(diào)用腳本時(shí)傳給腳本:

          , 是 Teader 或者 observer 中的-一個(gè)

          , 一般是 failover


          參數(shù) from-ip, from-port, to-ip,to-port 是用來和舊的 master 和新的 master (即舊的s lave)通信的

          port 26379

          dir /tmp

          sentinel monitor mymaster 127.0.0.1 6379 2

          sentine1 auth-pass mymaster MySUPER--secret-0123passwOrd

          sentine1 down-after-mi 11iseconds mymaster 30000

          sentine1 paralle1-syncs mymaster 1

          sentine1 fai lover-ti meout mymaster 180000

          sentine1 notificati on-script mymaster /var/redis/notify. sh

          sentine1 client-reconfig-script mymaster /var/redis/reconfig.sh
          復(fù)制代碼

          參考資料:

          redis_doc

          歡迎點(diǎn)贊,關(guān)注,收藏

          朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力


          作者:小魔童哪吒
          鏈接:https://juejin.cn/post/7000747318051864606
          來源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



          瀏覽 31
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉黄色电影网站 | 色婷婷激情五月天 | 香蕉一级视频 | 亚洲AV无码久久久久网站飞鱼 | 黄色一级爱爱 |