Docker 部署Redis 集群&解决 Waiting for the cluster to join

创建redis 网络

docker network create redis --subnet 172.38.0.0/16

通过脚本创建6个redis 配置

cd 
mkdir shell
cd shell
vim redis.sh
#开始 以下内容复制到 redis.sh 文件中
for port in $(seq 1 6);do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes 
EOF
#用shell 创建 6个容器,也可以使用后面的docker 创建和docker-compose 创建 
docker run -d -p 33${port}${port}:6379 -p 133${port}${port}:16379 --name redis-${port} -v /mydata/redis/node-${port}/data:/data -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf --net redis --ip 172.38.0.1${port} redis redis-server /etc/redis/redis.conf
done
#结束


#运行redis.sh 文件
bash redis.sh

各节点解释如下所示:
port:节点端口,即对外提供通信的端口
cluster-enabled:是否启用集群
cluster-config-file:集群配置文件
cluster-node-timeout:连接超时时间
cluster-announce-ip:集群各节点IP地址
cluster-announce-port:集群节点映射端口
cluster-announce-bus-port:集群总线端口
appendonly:持久化模式

创建6个redis 容器 有两种方式:1、用docker 创建 2、用docker-compose 创建
docker-compose 创建
安装docker-compse前服务器上必须先安装好docker
docker-compse安装步骤

 #(官网安装地址,较慢,可以执行下面国内地址)sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#1.国内加速安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#2.Apply executable permissions to the binary
sudo chmod +x /usr/local/bin/docker-compose
#3.Test the installation.
docker-compose --version

docker-compose yml文件编写

cd 
mkdir compose_test
cd compose_test
vi docker_compose_redis.yml
#docker_compose_redis.yml 开始 将一下内容复制写入 docker_compose_redis.yml 注意检查格式
version: '3.1'#docker-compose版本
services: #定义container
  redis-1:
    restart: always
    image: redis:6.2.6 #image
    container_name: redis-1 #容器名称
    ports: #端口
      - 3311:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes: #数据卷
      - /mydata/redis/node-1/data:/data
      - /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.11
  redis-2:
    restart: always
    image: redis:6.2.6
    container_name: redis-2
    ports:
      - 3322:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes:
      - /mydata/redis/node-2/data:/data
      - /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.12
  redis-3:
    restart: always
    image: redis:6.2.6
    container_name: redis-3
    ports:
      - 3333:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes:
      - /mydata/redis/node-3/data:/data
      - /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.13
  redis-4:
    restart: always
    image: redis:6.2.6
    container_name: redis-4
    ports:
      - 3344:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes:
      - /mydata/redis/node-4/data:/data
      - /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.14
  redis-5:
    restart: always
    image: redis:6.2.6
    container_name: redis-5
    ports:
      - 3355:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes:
      - /mydata/redis/node-5/data:/data
      - /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.15
  redis-6:
    restart: always
    image: redis:6.2.6
    container_name: redis-6
    ports:
      - 3366:6379
    command: 
        redis-server /etc/redis/redis.conf  # 启动容器命令   
    volumes:
      - /mydata/redis/node-6/data:/data
      - /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf
    networks:   ## 定义网络
      redis:   ## 加入的网络的名称
           ipv4_address: 172.38.0.16
networks:
  default:
    external:
      name: redis #redis已经存在的网络
  redis:
    external: true

#docker_compose_redis.yml 结束
#docker_compose_redis.yml 指定文件运行
docker-compose -f docker_compose_redis.yml up -d

docker 创建6个容器

docker run -d --name redis-node1 -v /home/install/redis/data/node1:/data -p 6379:6379 -p 16379:16379 redis --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379 
docker run -d --name redis-node2 -v /home/install/redis/data/node2:/data -p 6380:6380 -p 16380:16380 redis --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380 
docker run -d --name redis-node3 -v /home/install/redis/data/node3:/data -p 6381:6381 -p 16381:16381 redis --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6381 
docker run -d --name redis-node4 -v /home/install/redis/data/node4:/data -p 6382:6382 -p 16382:16382 redis --cluster-enabled yes --cluster-config-file nodes-node-4.conf --port 6382 
docker run -d --name redis-node5 -v /home/install/redis/data/node5:/data -p 6383:6383 -p 16383:16383 redis --cluster-enabled yes --cluster-config-file nodes-node-5.conf --port 6383 
docker run -d --name redis-node6 -v /home/install/redis/data/node6:/data -p 6384:6384 -p 16384:16384 redis --cluster-enabled yes --cluster-config-file nodes-node-6.conf --port 6384 

查看创建好的容器

[root@iZwz9f559fa6a275jj2x0sZ node-6]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS              PORTS                                       NAMES
3c66f768dc48   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3322->6379/tcp, :::3322->6379/tcp   redis-2
e2d02ec4955f   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3311->6379/tcp, :::3311->6379/tcp   redis-1
70359b600a86   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3366->6379/tcp, :::3366->6379/tcp   redis-6
b941c7d69b4e   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3355->6379/tcp, :::3355->6379/tcp   redis-5
a94defd938fa   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3344->6379/tcp, :::3344->6379/tcp   redis-4
c3c425010b54   redis:6.2.6   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3333->6379/tcp, :::3333->6379/tcp   redis-3

创建Redis集群

[root@iZwz9f559fa6a275jj2x0sZ compose_test]# docker exec -it redis-1 /bin/bash
root@e2d02ec4955f:/data# redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: db4d25929872fc413adb423e4de1670c6202418c 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: f92373ce9c7cba38423836cdf055aec3871f8020 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: aa75835545c59bf00fbdeadc4c730347a12b05bb 172.38.0.14:6379
   replicates f92373ce9c7cba38423836cdf055aec3871f8020
S: 91bd51264b551686e9febdc03f5d9fc6a73606ae 172.38.0.15:6379
   replicates eb13c1cfc1a4b2bca4680577d6e83f787267ebb4
S: 90a83a972a2d60b81e575807d27e325d649fe741 172.38.0.16:6379
   replicates db4d25929872fc413adb423e4de1670c6202418c
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: f92373ce9c7cba38423836cdf055aec3871f8020 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: db4d25929872fc413adb423e4de1670c6202418c 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: aa75835545c59bf00fbdeadc4c730347a12b05bb 172.38.0.14:6379
   slots: (0 slots) slave
   replicates f92373ce9c7cba38423836cdf055aec3871f8020
S: 90a83a972a2d60b81e575807d27e325d649fe741 172.38.0.16:6379
   slots: (0 slots) slave
   replicates db4d25929872fc413adb423e4de1670c6202418c
S: 91bd51264b551686e9febdc03f5d9fc6a73606ae 172.38.0.15:6379
   slots: (0 slots) slave
   replicates eb13c1cfc1a4b2bca4680577d6e83f787267ebb4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#查看集群 3个主机,3个从机
root@e2d02ec4955f:/data# redis-cli -c
127.0.0.1:6379> cluster nodes
f92373ce9c7cba38423836cdf055aec3871f8020 172.38.0.13:6379@16379 master - 0 1652261365110 3 connected 10923-16383
db4d25929872fc413adb423e4de1670c6202418c 172.38.0.12:6379@16379 master - 0 1652261367128 2 connected 5461-10922
aa75835545c59bf00fbdeadc4c730347a12b05bb 172.38.0.14:6379@16379 slave f92373ce9c7cba38423836cdf055aec3871f8020 0 1652261366626 3 connected
90a83a972a2d60b81e575807d27e325d649fe741 172.38.0.16:6379@16379 slave db4d25929872fc413adb423e4de1670c6202418c 0 1652261367128 2 connected
91bd51264b551686e9febdc03f5d9fc6a73606ae 172.38.0.15:6379@16379 slave eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 0 1652261366125 1 connected
eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 172.38.0.11:6379@16379 myself,master - 0 1652261365000 1 connected 0-5460

设置一个值,看是哪个主机处理的,通过docker停用改容器,然后再查看是否可以获取到刚才的值

127.0.0.1:6379> set a 12345678
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
172.38.0.13:6379>
[root@iZwz9f559fa6a275jj2x0sZ node-6]# docker stop redis-3
redis-3
#查看Redis 集群 ,13 已经fail ,14成为了主服务 从14上读取到了值
root@e2d02ec4955f:/data# redis-cli -c
127.0.0.1:6379> cluster nodes
f92373ce9c7cba38423836cdf055aec3871f8020 172.38.0.13:6379@16379 master,fail - 1652261642575 1652261641566 3 connected
db4d25929872fc413adb423e4de1670c6202418c 172.38.0.12:6379@16379 master - 0 1652261740516 2 connected 5461-10922
aa75835545c59bf00fbdeadc4c730347a12b05bb 172.38.0.14:6379@16379 master - 0 1652261741543 7 connected 10923-16383
90a83a972a2d60b81e575807d27e325d649fe741 172.38.0.16:6379@16379 slave db4d25929872fc413adb423e4de1670c6202418c 0 1652261741543 2 connected
91bd51264b551686e9febdc03f5d9fc6a73606ae 172.38.0.15:6379@16379 slave eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 0 1652261741543 1 connected
eb13c1cfc1a4b2bca4680577d6e83f787267ebb4 172.38.0.11:6379@16379 myself,master - 0 1652261740000 1 connected 0-5460
127.0.0.1:6379> 
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"12345678"
172.38.0.14:6379> 

创建Redis集群 注意事项:
1、端口 ,云服务 安全组和防火墙都需要配置(如:redis客户端端口是3311,集群总线端口就是13311)
在这里插入图片描述在这里插入图片描述2、创建集群检查IP 与 创建容器指定的ip 一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值