網(wǎng)站首頁 編程語言 正文
Redis 主從復制
什么是主從復制
如果單機情況下,機器重啟,內(nèi)存數(shù)據(jù)丟失,如何保證數(shù)據(jù)的高可用呢?持久化方案
如果機器硬盤壞掉,如何保證數(shù)據(jù)的高可用呢?主從復制
Redis的主從機制:主負責讀寫,從一般只讀不能寫(客戶端)。
持久化保證了即使 Redis 服務重啟也不會丟失數(shù)據(jù),因為 Redis 服務重啟后會將硬盤上持久化的數(shù)據(jù)恢復到內(nèi)存中,但是當 Redis 服務器的硬盤損壞了可能會導致數(shù)據(jù)丟失,不過通過 Redis 的主從復制
機制就可以避免這種單點故障,如下圖:
說明:
主 Redis 中的數(shù)據(jù)有兩個副本( replication )即從 redis1 和從 redis2 ,即使一臺 Redis 服務器宕機其它兩臺 Redis 服務也可以繼續(xù)提供服務。
主 Redis 中的數(shù)據(jù)和從 Redis 上的數(shù)據(jù)保持實時同步,當主 Redis 寫入數(shù)據(jù)時通過主從復制機制會復制到兩個從 Redis 服務上。
只有一個主 Redis ,可以有多個從 Redis 。
主從復制不會阻塞 master ,在同步數(shù)據(jù)時, master 可以繼續(xù)處理 client 請求。
一個 Redis 可以即是主又是從,如下圖:
主從配置
主Redis配置
無需特殊配置
從Redis配置
修改從服務器上的 redis.conf 文件:
# slaveof <masterip> <masterport>
# 表示當前【從服務器】對應的【主服務器】的IP是192.168.10.135,端口是6379。
slaveof 192.168.10.135 6379
replicaof 192.168.19.135 6379
實現(xiàn)原理
- Redis 的主從同步,分為全量同步和增量同步。
- 只有從機第一次連接上主機是全量同步。
- 斷線重連有可能觸發(fā)全量同步也有可能是增量同步( master 判斷 runid 是否一致)。
- 除此之外的情況都是增量同步。
全量同步
Redis 的全量同步過程主要分三個階段:
- 同步快照階段: Master 創(chuàng)建并發(fā)送快照給 Slave , Slave 載入并解析快照。 Master 同時將此階段所產(chǎn)生的新的寫命令存儲到緩沖區(qū)。
- 同步寫緩沖階段: Master 向 Slave 同步存儲在緩沖區(qū)的寫操作命令。
- 同步增量階段: Master 向 Slave 同步寫操作命令。
增量同步
- Redis 增量同步主要指 Slave 完成初始化后開始正常工作時, Master 發(fā)生的寫操作同步到 Slave 的過程。
- 通常情況下, Master 每執(zhí)行一個寫命令就會向 Slave 發(fā)送相同的寫命令,然后 Slave 接收并執(zhí)行。
Redis 哨兵機制
Redis 主從復制的缺點:沒有辦法對 master 進行動態(tài)選舉,需要使用 Sentinel 機制完成動態(tài)選舉。
簡介
- Sentinel (哨兵)進程是用于監(jiān)控 Redis 集群中 Master 主服務器工作的狀態(tài)
- 在 Master 主服務器發(fā)生故障的時候,可以實現(xiàn) Master 和 Slave 服務器的切換,保證系統(tǒng)的高可用( HA )
- 其已經(jīng)被集成在 redis2.6+ 的版本中, Redis 的哨兵模式到了 2.8 版本之后就穩(wěn)定了下來。
哨兵進程的作用
- 監(jiān)控( Monitoring ): 哨兵( sentinel ) 會不斷地檢查你的 Master 和 Slave 是否運作正常。
- 提醒( Notification ): 當被監(jiān)控的某個 Redis 節(jié)點出現(xiàn)問題時, 哨兵( sentinel ) 可以通過API 向管理員或者其他應用程序發(fā)送通知。
- 自動故障遷移( Automatic failover ):當一個 Master 不能正常工作時,哨兵( sentinel )會開始一次自動故障遷移操作
故障判定原理分析
- 每個 Sentinel (哨兵)進程以每秒鐘一次的頻率向整個集群中的 Master 主服務器, Slave 從服務器以及其他 Sentinel (哨兵)進程發(fā)送一個 PING 命令。
- 如果一個實例( instance )距離最后一次有效回復 PING 命令的時間超過 down-after- milliseconds 選項所指定的值, 則這個實例會被 Sentinel (哨兵)進程標記為主觀下線 ( SDOWN )。
- 如果一個 Master 主服務器被標記為主觀下線( SDOWN ),則正在監(jiān)視這個 Master 主服務器的所有 Sentinel (哨兵)進程要以每秒一次的頻率確認 Master 主服務器的確進入了主觀下線狀態(tài)。
- 當有足夠數(shù)量的 Sentinel (哨兵)進程(大于等于配置文件指定的值)在指定的時間范圍內(nèi)確認 Master 主服務器進入了主觀下線狀態(tài)( SDOWN ), 則 Master 主服務器會被標記為客觀下線 ( ODOWN )。
- 在一般情況下, 每個 Sentinel (哨兵)進程會以每 10 秒一次的頻率向集群中的所有Master 主服務器、 Slave 從服務器發(fā)送 INFO 命令。
- 當 Master 主服務器被 Sentinel (哨兵)進程標記為客觀下線( ODOWN )時, Sentinel (哨兵)進程向下線的 Master 主服務器的所有 Slave 從服務器發(fā)送 INFO 命令的頻率會從 10秒一次改為每秒一次。
- 若沒有足夠數(shù)量的 Sentinel (哨兵)進程同意 Master 主服務器下線, Master 主服務器的客觀下線狀態(tài)就會被移除。若 Master 主服務器重新向 Sentinel (哨兵)進程發(fā)送 PING 命令返回有效回復, Master 主服務器的主觀下線狀態(tài)就會被移除。
自動故障遷移
- 它會將失效 Master 的其中一個 Slave 升級為新的 Master , 并讓失效 Master 的其他 Slave 改為復制新的 Master ;
- 當客戶端試圖連接失效的 Master 時,集群也會向客戶端返回新 Master 的地址,使得集群可以使用現(xiàn)在的 Master 替換失效 Master 。
- Master 和 Slave 服務器切換后, Master 的 redis.conf 、 Slave 的 redis.conf 和 sentinel.conf 的配置文件的內(nèi)容都會發(fā)生相應的改變,即, Master 主服務器的 redis.conf配置文件中會多一行 slaveof 的配置, sentinel.conf 的監(jiān)控目標會隨之調(diào)換。
案例演示
修改從機的 sentinel.conf :
# 哨兵sentinel監(jiān)控的redis主節(jié)點的 ip port
# master-name 可以自己命名的主節(jié)點名字 只能由字母A-z、數(shù)字0-9 、這三個字符".- _"組成。
# quorum 當這些quorum個數(shù)sentinel哨兵認為master主節(jié)點失聯(lián) 那么這時 客觀上認為主節(jié) 點失聯(lián)了
# sentinel monitor <master-name> <master ip> <master port> <quorum>
sentinel monitor mymaster 192.168.10.133 6379 1
其他配置項說明sentinel.conf
# 哨兵sentinel實例運行的端口 默認26379
port 26379
# 哨兵sentinel的工作目錄
dir /tmp
# 哨兵sentinel監(jiān)控的redis主節(jié)點的 ip port
# master-name 可以自己命名的主節(jié)點名字 只能由字母A-z、數(shù)字0-9 、這三個字符".-_"組 成。
# quorum 當這些quorum個數(shù)sentinel哨兵認為master主節(jié)點失聯(lián) 那么這時 客觀上認為主節(jié)點 失聯(lián)了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 當在Redis實例中開啟了requirepass foobared 授權密碼 這樣所有連接Redis實例的客戶端都 要提供密碼
# 設置哨兵sentinel 連接主從的密碼 注意必須為主從設置一樣的驗證密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主節(jié)點沒有應答哨兵sentinel 此時 哨兵主觀上認為主節(jié)點下線 默認30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 這個配置項指定了在發(fā)生failover主備切換時最多可以有多少個slave同時對新的master進行同步
# 這個數(shù)字越小,完成failover所需的時間就越長,但是如果這個數(shù)字越大,就意味著越多的slave因為replication而不可用。
# 可以通過將這個值設為 1 來保證每次只有一個slave 處于不能處理命令請求的狀態(tài)。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障轉移的超時時間 failover-timeout 可以用在以下這些方面:
#1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
#2. 當一個slave從一個錯誤的master那里同步數(shù)據(jù)開始計算時間。直到slave被糾正為向正確的 master那里同步數(shù)據(jù)時。
#3.當想要取消一個正在進行的failover所需要的時間。
#4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超 時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來了
# 默認三分鐘
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
# 配置當某一事件發(fā)生時所需要執(zhí)行的腳本,可以通過腳本來通知管理員,例如當系統(tǒng)運行不正常時發(fā)郵 件通知相關人員。
#對于腳本的運行結果有以下規(guī)則:
#若腳本執(zhí)行后返回1,那么該腳本稍后將會被再次執(zhí)行,重復次數(shù)目前默認為10
#若腳本執(zhí)行后返回2,或者比2更高的一個返回值,腳本將不會重復執(zhí)行。
#如果腳本在執(zhí)行過程中由于收到系統(tǒng)中斷信號被終止了,則同返回值為1時的行為相同。
#一個腳本的最大執(zhí)行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執(zhí) 行。
#通知型腳本:當sentinel有任何警告級別的事件發(fā)生時(比如說redis實例的主觀失效和客觀失效等 等),將會去調(diào)用這個腳本,
#這時這個腳本應該通過郵件,SMS等方式去通知系統(tǒng)管理員關于系統(tǒng)不正 常運行的信息。調(diào)用該腳本時,將傳給腳本兩個參數(shù),一個是事件的類型,一個是事件的描述。
#如果sentinel.conf配置文件中配置了這個腳本路徑,那么必須保證這個腳本存在于這個路徑,并且 是可執(zhí)行的,否則sentinel無法正常啟動成功。
#通知腳本
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 客戶端重新配置主節(jié)點參數(shù)腳本
# 當一個master由于failover而發(fā)生改變時,這個腳本將會被調(diào)用,通知相關的客戶端關于master 地址已經(jīng)發(fā)生改變的信息。
# 以下參數(shù)將會在調(diào)用腳本時傳給腳本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>總是“failover”,
# <role>是“l(fā)eader”或者“observer”中的一個。
# 參數(shù) from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的 slave)通信的
# 這個腳本應該是通用的,能被多次調(diào)用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
通過 redis-sentinel 啟動哨兵服務
./redis-sentinel sentinel.conf
原文鏈接:https://blog.csdn.net/Miaoshuowen/article/details/125963413
相關推薦
- 2022-07-02 golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼_Golang
- 2022-12-23 Python中的文件輸入輸出問題_python
- 2022-06-29 在Oracle中使用正則表達式_oracle
- 2022-06-01 Python全角與半角之間相互轉換的方法總結_python
- 2023-03-15 pandas將Series轉成DataFrame的實現(xiàn)_python
- 2022-11-22 Python網(wǎng)絡請求模塊urllib與requests使用介紹_python
- 2022-12-14 詳解如何利用Redis實現(xiàn)生成唯一ID_Redis
- 2022-04-28 python實現(xiàn)線性回歸的示例代碼_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支