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
啟動成功,連接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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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 #端口映射 #第一個端口是客戶端通信端口 第二個端口為集群總線端口 用於失敗檢測以及故障轉移、選舉等 偏移量總是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
我這里的話沒有配置網絡,啟動的時候會為這些容器統一創建一個名字為redis-cluster_default的網絡。同時也可以自定義網絡。
配置好之后通過docker-compose up -d執行
6個節點能啟動成功了 這個時候隨便進入一個節點開啟集群模式(在這里我用的是宿主機的ip進行集群模式的創建)
redis-cli --cluster create 122.51.103.239:6381 122.51.103.239:6382 122.51.103.239:6383 122.51.103.239:6384 122.51.103.239:6385 122.51.103.239: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配置