🌟前言
在之前的文章中已经学习了Redis主从复制模式、哨兵模式。虽然前两者保证了Redis的高可用,但是master主节点的写能力与存储能力拓展性不高。
于是,为了解决redis写能力与存储能力受限的问题,Redis引入了Cluster模式,以此来提高横向拓展性。本文就来对其基础知识作出介绍,并演示三主三从架构的分片集群搭建方式。
另外,此文章基于【Redis从头学 -1】17张图带你学会Redis多环境(Linux、Windows)安装与配置这篇文章安装的Redis环境进行分片集群搭建。
🌟何为Cluster模式?
- Cluster是一组Redis实例之间进行数据分片和分布式存储的方式。通过数据分片算法将数据分割在不同的槽位,并将这些槽位分配给Redis节点。
- Cluster组间的通信,采用Gossip协议进行实现。
- 去中心结构。
🌟数据分片
简单理解:将数据按照一定的规则(数据分片算法)来划分为多个数据块的技术,来解决大规模数据的处理和存储问题。
常见的数据分区算法
- 哈希分片(Hash Sharding):将数据的关键属性通过哈希函数映射为一个标识,然后按照该标识进行分片。这样可以保证相同标识的数据会被分配到同一个分片上,实现了数据在分片间的均匀分布。
- 范围分片(Range Sharding):根据数据的某个范围属性(如时间戳、字母顺序等)进行分片。例如按照订单创建时间分片,将一段时间内的订单分配到同一个分片上。这样可以保证具有相似属性的数据在同一个分片上,方便查询和统计操作。
- 列表分片(List Sharding):将数据分为固定数量的列表,每个节点负责处理其中的一个列表。例如将数据按照ID或名称的字母顺序分为A、B、C等列表,然后将不同列表的数据分配给不同节点。这样可以简化数据分片的逻辑和管理。
- 一致性哈希分片(Consistent Hashing):将数据和节点都映射到一个环形空间上,通过一致性哈希算法确定数据应该被分配到的节点。一致性哈希分片具有动态性,当节点发生增加或删除时,只需要重新映射受影响的数据,而不需要重新分配所有数据。
- 基于功能的分片(Functional Sharding):根据不同的功能或业务需求对数据进行分片。例如将用户信息分片、商品信息分片等,使得每个分片只包含特定类型的数据,简化了系统的管理和维护。
🌟Redis哈希槽
哈希槽:Redis没有采用一致性哈希分片算法进行数据分片,而是引入了哈希槽的概念。总共有16384个哈希槽位,集群中的节点根据分配规则,负责相应范围的槽位。如下图所示:这里要注意只有主节点才有槽位,从节点是没有槽位的
槽位分配:通过对Key进行CRC16哈希运算,并取模16384。根据得出的值确定节点的范围区间。举例:CRC16(“key”)%16384
优点:方便管理节点的哈希槽分配。
🌟搭建过程
小tips:
- 搭建时采用三主三从的结构。
- 端口号分别为6381、6382、6383、6384、6385、6386。以及总线端口16381、16382、16383、16384、16385、16386。
- 这里注意三主三从的节点由其内部分配,无需我们进行配置。
- 注意要删掉之前的持久化文件,若现在要配置的持久化文件与之前的一样。
- 注意关闭防火墙或者开放相应的端口号。本文已开放。
创建配置文件
1.创建文件夹cluster。存放相关配置文件,路径为/data/redis/cluster。以及创建日志路径以及持久化文件路径
mkdir -p /data/redis/cluster mkdir -p /data/redis/cluster/log mkdir -p /data/redis/cluster/data
2.进入到上述目录并创建6个配置文件。
cd /data/redis/cluster touch redis1.conf redis2.conf redis3.conf redis4.conf redis5.conf redis6.conf
3.redis1.conf配置文件
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6381 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6381.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly1.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6381.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6381 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16381
4.redis2.conf配置文件
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6382 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6382.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly2.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6382.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6382 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16382
5.redis3.conf配置文件。
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6383 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6383.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly3.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6383.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6383 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16383
6.redis4.conf配置文件
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6384 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6384.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly4.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6384.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6384 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16384
7.redis5.conf配置文件。
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6385 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6385.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly5.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6385.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6385 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16385
8.redis6.conf配置文件。
#任何ip可以访问 bind 0.0.0.0 #端口号 port 6386 #守护进程 daemonize yes #密码 requirepass "daencode@top" #日志文件 logfile "/data/redis/cluster/log/redis_6386.log" #持久化文件存储路径 dir "/data/redis/cluster/data" #持久化策略, 10秒内有个1个key改动,执⾏快照 appendonly yes appendfilename "appendonly6.aof" #访问主节点的密码 masterauth "daencode@top" #是否开启集群 cluster-enabled yes # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf cluster-config-file nodes-6386.conf #节点连接超时时间 cluster-node-timeout 20000 #集群节点的ip,当前节点的ip cluster-announce-ip 49.233.48.98 #集群节点映射端口 cluster-announce-port 6386 #集群节点总线端口,节点之间互相通信,常规端口+1万 cluster-announce-bus-port 16386
集群启动
1.进入到redis的bin目录
cd /usr/local/redis/bin
2.启动六个节点。
./redis-server /data/redis/cluster/redis1.conf ./redis-server /data/redis/cluster/redis2.conf ./redis-server /data/redis/cluster/redis3.conf ./redis-server /data/redis/cluster/redis4.conf ./redis-server /data/redis/cluster/redis5.conf ./redis-server /data/redis/cluster/redis6.conf
3.查看是否启动成功。
4.其中一个节点客户端加入集群cluster
./redis-cli -a daencode@top --cluster create 49.233.48.98:6381 49.233.48.98:6382 49.233.48.98:6383 49.233.48.98:6384 49.233.48.98:6385 49.233.48.98:6386 --cluster-replicas 1
参数解释
- –cluster create <6个节点信息>:构建集群全部节点信息。
- –cluster-replicas 1:主从节点比例,1表示一主一从。六个节点正好为三对一主一从。
执行结果图:红框部分代表槽位分配策略,以及主从节点信息。满意则输入yes。
4.输入yes,成功加入。
5.检查节点状态信息。
./redis-cli -a daencode@top --cluster check 49.233.48.98:6381
集群cluster测试
1.进入到redis的bin目录登录6381节点客户端,以集群方式登录。
#-c代表集群方式 ./redis-cli -c -a daencode@top -p 6381
2.查看集群信息。
cluster info
3.查看节点信息。
cluster nodes
4.通过set命令写入缓存,查看会被分配到哪个槽位。通过下图可以看出被分配到了6382节点的槽位区间中。
🌟写在最后
有关于一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程到此就结束了。感谢大家的阅读与支持!另外配置集群时一定要细心配置,好好检查配置文件!!!