Redis 主從在線切換

精神小夥 在線背鍋redis

Redis 主從在線切換記錄bash

背景

Redis master 所在實例主機須要下線維護. 如何切換主從對線上影響最小. 當前架構以下圖 架構

切換前

技術方案

方案1

引入 redis sentinel.ui

步驟:

  1. 部署redis sentinel
  2. 修改業務配置, 修改業務代碼.
  3. kill master.
  4. check
  5. 創建新主從邏輯

優勢:

  1. 切換簡單, kill 主庫便可, sentinel 可自動提高 slave -> master.

缺點:

  1. 須要部署 redis sentinel, 新的中間件.
  2. 須要改動業務代碼.

方案2

直接切換spa

步驟:

  1. 使從庫可寫, redis-cli -h redis-slave -p 6379 CONFIG set slave-read-only no
  2. 修改業務側配置, redis 地址指向可寫的 slave 實例, 重啓業務應用
  3. 確保主從同步完成, 中止主從同步. redis-cli -h redis-slave -p 6379 slaveof no one
  4. 創建新主從邏輯.

優勢:

  1. 符合直覺
  2. 沒有代碼改動

缺點:

  1. 若是切換過程當中有問題, 須要及時回滾配置和業務項目發佈. 耗時較長, 會致使數據丟失.

方案3

引入4層代理, haproxy3d

步驟:

  1. 部署 haproxy, 做爲現 master 的代理.
  2. 修改業務側配置, redis 地址指向 haproxy 代理地址, 重啓業務應用.
  3. 使從庫可寫
  4. 修改 haproxy 配置, 指向可寫的從庫, 並 reload 配置.
  5. 確保主從同步完成, 中止主從同步.
  6. 創建新主從邏輯.

優勢

  1. 引入中間層haproxy, 由於 haproxy 支持動態reload配置, 並保證優雅關閉以前的鏈接, 業務側可無感知 redis 主從切換.
  2. 主從切換時間短

缺點

  1. 引入了新的中間件

肯定方案

穩妥起見, 使用方案3.代理

實施

  1. 引入 haproxy 後架構 code

    haproxy

  2. 執行主從切換cdn

export redis-slave=REDIS_SLAVE_IP
export redis-master=REDIS_MASTER_IP

# 從庫可寫
redis-cli -h redis-slave -p 6379 CONFIG set slave-read-only no

# 修改 haproxy 配置
sed -i 's/redis-master/redis-slave/g' haproxy.cfg

# reload haproxy
haproxy -f haproxy.cfg -p /tmp/haproxy.pid -sf `cat /tmp/haproxy.pid`

# 肯定主從同步結束
redis-cli -h redis-slave -p 6379 info | grep master_sync_in_progress
# 值需爲0

# 中止主從同步
redis-cli -h redis-slave -p 6379 slaveof no one

# 創建新主從
redis-cli -h redis-master -p 6379 slaveof redis-slave 6379

# 肯定新主從同步結束
redis-cli -h redis-master -p 6379 info | grep master_sync_in_progress
# 值需爲0

# 結束
複製代碼
  1. 切換後架構
    end

小結

簡單記錄了 Redis 主從切換的取捨和操做.中間件

相關文章
相關標籤/搜索