一、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更多操作請檢視官方文件。