docker-compose安装redis集群

简介

为了防止单机redis挂机导致服务不可用,我们使用redis集群进行数据的存储,也就是可用性,以及单节点的redis的读写能力是有限的,集群redis的读写能力是有所提高的

这里使用的6的redis节点,因为redis集群中,至少是需要6个redis的,尝试过3个,就会报下列的错误

*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 3 nodes and 1 replicas per node.
*** At least 6 nodes are required.

然后我这里使用的是云服务器,因此会有需要开放端口这个功能,我们这里有6个节点,所以是开放6个端口吗? 不止哦,需要开放12个端口。后面听我细细讲来

操作过程
1、创建文件夹

这里需要创建6个redis节点的文件夹,用于容器卷的映射

mkdir -p /opt/docker/redis-cluster/redis-1/data
mkdir -p /opt/docker/redis-cluster/redis-2/data
mkdir -p /opt/docker/redis-cluster/redis-3/data
mkdir -p /opt/docker/redis-cluster/redis-4/data
mkdir -p /opt/docker/redis-cluster/redis-5/data
mkdir -p /opt/docker/redis-cluster/redis-6/data

也可以使用批量指令

for i in {1..6};do mkdir -p /opt/docker/redis-cluster/redis-$i/data;done
2、在各个redis-*下创建redis.conf,用于挂载对应的redis容器

具体内容如下:
redis.conf放在与data同一级

for i in {1..6};do echo "cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000 
appendonly yes
port 909$i
masterauth 123456
requirepass 123456" > /opt/docker/redis-cluster/redis-$i/redis.conf;done
  • cluster-enabled : 是否开启集群
  • cluster-config-file # 集群配置文件
  • cluster-node-timeout # 集群节点多少时间未响应视为该节点丢失
  • appendonly : aof持久化
  • port : # redis监听端口
  • masterauth : #设置master节点密码
  • requirepass : #设置密码

这里使用的是9091~9096端口作为6个节点的端口
同时,一定要注意 masterauth和requirepass的密码最好设置为一致

3、开启端口

然后这里需要在对应的云服务器上开启端口,需要注意的是,在开启对应的端口的同时,还需要开启端口+10000的端口,原因如下:每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口。
因此需要开启的端口有:
9091~9096
19091~19096

4、编写docker-compose.yml

vim /opt/docker/redis-cluster/docker-compose.yaml

version: '3'
services:
  redis-1:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-1
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
    - /opt/docker/redis-cluster/redis-1/data:/data
    - /opt/docker/redis-cluster/redis-1/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server","/usr/local/etc/redis/redis.conf"]
  redis-2:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-2
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
      - /opt/docker/redis-cluster/redis-2/data:/data
      - /opt/docker/redis-cluster/redis-2/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]
  redis-3:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-3
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
      - /opt/docker/redis-cluster/redis-3/data:/data
      - /opt/docker/redis-cluster/redis-3/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]
  redis-4:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-4
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
      - /opt/docker/redis-cluster/redis-4/data:/data
      - /opt/docker/redis-cluster/redis-4/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]
  redis-5:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-5
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
      - /opt/docker/redis-cluster/redis-5/data:/data
      - /opt/docker/redis-cluster/redis-5/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]
  redis-6:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-6
    restart: always
    network_mode: "host" #host:容器环境不隔离,将使用主机的端口和ip,不能与ports 端口映射同时使用
    volumes:
      - /opt/docker/redis-cluster/redis-6/data:/data
      - /opt/docker/redis-cluster/redis-6/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]

5、执行docker-compose

/opt/docker/redis-cluster目录下,执行
docker-compose up -d

之后使用docker ps,查询容器是否都是正常启动
image.png

如果启动失败的话,可以使用docke logs 容器id 查看日志

6、进入redis-1容器中,并创建集群

进入容器

使用docker ps 获取redis-1的容器id

docker exec -it 容器id bash

image.png

创建集群

这里注意,需要将ip改成你服务器的ip

redis-cli -a 123456 --cluster create  ip:9091  ip:9092 ip:9093 ip:9094 ip:9095 ip:9096 --cluster-replicas 1

-a :代表的是密码 ,实在redis.conf中的密码
–cluster-replicas 执行集群中一个主节点的从节点个数

执行指令之后,出现该问题,则回复yes
image.png

如果集群创建过程中没有什么问题的话,则会出现下面的结果了。
image.png

7、测试

先进入容器

docker exec -it 容器id bash

然后连接集群
这里把ip替换为自己的

redis-cli -c -h ip -p 9091 -a 123456 

执行成功后输入 cluster info,就可以看到集群的信息了
image.png

也可以测试get set 方法
可以看见,数据存在于不同的redis中
image.png
image.png

总结:

整体过程还是相对复杂的,尤其是网络端口需要多开放的问题。
希望能帮助到你,我是walker~

遇到问题

*** FATAL CONFIG FILE ERROR (Redis 6.2.6) ***
Reading the configuration file, at line 1

‘cluster-enabled yes # 开启集群’
wrong number of arguments

原因:redis.conf中带有注释,会导致失败

Node ip:port NOAUTH Authentication required

redis-cli时需要添加密码
redis-cli -a 密码

*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 3 nodes and 1 replicas per node.

*** At least 6 nodes are required.

至少需要6个节点

Waiting for the cluster to join 等很久

原因:
需要将端口+10000端口也打开
例如开放的是9091,那么19091也要打开

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值