Redis叢集部署的三種模式

xiangzhihong發表於2022-11-23

一、Redis簡介

Redis 是一款完全開源免費、遵守BSD協議的高效能(NOSQL)的key-value資料庫。它使用ANSI C語言編寫,支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。

Redis的使用場景有如下一些:

  • 讀寫效率要求高,需要將資料進行快取的。此時,可以把一些需要頻繁訪問的資料,而且在短時間之內不會發生變化的,放入Redis中進行操作,從而提高使用者的請求速度和降低網站的負載,降低資料庫的讀寫次數。
  • 需要實時計算的場景。需要實時變化和展示的功能,就可以把相關資料放在Redis中進行操作,可以大大提高訪問效率。
  • 訊息佇列場景。比如在應對實時聊天系統時,就可以使用Redis,可以大大提高應用的可用性。

正是因為Redis有這麼多的好處,所以不管是大中型專案,都會用到Redis。而我們今天要講的就是Redis的三種叢集部署模式:主從模式,Sentinel(哨兵)模式,Cluster模式。

Rdis最開始使用主從模式做叢集,若master當機需要手動配置slave轉為master;後來為了高可用提出來哨兵模式,該模式下有一個哨兵監視master和slave,若master當機可自動將slave轉為master,但它也有一個問題,就是不能動態擴充;所以在3.x提出cluster叢集模式。

二、主從模式

2.1 主從模式簡介

主從模式是三種模式中最簡單的,在主從複製中,資料庫分為兩類:主資料庫(master)和從資料庫(slave)。其中,主從複製有如下特點:

  • 主資料庫可以進行讀寫操作,當讀寫操作導致資料變化時會自動將資料同步給從資料庫;
  • 從資料庫一般是隻讀的,並且接收主資料庫同步過來的資料;
  • 一個master可以擁有多個slave,但是一個slave只能對應一個master;
  • slave掛了不影響其他slave的讀和master的讀和寫,重新啟動後會將資料從master同步過來;
  • master掛了以後,不影響slave的讀,但redis不再提供寫服務,master重啟後redis將重新對外提供寫服務;
  • master掛了以後,不會在slave節點中重新選一個master;

下面是主從模式的工作示意圖。
在這裡插入圖片描述

工作機制:

  • 當slave啟動後,主動向master傳送SYNC命令。master接收到SYNC命令後在後臺儲存快照(RDB持久化)和快取儲存快照這段時間的命令,然後將儲存的快照檔案和快取的命令傳送給slave。slave接收到快照檔案和命令後載入快照檔案和快取的執行命令。
  • 複製初始化後,master每次接收到的寫命令都會同步傳送給slave,保證主從資料一致性。

2.2 環境說明

為了方便演示主從模式,我們需要準備至少3臺機器(虛擬機器)。
在這裡插入圖片描述

2.3 下載解壓Redis安裝包

接下來,就是下載Redis的安裝包,下載地址:http://download.redis.io/rele...

cd /opt/software
wget http://download.redis.io/releases/redis-7.0.3.tar.gz
# 解壓
tar -xf redis-7.0.3.tar.gz
cd redis-7.0.3
# 設定環境變數
echo "export REDIS_HOME=/opt/software/redis-7.0.3">> /etc/profile
source /etc/profile

2.4 編譯安裝

接下來是,編譯安裝所有的節點。

cd $REDIS_HOME
yum -y install gcc gcc++
make && make install
# 預設安裝目錄 /usr/local/bin

2.5 配置服務

安裝節點之後,為了方便後期啟動和維護服務, 需要對安裝的節點進行服務的配置。

cat << EOF > /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=forking
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65536
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

下面是配置的相關描述和說明:

  • Description: # 描述服務
  • After: # 描述服務類別
  • [Service] # 服務執行引數的設定
  • Type=forking # 是後臺執行的形式
  • ExecStart # 為服務的具體執行命令
  • ExecReload # 為重啟命令
  • ExecStop # 為停止命令
  • LimitNOFILE=65536 # 開啟檔案數和程式數有限制,預設限制為1024,如果不設定,或者設定為LimitNOFILE=unlimited(不識別),則得到了1024
  • PrivateTmp=True # 表示給服務分配獨立的臨時空間

【注意】[Service]的啟動、重啟、停止命令全部要求使用絕對路徑 [Install] #執行級別下服務安裝的相關設定,可設定為多使用者,即系統執行級別為3

過載系統服務:systemctl daemon-reload。以下是配置,位於/usr/libexec/redis-shutdown路徑下。

#!/bin/bash
#
# Wrapper to close properly redis and sentinel
test x"$REDIS_DEBUG" != x && set -x
REDIS_CLI=/usr/local/bin/redis-cli
# Retrieve service name
SERVICE_NAME="$1"
if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=redis
fi
# Get the proper config file based on service name
CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"
# Use awk to retrieve host, port from config file
HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
# Just in case, use default host, port
HOST=${HOST:-127.0.0.1}
if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}
else
    PORT=${PORT:-26739}
fi
# Setup additional parameters
# e.g password-protected redis instances
[ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"
# shutdown the service properly
if [ -e "$SOCK" ] ; then
        $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
else
        $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
fi

經過上面的處理後,就可以使用systemctl命令來啟停redis了。

2.6 授權啟動服務

接下來,是授權啟動服務需要用到的一些命令:

chmod +x /usr/libexec/redis-shutdown
useradd -s /sbin/nologin redis

mkdir /usr/local/redis ; cp $REDIS_HOME/redis.conf /usr/local/redis/ && chown -R redis:redis /usr/local/redis
mkdir -p /opt/software/redis-7.0.3/data && chown -R redis:redis /opt/software/redis-7.0.3/data
yum install -y bash-completion && source /etc/profile                 # 命令補全
systemctl daemon-reload
systemctl enable redis

2.7 修改linux核心引數

# 臨時生效
sysctl  -w  vm.overcommit_memory=1
# 永久生效
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf && sysctl -p
### 可選值:0,1,2。
# 0,:表示核心將檢查是否有足夠的可用記憶體供應用程式使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程式。
# 1:表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
# 2: 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體。

2.8 節點配置

2.8.1 master節點配置

首先,我們開啟master節點檔案,檔案位於vi/usr/local/redis/redis.conf目錄下,然後修改配置如下:

bind 192.168.182.110               # 監聽ip,多個ip用空格分隔
daemonize yes               # 允許後臺啟動
logfile "/usr/local/redis/redis.log"                # 日誌路徑
dir /opt/software/redis-7.0.3/data                 # 資料庫備份檔案存放目錄
masterauth 123456               # slave連線master密碼,master可省略
requirepass 123456              # 設定master連線密碼,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目錄生成appendonly.aof檔案,將每一次寫操作請求都追加到appendonly.aof 檔案中

2.8.2 slave1節點配置

接著,我們開啟slave1節點檔案,檔案位於vi/usr/local/redis/redis.conf,修改配置如下:

bind 192.168.182.111               # 監聽ip,多個ip用空格分隔
daemonize yes               # 允許後臺啟動
logfile "/usr/local/redis/redis.log"                # 日誌路徑
dir /opt/software/redis-7.0.3/data                 # 資料庫備份檔案存放目錄
#  replicaof用於追隨某個節點的redis,被追隨的節點為主節點,追隨的為從節點。就是設定master節點
replicaof 192.168.182.110 6379
masterauth 123456               # slave連線master密碼,master可省略
requirepass 123456              # 設定master連線密碼,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目錄生成appendonly.aof檔案,將每一次寫操作請求都追加到appendonly.aof 檔案中

2.8.3 slave2節點配置

開啟slave2的節點檔案,檔案位於vi/usr/local/redis/redis.conf,修改配置如下:
bind 192.168.182.112               # 監聽ip,多個ip用空格分隔
daemonize yes               # 允許後臺啟動
logfile "/usr/local/redis/redis.log"                # 日誌路徑
dir /opt/software/redis-7.0.3/data                 # 資料庫備份檔案存放目錄
#  replicaof用於追隨某個節點的redis,被追隨的節點為主節點,追隨的為從節點。就是設定master節點
replicaof 192.168.182.110 6379
masterauth 123456               # slave連線master密碼,master可省略
requirepass 123456              # 設定master連線密碼,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目錄生成appendonly.aof檔案,將每一次寫操作請求都追加到appendonly.aof 檔案中

2.9 啟動Redis服務

systemctl start redis
systemctl status redis

2.10 檢視叢集

然後,使用下面的命令檢視叢集的一些資料:

# 互動式
redis-cli -h 192.168.182.110 -a 123456
192.168.182.110:6379> info replication

# 互動式
redis-cli -h 192.168.182.110
192.168.182.110:6379> auth 123456
192.168.182.110:6379> info replication

# 非互動式
redis-cli -h 192.168.182.110 -a 123456 info replication

如果一切配置都沒有問題,Redis的主資料庫會不定時的向從資料庫同步資料,如下圖所示。
在這裡插入圖片描述

三、Sentinel(哨兵)模式

3.1 Sentinel(哨兵)模式簡介

主從模式的弊端就是不具備高可用性,當master掛掉以後,Redis將不能再對外提供寫入操作,因此sentinel模式應運而生。sentinel中文含義為哨兵,顧名思義,它的作用就是監控redis叢集的執行狀況,此模式具有如下一些特點:

  • sentinel模式是建立在主從模式的基礎上,如果只有一個Redis節點,sentinel就沒有任何意義;
  • 當master掛了以後,sentinel會在slave中選擇一個做為master,並修改它們的配置檔案,其他slave的配置檔案也會被修改,比如slaveof屬性會指向新的master;
  • 當master重新啟動後,它將不再是master,而是做為slave接收新的master的同步資料;
  • sentinel因為也是一個程式,所以有掛掉的可能,所以sentinel也會啟動多個形成一個sentinel叢集;
  • 多sentinel配置的時候,sentinel之間也會自動監控;
  • 當主從模式配置密碼時,sentinel也會同步將配置資訊修改到配置檔案中;
  • 一個sentinel或sentinel叢集可以管理多個主從Redis,多個sentinel也可以監控同一個redis;
  • sentinel最好不要和Redis部署在同一臺機器,不然Redis的伺服器掛了以後,sentinel也可能會掛掉。

下面是Sentinel(哨兵)模式的工作的原理圖:
在這裡插入圖片描述

其工作的流程如下所示:

  • 每個sentinel以每秒鐘一次的頻率向它所知的master,slave以及其他sentinel例項傳送一個 PING 命令;
  • 如果一個例項距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個例項會被sentinel標記為主觀下線;
  • 如果一個master被標記為主觀下線,則正在監視這個master的所有sentinel要以每秒一次的頻率確認master的確進入了主觀下線狀態;
  • 當有足夠數量的sentinel(大於等於配置檔案指定的值)在指定的時間範圍內確認master的確進入了主觀下線狀態, 則master會被標記為客觀下線;
  • 在一般情況下, 每個sentinel會以每 10 秒一次的頻率向它已知的所有master,slave傳送 INFO 命令;
  • 當master被sentinel標記為客觀下線時,sentinel向下線的master的所有slave傳送 INFO 命令的頻率會從 10 秒一次改為 1 秒一次;
  • 若沒有足夠數量的sentinel同意master已經下線,master的客觀下線狀態就會被移除;若master重新向sentinel的 PING 命令返回有效回覆,master的主觀下線狀態就會被移除。

3.2 環境說明

在這裡插入圖片描述

同時,為了保證能夠最小可能的碟機事件,sentinel 最好跟redis部署在不同的機器上,sentinel 埠:26379。

3.3 配置sentinel

因為哨兵模式是基於主從模式的,所以redis的相關配置就不多說明。我們只需要在主從模式的基礎上直接修改sentinel配置檔案,配置3個哨兵即可,哨兵的配置可以參考如下內容。

# 三個節點建立儲存目錄
mkdir /opt/software/redis-7.0.3/sentinel
mkdir /opt/software/redis-7.0.3/sentinel ; chown -R redis:redis /opt/software/redis-7.0.3/
cat >/usr/local/redis/sentinel.conf<<EOF
daemonize yes
logfile "/usr/local/redis/sentinel.log"
# sentinel工作目錄
dir "/opt/software/redis-7.0.3/sentinel"
# 判斷master失效至少需要2個sentinel同意,建議設定為n/2+1,n為sentinel個數
# sentinel monitor <master-name> <ip> <port> <count>
sentinel monitor mymaster 192.168.182.110 6379 2
sentinel auth-pass mymaster 123456
# 判斷master主觀下線時間,預設30s
sentinel down-after-milliseconds mymaster 30000
EOF

3.4 啟動sentinel

啟動sentinel模式的命令如下:

/usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
netstat -tnlp|grep 26379

在這裡插入圖片描述

3.5 故障模擬測試

為了模擬故障,我們將master停掉。

# 停掉master
systemctl stop redis
redis-cli -h 192.168.182.111 -a 123456 info replication

在這裡插入圖片描述

可以看到,Redis發現master節點出現問題後,會自動切換到其它節點。接下來,我們再測試一下讀寫。

[root@local-168-182-110 redis-7.0.3]# redis-cli -h 192.168.182.112 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.182.112:6379> set k2 v2
OK

在這裡插入圖片描述

可以看到,新的master節點讀寫能力都是正常的,接下來就是恢復故障,看能否正常。

redis-cli -h 192.168.182.112 -a 123456 info replication

在這裡插入圖片描述
可以看到,和之前預定的sentinel模式的工作流程是一樣的:原先的master節點在恢復後並不會主動切換到master角色,而是作為slave角色繼續服務。

四、Cluster(叢集)模式

4.1 Cluster(叢集)模式簡介

Redis 的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺 Redis 伺服器都儲存相同的資料,很浪費記憶體,所以在 redis3.0上加入了 Cluster 叢集模式,實現了 Redis 的分散式儲存,也就是說每臺 Redis 節點上儲存不同的內容。下面是Cluster 叢集模式的一些特點:

  • sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當資料量過大到一臺伺服器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對儲存的資料進行分片,將資料儲存到多個Redis例項中。cluster模式的出現就是為了解決單機Redis容量有限的問題,將Redis的資料根據一定的規則分配到多臺機器。
  • cluster可以說是sentinel+主從模式的結合體,透過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis例項。因為Redis的資料是根據一定規則分配到cluster的不同機器的,當資料量過大時,可以新增機器進行擴容。
  • 使用叢集,只需要將redis配置檔案中的cluster-enable配置開啟即可,每個叢集中至少需要三個主資料庫才能正常執行,新增節點非常方便。

下面是Cluster 叢集模式的架構示意圖。
在這裡插入圖片描述

可以看到,Cluster 叢集模式有如下一些特點:

  • 多個redis節點網路互聯,資料共享;
  • 所有的節點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用;
  • 不支援同時處理多個key(如MSET/MGET),因為redis需要把key均勻分佈在各個節點上,併發量很高的情況下同時建立key-value會降低效能並導致不可預測的行為;
  • 支援線上增加、刪除節點;
  • 客戶端可以連線任何一個主節點進行讀寫。

4.2 環境說明

為了模擬Cluster 叢集模式,我們需要準備至少三臺機器,然後分別開啟三個redis服務,即每個節點都要是一主兩從模式。
在這裡插入圖片描述

4.3 修改配置

接下來,我們基於主從模式的配置進行如下修改。

# 建立儲存目錄
mkdir -p /opt/software/redis-7.0.3/cluster/redis_{7001..7003}
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7001.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7002.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7003.conf

chown -R redis:redis /usr/local/redis ;chown -R redis:redis /opt/software/redis-7.0.3/cluster

然後,修改位於/usr/local/redis/cluster_redis_7001.conf目錄的配置檔案

cluster_redis_7001.conf。
# 【注意】節點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7001
daemonize yes
pidfile "/var/run/cluster_redis_7001.pid"
logfile "/usr/local/redis/cluster_redis_7001.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7001"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 開啟叢集模式
cluster-enabled yes
# 雖然此配置的名字叫"叢集配置檔案",但是此配置檔案不能人工編輯,它是叢集節點自動維護的檔案,主要用於記錄叢集中有哪些節點、他們的狀態以及一些持久化引數等,方便在重啟時恢復這些狀態。通常是在收到請求之後這個檔案就會被更新。
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000

然後,修改配置檔案cluster_redis_7002.conf,位於/usr/local/redis/cluster_redis_7002.conf目錄下。

# 【注意】節點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7002
daemonize yes
pidfile "/var/run/cluster_redis_7002.pid"
logfile "/usr/local/redis/cluster_redis_7002.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7002"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes則開啟叢集功能,此redis例項作為叢集的一個節點,否則,它是一個普通的單一的redis例項。
cluster-enabled yes
# 雖然此配置的名字叫"叢集配置檔案",但是此配置檔案不能人工編輯,它是叢集節點自動維護的檔案,主要用於記錄叢集中有哪些節點、他們的狀態以及一些持久化引數等,方便在重啟時恢復這些狀態。通常是在收到請求之後這個檔案就會被更新。
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000

然後,繼續修改配置檔案cluster_redis_7003.conf,檔案目錄位於/usr/local/redis/cluster_redis_7003.conf。

# 【注意】節點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7003
daemonize yes
pidfile "/var/run/cluster_redis_7003.pid"
logfile "/usr/local/redis/cluster_redis_7003.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7003"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes則開啟叢集功能,此redis例項作為叢集的一個節點,否則,它是一個普通的單一的redis例項。
cluster-enabled yes
# 雖然此配置的名字叫"叢集配置檔案",但是此配置檔案不能人工編輯,它是叢集節點自動維護的檔案,主要用於記錄叢集中有哪些節點、他們的狀態以及一些持久化引數等,方便在重啟時恢復這些狀態。通常是在收到請求之後這個檔案就會被更新。
cluster-config-file nodes_7003.conf
cluster-node-timeout 15000

其它兩臺機器配置與192.168.182.110一致,只是ip不同,此處省略。

# 將配置copy到另外兩個節點
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-111:/usr/local/redis/
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-112:/usr/local/redis/

# 在node2上執行
sed -i 's/192.168.182.110/192.168.182.111/g' /usr/local/redis/cluster_redis_{7001..7003}.conf

# 在node3上執行
sed -i 's/192.168.182.110/192.168.182.112/g' /usr/local/redis/cluster_redis_{7001..7003}.conf

4.4 啟動Redis服務

接下來,啟動Redis服務的所有的節點。

redis-server /usr/local/redis/cluster_redis_7001.conf
netstat -tnlp|grep 7001
redis-server /usr/local/redis/cluster_redis_7002.conf
netstat -tnlp|grep 7002
redis-server /usr/local/redis/cluster_redis_7003.conf
netstat -tnlp|grep 7003
tail -f /usr/local/redis/cluster_redis_7001.log
tail -f /usr/local/redis/cluster_redis_7002.log
tail -f /usr/local/redis/cluster_redis_7003.log

啟動成功之後,如下圖。
在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述

4.5 建立叢集

為了能夠正常工作,我們需要叢集的一個主節點有2個從節點。

# –cluster-replicas 2 : 表示叢集的一個主節點有2個從節點,就是一主兩從模式
redis-cli -a 123456 --cluster create \
192.168.182.110:7001 192.168.182.110:7002 192.168.182.110:7003 \
192.168.182.111:7001 192.168.182.111:7002 192.168.182.111:7003 \
192.168.182.112:7001 192.168.182.112:7002 192.168.182.112:7003 \
--cluster-replicas 2

在這裡插入圖片描述
接著,系統會會自動生成nodes.conf檔案,然後開啟檔案即可看到叢集的相關資訊。

ll /opt/software/redis-7.0.3/cluster/redis_{7001..7003}

在這裡插入圖片描述

4.6 繼承操作

登入叢集

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456

叢集資訊

redis-cli -c -h 192.168.182.129 -p 7001
192.168.182.110:7001> auth 123456
192.168.182.110:7001> CLUSTER INFO

在這裡插入圖片描述

列出節點資訊

redis-cli -c -h 192.168.182.129 -p 7001
192.168.182.110:7001> auth 123456
192.168.182.110:7001> CLUSTER INFO
192.168.182.110:7001> CLUSTER NODES

在這裡插入圖片描述
增加節點
比如,在node1伺服器上增加一節點。首先,我們新增如下配置:

# copy配置
cp /usr/local/redis/cluster_redis_7003.conf /usr/local/redis/cluster_redis_7004.conf
# 建立儲存目錄
mkdir /opt/software/redis-7.0.3/cluster/redis_7004

# 修改配置
vi /usr/local/redis/cluster_redis_7004.conf

bind 192.168.182.110
port 7004
daemonize yes
pidfile "/var/run/redis_7004.pid"
logfile "/usr/local/redis/cluster_redis_7004.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7004"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 15000

# 授權
chown -R redis:redis /usr/local/redis && chown -R redis:redis /opt/software/redis-7.0.3/cluster/redis_7004

然後,再啟動服務。

redis-server /usr/local/redis/cluster_redis_7004.conf
netstat -tnlp|grep :7004

如果要在叢集中增加節點,可以使用下面的方式。

[root@local-168-182-110 ~]# redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 新增節點
192.168.182.110:7001> CLUSTER MEET 192.168.182.110 7004
# 檢視節點資訊
192.168.182.110:7001> CLUSTER NODES

可以看到,新增的節點都是以master身份加入叢集的。如果要【更換節點身份】,比如將新增的192.168.182.110:7004節點身份改為192.168.182.130:7001的slave。

redis-cli -c -h 192.168.182.110 -p 7004
192.168.182.110:7004> auth 123456
# 改變節點型別
192.168.182.110:7004> cluster replicate 0a9d68b75d529b611b4bae5753be602006fcef74
192.168.182.110:7004> CLUSTER NODES

在這裡插入圖片描述

刪除某個節點,可以參考下面的內容。

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 檢視節點
192.168.182.110:7001> CLUSTER NODES
# 刪除節點
192.168.182.110:7001> CLUSTER FORGET 378ef2a24fb4138496b8da85bb66143800b53686
# 檢查節點資訊
192.168.182.110:7001> CLUSTER NODES

在這裡插入圖片描述

最後,在配置修改完後儲存配置。

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 將節點的配置檔案儲存到硬碟裡面
192.168.182.110:7001> CLUSTER SAVECONFIG

可以看到,之前刪除的節點又恢復了,這是因為對應的配置檔案沒有刪除,執行CLUSTER SAVECONFIG恢復。
在這裡插入圖片描述

接下來,我們模擬下模擬master節點掛掉的場景。

netstat -lntp |grep :7001|awk '{print $NF}'|cut -d '/' -f 1|xargs kill -9
redis-cli -c -h 192.168.182.111 -p 7001 -a 123456 CLUSTER NODES

在這裡插入圖片描述
可以看到,192.168.182.110:7001的一行為master fail,狀態為disconnected;而對應192.168.182.110:7004的一行,slave已經變成master。

接著,我們再模擬下故障恢復場景,重新啟動192.168.182.110:7001節點。

redis-server /usr/local/redis/cluster_redis_7001.conf
redis-cli -c -h 192.168.182.111 -p 7001 -a 123456 CLUSTER NODES

在這裡插入圖片描述

可以看到,192.168.182.110:7001節點啟動後為slave節點,並且是192.168.182.110:7004的slave節點。即master節點如果掛掉,它的slave節點變為新master節點繼續對外提供服務,而原來的master節點如果重啟,則變為新master節點的slave節點。需要說明的是,cluster不能選擇db,只能預設db為0,所以select切庫相當於是不能使用的。

五、其他操作

5.1 檢視叢集資訊

  • cluster info :列印叢集的資訊
  • cluster nodes :列出叢集當前已知的所有節點( node),以及這些節點的相關資訊。

5.2 節點操作

  • cluster meet <ip> <port> :將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。
  • cluster forget <node_id> :從叢集中移除 node_id 指定的節點。
  • cluster replicate <node_id> :將當前節點設定為 node_id 指定的節點的從節點。
  • cluster saveconfig :將節點的配置檔案儲存到硬碟裡面。

5.3 槽(slot)操作

  • cluster addslots <slot> [slot ...] :將一個或多個槽( slot)指派( assign)給當前節點。
  • cluster delslots <slot> [slot ...] :移除一個或多個槽對當前節點的指派。
  • cluster flushslots :移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
  • cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
  • cluster setslot <slot> migrating <node_id> :將本節點的槽 slot 遷移到 node_id 指定的節點中。
  • cluster setslot <slot> importing <node_id> :從 node_id 指定的節點中匯入槽 slot 到本節點。
  • cluster setslot <slot> stable :取消對槽 slot 的匯入( import)或者遷移( migrate)。

5.4 鍵

  • cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。
  • cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。
  • cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵

主從模式、哨兵模式、叢集模式的環境部署就到這裡了,redis更多操作請檢視官方文件。

相關文章