背景
在学习redis高级篇的时候,卡在了redis集群的部署。
因为教程不是基于docker进行部署的,所以自己在部署的时候遇到了一些问题,看到一些博客说了他们的做法但是我还是搭建不起来,然后看了redis.io的文档,也没有发现有docker部署的说明
所以自己静心梳理了一番。
跟着学的教程没有用docker部署,然后配置的时候没有配置
cluster-announce-** xxxxx
但是配置的是哨兵模式的
replica-announce-** xxxxx
所以搭建内部调试的时候没问题,但是spring连接不上
一番修改之后,出现搭建都搭不起来的现象
以下仅作本人学习过程的记录
遇到的问题
在使用命令创建集群的时候
redis-cli -a 密码 --cluster create --cluster-replicas 从节点数 ip1:port1 ip2:port2
控制台出现以下阻塞信息
Waiting for the cluster to join
..................
经查阅,可能是各节点无法通信造成的,需要设置声明的对外的端口号+10000
问题解决
一共有6个节点
每个节点的端口都设置成6379
因为docker的隔离性
所以每个节点的配置文件都是下面这一份,直接复制
redis.conf配置文件
port 6379
bind 0.0.0.0
# 一定要手动打开集群模式
cluster-enabled yes
cluster-node-timeout 5000
dir ./
# 我设置需要密码访问
protected-mode yes
requirepass 123456
docker-compose.yml
说一下重点
1.我的网络模式是bridge模式
我使用过host模式
但是最后java访问节点失败
所以选择bridge模式
2.以下几行配置的关键性
ports:
# 容器内的端口与配置文件保持一致
# 容器外的端口与下面声明的对外端口保持一致
- 6379:6379
# 容器内集群通信端口默认是配置的端口+10000
# 容器外的集群通信端口与下面声明的对外集群通信端口保持一致
- 16379:16379
command:
- "redis-server"
- "/etc/redis/redis.conf"
# 密码一定要配置且与配置文件的requirepass一致
- "--masterauth 123456"
# 集群对外声明的ip,用于集群的搭建和spring的访问
# 这里需要设置为宿主机的ip,而且一定要配置
- "--cluster-announce-ip 192.168.1.7"
# 集群对外声明的端口,用于集群的搭建和spring的访问
- "--cluster-announce-port 6379"
# 集群对外声明的总线端口,用于集群之间通信
# 一定要设置,否则创建集群的时候出现阻塞
- "--cluster-announce-bus-port 16379"
集群搭建命令
进入某个docker容器中使用以下命令搭建
三主三从集群
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.1.7:6379 192.168.1.7:6380 192.168.1.7:6381 192.168.1.7:6382 192.168.1.7:6383 192.168.1.7:6384
完整版docker-compose.yml
version: "3"
services:
redis1:
image: redis:7.0
container_name: redis1
ports:
- 6379:6379 # 注意这里
- 16379:16379 # 注意这里
volumes:
- ./redis1/redis.conf:/etc/redis/redis.conf
- ./redis1/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6379" # 注意这里
- "--cluster-announce-bus-port 16379" # 注意这里
networks:
- redis-net
redis2:
image: redis:7.0
container_name: redis2
ports:
- 6380:6379 # 注意这里
- 16380:16379 # 注意这里
volumes:
- ./redis2/redis.conf:/etc/redis/redis.conf
- ./redis2/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6380" # 注意这里
- "--cluster-announce-bus-port 16380" # 注意这里
networks:
- redis-net
redis3:
image: redis:7.0
container_name: redis3
ports:
- 6381:6379 # 注意这里
- 16381:16379 # 注意这里
volumes:
- ./redis3/redis.conf:/etc/redis/redis.conf
- ./redis3/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6381" # 注意这里
- "--cluster-announce-bus-port 16381" # 注意这里
networks:
- redis-net
slave1:
image: redis:7.0
container_name: slave1
ports:
- 6382:6379 # 注意这里
- 16382:16379 # 注意这里
volumes:
- ./slave1/redis.conf:/etc/redis/redis.conf
- ./slave1/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6382" # 注意这里
- "--cluster-announce-bus-port 16382" # 注意这里
networks:
- redis-net
slave2:
image: redis:7.0
container_name: slave2
ports:
- 6383:6379 # 注意这里
- 16383:16379 # 注意这里
volumes:
- ./slave2/redis.conf:/etc/redis/redis.conf
- ./slave2/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6383" # 注意这里
- "--cluster-announce-bus-port 16383" # 注意这里
networks:
- redis-net
slave3:
image: redis:7.0
container_name: slave3
ports:
- 6384:6379
- 16384:16379
volumes:
- ./slave3/redis.conf:/etc/redis/redis.conf
- ./slave3/data:/data
command:
- "redis-server"
- "/etc/redis/redis.conf"
- "--masterauth 123456"
- "--cluster-announce-ip 192.168.1.7"
- "--cluster-announce-port 6384" # 注意这里
- "--cluster-announce-bus-port 16384" # 注意这里
networks:
- redis-net
networks:
redis-net:
driver: bridge