高可用架构-Redis Cluster
Redis服务器支持单机、主从复制、Sentinel、集群部署,部署架构也是由简单到复杂,Redis Cluster 集群架构是官方推荐应对大数据量、大并发场景部署方案。Redis的架构变迁如下图所示,其归属就是Redis Cluster
Redis Cluster是Redis的分布式实现,其设计主要目标如下:
- 高性能 高扩展 - 支持线性扩展 最高可达1000个节点。没有中间代理 使用异步复制
- 允许范围内的写入安全机制 - 系统以最大努力的方式确保主节点写入安全操作,但并不是100%
- 高可用 - 在节点不可用的情况下,Redis Cluster集群能够保证其他节点的可用性。同时每个主节点可设置最少一个副本节点
不同于Redis Sentinel ,Redis Cluster 采用将数据进行分割处理,每个节点存储整个数据集的一部分,同时为了保证架构的高可用性,每个节点允许N个副本进行数据备份。Redis Cluster 集群将数据从逻辑上分成 16384个Hash 槽,每个Node节点承担16384个槽中的一部分数据。假设Redis Cluster 有三个Node节点,则数据分布如下
Slots | Node |
---|---|
0 - 5460 | Node #0 |
5461 - 10922 | Node #1 |
10923 - 16383 | Node #2 |
简单的原理先介绍到这里,现在开始动手在本地搭建一个Cluster 集群。
单机集群
创建配置
在单机上设置三个节点(Redis Cluster要求最少三个节点),占用端口分别为 60000、60001、60002;使用一下shell脚本自动生成三个节点的配置文件
# 创建 redis_cluster.sh 文件内容如下
for i in 0 1 2
do
p=$((6000 + i))
mkdir -p node_$p
cat << EOF > node_$p/redis.conf
port $p
cluster-enabled yes
cluster-config-file cluster.conf
cluster-node-timeout 5000
daemonize yes
appendonly yes
EOF
done
# 对 redis_cluster.sh 文件进行授权
chmod u+x *.sh
# 运行文件
./redis_cluster.sh
# 查看目录
AndydeMacBook-Pro:cluster andy$ ls
node_6000 node_6001 node_6002 redis_cluster.sh
已经自动生成三个节点的配置文件,下面简单介绍一下配置文件的内容
配置说明
# 查看文件内容
more node_6000/redis.conf
# 节点占用端口
port 6000
# 启动Redis Cluster 集群
cluster-enabled yes
# 定义集群节点 配置存储文件名称
cluster-config-file cluster.conf
# 心跳 (ping) 超时时间
cluster-node-timeout 5000
# 以后台进程启动
daemonize yes
# 开启aof 持久化
appendonly yes
运行节点
# 编写 run_cluster.sh 批量运行集群
for i in 0 1 2;
do cd node_$((6000 + i));
redis-server redis.conf& cd -;
done
# 对 run_cluster.sh 文件进行授权
chmod u+x *.sh
# 运行文件
AndydeMacBook-Pro:cluster andy$ ./run_cluster.sh
/Users/andy/tool/util/redis-stable/cluster
/Users/andy/tool/util/redis-stable/cluster
/Users/andy/tool/util/redis-stable/cluster
如上,三个节点已经正常运行。
创建集群
# 使用一下命令创建cluster , 在中途输入yes 使用系统自动分配的hash槽 进行初始化
redis-cli --cluster create 127.0.0.1:6000 127.0.0.1:6001 127.0.0.1:6002
客户端连接
测试Redis Cluster是否工作正常。
AndydeMacBook-Pro:~ andy$ redis-cli -c -p 6000
# x 的key 的hash 槽是 16287 被分配到 6002节点进行存储
127.0.0.1:6000> set x world
-> Redirected to slot [16287] located at 127.0.0.1:6002
OK
# hello 的key 的hash 槽是 866 被分配到 6000节点进行存储
127.0.0.1:6002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:6000
OK
使用redis-cli 连接集群时,需要加上 -c 参数,否则就会出现 (error) MOVED 16287 127.0.0.1:6002错误
至此,单机Cluster架构已经搭建完毕,但是似乎并不满足高可用的设计初衷,因为任意节点不可用都会导致服务不正常,接下来我们为每个节点创建一个从节点,复制主节点的数据。
单机主从Cluster
三个主节点 + 三个从节点 那么最少需要创建6个节点才能满足高可用的要求。启动集群也非常的简单,只需要使用标志–cluster replica 1,就能自动创建集群
创建配置
# 重新创建一个 cluster_salve 文件夹 更改 redis_cluster.sh 的内容
for i in 0 1 2 3 4 5
do
p=$((6000 + i))
mkdir -p node_$p
cat << EOF > node_$p/redis.conf
port $p
cluster-enabled yes
cluster-config-file cluster.conf
cluster-node-timeout 5000
daemonize yes
appendonly yes
EOF
done
# 运行脚本
AndydeMacBook-Pro:cluster_slave andy$ ./redis_cluster.sh
运行节点
# run_cluster.sh 内容如下
for i in 0 1 2 3 4 5;
do
p=$((6000 + i))
cd node_$p;
redis-server redis.conf& cd -;
done
# 运行脚本
AndydeMacBook-Pro:cluster_slave andy$ ./run_cluster.sh
创建集群
AndydeMacBook-Pro:cluster_slave andy$ redis-cli --cluster create 127.0.0.1:6000 127.0.0.1:6001 \
> 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 \
> --cluster-replicas 1
Cluster 基本命令
查看节点信息
AndydeMacBook-Pro:cluster_slave andy$ redis-cli -c -p 6000 cluster nodes
f6c144b0743c9d32fb85d14fb3508e2a7310a3e7 127.0.0.1:6003@16003 slave 35cf7788e843934944d9690d6d627e6ae56ca7bf 0 1670682923682 1 connected
15a4bd4db978a14458bd0da6d967acf2e4a76214 127.0.0.1:6001@16001 master - 0 1670682922000 2 connected 5461-10922
24fd38e6d58d3969cacd1ee26a6a113fa88d181f 127.0.0.1:6004@16004 slave 15a4bd4db978a14458bd0da6d967acf2e4a76214
...
查看集群信息
AndydeMacBook-Pro:cluster_slave andy$ redis-cli -c -p 6000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
....
查看节点ID
127.0.0.1:6000> cluster myid
"35cf7788e843934944d9690d6d627e6ae56ca7bf"