【赵渝强老师】Redis Cluster分布式集群

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。

b385.png

主从复制是Redis集群实现的一种方式,而Redis集群的另一种实现方式就是Redis Cluster。它是Redis提供的数据分布式存储解决方案。


一、 什么是Redis Cluster?


日常在对于Redis的使用中经常会遇到一些问题,例如:如何保证Redis的持续高可用性?如何实现单实例Redis扩充?如何提升高并发时的性能问题?针对这些问题,在Redis 3.0版本中推出了Redis Cluster。它是Redis的分布式解决方案,并有效解决了Redis分布式方面的需求。当遇到单机的内存、并发和流量等瓶颈时,可以采用Redis Cluster架构达到负载均衡的目的。Redis Cluster主要具有以下的优势:

  • 官方推荐,毋庸置疑。
  • 去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。
  • 管理方便,后续可自行增加或摘除节点,移动分槽等等。
  • 简单,易上手。


二、 Redis Cluster的体系架构


分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则。哈希分区的原理如下图所示。

image.png


虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。比如Redis Cluster槽的范围是0 ~ 16383。槽是集群内数据管理和迁移的基本单位。


Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。以6个节点为例,来介绍Redis Cluster的体系架构,其中:三个为master节点,另外三个为slave节点。体系架构如下图所示。

image.png

视频讲解如下:


三、 部署Redis Cluster


部署Redis Cluster可以通过手动编辑配置文件来完成,这种方式比较灵活也是在生产环境中使用的方式;另一方面,Redis提供了一个命令脚本create-cluster帮助快速部署一个Redis Cluster,但这种方式多用于开发和测试环境中。


3.1  【实战】手动部署Redis Cluster


(1)复制6份Redis的配置文件。

cp redis.conf /root/training/redis/conf/redis6379.conf
cp redis.conf /root/training/redis/conf/redis6380.conf
cp redis.conf /root/training/redis/conf/redis6381.conf
cp redis.conf /root/training/redis/conf/redis6382.conf
cp redis.conf /root/training/redis/conf/redis6383.conf
cp redis.conf /root/training/redis/conf/redis6384.conf


(2)以redis6379.conf为例修改配置文件的内容,需要修改的参数如下:

daemonize yes
port 6379
cluster-enabled yes
cluster-config-file nodes/nodes-6379.conf
cluster-node-timeout 15000
dbfilename dump6379.rdb
appendonly yes
appendfilename "appendonly6379.aof"


(3)按照同样的方式修改其他的Redis Cluster配置文件,如redis6380.conf的修改内容如下:

daemonize yes
port 6380
cluster-enabled yes
cluster-config-file nodes/nodes-6380.conf
cluster-node-timeout 15000
dbfilename dump6380.rdb
appendonly yes
appendfilename "appendonly6380.aof"


(4)创建Redis Cluster节点配置信息保存的目录。

mkdir /root/training/redis/nodes


(5)启动所有的Redis实例。

bin/redis-server conf/redis6379.conf 
bin/redis-server conf/redis6380.conf 
bin/redis-server conf/redis6381.conf 
bin/redis-server conf/redis6382.conf 
bin/redis-server conf/redis6383.conf 
bin/redis-server conf/redis6384.conf


(6)通过ps命令确定Redis实例的进程信息。

ps -ef|grep redis
# 输出的信息如下:
root       5383  ... bin/redis-server 127.0.0.1:6379 [cluster]
root       5385  ... bin/redis-server 127.0.0.1:6380 [cluster]
root       5387  ... bin/redis-server 127.0.0.1:6381 [cluster]
root       5397  ... bin/redis-server 127.0.0.1:6382 [cluster]
root       5403  ... bin/redis-server 127.0.0.1:6383 [cluster]
root       5413  ... bin/redis-server 127.0.0.1:6384 [cluster]


(7)初始化Redis Cluster。

bin/redis-cli --cluster create --cluster-replicas 1 \
127.0.0.1:6379 \
127.0.0.1:6380 \
127.0.0.1:6381 \
127.0.0.1:6382 \
127.0.0.1:6383 \
127.0.0.1:6384 

# 输出的信息如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6384 to 127.0.0.1:6380
Adding replica 127.0.0.1:6382 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 24840361406aa8ba5ab2d03f28bdb21dd5362d4f 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
M: 8aba2fafcfa5161315ff1dd645db3b75607128a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: 41780e8f30a91c644cfec889bfce6cb02f977943 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
S: 97119cfb5c5cc8eea385a8aca9b665f1498bced4 127.0.0.1:6382
   replicates 24840361406aa8ba5ab2d03f28bdb21dd5362d4f
S: 9abfeb7da0d9f8017ea5de5114b5bd57a0b8f851 127.0.0.1:6383
   replicates 8aba2fafcfa5161315ff1dd645db3b75607128a6
S: a1b8e2ab26a4b7c9ec20c62e61992e9efca39476 127.0.0.1:6384
   replicates 41780e8f30a91c644cfec889bfce6cb02f977943
   
# 下面这里输入yes
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: 24840361406aa8ba5ab2d03f28bdb21dd5362d4f 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a1b8e2ab26a4b7c9ec20c62e61992e9efca39476 127.0.0.1:6384
   slots: (0 slots) slave
   replicates 41780e8f30a91c644cfec889bfce6cb02f977943
S: 97119cfb5c5cc8eea385a8aca9b665f1498bced4 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 24840361406aa8ba5ab2d03f28bdb21dd5362d4f
M: 8aba2fafcfa5161315ff1dd645db3b75607128a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 41780e8f30a91c644cfec889bfce6cb02f977943 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 9abfeb7da0d9f8017ea5de5114b5bd57a0b8f851 127.0.0.1:6383
   slots: (0 slots) slave
   replicates 8aba2fafcfa5161315ff1dd645db3b75607128a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


(8)使用Redis客户端连接Redis Cluster。

bin/redis-cli -c


(9)查看Redis Cluster的统计信息。

127.0.0.1:6379> 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
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:152
cluster_stats_messages_pong_sent:151
cluster_stats_messages_sent:303
cluster_stats_messages_ping_received:146
cluster_stats_messages_pong_received:152
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:303


3.2  【实战】使用脚本部署Redis Cluster


(1)进入Redis源码的utils/create-cluster目录,将脚本create-cluster复制到Redis安装目录的bin目录下。

cd /root/tools/redis-6.2.6/utils/create-cluster
cp create-cluster /root/training/redis/bin/


(2)查看脚本create-cluster的内容。

more /root/training/redis/bin/create-cluster

# 输出的信息如下:
#!/bin/bash
# Settings
BIN_PATH="/root/training/redis/bin"
CLUSTER_HOST=127.0.0.1
PORT=30000
TIMEOUT=2000
NODES=6
REPLICAS=1
PROTECTED_MODE=yes
ADDITIONAL_OPTIONS=""
......


(3)编辑脚本create-cluster设置Redis的bin路径。

......
# Settings
BIN_PATH="/root/training/redis/bin"
......


(4)启动Redis Cluster的节点。

bin/create-cluster start

# 输出的信息如下:
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006


(5)通过ps命令查看Redis的后台进程信息。

ps -ef |grep redis-server

# 输出的信息如下:
... 4398  ... /root/training/redis/bin/redis-server *:30001 [cluster]
... 4400  ... /root/training/redis/bin/redis-server *:30002 [cluster]
... 4402  ... /root/training/redis/bin/redis-server *:30003 [cluster]
... 4412  ... /root/training/redis/bin/redis-server *:30004 [cluster]
... 4418  ... /root/training/redis/bin/redis-server *:30005 [cluster]
... 4424  ... /root/training/redis/bin/redis-server *:30006 [cluster]


(6)初始化Redis Cluster。

bin/create-cluster create

# 输出的信息如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 39b81f4a37933ae7805c3f611ddb869acc8446a4 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 804594da6fb9338610737086e3f1d9bcdba3944e 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: 6cae403b057c7e4e17f86d78c245a8bf7358287c 127.0.0.1:30004
   replicates 39b81f4a37933ae7805c3f611ddb869acc8446a4
S: 405154d64389b69335fab2cb1e029aa29344d7de 127.0.0.1:30005
   replicates 804594da6fb9338610737086e3f1d9bcdba3944e
S: 27039bdc08fcb9452ba009adaf31db28d184a528 127.0.0.1:30006
   replicates 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147
   
# 下面这里输入yes。
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 804594da6fb9338610737086e3f1d9bcdba3944e 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 6cae403b057c7e4e17f86d78c245a8bf7358287c 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 39b81f4a37933ae7805c3f611ddb869acc8446a4
S: 27039bdc08fcb9452ba009adaf31db28d184a528 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147
M: 39b81f4a37933ae7805c3f611ddb869acc8446a4 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 405154d64389b69335fab2cb1e029aa29344d7de 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 804594da6fb9338610737086e3f1d9bcdba3944e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


(7)使用Redis客户端连接Redis Cluster

bin/redis-cli -c -p 30001


(8)查看Redis Cluster的统计信息。

127.0.0.1:30001> cluster info
# 输出的信息如下:
cluster_state:ok                          集群状态
cluster_slots_assigned:16384              已分配的slot数量
cluster_slots_ok:16384                    ok状况的slot数量
cluster_slots_pfail:0                     可能失效的slot数量
cluster_slots_fail:0                      已失效的slot数量
cluster_known_nodes:6                     集群中节点的数量    
cluster_size:3                            分片的数量
cluster_current_epoch:6                   集群中的版本数量。
cluster_my_epoch:1                        当前节点的版本数。
cluster_stats_messages_ping_sent:478      发送ping数量
cluster_stats_messages_pong_sent:480      发送pong数量
cluster_stats_messages_sent:958           总发送的数量
cluster_stats_messages_ping_received:475  接收ping数量
cluster_stats_messages_pong_received:478  接收pong数量
cluster_stats_messages_received:958       总接收数量


相关文章
|
2月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
217 5
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
353 5
|
2月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
276 1
|
3月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
3月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
217 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
3月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
4月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
275 6
|
5月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
9月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
885 0
分布式爬虫框架Scrapy-Redis实战指南
|
7月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
366 67

相关产品

  • 云数据库 Tair(兼容 Redis)