Redis Cluster with Docker

Redis Cluster with Docker

前言:超麻煩der
環境:Ubuntu 20.04 on NUC i7

創建目錄(開一個project「redis-cluster」)
mkdir -p /your_project_root_path/redis-cluster
切換至指定目錄
cd /your_project_root_path/redis-cluster/
編寫 redis-cluster.tmpl 配置文件
vim redis-cluster.tmpl

配置文件 redis-cluster.tmpl 內容

port ${PORT}
requirepass your_redis_password_here
masterauth your_redis_password_here
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.11.201
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
  • requirepass:添加訪問認證;
  • masterauth:如果主節點開啟了訪問認證,從節點訪問主節點需要認證;
  • protected-mode:保護模式,預設值 yes,即開啟。開啟保護模式以後,需配置 bind ip 或者設置訪問密碼;關閉保護模式,外部網路可以直接訪問;
  • daemonize:是否以守護執行緒的方式啟動(後台啟動),預設值 no;
  • appendonly:是否開啟 AOF 持久化模式,預設值 no;
  • cluster-enabled:是否開啟叢集模式,預設值 no;
  • cluster-config-file:叢集節點資訊文件;
  • cluster-node-timeout:叢集節點連接超時時間;
  • cluster-announce-ip:叢集節點 IP,填寫宿主機的 IP;
  • cluster-announce-port:叢集節點映射埠;
  • cluster-announce-bus-port:叢集節點匯流排埠。
在 redis-cluster 目錄下執行:
for port in `seq 7001 7006`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

以上 shell script會以for迴圈的方式循環創建 7001~7006相關的目錄與文件

每個 conf 資料夾下的 redis.conf 長得像這樣
7001~7006資料夾裡的 port、cluster-announce-port、cluster-announce-bus-port 應該要對各自的數字

有了各自的 conf 檔後,開始來寫 docker-compose.yml

# 描述 Compose 文件的版本資訊
version: "3.3"

# 定義服務,可以多個,本範例起六台
services:
  redis-7001: # 服務名稱
    image: redis # 創建容器時所需的鏡像
    container_name: redis-7001 # 容器名稱
    restart: always # 容器總是重新啟動
    network_mode: "host" # host 網路模式
    volumes: # 數據卷,目錄掛載
      - /your_project_root_path/redis-cluster/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7001/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf # 覆蓋容器啟動後預設執行的命令

  redis-7002:
    image: redis
    container_name: redis-7002
    network_mode: "host"
    volumes:
      - /your_project_root_path/redis-cluster/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7002/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-7003:
    image: redis
    container_name: redis-7003
    network_mode: "host"
    volumes:
      - /your_project_root_path/redis-cluster/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7003/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-7004:
    image: redis
    container_name: redis-7004
    network_mode: "host"
    volumes:
      - /your_project_root_path/redis-cluster/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7004/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-7005:
    image: redis
    container_name: redis-7005
    network_mode: "host"
    volumes:
      - /your_project_root_path/redis-cluster/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7005/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-7006:
    image: redis
    container_name: redis-7006
    network_mode: "host"
    volumes:
      - /your_project_root_path/redis-cluster/7006/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /your_project_root_path/redis-cluster/7006/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

然後就把服務起起來吧~

docker-compose up -d

服務起起來之後還沒結束喔,現在每一台Redis都是獨立的,接下來要建立cluster,將它們都串聯起來

創建 Redis Cluster
隨便進入一個容器節點,並進入 /usr/local/bin/ 目錄:

進入容器
docker exec -it redis-7001 bash
切換至指定目錄
cd /usr/local/bin/
通過以下命令實現 Redis Cluster 的創建
redis-cli -a your_redis_password_here --cluster create 192.168.11.201:7001 192.168.11.201:7002 192.168.11.201:7003 192.168.10.11:7004 192.168.10.11:7005 192.168.10.11:7006 --cluster-replicas 1

在然後在看到 shell script 出現

Can I set the above configuration? (type 'yes' to accept):

時,輸入 yes 並按下Enter

看到以下的畫面後,Redis Cluster的創建才算完成

至此一個高可用的 Redis Cluster 叢集搭建完成,如下圖所示,該叢集中包含 6 個 Redis 節點,3 主 3 從。三個主節點會分配槽,處理客戶端的命令請求,而從節點可用在主節點故障後,頂替主節點。

以下是幾個確認 Cluster 的方法:

檢查Cluster狀態

進入容器
docker exec -it redis-7001 bash
切換至指定目錄
cd /usr/local/bin/
檢查叢集狀態(要檢查哪一個節點就指定對應的埠)
redis-cli -a your_redis_password_here --cluster check 192.168.11.201:7006
連接至叢集某個節點
redis-cli -c -a your_redis_password_here -h 192.168.11.201 -p 7006
查看叢集資訊
cluster info
查看叢集節點資訊
cluster nodes
最後幾個注意點
Client端要使用叢集時,可以由任一節點進入

但請用

cluster-announce-port(上例如 7001~7006)

不要用

cluster-announce-bus-port(上例如 17001~17006)

cluster-announce-bus-port 是叢集之間節點溝通用,若Client端接入,可能會導致叢集同步數據失常

很重要,所以要講三次