本篇开始即默认你已经成功安装redis以及可以联通云服务器或IP
创建一个配置文件模式
mkdir -p /data/docker_redis/
编写redis_cluster.conf.template文件
vi redis_cluster.conf.template
在此文件中写入以下内容:
# 设置Redis服务监听的端口
port ${PORT}
# 设置客户端连接Redis服务时需要验证的密码
requirepass 123456WSJwsj!
# 如果当前节点是从节点(slave),用于连接主节点(master)时需要提供的主节点密码
masterauth 123456WSJwsj!
# 关闭受保护模式,在受保护模式下,Redis服务默认只允许本地回环地址(127.0.0.1)访问,关闭后可接受外部IP的连接请求
protected-mode no
# 禁止Redis以守护进程(daemon)方式运行,也就是在前台运行,方便查看日志输出等,常用于开发和调试环境,在生产环境可能根据需求调整
daemonize no
# 开启AOF(Append-Only File)持久化功能,使得Redis执行的写命令会以追加的方式记录到文件中,在重启时可根据该文件恢复数据,提高数据的可靠性和安全性
appendonly yes
# 启用Redis集群模式
cluster-enabled yes
# 指定集群配置文件的名称
cluster-config-file nodes.conf
# 设置集群节点的超时时间,单位是毫秒
cluster-node-timeout 5000
# (此处改为你自己云服务器地址或ip地址)
cluster-announce-ip 113.44.161.20
#此端口为redis提供服务端口,用于应用客户端连接
cluster-announce-port ${PORT}
#此端口用于redis集群进行故障检测、配置更新、故障转移授权和内部通讯使用,不用于应用客户端连接使用。
cluster-announce-bus-port 1${PORT}
创建6个redis实例的数据目录,配置文件目录和配置文件(此处使用脚本)
for port in `seq 8001 8006`; do \
mkdir -p /data/redis_data/${port}/conf \
&& PORT=${port} envsubst < /data/docker_redis/redis_cluster.conf.template > /data/redis_data/${port}/conf/redis.conf \
&& mkdir -p /data/redis_data/${port}/data;\
done
将上面脚本内容直接复制粘贴运行(我是在xshell中运行的,已经关闭没法截图了)
可以使用tree命令检查创建的目录和文件(可能会有没有安装tree情况)
[root@mysql data]$ tree redis_data/
redis_data/
|-- 8001
| |-- conf
| | `-- redis.conf
| `-- data
|-- 8002
| |-- conf
| | `-- redis.conf
| `-- data
|-- 8003
| |-- conf
| | `-- redis.conf
| `-- data
|-- 8004
| |-- conf
| | `-- redis.conf
| `-- data
|-- 8005
| |-- conf
| | `-- redis.conf
| `-- data
`-- 8006
|-- conf
| `-- redis.conf
`-- data
18 directories, 6 files
批量创建容器 在这里使用for循环批量创建redis容器,代码如下所示 (这里也是使用脚本,和上面操作一致)
for port in $(seq 8001 8006); do \
docker run -d -it -p ${port}:${port} -p 1${port}:1${port} --restart always --name redis-${port} \
-v /data/redis_data/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/redis_data/${port}/data:/data \
redis:7.0.2 redis-server /usr/local/etc/redis/redis.conf; \
done
在这里使用-v参数,让容器的redis配置参数和数据全部使用宿主机的文件目录。这样做的好处是,保证redis的数据不丢失。
查看刚刚创建的redis容器
创建redis-cluster集群
6个redis容器创建好之后,选择其中的一个容器进入,进行redis-cluster集群创建
docker exec -it redis-8001 redis-cli -a 123456WSJwsj! --cluster create 113.44.161.20:8001 113.44.161.20:8002 113.44.161.20:8003 113.44.161.20:8004 113.44.161.20:8005 113.44.161.20:8006 --cluster-replicas 1
不要复制粘贴直接运行,需要将ip改为你自己的ip
搭建Redis集群遇到的问题:Waiting for the cluster to join~~~
遇到这种情况大部分是因为集群总线的端口没有开放!
集群总线
每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。
解决方案:
只需要将开启Redis端口对应的 集群总线端口即可。例如: 8001+ 10000 = 18001。所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群!
上述命令执行之后,redis-cluster集群就搭建好了