有學習的小伙伴可以一起討論,微信 15321502296
第五章 復制
復制功能 :是高可用redis的基礎,后面的哨兵和集群都是在復制的基礎上進行的,滿足數據恢復和負載均衡
1、建立配置
主節點 和從節點 主上操作,從上學習
每個從節點只能有一個主節點,而主節點可以有多個從節點
復制的數據流是單向的,從復制主。方法有三種
(1)、在配置文件中加入(slaveof masterHost)(master Port)隨redis啟動生效
vim redis.conf
在slaveof下添加
(2)在redis-server啟動命令后加入-slaveof(masterHost)(masterPort)生效
(3)在交互式界面直接使用命令 :slaveof(masterHost)(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'啟動后都會有一個40位 16進制的字符串作為id,運行id 是 用來表示唯一識別redis的 節點,用info replication 查看,關閉再啟動后,運行id會改變
4、psync 命令 : 從節點使用psync 完成部分操作和 全量操作
psync runid offset
運行id 復制偏移量
psync工作流程
主發送命令 :psync
主-從返回情況 :full resync、countinue、 err
全量復制 : 主節點吧全部數據一次性發送給從,量大,時間長
全量復制的流程
1、從節點 發送psync 復制請求 : 默認值為 ? 和 -1
2、主節點根據判斷為全量復制回復 : full resync(全量復制)、continue(繼續 ,出現在部分復制或者是增量復制)、err(錯誤)
3、從節點接受響應,保存 運行id 和偏移量
4、主節點執行bgsave 保存rdb文件到本地 ,
5、發送給從節點,從節點把接受的rdb文件保存到本地,並直接作為從節點的數據文件
6、從節點保存文件,並記錄。主節點仍然響應
7、從節點刪除自身的舊數據,加載rdb文件
8、加載完成后,會開啟AOF持久化,進行學習
部分復制 重新建立連接,把之前斷掉之后,沒有發送的數據,剩下的部分繼續發送
部分復制的工作流程
心跳
判斷心跳的機制
通過 min-slaves-to-write、 min-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 的技巧
1、setinel 節點不應該部署在一台物理機器上
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