[redis進階四]分布式系統之哨兵(2)

目錄

一? 利用docker搭建環境

板書:

一)準備?作:

板書:

解讀docker配置文件:

1)安裝docker和docker-compose

?2) 停?之前的redis-server

?3) 使?docker獲取redis鏡像

二)編排redis主從節點

板書:?編輯

1) 編寫docker-compose.yml

2) 啟動所有容器

3) 查看運??志

4) 驗證

三)編排 redis-sentinel節點

板書:

1) 編寫 docker-compose.yml

?2) 創建配置?件

?3) 啟動所有容器

?4) 查看運??志

5) 觀察redis-sentinel 的配置rewrite

二? 哨兵自動選舉詳解

自動選舉的全部板書:

1)手動操作觀察重新選舉

2)選舉原理

1) 主觀下線

2) 客觀下線

?3) 選舉出哨兵的leader

?4) leader 挑選出合適的slave成為新的 master

三? 總結


一? 利用docker搭建環境

板書:

一)準備?作:

板書:

解讀docker配置文件:

?

1)安裝docker和docker-compose

關于docker的安裝請點擊鏈接看docker專欄

docker-compose安裝

 # ubuntuapt install docker-compose# centosyum install docker-compose

?2) 停?之前的redis-server

# 停?redis-server
service redis-server stop
# 停?redis-sentinel 如果已經有的話
service redis-sentinel stop

?3) 使?docker獲取redis鏡像

docker pull redis:5.0.9

二)編排redis主從節點

復制粘貼的格式可能不對,需要正確格式的私聊我

板書:

1) 編寫docker-compose.yml

創建 /root/redis/docker-compose.yml?,同時cd到yml所在?錄中.

注意:docker中可以通過容器名字,作為ip地址,進?相互之間的訪問

 version: '3.7'services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports: - 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379

2) 啟動所有容器

docker-compose up -d

如果啟動后發現前?的配置有誤,需要重新操作,使? docker-compose down 即可停?并刪除剛才創建好的容器.

3) 查看運??志

docker-compose logs

上 述操作必須保證?作?錄在yml的同級?錄中,才能?作

4) 驗證

連接主節點??redis-cli -p 6379

 127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=172.22.0.3,port=6379,state=online,offset=348,lag=1slave1:ip=172.22.0.4,port=6379,state=online,offset=348,lag=1master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63master_replid2:0000000000000000000000000000000000000000master_repl_offset:348second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:348

連接從節點??redis-cli -p 6380

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:446
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:446
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:446

連接從節點??redis-cli -p 6381

 127.0.0.1:6381> info replication# Replicationrole:slavemaster_host:redis-mastermaster_port:6379master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_repl_offset:516slave_priority:100slave_read_only:1connected_slaves:0master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63master_replid2:0000000000000000000000000000000000000000master_repl_offset:516second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:516

三)編排 redis-sentinel節點

復制粘貼的格式可能不對,需要正確格式的私聊我

板書:

也可以把redis-sentinel放到和上?的redis的同?個yml中進?容器編排.此處分成兩組,主要是為
了兩??:

  • 觀察?志?便
  • 確保redis主從節點啟動之后才啟動redis-sentinel.如果先啟動redis-sentinel的話,可能觸發額 外的選舉過程,混淆視聽.(不是說先啟動哨兵不?,?是觀察的結果可能存在?定隨機性).

1) 編寫 docker-compose.yml


創建 /root/redis-sentinel/docker-compose.yml?,同時cd到yml所在?錄中.

注意:每個?錄中只能存在?個docker-compose.yml?件.

version: '3.7'
services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379
sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379
sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redis-data_default 

?2) 創建配置?件

創建?sentinel1.conf?sentinel2.conf?sentinel3.conf 三份文件的內容是完全相同的,都放到 /root/redis-sentinel/ ?錄中.

bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

理解 sentinel monitor

sentinel monitor 主節點名 主節點 ip 主節點端? 法定票數

參數解釋:

  • 主節點名,這個是哨兵內部??起的名字
  • 主節點ip,部署redis-master的設備ip.此處由于是使?docker,可以直接寫docker的容器名,會被?動DNS成對應的容器ip
  • 主節點端?,不解釋.
  • 法定票數,哨兵需要判定主節點是否掛了.但是有的時候可能因為特殊情況,?如主節點仍然?作正常,但是哨兵節點???絡出問題了,?法訪問到主節點了.此時就可能會使該哨兵節點認為主節點下線,出現誤判.使?投票的?式來確定主節點是否真的掛了是更穩妥的做法.需要多個哨兵都認為主節點掛了,票數>=法定票數之后,才會真的認為主節點是掛了.

理解 sentinel down-after-milliseconds

主節點和哨兵之間通過?跳包來進?溝通.如果?跳包在指定的時間內還沒回來,就視為是節點出現 故障.

既然內容相同,為啥要創建多份配置?件?


redis-sentinel 在運?中可能會對配置進?rewrite,修改?件內容.如果??份?件,就可能出現修改混亂的情況.

?3) 啟動所有容器

 docker-compose up -d

如果啟動后發現前?的配置有誤,需要重新操作,使? docker-compose down 剛才創建好的容器.

?4) 查看運??志

 docker-compose logs

上述操作必須保證?作?錄在yml的同級?錄中,才能?作.

可以看到,哨兵節點已經通過主節點,認識到了對應的從節點.

5) 觀察redis-sentinel 的配置rewrite

再次打開哨兵的配置?件,發現?件內容已經被?動修改了.

 bind 0.0.0.0port 26379sentinel myid 4d2d562860b4cdd478e56494a01e5c787246b6aasentinel deny-scripts-reconfig yes# Generated by CONFIG REWRITEdir "/data"sentinel monitor redis-master 172.22.0.4 6379 2sentinel down-after-milliseconds redis-master 1000sentinel config-epoch redis-master 1sentinel leader-epoch redis-master 1sentinel known-replica redis-master 172.22.0.2 6379sentinel known-replica redis-master 172.22.0.3 6379sentinel known-sentinel redis-master 172.22.0.7 26379 f718caed536d178f5ea6d1316d09407cfae43dd2sentinel known-sentinel redis-master 172.22.0.5 26379 2ab6de82279bb77f8397c309d36238f51273e80asentinel current-epoch 1

# Generated by CONFIG REWRITE 這?的內容就是?動修改的

對?這三份?件,可以看到配置內容是存在差異的

二? 哨兵自動選舉詳解

自動選舉的全部板書:

1)手動操作觀察重新選舉

redis-master 宕機之后

?動把 redis-master??掉

1 docker stop redis-master

觀察哨兵的?志

可以看到哨兵發現了主節點sdown,進?步的由于主節點宕機得票達到 master 被判定為odown.

  • 主觀下線(SubjectivelyDown,SDown):哨兵感知到主節點沒?跳了.判定為主觀下線
  • 客觀下線(ObjectivelyDown,ODown):多個哨兵達成?致意?,才能認為master確實下線了.

接下來,哨兵們挑選出了?個新的master.在上圖中,是172.22.04:6379?這個節點.

此時,對于Redis來說仍然是可以正常使?的.

redis-master 重啟之后

?動把 redis-master?啟動起來

1 docker start redis-master

觀察哨兵?志可以看到剛才新啟動的redis-master?被當成了slave

使?redis-cli 也可以進?步的驗證這?點

 127.0.0.1:6379> info replication# Replicationrole:slavemaster_host:172.22.0.4master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:324475slave_priority:100slave_read_only:1connected_slaves:0master_replid:ececc285a2892fba157318c77ebe1409f9c2254emaster_replid2:0000000000000000000000000000000000000000master_repl_offset:324475second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:318295repl_backlog_histlen:6181

結論

  • ?Redis主節點如果宕機,哨兵會把其中的?個從節點,提拔成主節點.
  • 當之前的Redis主節點重啟之后,這個主節點被加?到哨兵的監控中,但是只會被作為從節點使?

2)選舉原理

假定當前環境如上?介紹,三個哨兵(sentenal1,sentenal2,sentenal3),?個主節點(redis-master),兩
個從節點(redis-slave1,redis-slave2).?
當主節點出現故障,就會觸發重新?系列過程.

1) 主觀下線


當redis-master 宕機,此時redis-master和三個哨兵之間的?跳包就沒有了.
此時,站在三個哨兵的?度來看,redis-master出現嚴重故障.因此三個哨兵均會把redis-master判定
為主觀下線(SDown)


2) 客觀下線


此時,哨兵sentenal1,sentenal2,sentenal3均會對主節點故障這件事情進?投票.當故障得票數>=配
置的法定票數之后,

 sentinel monitor redis-master 172.22.0.4 6379 2

?3) 選舉出哨兵的leader


接下來需要哨兵把剩余的slave中挑選出?個新的master.這個?作不需要所有的哨兵都參與.只需要選出個代表(稱為leader),由leader負責進?slave升級到master的提拔過程.這個選舉的過程涉及到 Raft?算法

假定一共三個哨兵結點 S1 S2 S3

1. 每個哨兵節點都給其他所有哨兵節點,發起?個"拉票請求".(S1->S2,S1->S3,S2->S1,S2->S3,S3->S1,S3->S2)

2. 收到拉票請求的節點,會回復?個"投票響應".響應的結果有兩種可能,投or不投.

?????????如S1給S2發了個投票請求,S2就會給S1返回投票響應.
????????到底S2是否要投S1呢?取決于S2是否給別?投過票了.(每個哨兵只有?票).
????????如果S2沒有給別?投過票,換??之,S1是第?個向S2拉票的,那么S2就會投S1.否則則不投.

3. ?輪投票完成之后,發現得票超過半數的節點,?動成為leader0.

????????如果出現平票的情況(S1投S2,S2投S3,S3投S1,每??票),就重新再投?次即可. 這也是為啥建議哨兵節點設置成奇數個的原因.如果是偶數個,則增?了平票的概率,帶來不必要的開銷.

?4. leader 節點負責挑選?個slave成為新的master.當其他的sentenal發現新的master出現了,就說明選舉結束了.

簡??之,Raft算法的核?就是"先下?為強".誰率先發出了拉票請求,誰就有更?的概率成為leader

這?的決定因素成了"?絡延時".?絡延時本?就帶有?定隨機性

具體選出的哪個節點是leader,這個不重要,重要的是能選出?個節點即可.????????

?4) leader 挑選出合適的slave成為新的 master

挑選規則:

?1. ?較優先級.優先級?(數值?的)的上位.優先級是配置?件中的配置項(slave-priority)或者(replica-priority)

2. ?較 replication offset 誰復制的數據多,?的上位.

3. ?較run id?,誰的id?,誰上位.

當某個slave節點被指定為master之后,

1. leader 指定該節點執?slave no one?,成為master

2. leader 指定剩余的slave節點,都依附于這個新master

三? 總結

上述過程,都是"??值守",Redis?動完成的.這樣做就解決了主節點宕機之后需要???預的問題,
提?了系統的穩定性和可?性.

?些注意事項:

  • ?哨兵節點不能只有?個.否則哨兵節點掛了也會影響系統可?性.
  • ?哨兵節點最好是奇數個.?便選舉leader,得票更容易超過半數.
  • ?哨兵節點不負責存儲數據.仍然是redis主從節點負責存儲.
  • ?哨兵+主從復制解決的問題是"提?可?性",不能解決"數據極端情況下寫丟失"的問題
  • ?哨兵+主從復制不能提?數據的存儲容量.當我們需要存的數據接近或者超過機器的物理內存,這樣的結構就難以勝任了.

為了能存儲更多的數據,就引?了集群.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80410.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spark-Schema 定義字段強類型和弱類型

在數據處理和存儲中,Schema(模式)定義了數據的結構和字段屬性,其中字段的強類型和弱類型是重要的概念,直接影響數據的驗證、存儲和處理方式。以下是詳細解釋: 1. 強類型(Strongly Typed&#x…

2024睿抗編程賽國賽-題解

2024睿抗編程賽國賽題解 RC-u1 大家一起查作弊 題目重述 我們需要從給定的多行字符串中提取出所有的關鍵詞,并計算這些關鍵詞的可疑分數總和、總長度以及關鍵詞的數量。具體步驟如下: 關鍵詞定義:由大寫字母、小寫字母、數字組成的字符串&a…

控制LED燈設備

本章分別使用C庫和系統調用的文件操作方式控制開發板的LED燈,展示如何在應用層通過系統提供的設備文件控制相關硬件。 本章的示例代碼目錄為:base_code/linux_app/led/sys_class_leds。 9.1. LED子系統 在Linux系統中,絕大多數硬件設備都有…

SpringBoot學習(上) , SpringBoot項目的創建(IDEA2024版本)

目錄 1. SpringBoot介紹 SpringBoot特點 2. SpringBoot入門 2.1 創建SpringBoot項目 Spring Initialize 第一步: 選擇創建項目 第二步: 選擇起步依賴 第三步: 查看啟動類 2.2 springboot父項目 2.3 測試案例 2.3.1 數據庫 2.3.2 生成代碼 1. SpringBoot介紹 Spring B…

在 Ubuntu 中配置 Samba 實現「特定用戶可寫,其他用戶只讀」的共享目錄

需求目標 所有認證用戶可訪問 Samba 共享目錄 /path/to/home;**僅特定用戶(如 developer)**擁有寫權限;其他用戶僅允許讀取;禁止匿名訪問。 配置步驟 1. 設置文件系統權限 將目錄 /home3/guest 的所有權設為 develo…

ENSP-OSPF綜合實驗

AR4中通過ospf獲取的其他區域路由信息,并且通過路由匯總后簡化路由信息 實現全網通,以及單向重發布,以及通過缺省雙向訪問, 通過stub簡化過濾四類五類lsa,簡化ospf路由信息 通過nssa簡化ospf信息 區域匯總簡化R4路由信…

linux(centos)聯網情況下部署

nginx部署 1.linux(centos)聯網情況下部署 1.下載nginx所需依賴 # 安裝開發工具組(若未安裝) sudo yum groupinstall "Development Tools"# 安裝 OpenSSL 開發包 sudo yum install openssl-devel# 安裝 PCRE 開發包 sudo yum install pcre-…

LeetCode 1550.存在連續三個奇數的數組:遍歷

【LetMeFly】1550.存在連續三個奇數的數組:遍歷 力扣題目鏈接:https://leetcode.cn/problems/three-consecutive-odds/ 給你一個整數數組 arr,請你判斷數組中是否存在連續三個元素都是奇數的情況:如果存在,請返回 tr…

Android Framework學習四:init進程實現

文章目錄 init流程簡介init源碼執行順序執行順序 init進程的具體工作事項掛載文件系統設置 SELinuxSecondStageMaininit.rc啟動zygote和serviceManager進程的重要性serviceManager工作原理 Framework學習之系列文章 init流程簡介 下面圖片主要圍繞 Android 系統中init進程的運…

HTTP/3展望、我應該遷移到HTTP/2嗎

1. HTTP/3展望 HTTP/3 基于 QUIC 協議,完全解決了“隊頭阻塞”問題,弱網環境下的表現會優于 HTTP/2;QUIC 是一個新的傳輸層協議,建立在 UDP 之上,實現了可靠傳輸;QUIC 內含了 TLS1.3,只能加密通…

【大模型面試每日一題】Day 15:流水線并行的Bubble問題及其緩解方法

【大模型面試每日一題】Day 15:流水線并行的Bubble問題及其緩解方法 📌 題目重現 🌟🌟 面試官:解釋流水線并行(Pipeline Parallelism)的bubble問題及其緩解方法。 #mermaid-svg-Uz7WGsO8akW5F…

Windows環境下maven的安裝與配置

1.檢查JAVA_HOME環境變量 Maven是使用java開發的,所以必須知道當前系統環境中的JDK的安裝目錄。 搜索欄直接輸入“cmd” 或者 WinR 輸入cmd 在打開的終端窗口輸入“echo %JAVA_HOME”,就可以看到jdk的位置了。 如果沒有的話,請參考我的文章&a…

Kubernetes 集群部署應用

部署 Nginx 應用 命令行的方式 1. 創建 deployment 控制器的 pod # --imagenginx:這個會從 docker.io 中拉取,這個網站拉不下來 # kubectl create deployment mynginx --imagenginx# 使用國內鏡像源拉取 kubectl create deployment mynginx --imaged…

如何使用依賴注入來實現依賴倒置原則?

依賴注入(Dependency Injection, DI)是實現依賴倒置原則(DIP)的具體技術手段,它通過將依賴對象的創建和管理交給外部容器,從而實現高層模塊與低層模塊的解耦。下面從原理、實現方式、框架應用及最佳實踐四個方面詳細解析: 一、依賴倒置原則(DIP)的核心思想 高層模塊不…

python使用AES進行加密和解密

如果需要加密和解密功能,可以使用AES算法。以下是使用Python實現AES加密和解密的示例: from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytesdef aes_encrypt(data,

SaaS場快訂首頁的前端搭建【持續更新】

文章目錄 一、創建頁面二、配置路由三、寫接口文件(api)1.定位的接口函數(騰訊地圖api)實現代碼: 2.獲取場館分類的數據3.獲取附近場館列表的數據 四、開發首頁頁面1.頂部區域2.搜索框3.場館分類4.附近場館列表 五、難…

深入解析 MQTT 協議:物聯網通信的基石

在當今物聯網蓬勃發展的時代,設備之間高效、可靠的通信變得至關重要。MQTT(Message Queuing Telemetry Transport)協議,作為一種輕量級的消息傳輸協議,正逐漸成為物聯網通信的基石,廣泛應用于各種場景中。 …

在Python中計算函數耗時并超時自動退出

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 方法1:使用裝飾器結合信號模塊(僅Unix-like系統)方法2:使用多線程(跨平臺解決方案)方法3:使用concurrent.futures(Python 3.2+)方法4:使用 multiprocessing + Process(跨平臺)?方法5:使用 time 手動計…

理解c++中explicit關鍵字的作用

理解c中explicit關鍵字的作用 explicit 關鍵字的作用是防止構造函數被隱式調用&#xff0c;從而避免意外的類型轉換 #include <iostream> class Vec3 { public://構造函數沒有被explicit修飾Vec3(float value): x(value), y(value), z(value){}Vec3(float val1, float …

不止是UI庫:React如何重塑前端開發范式?

React&#xff1a;引領現代前端開發的聲明式UI庫 在當今快速發展的前端世界&#xff0c;React以其聲明式、組件化和高效的特性&#xff0c;穩坐頭把交椅&#xff0c;成為構建交互式用戶界面的首選JavaScript庫。本文將帶你快速了解React的核心魅力、主要優勢以及生態發展&…