天天看點

redis哨兵與叢集

Redis哨兵模式

一、安裝和配置

1.1 解壓

tar zvxf redis-6.0.10.tar.gz
           

1.2 編譯環境

更新gcc版本
yum install centos-release-scl
yum install devtoolset-7-gcc*

cd /opt/rh/devtoolset-7
source ./enable

或者scl enable devtoolset-7 bash
           

1.3 編譯

cd /opt/redis-6.0.10
make
make install
或者 make install PREFIX=/usr/local/redis/

           

預設情況下,redis被安裝到/usr/local/bin下。

1.4 主從配置

主節點隻用修改基本配置

# 綁定IP
bind 127.0.0.1 192.168.44.10
# 背景運作
daemonize yes
# 落盤檔案位置可以考慮修改
dir ./
# 連接配接密碼可以考慮修改
requirepass xxx
           

從節點配置額外需要修改

# 從節點 slaveof 後面跟主節點及端口号
slaveof 192.168.44.10 6379

# 因為政治目的slaveof這個說法有點敏感,修改成replicaof,可能老版本還是slaveof
# replicaof <masterip> <masterport>
replicaof 192.168.44.10 6379

           

1.5 哨兵配置

哨兵配置sentinel.conf解釋:

# 哨兵sentinel執行個體運作的端口,預設26379  
port 26379
# 哨兵sentinel的工作目錄
dir ./

# 哨兵sentinel監控的redis主節點的 
## ip:主機ip位址
## port:哨兵端口号
## master-name:可以自己命名的主節點名字(隻能由字母A-z、數字0-9 、這三個字元".-_"組成。)
## quorum:當這些quorum個數sentinel哨兵認為master主節點失聯 那麼這時 客觀上認為主節點失聯了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
sentinel monitor mymaster 127.0.0.1 6379 2

# 當在Redis執行個體中開啟了requirepass <foobared>,所有連接配接Redis執行個體的用戶端都要提供密碼。
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster 123456  

# 指定主節點應答哨兵sentinel的最大時間間隔,超過這個時間,哨兵主觀上認為主節點下線,預設30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000  

# 指定了在發生failover主備切換時,最多可以有多少個slave同時對新的master進行同步。這個數字越小,完成failover所需的時間就越長;反之,但是如果這個數字越大,就意味着越多的slave因為replication而不可用。可以通過将這個值設為1,來保證每次隻有一個slave,處于不能處理指令請求的狀态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1  

# 故障轉移的逾時時間failover-timeout,預設三分鐘,可以用在以下這些方面:
## 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。  
## 2. 當一個slave從一個錯誤的master那裡同步資料時開始,直到slave被糾正為從正确的master那裡同步資料時結束。  
## 3. 當想要取消一個正在進行的failover時所需要的時間。
## 4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個逾時,slaves依然會被正确配置為指向master,但是就不按parallel-syncs所配置的規則來同步資料了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000

# 當sentinel有任何警告級别的事件發生時(比如說redis執行個體的主觀失效和客觀失效等等),将會去調用這個腳本。一個腳本的最大執行時間為60s,如果超過這個時間,腳本将會被一個SIGKILL信号終止,之後重新執行。
# 對于腳本的運作結果有以下規則:  
## 1. 若腳本執行後傳回1,那麼該腳本稍後将會被再次執行,重複次數目前預設為10。
## 2. 若腳本執行後傳回2,或者比2更高的一個傳回值,腳本将不會重複執行。  
## 3. 如果腳本在執行過程中由于收到系統中斷信号被終止了,則同傳回值為1時的行為相同。
# sentinel notification-script <master-name> <script-path>  
sentinel notification-script mymaster /var/redis/notify.sh

# 這個腳本應該是通用的,能被多次調用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
           

哨兵節點主要配置:

port 26379

# 背景運作
daemonize yes

# 哨兵配置
# mymaster        為主節點名字,可以随便取,後面程式裡邊連接配接的時候要用到
# 192.168.44.10 6379 為主節點的 ip,port
# 1               後面的數字 1 表示選舉主節點的時候,投票數。1表示有一個sentinel同意即可更新為master
sentinel monitor mymaster 192.168.44.10 6379 1

sentinel parallel-syncs mymaster 1 

           

哨兵模式下主節點redis.config配置

daemonize yes
pidfile "/var/run/redis-16379.pid"
logfile "/var/log/redis/redis-16379.log"
port 6379
bind 127.0.0.1 192.168.44.10
timeout 300
databases 16
dbfilename "dump-6379.db"
dir "/usr/local/redis-sentinel/redis-workdir"
masterauth "123456"
requirepass "123456"
           
如果要做 自動故障轉移,建議所有的

redis.conf

都設定

masterauth

。因為 自動故障 隻會重寫 主從關系,即

slaveof

,不會自動寫入

masterauth

。如果

Redis

原本沒有設定密碼,則可以忽略。

哨兵模式下從節點redis.config配置

daemonize yes
pidfile /var/run/redis-6379.pid
logfile /var/log/redis/redis-6379.log
port 6379
bind 127.0.0.1 192.168.44.11
timeout 300
databases 16
dbfilename dump-6379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456
slaveof 192.168.44.10 6379
           

二、Springboot下內建redis哨兵模式

2.1 主要依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
           

2.2 主要配置

配置哨兵的master名字和所有哨兵節點

ip:port

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.44.10:26379,192.168.44.11:26379,192.168.44.12:26379
           

三、

Redis

監控

四、

Redis Sentinel

的主要功能特性

Sentinel

的主要功能包括 主節點存活檢測、主從運作情況檢測、自動故障轉移 (

failover

)、主從切換。

Redis

Sentinel

最小配置是 一主一從。

Redis

Sentinel

系統可以用來管理多個

Redis

伺服器,該系統可以執行以下四個任務:

Sentinel

會不斷的檢查 主伺服器 和 從伺服器 是否正常運作。

  • 通知

當被監控的某個

Redis

伺服器出現問題,

Sentinel

通過

API

腳本 向 管理者 或者其他的 應用程式 發送通知。

  • 自動故障轉移

當 主節點 不能正常工作時,

Sentinel

會開始一次 自動的 故障轉移操作,它會将與 失效主節點 是 主從關系 的其中一個 從節點 更新為新的 主節點,并且将其他的 從節點 指向 新的主節點。

  • 配置提供者

Redis Sentinel

模式下,用戶端應用 在初始化時連接配接的是

Sentinel

節點集合,從中擷取 主節點 的資訊。

4.3. 主觀下線和客觀下線

預設情況下,每個

Sentinel

節點會以 每秒一次 的頻率對

Redis

節點和 其它 的

Sentinel

節點發送

PING

指令,并通過節點的 回複 來判斷節點是否線上。

  • 主觀下線

主觀下線 适用于所有 主節點 和 從節點。如果在

down-after-milliseconds

毫秒内,

Sentinel

沒有收到 目标節點 的有效回複,則會判定 該節點 為 主觀下線。

  • 客觀下線

客觀下線 隻适用于 主節點。如果 主節點 出現故障,

Sentinel

節點會通過

sentinel is-master-down-by-addr

指令,向其它

Sentinel

節點詢問對該節點的 狀态判斷。如果超過

<quorum>

個數的節點判定 主節點 不可達,則該

Sentinel

節點會判斷 主節點 為 客觀下線。

4.4. Sentinel的通信指令

Sentinel

節點連接配接一個

Redis

執行個體的時候,會建立

cmd

pub/sub

兩個 連接配接。

Sentinel

cmd

連接配接給

Redis

發送指令,通過

pub/sub

連接配接到

Redis

執行個體上的其他

Sentinel

執行個體。

Sentinel

Redis

主節點 和 從節點 互動的指令,主要包括:

指令 作 用
PING

Sentinel

Redis

PING

指令,檢查節點的狀态
INFO

Sentinel

Redis

INFO

指令,擷取它的 從節點資訊
PUBLISH

Sentinel

向其監控的

Redis

節點

__sentinel__:hello

這個

channel

釋出 自己的資訊 及 主節點 相關的配置
SUBSCRIBE

Sentinel

通過訂閱

Redis

主節點 和 從節點 的

__sentinel__:hello

channnel

,擷取正在監控相同服務的其他

Sentinel

Sentinel

Sentinel

互動的指令,主要包括:

Sentinel

向其他

Sentinel

PING

SENTINEL:is-master-down-by-addr 和其他

Sentinel

協商 主節點 的狀态,如果 主節點 處于

SDOWN

狀态,則投票自動選出新的 主節點

4.5. Redis Sentinel的工作原理

每個

Sentinel

節點都需要 定期執行 以下任務:

  • Sentinel

    以 每秒鐘 一次的頻率,向它所知的 主伺服器、從伺服器 以及其他

    Sentinel

    執行個體 發送一個

    PING

    指令。
  • 如果一個 執行個體(

    instance

    )距離 最後一次 有效回複

    PING

    指令的時間超過

    down-after-milliseconds

    所指定的值,那麼這個執行個體會被

    Sentinel

    标記為 主觀下線。
  • 如果一個 主伺服器 被标記為 主觀下線,那麼正在 監視 這個 主伺服器 的所有

    Sentinel

    節點,要以 每秒一次 的頻率确認 主伺服器 的确進入了 主觀下線 狀态。
  • 如果一個 主伺服器 被标記為 主觀下線,并且有 足夠數量 的

    Sentinel

    (至少要達到 配置檔案 指定的數量)在指定的 時間範圍 内同意這一判斷,那麼這個 主伺服器 被标記為 客觀下線。
  • 在一般情況下, 每個

    Sentinel

    會以每

    10

    秒一次的頻率,向它已知的所有 主伺服器 和 從伺服器 發送

    INFO

    指令。當一個 主伺服器 被

    Sentinel

    标記為 客觀下線 時,

    Sentinel

    向 下線主伺服器 的所有 從伺服器 發送

    INFO

    指令的頻率,會從

    10

    秒一次改為 每秒一次。
  • Sentinel

    Sentinel

    SDOWN

    狀态,則投票自動選出新的 主節點。将剩餘的 從節點 指向 新的主節點 進行 資料複制。
  • 當沒有足夠數量的

    Sentinel

    同意 主伺服器 下線時, 主伺服器 的 客觀下線狀态 就會被移除。當 主伺服器 重新向

    Sentinel

    PING

    指令傳回 有效回複 時,主伺服器 的 主觀下線狀态 就會被移除。
注意:一個有效的

PING

回複可以是:

+PONG

-LOADING

或者

-MASTERDOWN

。如果 伺服器 傳回除以上三種回複之外的其他回複,又或者在 指定時間 内沒有回複

PING

指令, 那麼

Sentinel

認為伺服器傳回的回複 無效(

non-valid

)。

五、Sentinel時用戶端指令

  • 檢查其他

    Sentinel

    節點的狀态,傳回

    PONG

    為正常。
> PING sentinel
           
  • 顯示被監控的所有 主節點 以及它們的狀态。
> SENTINEL masters
           
  • 顯示指定 主節點 的資訊和狀态。
> SENTINEL master <master_name>
           
  • 顯示指定 主節點 的所有 從節點 以及它們的狀态。
> SENTINEL slaves <master_name>
           

傳回指定 主節點 的

IP

位址和 端口。如果正在進行

failover

failover

已經完成,将會顯示被提升為 主節點 的 從節點 的

IP

位址和 端口。

> SENTINEL get-master-addr-by-name <master_name>
           
  • 重置名字比對該 正規表達式 的所有的 主節點 的狀态資訊,清除它之前的 狀态資訊,以及 從節點 的資訊。
> SENTINEL reset <pattern>
           
  • 強制目前

    Sentinel

    節點執行

    failover

    ,并且不需要得到其他

    Sentinel

    節點的同意。但是

    failover

    後會将 最新的配置 發送給其他

    Sentinel

    節點。
>SENTINEL failover <master_name>
           

六、Redis正常參數

Redis

配置檔案主要參數解析參考:

# redis程序是否以守護程序的方式運作,yes為是,no為否(不以守護程序的方式運作會占用一個終端)。
daemonize no
# 指定redis程序的PID檔案存放位置
pidfile /var/run/redis.pid
# redis程序的端口号
port 6379
# 綁定的主機位址
bind 127.0.0.1
# 用戶端閑置多長時間後關閉連接配接,預設此參數為0即關閉此功能
timeout 300
# redis日志級别,可用的級别有debug.verbose.notice.warning
loglevel verbose
# log檔案輸出位置,如果程序以守護程序的方式運作,此處又将輸出檔案設定為stdout的話,就會将日志資訊輸出到/dev/null裡面去了
logfile stdout
# 設定資料庫的數量,預設為0可以使用select <dbid>指令在連接配接上指定資料庫id
databases 16
# 指定在多少時間内重新整理次數達到多少的時候會将資料同步到資料檔案
save <seconds> <changes>
# 指定存儲至本地資料庫時是否壓縮檔案,預設為yes即啟用存儲
rdbcompression yes
# 指定本地資料庫檔案名
dbfilename dump.db
# 指定本地資料問就按存放位置
dir ./
# 指定當本機為slave服務時,設定master服務的IP位址及端口,在redis啟動的時候他會自動跟master進行資料同步
slaveof <masterip> <masterport>
# 當master設定了密碼保護時,slave服務連接配接master的密碼
masterauth <master-password>
# 設定redis連接配接密碼,如果配置了連接配接密碼,用戶端在連接配接redis是需要通過AUTH<password>指令提供密碼,預設關閉
requirepass footbared
# 設定同一時間最大客戶連接配接數,預設無限制。redis可以同時連接配接的用戶端數為redis程式可以打開的最大檔案描述符,如果設定 maxclients 0,表示不作限制。當用戶端連接配接數到達限制時,Redis會關閉新的連接配接并向用戶端傳回 max number of clients reached 錯誤資訊
maxclients 128
# 指定Redis最大記憶體限制,Redis在啟動時會把資料加載到記憶體中,達到最大記憶體後,Redis會先嘗試清除已到期或即将到期的Key。當此方法處理後,仍然到達最大記憶體設定,将無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區
maxmemory<bytes>
# 指定是否在每次更新操作後進行日志記錄,Redis在預設情況下是異步的把資料寫入磁盤,如果不開啟,可能會在斷電時導緻一段時間内的資料丢失。因為redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設為no。
appendonly no
# 指定跟新日志檔案名預設為appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的條件,有三個可選參數 - no:表示等作業系統進行資料緩存同步到磁盤(快),always:表示每次更新操作後手動調用fsync()将資料寫到磁盤(慢,安全), everysec:表示每秒同步一次(折衷,預設值);
appendfsync everysec
           

七、

Redis Cluster

配置

redis cluster

至少需要三注三從

7.1 正常配置

# redis背景運作
daemonize yes
# 綁定的主機端口
bind 127.0.0.1
# 資料存放目錄
dir /usr/local/redis-cluster/data/redis-6379
# 程序檔案
pidfile /var/run/redis-cluster/${自定義}.pid
# 日志檔案
logfile /usr/local/redis-cluster/log/${自定義}.log
# 端口号
port 6379
# 開啟叢集模式,把注釋#去掉
cluster-enabled yes
# 叢集的配置,配置檔案首次啟動自動生成
cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf
# 請求逾時,設定10秒
cluster-node-timeout 10000
# aof日志開啟,有需要就開啟,它會每次寫操作都記錄一條日志
appendonly yes
           

7.2 建構叢集

至少6台裝置用來建構叢集,不用在從機的配置中加上replicaof或slaveof語句,現在高版本都是自動的。

1. 先分别啟動所有redis
2. 通過指令建構叢集
redis-cli --cluster create 192.168.44.10:6379 192.168.44.10:6380 192.168.44.11:6379 192.168.44.11:6380 192.168.44.12:6379 192.168.44.12:6380 --cluster-replicas 1

3. --cluster-replicas 1 訓示給定的建立節點清單是以主節點+從節點對組成的。

           

叢集指令

$ redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN --cluster-replicas <arg> check          host:port --cluster-search-multiple-owners
  info           host:port
  fix            host:port --cluster-search-multiple-owners --cluster-fix-with-unreachable-masters
  reshard        host:port --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters --cluster-timeout <arg>
                 --cluster-simulate --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> del-node       host:port node_id
  call           host:port command arg arg .. arg set-timeout    host:port milliseconds
  import         host:port --cluster-from <arg>
                 --cluster-copy --cluster-replace
  backup         host:port backup_directory
  help
  
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
           

7.3 用戶端連接配接

指令行多加一個

-c

-c 選項指定以Cluster模式運作redis-cli
           
redis-cli -h 192.168.44.12 -p 6379 -c
           

所有get set等指令都會被重新定向到該key所在的伺服器

注意keys *指令不能正确傳回所有key

7.4 重新開機叢集

(保留原有叢集的)重新開機:

  • 不需要再執行(形如redis-cli --cluster create 192.168.44.10:6379 192.168.44.10:6380 192.168.44.11:6379 192.168.44.11:6380 192.168.44.12:6379 192.168.44.12:6380 --cluster-replicas 1這樣的)叢集生成指令。
  • 第一步:先*關閉*各個Redis節點。
  • 第二步:再*啟動*各個Redis節點即可。(注意:啟動redis服務時請在上次成功啟動服務的目錄啟動,即已經生成rdb,conf的目錄,否則該節點加入不了叢集)

(删除原有叢集的)重新開機:

  • 需要再執行(形如redis-cli -a ds123 --cluster create 10.8.109.24:6379 10.8.109.36:6379 10.8.109.49:6379 10.8.109.49:6380 10.8.109.24:6380 10.8.109.36:6380 --cluster-replicas 1這樣的)叢集生成指令。
  • *第二步:*删除各個Redis安裝目錄下的*節點配置檔案nodes.conf*、*資料檔案dump.rdb*。

說明:此方式相當于重置到剛剛建立叢集的時候了,是以需要删除節點配置檔案nodes.conf、還需要删除資料存儲檔案dump.rdb。

7.5 關閉叢集

  • 方式一:進入redis後,使用SHUTDOWN指令或SHUTDOWN SAVE指令或SHUTDOWN NOSAVE指令。
  • 方式二:通過redis的用戶端程式

    redis-cli

    shutdown

redis-cli -p 6380 shutdown
           

使用shell腳本批量關閉

#!/bin/bash 
redis-cli -h 192.168.44.10 -p 6379 shutdown
redis-cli -h 192.168.44.10 -p 6380 shutdown
redis-cli -h 192.168.44.11 -p 6379 shutdown
redis-cli -h 192.168.44.11 -p 6380 shutdown
redis-cli -h 192.168.44.12 -p 6379 shutdown
redis-cli -h 192.168.44.12 -p 6380 shutdown
           

7.6 檢視叢集資訊

使用

redis-cli -c

連入任意server

  • 使用cluster info
192.168.44.10:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:9
cluster_my_epoch:1
cluster_stats_messages_ping_sent:95
cluster_stats_messages_pong_sent:94
cluster_stats_messages_fail_sent:3
cluster_stats_messages_sent:192
cluster_stats_messages_ping_received:94
cluster_stats_messages_pong_received:91
cluster_stats_messages_fail_received:1
cluster_stats_messages_received:186
           
  • 使用cluster nodes

    這個指令很重要,可以檢視是否故障,是否完成故障轉移

192.168.44.10:6379> cluster nodes
249f41fda5a29551b54f84e189cefc07003b777a 192.168.44.11:6380@16380 slave dae7dacfd2828bbc485f4f5f31f755665704b511 0 1625732773268 1 connected
710d7a7e5339e21d52bfcfb464b0d59f55f01242 192.168.44.10:6380@16380 master - 0 1625732774288 9 connected 10923-16383
88b39d88f9feaf5a18896233e00282f1a008616a 192.168.44.12:6380@16380 slave e05b09bd0949ca46baea67c45c1886716562a091 0 1625732771000 3 connected
78738770dd492fbe402467b8a80478d32b11a898 192.168.44.12:6379@16379 slave 710d7a7e5339e21d52bfcfb464b0d59f55f01242 0 1625732771235 9 connected
dae7dacfd2828bbc485f4f5f31f755665704b511 192.168.44.10:6379@16379 myself,master - 0 1625732770000 1 connected 0-5460
e05b09bd0949ca46baea67c45c1886716562a091 192.168.44.11:6379@16379 master - 0 1625732773000 3 connected 5461-10922

           

八、生産環境中注意要點

各類配置檔案的檔案名最好帶端口号。

繼續閱讀