从零到一:Redis Cluster摆设设置全流程详解,轻松搞定高可用分布式缓存!
Redis Cluster是Redis官方提供的分布式解决方案,它通过数据分片(Sharding)和主从复制(Replication)来实现高可用性和横向扩展。Redis Cluster能够在多个节点之间主动分配数据,而且在节点故障时主动进行故障转移,确保系统的高可用性。本文将具体先容Redis Cluster的摆设和设置全流程,帮助读者快速搭建一个高可用的Redis集群。 1 Redis Cluster概述1.1 Redis Cluster特点
[*]数据分片:Redis Cluster将数据分布在多个节点上,每个节点负责一部分数据
[*]高可用性:每个分片(Shard)都有一个主节点和多个从节点,主节点故障时,从节点可以主动提拔为主节点
[*]主动故障转移:Redis Cluster能够主动检测节点故障,并进行故障转移
[*]客户端路由:客户端可以直接毗连到集群中的任意节点,节点会根据键的哈希值将请求路由到精确的节点
1.2 Redis Cluster架构
Redis Cluster由多个节点构成,每个节点可以是一个主节点或从节点。集群中的每个主节点负责一部分数据,从节点则复制主节点的数据。 Redis Cluster使用哈希槽(Hash Slot)来分配数据,总共有16384个哈希槽,每个键通过CRC16算法计算出一个哈希值,然后映射到对应的哈希槽。 2 Redis Cluster环境准备
2.1 主机节点规划
主机IP
脚色
端口
分析
192.168.10.33
Master + Slave
6379/6380
节点1(双实例)
192.168.10.34
Master + Slave
6379/6380
节点2(双实例)
192.168.10.35
Master + Slave
6379/6380
节点3(双实例)
2.2 Redis安装
三台主机上均需要安装redis,安装操纵请参考: Redis安装与基础设置:单节点离线摆设与设置解析-CSDN博客 3 Redis Cluster设置
3.1 创建Redis设置文件目录
# 在各台主机上创建Redis实例目录
mkdir -p /data/redis-cluster/{6379,6380} 3.2 设置Redis实例设置文件
# 在每台主机的/data/redis-cluster/6379和/data/redis-cluster/6380目录下分别创建redis.conf
cat <<EOF > /data/redis-cluster/6379/redis.conf
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /data/redis-cluster/6379/redis.log
dir "/data/redis-cluster/6379"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly-6379.aof"
requirepass lahmy1c@
masterauth lahmy1c@
EOF
cat <<EOF > /data/redis-cluster/6380/redis.conf
bind 0.0.0.0
protected-mode no
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile /data/redis-cluster/6380/redis.log
dir "/data/redis-cluster/6380"
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly-6380.aof"
requirepass lahmy1c@
masterauth lahmy1c@
EOF 3.3 启动Redis实例
# 在每台主机上分别启动两个Redis实例,端口6379和6380
# 在 Host1 上
/usr/local/redis/bin/redis-server /data/redis-cluster/6379/redis.conf
/usr/local/redis/bin/redis-server /data/redis-cluster/6380/redis.conf 3.4 验证节点是否启动
# 执行如下命令,返回返回PONG,则已启动
/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ ping
/usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ ping
# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ ping
/usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ pingWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
# /usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ ping
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
#
# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ ping
/usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ pingWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
# /usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ ping
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
#
# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ ping
/usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ pingWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
# /usr/local/redis/bin/redis-cli -p 6380 -a lahmy1c@ ping
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
# 4 创建Redis Cluster
4.1 使用redis-cli命令创建集群
# 在任意一台主机上执行如下命令
/usr/local/redis/bin/redis-cli --cluster create \
192.168.10.33:6379 \
192.168.10.33:6380 \
192.168.10.34:6379 \
192.168.10.34:6380 \
192.168.10.35:6379 \
192.168.10.35:6380 \
--cluster-replicas 1 -a lahmy1c@
参数说明:
--cluster-replicas 1:表示每个主节点有一个从节点
# /usr/local/redis/bin/redis-cli --cluster create \
> 192.168.10.33:6379 \
> 192.168.10.33:6380 \
> 192.168.10.34:6379 \
> 192.168.10.34:6380 \
> 192.168.10.35:6379 \
> 192.168.10.35:6380 \
> --cluster-replicas 1 -a lahmy1c@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master -> Slots 0 - 5460
Master -> Slots 5461 - 10922
Master -> Slots 10923 - 16383
Adding replica 192.168.10.34:6380 to 192.168.10.33:6379
Adding replica 192.168.10.35:6380 to 192.168.10.34:6379
Adding replica 192.168.10.33:6380 to 192.168.10.35:6379
M: bc972a8cec9c52e5c4b5da01b7674edd8f9891a5 192.168.10.33:6379
slots: (5461 slots) master
S: f4aebe01a277c7384356d10dd9f14381aadba730 192.168.10.33:6380
replicates 72a68c3bbe6f8228640afabbd0d6100f681bfb87
M: 4297823a72a4677329764bdfbdd6fdb0f1b25182 192.168.10.34:6379
slots: (5462 slots) master
S: 034005a84845645fac6834900a11254db009ccec 192.168.10.34:6380
replicates bc972a8cec9c52e5c4b5da01b7674edd8f9891a5
M: 72a68c3bbe6f8228640afabbd0d6100f681bfb87 192.168.10.35:6379
slots: (5461 slots) master
S: 5eb12144975cb46c0cee39d63407488f7bcc99c6 192.168.10.35:6380
replicates 4297823a72a4677329764bdfbdd6fdb0f1b25182
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 192.168.10.33:6379)
M: bc972a8cec9c52e5c4b5da01b7674edd8f9891a5 192.168.10.33:6379
slots: (5461 slots) master
1 additional replica(s)
S: 034005a84845645fac6834900a11254db009ccec 192.168.10.34:6380
slots: (0 slots) slave
replicates bc972a8cec9c52e5c4b5da01b7674edd8f9891a5
M: 4297823a72a4677329764bdfbdd6fdb0f1b25182 192.168.10.34:6379
slots: (5462 slots) master
1 additional replica(s)
S: f4aebe01a277c7384356d10dd9f14381aadba730 192.168.10.33:6380
slots: (0 slots) slave
replicates 72a68c3bbe6f8228640afabbd0d6100f681bfb87
S: 5eb12144975cb46c0cee39d63407488f7bcc99c6 192.168.10.35:6380
slots: (0 slots) slave
replicates 4297823a72a4677329764bdfbdd6fdb0f1b25182
M: 72a68c3bbe6f8228640afabbd0d6100f681bfb87 192.168.10.35:6379
slots: (5461 slots) master
1 additional replica(s)
All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
All 16384 slots covered.
# 4.2 验证集群状态
# 如果集群状态正常,会显示每个节点的角色(主节点或从节点)以及哈希槽的分配情况
/usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ --cluster check 192.168.10.33:6379
# /usr/local/redis/bin/redis-cli -p 6379 -a lahmy1c@ --cluster check 192.168.10.33:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.10.33:6379 (bc972a8c...) -> 0 keys | 5461 slots | 1 slaves.
192.168.10.34:6379 (4297823a...) -> 0 keys | 5462 slots | 1 slaves.
192.168.10.35:6379 (72a68c3b...) -> 0 keys | 5461 slots | 1 slaves.
0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.10.33:6379)
M: bc972a8cec9c52e5c4b5da01b7674edd8f9891a5 192.168.10.33:6379
slots: (5461 slots) master
1 additional replica(s)
S: 034005a84845645fac6834900a11254db009ccec 192.168.10.34:6380
slots: (0 slots) slave
replicates bc972a8cec9c52e5c4b5da01b7674edd8f9891a5
M: 4297823a72a4677329764bdfbdd6fdb0f1b25182 192.168.10.34:6379
slots: (5462 slots) master
1 additional replica(s)
S: f4aebe01a277c7384356d10dd9f14381aadba730 192.168.10.33:6380
slots: (0 slots) slave
replicates 72a68c3bbe6f8228640afabbd0d6100f681bfb87
S: 5eb12144975cb46c0cee39d63407488f7bcc99c6 192.168.10.35:6380
slots: (0 slots) slave
replicates 4297823a72a4677329764bdfbdd6fdb0f1b25182
M: 72a68c3bbe6f8228640afabbd0d6100f681bfb87 192.168.10.35:6379
slots: (5461 slots) master
1 additional replica(s)
All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
All 16384 slots covered.
# 5 Redis Cluster操纵
5.1 客户端毗连
# 客户端可以连接到集群中的任意节点,节点会根据键的哈希值将请求路由到正确的节点
/usr/local/redis/bin/redis-cli -c -h 192.168.10.33 -p 6379 -a lahmy1c@
# /usr/local/redis/bin/redis-cli -c -h 192.168.10.33 -p 6379 -a lahmy1c@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.10.33:6379> 5.2 数据操纵
# 在集群中,数据的读写操作与单机Redis相同
192.168.10.33:6379> set keytest test01
OK
192.168.10.33:6379> get keytest
"test01"
192.168.10.33:6379> 5.3 集群管理
Redis Cluster提供了一些管理命令,可以用于查看集群状态、添加节点、删除节点等操纵。以下是一些常用的集群管理命令:
5.3.1 查看集群节点信息
/usr/local/redis/bin/redis-cli -h 192.168.10.33 -p 6379 -a lahmy1c@ cluster nodes
# /usr/local/redis/bin/redis-cli -h 192.168.10.33 -p 6379 -a lahmy1c@ cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
034005a84845645fac6834900a11254db009ccec 192.168.10.34:6380@16380 slave bc972a8cec9c52e5c4b5da01b7674edd8f9891a5 0 1742291584000 1 connected
4297823a72a4677329764bdfbdd6fdb0f1b25182 192.168.10.34:6379@16379 master - 0 1742291585524 3 connected 5461-10922
f4aebe01a277c7384356d10dd9f14381aadba730 192.168.10.33:6380@16380 slave 72a68c3bbe6f8228640afabbd0d6100f681bfb87 0 1742291584519 5 connected
5eb12144975cb46c0cee39d63407488f7bcc99c6 192.168.10.35:6380@16380 slave 4297823a72a4677329764bdfbdd6fdb0f1b25182 0 1742291585525 3 connected
72a68c3bbe6f8228640afabbd0d6100f681bfb87 192.168.10.35:6379@16379 master - 0 1742291585000 5 connected 10923-16383
bc972a8cec9c52e5c4b5da01b7674edd8f9891a5 192.168.10.33:6379@16379 myself,master - 0 1742291584000 1 connected 0-5460
# 5.3.2 添加新节点
/usr/local/redis/bin/redis-cli --cluster add-node 192.168.10.31:6379 192.168.10.31:6379 5.3.3 删除节点
/usr/local/redis/bin/redis-cli --cluster del-node 192.168.10.31:6379 <node-id> 6 常见题目及解决方案
6.1 集群节点故障
[*]当集群中的某个节点故障时,Redis Cluster会主动进行故障转移
[*]假仍旧障节点是主节点,集群会将其从节点提拔为新的主节点
[*]假仍旧障节点是从节点,集群会继续运行,直到从节点规复
6.2 数据迁徙
在Redis Cluster中,数据迁徙是通过哈希槽的重新分配实现的。可以使用redis-cli工具手动迁徙哈希槽,命令如下: /usr/local/redis/bin/redis-cli --cluster reshard 192.168.10.31:6379 -a lahmy1c@ 7 总结
通过本文的先容,盼望可以帮助你相识Redis Cluster的摆设和设置的全流程。
页:
[1]