如何在 Linux 上設定 Redis Cluster 文章首圖

如何在 Linux 上設定 Redis Cluster

如何在 Linux 上設定 Redis Cluster

在現代應用程式架構中,資料的吞吐量與可用性至關重要。當單一 Redis 執行個體無法負載日益增長的請求,或需要確保在節點故障時服務不中斷,Redis Cluster 便成為首選解決方案。它提供了內建的資料分片(Sharding)與高可用性機制,讓分散式快取變得簡單易用。

本文將帶領中階 Linux 使用者,在 Ubuntu 22.04 或 Debian 12 環境上,手動部署一個包含 6 個節點(3 Master + 3 Replica)的 Redis Cluster。

環境準備與依賴安裝

首先,我們需要確保系統已安裝 Redis 伺服器。雖然 Redis Cluster 功能內建於 Redis 5.0 以上版本,但為了教學清晰,我們將使用預設的二進位檔進行設定。

在終端機中執行以下指令安裝 Redis:

sudo apt update
sudo apt install redis-server -y

安裝完成後,暫時停止 Redis 服務,因為我們將手動管理多個執行個體:

sudo systemctl stop redis-server
sudo systemctl disable redis-server

建立節點目錄結構

Redis Cluster 每個節點都需要獨立的埠號、資料目錄與設定檔。為了簡化管理,我們將建立 6 個目錄,分別對應埠號 7000 到 7005。

執行以下指令建立目錄結構:

for port in $(seq 7000 7005); do \
  mkdir -p /etc/redis/cluster/$port \
  touch /etc/redis/cluster/$port/redis.conf; \
done

撰寫節點設定檔

接下來,我們需要為每個節點撰寫專屬的 redis.conf。核心設定包括埠號、啟用 Cluster 模式、設定 Cluster 節點檔案名稱以及關閉保護模式。

我們可以使用 Shell 迴圈自動生成設定檔內容,確保一致性:

for port in $(seq 7000 7005); do
  cat <<EOF > /etc/redis/cluster/$port/redis.conf
port $port
cluster-enabled yes
cluster-config-file nodes-$port.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
daemonize yes
pidfile /var/run/redis/redis-$port.pid
dir /etc/redis/cluster/$port
logfile /var/log/redis/redis-$port.log
bind 0.0.0.0
EOF
done

這裡的重點參數說明:

  • cluster-enabled yes:啟用 Cluster 模式。
  • cluster-config-file:Cluster 狀態的內部檔案,由 Redis 自動維護,勿手動編輯。
  • protected-mode no:為了讓節點間能互相通訊,教學環境中暫時關閉保護模式(生產環境應使用防火牆規則控制)。
  • bind 0.0.0.0:監聽所有網路介面。

啟動所有節點

設定檔準備就緒後,我們可以批次啟動所有 Redis 節點。請確保 /var/run/redis 目錄存在且具有正確權限:

sudo mkdir -p /var/run/redis
sudo chown redis:redis /var/run/redis

for port in $(seq 7000 7005); do
  sudo -u redis redis-server /etc/redis/cluster/$port/redis.conf
done

啟動後,我們可以檢查節點是否成功運行:

ps aux | grep redis-server

若看到 6 個不同埠號的 Redis 程序,表示啟動成功。

組建 Redis Cluster

現在,所有節點都是獨立運作的。我們需要使用 Redis 提供的 CLI 工具 redis-cli 將它們組合成一個 Cluster。Redis 7.0 之後,建議使用 --cluster create 參數,它會自動處理 Master 與 Replica 的分配。

執行以下指令,將 6 個節點加入 Cluster:

redis-cli --cluster create \
  127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
  --cluster-replicas 1

執行後,終端機會顯示節點配置摘要,並詢問是否確認。輸入 yes 並按下 Enter。Redis 會自動將前 3 個節點設為 Master,後 3 個設為對應的 Replica。

驗證 Cluster 狀態

組建完成後,我們可以使用 cluster infocluster nodes 指令來驗證狀態。

檢查 Cluster 是否健康運作:

redis-cli -p 7000 cluster info

若看到 cluster_state:ok,表示 Cluster 運作正常。

查看節點角色與連線狀態:

redis-cli -p 7000 cluster nodes

您應該會看到類似以下的輸出,顯示每個節點的 ID、IP、埠號以及角色(master 或 slave):

a1b2c3d4... 127.0.0.1:7000@17000 master - 0 1620000000000 1 connected
e5f6g7h8... 127.0.0.1:7001@17001 master - 0 1620000000000 2 connected
...

常見問題與排解

1. 無法連線到 Cluster 節點

若執行 cluster create 時出現 CLUSTERDOWN 或連線逾時,通常是因為防火牆阻擋了資料埠(17000+)。Redis Cluster 除了設定埠外,還需要開放 設定埠 + 10000 的通訊埠。 解決方法:在 Ubuntu 上使用 UFW 開放範圍:

sudo ufw allow 7000:7005/tcp
sudo ufw allow 17000:17005/tcp

2. 節點啟動失敗或權限錯誤

若節點無法啟動,檢查 /var/log/redis/ 下的 log 檔。常見原因是 redis 使用者對設定目錄或資料目錄無寫入權限。 解決方法:確保目錄所有者為 redis

sudo chown -R redis:redis /etc/redis/cluster/
sudo chown -R redis:redis /var/log/redis/

小結

透過上述步驟,我們成功在單一 Linux 主機上部署了一個具備高可用性與資料分片能力的 Redis Cluster。這種手動部署方式適合學習與測試環境。在生產環境中,建議使用 Ansible 或 Kubernetes Operator 進行自動化部署,並搭配雲端負載平衡器以處理節點故障轉移。Redis Cluster 的強大之處在於其透明性,應用程式只需連線到任意節點,Redis 會自動處理資料路由,讓分散式快取架構變得輕鬆可靠。