简介
为了防止单机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
,查询容器是否都是正常启动
如果启动失败的话,可以使用docke logs 容器id
查看日志
6、进入redis-1容器中,并创建集群
进入容器
使用docker ps
获取redis-1的容器id
docker exec -it 容器id bash
创建集群
这里注意,需要将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
如果集群创建过程中没有什么问题的话,则会出现下面的结果了。
7、测试
先进入容器
docker exec -it 容器id bash
然后连接集群
这里把ip替换为自己的
redis-cli -c -h ip -p 9091 -a 123456
执行成功后输入 cluster info
,就可以看到集群的信息了
也可以测试get set 方法
可以看见,数据存在于不同的redis中
总结:
整体过程还是相对复杂的,尤其是网络端口需要多开放的问题。
希望能帮助到你,我是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)用于节点的失败侦测、配置更新、故障转移授权,等等。