redis主從復制以及數據同步的原理


 有學習的小伙伴可以一起討論,微信 15321502296

第五章   復制

復制功能 :是高可用redis的基礎,后面的哨兵和集群都是在復制的基礎上進行的,滿足數據恢復和負載均衡

1、建立配置  

主節點  和從節點   主上操作,從上學習

每個從節點只能有一個主節點,而主節點可以有多個從節點

復制的數據流是單向的,從復制主。方法有三種

(1)、在配置文件中加入(slaveof masterHost)(master Port)隨redis啟動生效

vim redis.conf

slaveof下添加

 

(2)redis-server啟動命令后加入-slaveofmasterHost)(masterPort)生效

 

(3)在交互式界面直接使用命令 slaveofmasterHost)(masterPort)生效

 slaveof 192.168.4.60 6379

slaveof 節點值保留主節點的信息,然后返回

復制流程,以異步當時方式執行

查看主從信息

info replication

 

 斷開主從復制

slaveof no one

1、斷開與主節點的復制關系

2、晉升為主節點

切主

把當前從節點上對主節點的復制,切換到另一台主節點上的復制

slaveof 新主的ip 新主的端口

流程

1、斷開與舊的復制關系

2、與新主的節點建立聯系

3、刪除從節點當前的所有數據 (為了生產安全不要操作 !!)

4、對新主節點進行復制操作

安全性 requirepass 密碼驗證 auth校檢,配置 masterauth參數

vim redis.conf

在主上添加 requirepass 123.com  登錄時用auth+密碼驗證

在從上 添加 masterauth 123.com   聲明 主上的密碼

只讀  slave-read-only yes 改成no    從節點修改,可能會造成數據沒有統一性

傳輸延遲

再主上設置 repl-disable-tcp-nodelay  控制是否關閉 tcp-nodelay

  關閉 ,主節點產生的命令數據不管大小都會及時發送給從節點,主從延遲會減小,增加了網絡帶寬消耗,在主從同機房,同機架、上部署。

開啟 :主節點會合並比較小的tcp 數據包發送給從,節省帶寬,一般40毫秒發送一次,一般在跨機房部署時使用。

 

拓撲圖

星型 樹狀

 

復制過程·的原理

1、保存主節點信息  slaveof

2、從節點通過內部每秒運行的定時任務維護,復制相關的邏輯

從節點無法建立鏈接,定時任務會無限重復,直到成功

 

查看從節點失敗的原因

命令操作 info replicatio

查看 master_link_down_since_seconds

3、連接成功時,第一次發送ping命令,首次通信

檢測主機網絡套接字,是否接受處理的命令

4、執行權限的驗證,密碼驗證

5、同步數據集,psync同步,主節點全部發送給從節點

6、命令持續復制

 數據同步的方式

1、復制偏移量   (偏移量就是主節點宕掉之后,從節點代替主節點記錄 所執行的操作時間,以及數量)  從節點每秒都會上報自身的偏移量,主記錄到偏移量。主會根據自己的偏移量進行核對,同時保存自己的偏移量

2、復制積壓緩沖區  :復制積壓緩沖區是保存在主節點上的一個固定長度的列隊,默認大小為1 mb。(緩沖區規則: 先進先出)

主會響應寫命令,把命令發送給從節點,還會寫入積壓緩沖區

repl_blacklog_active:1    //開啟積壓緩沖區

repl_backlog_size:1048576   //緩沖區最大長度

repl_backlog_first_byte_offset:1984

repl_backlog_histlen:14


3、主節點運行的 id  :每個redis'啟動后都會有一個4016進制的字符串作為id,運行id 是 用來表示唯一識別redis的 節點,用info replication   查看,關閉再啟動后,運行id會改變

4psync 命令 : 從節點使用psync 完成部分操作和  全量操作

psync runid offset

      運行id    復制偏移量

psync工作流程

主發送命令 psync

-從返回情況 :full resynccountinueerr

全量復制   : 主節點吧全部數據一次性發送給從,量大,時間長

全量復制的流程

1、從節點 發送psync 復制請求 : 默認值為 ? 和 -1

2、主節點根據判斷為全量復制回復 full  resync(全量復制)、continue(繼續 ,出現在部分復制或者是增量復制)、err(錯誤)

3、從節點接受響應,保存 運行id 和偏移量

4、主節點執行bgsave 保存rdb文件到本地 ,

5、發送給從節點,從節點把接受的rdb文件保存到本地,並直接作為從節點的數據文件

6、從節點保存文件,並記錄。主節點仍然響應

7、從節點刪除自身的舊數據,加載rdb文件

8、加載完成后,會開啟AOF持久化,進行學習

部分復制  重新建立連接,把之前斷掉之后,沒有發送的數據,剩下的部分繼續發送

部分復制的工作流程

 

 

 

 

 

 

心跳

判斷心跳的機制

 

 

通過 min-slaves-to-writemin-slaves-max-log  //參數定義

主節點根據 replication 判斷從節點超時時間,如果超過默認的值,則判定從節點下線並段愛復制客戶端連接。及時主節點判定從節點下線后,如果從節點重復恢復,心跳檢測會繼續進行。

異步復制

主節點復制的流程

1、主節點的端口6379 接收處理命令

2、命令處理完之后返回響應結果

3、對於修改命令異步發送給6380從節點,從節點在主線中執行命令

 

 

 

 

 

異步復制

主節點進行讀寫數據,並進行同步

 

開發或者運維中的問題

1、讀寫分離,  數據延遲 ,數據過期問題 ,從節點發生故障

 

數據延遲

1、  監控程序  :定期檢查主從節點偏移量

2、當延遲字節量過高時,監控程序觸發警報,並通知客戶端從節點延遲過高

3、客戶端接收到具體的從節點高延遲通知后,修改讀命令到其他從節點或主節點。當延遲恢復后,在此通知客戶端,恢復從節點的讀命令請求

讀到過期數據

惰性刪除  主節點處理讀取命令時,自動檢測鍵的時間,如果超時自動刪除

定時刪除   在內部循環,定期查看鍵有沒有過期,如果過期自動刪除,之后同步給從節點

從節點的故障問題

在客戶端維護,維護可用的節點列表,當從節點故障時,立刻切換到其他從節點或者主節點上,由監控程序去完成

主從配置不一樣

內存相關的配置必須要一樣,避免出現內存溢出

 

規避全量復制

建議在低峰時進行操作

  

復制積壓緩沖區不足

把復制積壓緩沖區,根據峰值進行設置

 

復制風暴

1、單主節點復制風暴      太多從節點

2、單機復制風暴    機櫃

 

 

 

 

  

 

 哨兵

redis setinel

哨兵   實現高可用的一種方式

自動完成故障發現和故障轉移

配置哨兵

1、直接新建配置文件運行redis

cd /usr/local/redis-4.0.2

編輯新的配置文件

cp redis.conf redis.sentinel-26380.conf

修改端口  

vim redis.sentinel-26380.conf

啟動

 service-server redis.sentinel-26380.conf --sentinel

 配置主節點   

底部添加以下內容

sentinel monitor mymaster 192.168.4.30 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

 

 sentinel monitor <master name>  <ip>  <port> monitor : 監控

<master name> : 主節點名字

<quorum>  :法定人數  最好設置為基數    哨兵節點數除以二加一       設置大  : 准確

setinel down-after-milliseconds <master name> <times>  

通過 ping 命令  默認單位 毫秒

down-after-milliseconds  : 定期發送 ping 命令

 <times>  超過時間沒響應就down

 setinel parallel-sync  <master name> <nums>

sentinel parallel-syncs  

 一個從晉升為 主的時候  其他的從需要進行全量復制

會執行成為一個一個學習

setinel failover-time <master name> <time>

故障轉移的超時時間    

故障轉移的過程

1、選出合適從節點

2、從節點晉升為主節點        

3、其他的從節點向新主節點復制    

4、等待原來的主節點恢復后命令他去復制新的主節點

  故障轉移失敗     第一次超時時間是第二次超時時間的二倍

 

sentinel auth-pass <master name>  <password>

setinel notification-script  <master name> <script-path>

  哨兵在故障轉移期間出現問題 會觸發腳本 發送郵箱配置文件

setinel client-reconfig-script <master name> <script-path>

     部署redis  sentinel 的技巧

   1setinel 節點不應該部署在一台物理機器上

   2、 部署至少三個 奇數個數的sentinel

   3、只有 一套sentinel,還是每個主節點配置一套

哨兵的 API

sentinel master   展示所有被監控的主節點的狀態 和相關信息

setinel master <master name>  

 

 展示指定<master name > 的從節點狀態 以及相關的統計信息

  sentinel sentinels <master name>

展示指定 <master name>sentinel 節點集合

sentinel get-master-addr-by-name <master name>

返回指定<master name > 主節點的 ip地址端口

sentinel reset <pattern>

當前 sentinel 節點對符合 <pattern> 主節點的配置進行重置,包括 清除主節點相關狀態

  sentinel failover <master name>

對指定的<master name> 主節點進行強制故障轉移

sentinel ckuquorum <master name>  

檢查當前可達的sentinel 節電數量是否 可達   

<quorum>的 個數

sentinel flushconfig

sentinel 節點的配置強制刷到磁盤上  

 

 

sentinel remove <master name>

取消當前 sentinel 節點指定 <master name> 主節點的 監控

sentinel monitor <master name>  <ip> <port> <quorum>

  sentinel  set <master name>

動態 修改 sentinel 的 配置

sentinel is-master-downby-addr

sentinel 節點之間用來交換 對主節點是否下線的判斷  

 

 

實現原理

三個定時監控任務

主觀下線

客觀下線

sentinel 領導選舉

故障轉移

 有學習的小伙伴可以一起討論,微信 15321502296


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM