Windows 環境如何設定 Redis Master-Slave 與 Sentinel

最近在幫公司同事做 Redis 基礎教育,雖說公司 Redis 架在 Rehat 上,但身為一個 .NET 開發人員讓我轉換環境操作 Linux 還是相對苦手的,所以就在自己的 Windows 電腦上架了 Redis Master-Slave 與 Sentinel,隨手筆記備忘一下

準備工作

  1. 下載 Windows 版 Redis

    • .msi 可以直接安裝為 Windows Service (但設定調整比較麻煩,建議使用 .zip)

      這邊有安裝流程說明 使用 Redis 當做 ASP.NET MVC 的 Session State Server

      • 預設安裝在 c:\Program Files\Redis 檔案修改權限設定比較繁瑣
    • .zip

      • 建議不要放在 OS 槽,會少掉許多權限設定問題
  2. 準備建立 Master-Slave 與 Sentinel(下列方式擇一即可)

    • 採取實體隔離
      • 將 zip 解壓縮至資料夾後複製多份並標記用途(e.g. Redis-{Master|SlaveSentinel})後備用
    • 僅建立不同用途之 config
  3. 以下 demo 將以建立不同 config 方式進行

Master-Slave 設定

  • 調整 redis.windows.conf config 設定

    1. Master
      • 保留預設值即可
    2. Slave

      • 如果採用 config 隔離,請記得修改檔案(e.g. redis.windows6380.conf)
      • 修改 port (不可與 master port 重複)
      • 加入 slave 設定

        slaveof {masterip} {masterport>}

  • 啟動 Master & Slave (下列方式擇一即可)

    1. 指令

      • 啟動 master

        • 執行 redis-server.exe 並指定使用 master config

          redis-server redis.windows.conf

          1master

      • 啟動 slave

        • 執行 redis-server 並指定使用 slave config (執行前確認 config 是否已正確修改)

          redis-server redis.windows6380.conf

          2slave

        • 啟動後 Master 也會出現 sync 資料的訊息

          3slavesync

    2. Windows Service

      • 如果路徑包含空白請記得使用跳脫字元 \ 搭配 " 將路徑包起來,下面 Sentinel 有使用範例
      • 設定 master

        sc.exe create "Redis6379" start= auto binPath= "c:\redis\redis-server.exe --service-run c:\redis\redis.windows-service.conf" DisplayName= "Redis6379"
        
      • 設定 slave

        sc.exe create "Redis6380" start= auto binPath= "c:\redis\redis-server.exe --service-run c:\redis\redis.windows-service6380.conf" DisplayName= "Redis6380"
        
  • 確認執行狀況

    1. Master

      • redis-cli -h 127.0.0.1 -p 6379 info replication

        4masterinfo

    2. Slave

      • redis-cli -h 127.0.0.1 -p 6380 info replication

        5slaveinfo

Sentinel config 設定

Winodws 7 使用 Windows Redis 3.2.100 版本無法啟動 sentinel,需使用 3.0.504 版

  • 新增 sentinel.conf 檔案
  • 逐一加入以下設定

    1. 指定 port

      port 26379

    2. 指定監視名為 master ip 為 127.0.0.1 port 為 6379 的 redis master instance,最後數字代表幾個 sentinel 同意才進行切換

      sentinel monitor master 127.0.0.1 6379 1

    3. 指定 3000 毫秒沒有回應就視名為 master 的 instance 失效

      sentinel down-after-milliseconds master 3000

    4. 指定 18000 毫秒未完成視為 failover 失敗

      sentinel failover-timeout master 18000

    5. 指定同時只有 1 個 salve 可以從新 master 同步資料回去

      sentinel parallel-syncs master 1

      • 數字愈小,failover 耗時就愈久(需等所有 slave 都同步完)
      • slave 同步資料可能會造成 slave 無法回應,所以也不建議設太大
    6. 指定連線密碼為 password(非必要)

      sentinel auth-pass password

  • 最終設定範例

    port 26379
    sentinel monitor master 127.0.0.1 6379 1
    sentinel down-after-milliseconds master 3000
    sentinel failover-timeout master 18000
    sentinel parallel-syncs master 1
    

啟動 Sentinel

  1. 指令

    • 執行 redis-server.exe 並指定使用 sentinel config 及 --sentinel 參數 (執行前請確認 sentinel config 已設定)

      • redis-server.exe sentinel.conf --sentinel

        6sentinel

  2. Windows Service

    • 如果路徑包含空白請記得使用跳脫字元 \ 搭配 " 將路徑包起來

      sc.exe create "RedisSentinel" start= auto binPath= "\"c:\Program Files\redis\redis-server.exe\" --service-run \"c:\Program Files\redis\sentinel.conf\" --sentinel" DisplayName= "RedisSentinel"
      

確認執行狀態

redis-cli -h 127.0.0.1 -p 26379 info sentinel

7sentinelinfo

模擬 master 失效

  1. 手動 shutdown master

    • redis-cli -h 127.0.0.1 -p 6379 shutdown

      8mastershutdown

  2. 確認 sentinel 資訊

    • consoel 出現 failover 操作資訊

      9sentinelconsole

    • config 也自動修改了

      10sentinelconfig

  3. 確認 slave 資訊

    • console 出現啟用 Master mode

      11slave2master

    • config

      slaveof {masterip} {masterport>} 已被移除

    • 使用 redis-cli -h 127.0.0.1 -p 6380 info replication 確認

      12slave2master

模擬 slave 接替成為 master 後,原 master 回復服務

  1. 手動 shutdown master

    • redis-cli -h 127.0.0.1 -p 6379 shutdown

      8mastershutdown

  2. 確認 sentinel 資訊

    • consoel 出現 failover 操作資訊

      9sentinelconsole

    • config 也自動修改了

      10sentinelconfig

  3. 確認 slave 資訊

    • console 出現啟用 Master mode

      11slave2master

    • config

      slaveof {masterip} {masterport>} 已被移除

    • 使用 redis-cli -h 127.0.0.1 -p 6380 info replication 確認

      12slave2master

  4. 回復已 shutdown 的 master

    • 再次啟動原 master

      • 自動連線至新 master (原 slave) ,並成為其 slave 開始同步資料

        13master2slave

    • 新 master (原 slave) 同步資料至 原 master(新 slave)

      14slavesynctomaster

    • Sentinel 偵測到原 master加入並將其指定為 slave

      15sentinelslave

    • 原 master(新 slave) 的 config 會被自動加上 slaveof {新 master} {新 masterport>}

    • 使用指令確認一下

      • 原 master:6379 –> slave

        • redis-cli -h 127.0.0.1 -p 6379 info replication

          176379

      • 原 slave :6380 –> master

        • redis-cli -h 127.0.0.1 -p 6380 info replication

          166380

參考資料

  1. Redis
  2. Windows下Redis Sentinel部署(包含Redis Replication)
  3. [料理佳餚] 使用Redis-Sentinel 打造Redis 的HA