docker搭建redis叢集
docker-compose是以多容器的方式啟動,非常适合用來啟動叢集
一、環境準備
雲環境:CentOS 7.6 64位
二、安裝docker-compose
#需要先安裝企業版linux附加包(epel)
yum -y install epel-release
#安裝pip
yum -y install python-pip
#安裝docker-compose
pip install docker-compose
三、建立docker-compose.yml
以docker-compose啟動時會從目前路徑找docker-compose.yml或者docker-compose.yaml
從docker官網上找一份docker-compose.yml ,傳送門----------------------------------------https://docs.docker.com/compose/compose-file/
docker-compose啟動單機redis
接下來先用docker-compose嘗試啟動單點redis,下面是docker-compose配置檔案
#docker-compose版本
version: "3.8"
services:
# service執行個體名
redis:
#容器服務名
container_name: redis-0
#基礎鏡像
image: redis
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6379:6379
- 16379:16379
#映射主控端的資料卷 配置資料目錄和配置檔案目錄 HOST:CONTAINER
volumes:
- /usr/docker/redis/data:/data
- /usr/docker/redis/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
同時需要配置redis.conf ,配置以及配置項的修改請移步上一篇博文------從零開始學習docker之在docker中搭建redis(單機)
配置好之後隻需要在docker-compose.yml所在目錄執行
docker-compose up -d
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZuBnLuVzRjVXVU9EMFR1T5lEVOVDMD50dBR1T3dGRNFTR650dVRUT3lERNlHMT1UNjRlT5VEVNZXVE10dJRUT5hzUNVzYU5UeFRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
啟動成功,連接配接redis與驗證同樣移步上一篇博文
docker-compose啟動redis叢集
docker-compose.yml
#https://docs.docker.com/compose/compose-file/
#version
version: "3.8"
services:
# 節點1
redis-1:
#容器服務名
container_name: redis-1
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6381:6381
- 16381:16381
#映射主控端的資料卷 配置資料目錄和配置檔案目錄 HOST:CONTAINER
volumes:
- /usr/docker/redis-cluster/redis-6381/data:/data
- /usr/docker/redis-cluster/redis-6381/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 節點2
redis-2:
#容器服務名
container_name: redis-2
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6382:6382
- 16382:16382
#映射主控端的資料卷 配置目錄
volumes:
- /usr/docker/redis-cluster/redis-6382/data:/redis/data
- /usr/docker/redis-cluster/redis-6382/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 節點3
redis-3:
#容器服務名
container_name: redis-3
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6383:6383
- 16383:16383
#映射主控端的資料卷 配置目錄
volumes:
- /usr/docker/redis-cluster/redis-6383/data:/data
- /usr/docker/redis-cluster/redis-6383/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 節點4
redis-4:
#容器服務名
container_name: redis-4
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6384:6384
- 16384:16384
#映射主控端的資料卷 配置目錄
volumes:
- /usr/docker/redis-cluster/redis-6384/data:/redis/data
- /usr/docker/redis-cluster/redis-6384/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 節點5
redis-5:
#容器服務名
container_name: redis-5
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6385:6385
- 16385:16385
#映射主控端的資料卷 配置目錄
volumes:
- /usr/docker/redis-cluster/redis-6385/data:/redis/data
- /usr/docker/redis-cluster/redis-6385/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 節點6
redis-6:
#容器服務名
container_name: redis-6
#基礎鏡像
image: redis
#網絡 host模式 和主控端公用 以便叢集之中的其他機器互相通信
network_mode: "host"
#端口映射
#第一個端口是用戶端通信端口 第二個端口為叢集總線端口 用于失敗檢測以及故障轉移、選舉等 偏移量總是10000
ports:
- 6386:6386
- 16386:16386
#映射主控端的資料卷 配置目錄
volumes:
- /usr/docker/redis-cluster/redis-6386/data:/redis/data
- /usr/docker/redis-cluster/redis-6386/redis.conf:/etc/redis/redis.conf
# 設定服務預設的啟動程式
entrypoint:
- redis-server
- /etc/redis/redis.conf
叢集模式的redis.conf除了要改單機的幾個配置外(端口、本地通路保護) 還需要修改叢集配置。
#把這一行的#注掉 表示支援叢集
cluster-enabled yes
#叢集配置檔案(啟動時自動生成)
cluster-config-file nodes_xxx.conf
同時需要配置網絡 如果不配置的話預設時bridge模式 容器之間不能互相通信,無法做叢集。
在這裡我是把網絡配置成host模式:network_mode: "host" 即容器和主控端共享同一個網絡,這樣容器與容器之間就可以互相通信,詳見上面配置檔案。
配置好之後通過docker-compose up -d執行
6個節點能啟動成功了 這個時候随便進入一個節點開啟叢集模式
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
可以看到開啟叢集模式後預設配置設定了主從伺服器 選yes接受該配置
這時候主從伺服器都加入到叢集中去了 到這裡叢集就已經搭建好了
四、驗證redis叢集
首先進入其中某一個節點
redis-cli -c -h 127.0.0.1 -p 6381
連接配接到redis之後可以通過cluster-nodes顯示叢集節點分布情況
可以看到三主三從
redis6381節點 set值之後根據hash環分布 資料落在6382節點上
五、相關代碼及配置檔案
傳送門----------------------------------https://github.com/DreamsChaser/docker
六、問題彙總
問題1
ERROR: for redis-master-1 Cannot start service redis-master-1: OCI runtime create failed: container_linux.go:349:
starting container process caused "exec: \"redis-server /etc/redis/redis.conf\": stat redis-server /etc/redis/redis.conf: no such file or directory": unknown
這種情況會好多種原因 可能是因為配置檔案映射路徑有問題導緻
我這出現的情況是因為我在寫 容器啟動的指令entrypoint時沒有按照yml的檔案格式導緻不識别所緻
問題2
Node 127.0.0.1:6381 is not configured as a cluster node
未開啟叢集模式,需要在redis.conf裡開啟,具體見上面redis.conf配置