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

简介: 【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集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程到此就结束了。感谢大家的阅读与支持!另外配置集群时一定要细心配置,好好检查配置文件!!!


目录
相关文章
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
885 2
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
12月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
838 5
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
1192 67
|
存储 缓存 NoSQL
告别数据僵尸!Redis实现自动清理过期键值对
在数据激增的时代,Redis如同内存管理的智能管家,支持键值对的自动过期功能,实现“数据保鲜”。通过`EXPIRE`设定生命倒计时、`TTL`查询剩余时间,结合惰性删除与定期清理策略,Redis高效维护内存秩序。本文以Python实战演示其过期机制,并提供最佳实践指南,助你掌握数据生命周期管理的艺术,让数据优雅退场。
740 0
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供 8 种数据淘汰策略: 淘汰易失数据(具有过期时间的数据) 1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 2. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰 3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 4. volatile-random:从已设置过期
|
存储 缓存 NoSQL
Redis分片(分布式缓存)
分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集. 1 分片何用 Redis 的分片承担着两个主要目标: 允许使用很多电脑的内存总和来支持更大的数据库。
9138 0
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1922 0