【Redis从头学-14】一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Redis从头学-14】一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程

🌟前言


在之前的文章中已经学习了Redis主从复制模式、哨兵模式。虽然前两者保证了Redis的高可用,但是master主节点的写能力与存储能力拓展性不高。


于是,为了解决redis写能力与存储能力受限的问题,Redis引入了Cluster模式,以此来提高横向拓展性。本文就来对其基础知识作出介绍,并演示三主三从架构的分片集群搭建方式。


另外,此文章基于【Redis从头学 -1】17张图带你学会Redis多环境(Linux、Windows)安装与配置这篇文章安装的Redis环境进行分片集群搭建。


🌟何为Cluster模式?


  • Cluster是一组Redis实例之间进行数据分片和分布式存储的方式。通过数据分片算法将数据分割在不同的槽位,并将这些槽位分配给Redis节点。
  • Cluster组间的通信,采用Gossip协议进行实现。
  • 去中心结构。

🌟数据分片


简单理解:将数据按照一定的规则(数据分片算法)来划分为多个数据块的技术,来解决大规模数据的处理和存储问题。


常见的数据分区算法


  1. 哈希分片(Hash Sharding):将数据的关键属性通过哈希函数映射为一个标识,然后按照该标识进行分片。这样可以保证相同标识的数据会被分配到同一个分片上,实现了数据在分片间的均匀分布。
  2. 范围分片(Range Sharding):根据数据的某个范围属性(如时间戳、字母顺序等)进行分片。例如按照订单创建时间分片,将一段时间内的订单分配到同一个分片上。这样可以保证具有相似属性的数据在同一个分片上,方便查询和统计操作。
  3. 列表分片(List Sharding):将数据分为固定数量的列表,每个节点负责处理其中的一个列表。例如将数据按照ID或名称的字母顺序分为A、B、C等列表,然后将不同列表的数据分配给不同节点。这样可以简化数据分片的逻辑和管理。
  4. 一致性哈希分片(Consistent Hashing):将数据和节点都映射到一个环形空间上,通过一致性哈希算法确定数据应该被分配到的节点。一致性哈希分片具有动态性,当节点发生增加或删除时,只需要重新映射受影响的数据,而不需要重新分配所有数据。
  5. 基于功能的分片(Functional Sharding):根据不同的功能或业务需求对数据进行分片。例如将用户信息分片、商品信息分片等,使得每个分片只包含特定类型的数据,简化了系统的管理和维护。

🌟Redis哈希槽


哈希槽:Redis没有采用一致性哈希分片算法进行数据分片,而是引入了哈希槽的概念。总共有16384个哈希槽位,集群中的节点根据分配规则,负责相应范围的槽位。如下图所示:这里要注意只有主节点才有槽位,从节点是没有槽位的

f7f201a4ab67f6f040f7126968931025_1e39e39f4cbc45349a7375f143caaca3.png

槽位分配:通过对Key进行CRC16哈希运算,并取模16384。根据得出的值确定节点的范围区间。举例:CRC16(“key”)%16384


优点:方便管理节点的哈希槽分配。


🌟搭建过程


小tips:


  1. 搭建时采用三主三从的结构。
  2. 端口号分别为6381、6382、6383、6384、6385、6386。以及总线端口16381、16382、16383、16384、16385、16386。
  3. 这里注意三主三从的节点由其内部分配,无需我们进行配置。
  4. 注意要删掉之前的持久化文件,若现在要配置的持久化文件与之前的一样。
  5. 注意关闭防火墙或者开放相应的端口号。本文已开放。


创建配置文件


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.查看是否启动成功。

image.png


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。

af5ec64945201ccd6acece41d9f3bd9e_e098f6487d20475b94ad0de634105106.png

4.输入yes,成功加入。

4989c1d8f5ef614b3b4d84cbfe91e717_8cc37e0cec6a4668b20823e6540c534b.png

5.检查节点状态信息。


./redis-cli -a daencode@top --cluster check 49.233.48.98:6381

efde9d22fdafdefd9203a64a7fdc1ed9_83e39f0be638484d96f4d8afeae94f0e.png


集群cluster测试


1.进入到redis的bin目录登录6381节点客户端,以集群方式登录。


#-c代表集群方式
./redis-cli -c -a daencode@top -p 6381


2.查看集群信息。


cluster info

aff428191f78290079eadfcdd8ba29fb_9f583d58c61542848c71acea355b3d56.png


3.查看节点信息。


cluster nodes

2d76b442082fcd40b924c65007350619_ef48d5484b94403ea0dfd52b3ce4ff04.png


4.通过set命令写入缓存,查看会被分配到哪个槽位。通过下图可以看出被分配到了6382节点的槽位区间中。

6686f47f6dd26d66017cfb94e2dfd7ef_9b8df1342fc84c79aeb964649c46b977.png


🌟写在最后


有关于一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程到此就结束了。感谢大家的阅读与支持!另外配置集群时一定要细心配置,好好检查配置文件!!!


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
9天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
43 16
|
9天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
44 14
|
9天前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
37 13
|
9天前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
33 11
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
9天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
10天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
18天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
100 22