Redis Cluster 集群是一种分布式存储方案,它可以自动地将数据分区并分布在多个 Redis 节点上,同时提供高可用性和数据冗余。
Redis Cluster需要至少3个主节点才能正常工作。通常建议至少有 6 个节点,其中 3 个作为主节点,另外 3 个作为对应的从节点。
环境准备
创建一个Docker网络以供Redis集群使用:
docker network create redis-cluster
检查网络信息以确认其配置:
docker network inspect redis-cluster
可以看到Docker网络
redis-cluster
的主要信息:
- 网络名称(Name):
redis-cluster
,这是用户定义的网络名称。- 网络ID(Id):
d4fc20531acfe711a02213e7bfcd284ea4ea39b07088e364c7d59ee9518c7473
,这是网络的全局唯一标识符。- 创建时间(Created):
2024-07-14T17:55:49.865978892+08:00
,表示网络创建的具体时间。- 网络驱动(Driver):
bridge
,这表示网络使用的是桥接模式,允许容器与宿主机以及其他容器通信。- IP地址管理(IPAM):
- 子网(Subnet):
172.20.0.0/16
,这是分配给网络中容器的IP地址范围。- 网关(Gateway):
172.20.0.1
,这是网络中容器用来与外部通信的默认网关。- 网络作用域(Scope):
local
,表明这个网络仅限于创建它的Docker宿主机。- 是否启用IPv6(EnableIPv6):
false
,表示这个网络不支持IPv6。- 是否为内部网络(Internal):
false
,表示网络不是内部的,可以被外部访问。- 容器连接(Containers):目前为空,表明还没有任何容器连接到这个网络。
配置Redis节点
使用vim编辑器创建并编辑redis_config.sh
脚本,设置Redis节点配置。
vim redis_config.sh
在编辑器中粘贴以下内容:
注意替换 cluster-announce-ip
后面的 服务器ip地址
为你的实际服务器IP地址。
配置内容
#!/bin/bash
for port in $(seq 6379 6384);
do
mkdir -p /home/redis/node-${port}
touch /home/redis/node-${port}/redis.conf
cat << EOF > /home/redis/node-${port}/redis.conf
port ${port}
requirepass rediscengxuyuan
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 192.168.101.100
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
done
配置解析
循环创建目录和配置文件
- 使用
seq 6379 6384
生成端口号列表(6379 到 6384)。 - 对于每个端口号,创建一个对应的目录
/home/redis/node-${port}
,并在其中创建一个名为redis.conf
的配置文件。
配置文件内容
port ${port}
:设置节点监听的端口,这里是从 6379 到 6384。requirepass rediscengxuyuan
:设置密码保护,所有客户端连接到这个节点时都需要提供这个密码。bind 0.0.0.0
:绑定到所有可用的网络接口。protected-mode no
:禁用保护模式,允许外部客户端连接。daemonize no
:禁用后台运行模式,Redis 将作为一个前台进程运行。appendonly yes
:开启 AOF 持久化,每次写入操作都会被记录到 AOF 文件中。cluster-enabled yes
:启用集群模式。cluster-config-file nodes.conf
:指定集群配置文件的名字。cluster-node-timeout 5000
:设置节点超时时间为 5 秒,如果超过这个时间没有收到其他节点的心跳信息,则认为该节点已离线。cluster-announce-ip 192.168.101.100
:指定集群中其他节点识别此节点时使用的 IP 地址。cluster-announce-port ${port}
:指定集群中其他节点识别此节点时使用的端口,与port
相同。cluster-announce-bus-port 1${port}
:指定集群内部通信(即集群总线)所使用的端口。这里使用的是 16379 到 16384。
接下来,给脚本文件添加执行权限:
chmod +x redis_config.sh
通过以下命令来运行脚本:
./redis_config.sh
我们通过tree 命令查看目录结构:(如果没有 tree
命令先安装 yum install -y tree
)
启动Redis容器
创建并编辑redis_docker.sh
脚本,用于启动Redis容器。
vim redis_docker.sh
在编辑器中粘贴以下内容:
#!/bin/bash
for port in $(seq 6379 6384); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /home/redis/node-${port}/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /home/redis/node-${port}/data:/data \
--restart always --name redis-${port} --net redis-cluster \
--sysctl net.core.somaxconn=1024 redis:6.2.7 redis-server /usr/local/etc/redis/redis.conf
done
脚本将映射端口、挂载卷,并设置网络。运行脚本以启动所有Redis容器。
接下来,给脚本文件添加执行权限:
chmod +x redis_docker.sh
通过以下命令来运行你的脚本:
./redis_docker.sh
bash# 批量启动容器 for port in $(seq 6379 6384); do docker start redis-${port} done # 批量停止容器 for port in $(seq 6379 6384); do docker stop redis-${port} done # 批量删除容器 for port in $(seq 6379 6384); do docker rm redis-${port} done
集群操作
进入任一Redis容器,并使用redis-cli
命令创建集群。
docker exec -it redis-6379 /bin/bash
创建集群
redis-cli -a rediscengxuyuan --cluster create 192.168.101.100:6379 192.168.101.100:6380 192.168.101.100:6381 192.168.101.100:6382 192.168.101.100:6383 192.168.101.100:6384 --cluster-replicas 1
# redis-cli -a 密码 --cluster create IP地址:6379 IP地址:6380 IP地址:6381 IP地址:6382 IP地址:6383 IP地址:6384 --cluster-replicas 1
这个命令会创建一个包含三个主节点的集群,并且每个主节点都有一个从节点。--cluster-replicas 1
参数指定了每个主节点有一个从节点。
使用cluster info
和cluster nodes
命令检查集群状态。
redis-cli -c -a rediscengxuyuan
cluster info
输出:
cluster_state:ok
:表示集群目前状态正常。cluster_slots_assigned:16384
:集群中已经被分配的槽位数,Redis集群总共有16384个槽位。cluster_slots_ok:16384
:集群中状态正常的槽位数。cluster_slots_pfail:0
:集群中疑似失败的槽位数(pfail是possible fail的缩写)。cluster_slots_fail:0
:集群中已经确认失败的槽位数。cluster_known_nodes:6
:集群中已知节点的数量。cluster_size:3
:集群中的主节点数量(集群的大小通常指主节点的数量)。cluster_current_epoch:6
:集群的当前配置纪元,用于在故障转移时选举主节点。cluster_my_epoch:1
:当前节点的配置纪元。cluster_stats_messages_ping_sent:186
:集群中发送的ping消息数量。cluster_stats_messages_pong_sent:189
:集群中发送的pong消息数量。cluster_stats_messages_sent:375
:集群中发送的总消息数量。cluster_stats_messages_ping_received:184
:集群中接收到的ping消息数量。cluster_stats_messages_pong_received:186
:集群中接收到的pong消息数量。cluster_stats_messages_meet_received:5
:集群中接收到的meet消息数量(用于新节点加入集群)。cluster_stats_messages_received:375
:集群中接收到的总消息数量。
cluster nodes
输出:
每行代表一个集群中的节点,以下是对每个字段含义的解释:
9399a483ded0f717b0fd8f0d18eb500710b0340e
:节点的ID。192.168.101.100:6381@16381
:节点的IP地址和端口,以及集群总线端口(通常比常规端口大10000)。master
:节点的角色是主节点。-
:代表没有故障转移相关数据。0
:节点的最后检查时间。1720962800517
:节点的epoch。3
:如果节点是主节点,则这是它所属的槽位范围ID;如果是从节点,则这是它复制的主节点的ID。connected
:节点状态,表示节点是连接的。10923-16383
:节点负责的槽位范围。
以下是对其他节点的解释:
35f084fc050a251c07b1a4a7ed5940792dcbd040
:当前连接的节点,标记为myself
。cfada70539347a4b83184b7634e0b0d47758e8b6
:另一个主节点。974a27de9628820cba0f375cd94ff2bb463bad19
:一个从节点,它复制cfada70539347a4b83184b7634e0b0d47758e8b6
。df6f197441a509d9b090cb741e08d85b32273384
:另一个从节点,它复制9399a483ded0f717b0fd8f0d18eb500710b0340e
。706a5c82486175c49d1c789eb344a05ac45c3526
:另一个从节点,它复制35f084fc050a251c07b1a4a7ed5940792dcbd040
。
防火墙设置
为Redis集群开放必要的端口:
firewall-cmd --permanent --add-port="6379-6384/tcp"
firewall-cmd --reload
测试集群
进入一个Redis节点,设置一个键值,并在另一个节点查询以验证集群功能。
进入6381节点,设置一个键值,可以看到重定位的提示。
docker exec -it redis-6381 /bin/bash
redis-cli -c -a rediscengxuyuan -h 192.168.101.100 -p 6381
set cengxuyuan good
到其他节点,可以查询出来,代表我们已经成功。
docker exec -it redis-6384 /bin/bash
redis-cli -c -a rediscengxuyuan -h 192.168.101.100 -p 6384
get cengxuyuan
参考链接