Docker 搭建 Redis Cluster集群 每一步都带有操作图、命令!!!

一、环境

  • 阿里云服务器 CentOS 8
  • docker版本为20.10.7
  • redis 镜像 (拉取为默认最新镜像)

docker 安装 redis集群(外网可访问) - 图1
docker 安装 redis集群(外网可访问) - 图2
大致步骤:😜

  1. 下载Redis镜像
  2. 编写Redis配置文件
  3. 启动Redis 容器
  4. 创建Redis Cluster 集群。
  5. 进行实际测试

    二、前期准备

    2.1、搜索、拉取redis镜像

    ```shell docker search redis docker pull redis
  1. ![](https://cdn.nlark.com/yuque/0/2021/webp/22135796/1630722860541-81afd367-b39b-4cb2-83df-ec14bc859f24.webp#clientId=uf4f2c94b-9b05-4&from=paste&id=u7c02388b&margin=%5Bobject%20Object%5D&originHeight=120&originWidth=1335&originalType=url&ratio=1&status=done&style=none&taskId=u73bc8235-2f7b-4cdc-9772-aaf03fcf64e)<br />![](https://cdn.nlark.com/yuque/0/2021/webp/22135796/1630722860534-330e67b4-7591-4004-bf19-f7d55bcfae25.webp#clientId=uf4f2c94b-9b05-4&from=paste&id=uf531947b&margin=%5Bobject%20Object%5D&originHeight=95&originWidth=508&originalType=url&ratio=1&status=done&style=none&taskId=u141768f9-c2e3-4282-a828-c3c5db9a8ca)
  2. <a name="fOYCe"></a>
  3. ### 2.2、Docker 容器网络
  4. 1. 创建虚拟网卡😄创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。
  5. ```shell
  6. docker network create myredis
  1. 查看Docker 网卡信息
    1. docker network ls
    docker 安装 redis集群(外网可访问) - 图3
    3、查看dockerr网络详细信息
    1. docker network inspect myredis
    docker 安装 redis集群(外网可访问) - 图4
    4、补充(删除网卡信息、帮助命令)
    1. docker network rm myredis #删除网卡命令 多个中间 空格隔开
    2. docker network --help #显示可带参数等

    2.3、编写配置文件

    此处用到了一点 shlle 编程中 的一些命令,让我们操作更加便利。😃 ```shell

for port in $(seq 6379 6384); do mkdir -p /home/redis/node-${port}/conf touch /home/redis/node-${port}/conf/redis.conf cat << EOF > /home/redis/node-${port}/conf/redis.conf port ${port} requirepass 1234 masterauth 1234 bind 0.0.0.0 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 114.115.158.185 cluster-announce-port ${port} cluster-announce-bus-port 1${port} EOF done

  1. 命令解释:😊
  2. - port:节点端口;
  3. - requirepass:设置密码,访问时需要验证
  4. - masterauth: master服务设置了密码保护时,slave服务连接master的密码。这个配置很重要,当初我没配置,然后master挂了,slave没有上位。原因就是没配置这个参数,导致slave复制master数据的时候,因为设置了密码,导致不能复制数据,上位失败。如果开启了密码验证模式,所有的主从节点必须配置masterauth,因为某一个节点宕机重启之后,会自动变为从节点,此时如果想要从master复制数据,就必须需要主节点的密码
  5. - protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
  6. - daemonize:是否以守护线程的方式启动(后台启动),默认 no
  7. - appendonly:是否开启 AOF 持久化模式,默认 no
  8. - cluster-enabled:是否开启集群模式,默认 no
  9. - cluster-config-file:集群节点信息文件;
  10. - cluster-node-timeout:集群节点连接超时时间;节点超时时间,单位毫秒,设置一个较小的超时时间,目的是为了后面测试自动故障转移的效果,默认15000
  11. - cluster-announce-ip:集群节点 IP
  12. - 注意: 如果你想要你的redis集群可以供外网访问,这里直接填 服务器的IP 地址即可
  13. - 如若为了安全,只是在服务器内部进行访问,这里还需要做一些修改。
  14. - cluster-announce-port:集群节点映射端口;
  15. - cluster-announce-bus-port:集群节点总线端口。
  16. **redis 在官网上有说明为什么需要映射两个端口** :[redis官网](https://link.juejin.cn/?target=https%3A%2F%2Fredis.io%2Ftopics%2Fcluster-tutorial)<br />![](https://cdn.nlark.com/yuque/0/2021/webp/22135796/1630722861008-e8b036b8-4a7b-4ed1-8525-935cf6b78293.webp#clientId=uf4f2c94b-9b05-4&from=paste&id=uad100a32&margin=%5Bobject%20Object%5D&originHeight=637&originWidth=1368&originalType=url&ratio=1&status=done&style=none&taskId=u1a82d60d-1cb6-43b5-a8ea-dd53f944214)
  17. ---
  18. 执行命令完:<br />![](https://cdn.nlark.com/yuque/0/2021/webp/22135796/1630722861080-3cd909ab-2737-4e1c-8422-68f5b4c31cca.webp#clientId=uf4f2c94b-9b05-4&from=paste&id=u772f713b&margin=%5Bobject%20Object%5D&originHeight=438&originWidth=799&originalType=url&ratio=1&status=done&style=none&taskId=u3ac547c4-a6f0-4857-bf52-2c4da33f6c6)<br />我们通过tree 命令查看目录结构:(如果没有 tree 命令先安装 yum install -y tree)<br />![](https://cdn.nlark.com/yuque/0/2021/webp/22135796/1630722861118-9a0d6f78-7f2a-4904-8842-8373fc118ca7.webp#clientId=uf4f2c94b-9b05-4&from=paste&id=ud36bc45c&margin=%5Bobject%20Object%5D&originHeight=474&originWidth=531&originalType=url&ratio=1&status=done&style=none&taskId=udfad8695-817b-48b3-a2fa-0cecdc84b60)
  19. ---
  20. 接下来就是启动容器拉
  21. <a name="etlac"></a>
  22. ## 三、启动容器
  23. <a name="NiQ0U"></a>
  24. ### 3.1、启动redis容器
  25. 因为要启动六个容器,一个一个去启动,肯定是麻烦丫。就再次借助shell编程的力量。
  26. ```shell
  27. for port in $(seq 6379 6384); \
  28. do \
  29. docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  30. --privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  31. --privileged=true -v /home/redis/node-${port}/data:/data \
  32. --restart always --name redis-${port} --net myredis \
  33. --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
  34. done

解释:🤑

  • -it:交互
  • -d:后台运行,容器启动完成后打印容器
  • —privileged:是否让docker 应用容器 获取宿主机root权限(特殊权限-)
  • -p :端口映射
  • -v:文件挂载
  • —sysctl参数来设置系统参数,通过这些参数来调整系统性能
  • —restart always:在容器退出时总是重启容器
  • —name :给容器取名
  • —net myredis :使用我们创建的虚拟网卡 (想详细了解,可以去看看Docker 网络方面知识)

执行完成:
image.png
亦可使用docker ps -a 查看运行中容器。
image.png
可以看到已全部启动成功。
👨‍🔧

3.2、创建Redis Cluster集群

可随意选择一个节点进入,创建Redis集群。

1、进入redis-6379 容器

  1. docker exec -it redis-6379 /bin/bash

docker 安装 redis集群(外网可访问) - 图7

2、创建集群

  1. redis-cli -a 之前设置的密码 --cluster create 配置文件中的IP地址:6379 IP地址:6380 IP地址:6381 IP地址:6382 IP地址:6383 IP地址:6384 --cluster-replicas 1 复制代码
  2. 我输入的是
  3. redis-cli --cluster create 114.115.158.185:6379 114.115.158.185:6380 114.115.158.185:6381 114.115.158.185:6382 114.115.158.185:6383 114.115.158.185:6384 --cluster-replicas 1 -a 1234

image.png
显示这样的画面就表示已经成功拉。

3、查看节点相关信息

进入容器后,通过redis-cli -p 6379 -c -a 1234,进入redis。👼
image.png
输入cluster info 查看集群信息
docker 安装 redis集群(外网可访问) - 图10
也可输入cluster nodes 查看所有节点相关信息
docker 安装 redis集群(外网可访问) - 图11


👨‍💻下一步就是进入测试阶段拉。😀

四、测试

4.1、本机测试

image.png

4.2、外网测试

image.png
image.png
image.png

五、上述执行代码汇总

  1. 创建网络
  2. docker network create myredis
  3. 创建配置文件及文件夹
  4. for port in $(seq 6379 6384);
  5. do
  6. mkdir -p /home/redis/node-${port}/conf
  7. touch /home/redis/node-${port}/conf/redis.conf
  8. cat << EOF > /home/redis/node-${port}/conf/redis.conf
  9. port ${port}
  10. requirepass 1234
  11. bind 0.0.0.0
  12. protected-mode no
  13. daemonize no
  14. appendonly yes
  15. cluster-enabled yes
  16. cluster-config-file nodes.conf
  17. cluster-node-timeout 5000
  18. cluster-announce-ip 59.110.213.162
  19. cluster-announce-port ${port}
  20. cluster-announce-bus-port 1${port}
  21. EOF
  22. done
  23. 启动容器
  24. for port in $(seq 6379 6384); \
  25. do \
  26. docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  27. --privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  28. --privileged=true -v /home/redis/node-${port}/data:/data \
  29. --restart always --name redis-${port} --net myredis \
  30. --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
  31. done
  32. 进入容器
  33. docker exec -it redis-6379 /bin/bash
  34. 创建33
  35. redis-cli --cluster create 59.110.213.162:6379 59.110.213.162:6380 59.110.213.162:6381 59.110.213.162:6382 59.110.213.162:6383 59.110.213.162:6384 --cluster-replicas 1 -a 1234
  36. 进入即可
  37. redis-cli -p 6379 -c -a 1234

六、注意

如果使用阿里云、腾讯云、华为云等服务器需要开通安全组6379-6884、16379-16384端口
image.png

参考:https://juejin.cn/post/6992872034065727525