【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
目录
相关文章
|
6天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
数据并发竞争是大流量系统(如火车票系统、微博平台)中常见的问题,可能导致用户体验下降甚至系统崩溃。本文介绍了两种解决方案:1) 加写回操作加互斥锁,查询失败快速返回默认值;2) 保持多个缓存备份,减少并发竞争概率。通过实践案例展示,成功提高了系统的稳定性和性能。
|
6天前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
在使用Redis时,缓存与数据库数据不一致会导致应用异常。主要原因包括缓存更新失败、Rehash异常等。解决方案有:重试机制、缩短缓存时间、优化写入策略、建立监控报警、定期验证一致性、采用缓存分层及数据回滚恢复机制。这些措施可确保数据最终一致性,提升应用稳定性和性能。
|
24天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
38 5
|
1月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
69 14
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
44 5
|
7月前
|
存储 NoSQL Redis
redis存储原理和数据模型
redis存储原理和数据模型
71 1
|
4月前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型
|
6月前
|
存储 缓存 NoSQL
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
|
7月前
|
存储 缓存 NoSQL
为什么要在 Redis 中存储两次同一份数据?
为什么要在 Redis 中存储两次同一份数据?
95 0
为什么要在 Redis 中存储两次同一份数据?
|
7月前
|
存储 NoSQL 算法
redis存储什么类型的数据?redis分布式锁怎么实现的?
redis存储什么类型的数据?redis分布式锁怎么实现的?