redis集群详细搭建方式(含原理、操作指令、异常处理)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 1.概述概念:redis集群是从3.0版本开始支持的一个功能,是redis的一种水平扩展方式,将全局数据分散的存储在N个结点上,从而来将请求流量打散到各个结点上,减轻单结点压力。实现原理:redis的集群进行数据散列时使用了一致性hash算法的思想,如果对一致性hash算法有兴趣可以参照博主的另一篇文章:

1.概述

概念:

redis集群是从3.0版本开始支持的一个功能,是redis的一种水平扩展方式,将全局数据分散的存储在N个结点上,从而来将请求流量打散到各个结点上,减轻单结点压力。

实现原理:

redis的集群进行数据散列时使用了一致性hash算法的思想,如果对一致性hash算法有兴趣可以参照博主的另一篇文章:

一致性hash算法__BugMan的博客-CSDN博客

具体实现上,1个redis集群包含16384个槽位(solt),编号0-16384,将这些槽位分段给各个结点。如果要操作某个数据,CRC16(key)%16384计算出槽位号,如果这个槽位号在当前结点就直接在当前结点进行处理,如果在其它结点就使用重定向的方式将操作指令重定向到对应结点上去。redis将CRC16算法当作自己的hash函数的实现来使用。


以下以一个查找操作为例:

853a7c73c59248e5a338320cda893691.png

为什么能分担流量压力:

如果一个操作请求从业务代码发送过来,因为存在请求重定向机制的存在,所以请求随便发给一个redis结点都行。

环境依赖:

需要注意的是,5.0版本以前需要ruby环境,5.0版本以后不需要。

2.配置

2.1.配置文件

redis的配置文件redis.conf中关于集群的主要配置项有三个:


cluster-enabled,是否开启集群模式。


cluster-config-file,本届点生成的集群文件的名称。


cluster-node-timeout,失联等待时间,主要用于主节点失联后其他从节点何时开始重新竞选出主节点。

8ce74293ceab4a10892fae1f5ce9dc8f.png

2.2.合体

配置好后的各个结点还是相互独立的,集群处于未启动状态,各个结点还没分配各自的插槽号,需要使用指令来启动集群,并完成各节点插槽号的分配。

在5.0版本之前要使用redis-trib.rb命令来进行合体,在5.0以后合体命令继承在了redis-cli中,redis-cli支持了多种参数,在启动集群时对集群做一些初始化的配置:

注意:有多结点时,多个IP:port间以空格分隔。

命令格式 命令说明
redis-cli --cluster create IP:port 以默认的方式启动集群
redis-cli --cluster create IP:port --cluster-replicas 1 创建带主从关系的集群,主从关系由redis随机创建

使用redis-cli启动集群时创建的主从关系是无法指定的,如有需要的话可以在创建后手动调整。

命令格式 命令说明
redis-cli --cluster add-node IP:port 新增主结点

redis-cli --cluster add-node IP:port --cluster-slave --cluster-master-id 主节点的id 新增从结点

以下使用默认的方式启动集群,启动时redis会主动询问自动生成的集群配置是否满意:

image.png

合体成功后可以使用cluster nodes来查看当前集群的信息:

4849a542c7ff425898e06372012e7065.png

2.3.进入cli

集群模式下最好使用./redis-cli -c来进入集群模式下的客户端,因为进入普通模式的客户端的话很多集群功能不支持,比如说无法重定向,一旦进行存放值的操作时运算出来的hash值不在当前节点所管的范围,会直接报错。

3.集群操作

3.1.查看集群信息

cluster nodes

如果存在主从关系,通过编号消息可以看出主从关系。

72909fc3ee8e4621b512893c8ff05bb5.png

3.2.集群中录入值

一致性hash算法会将数据尽量均匀分布到集群中各个节点上去,但是不同节点上的数据不能进行批量操作,如mget、mset等。

如果想要强制指明将多个值都存放在一个节点上,以实现可以批量操作,可以使用{}来定义组。同组的数据,会在运算的时候强制将hash值算到一个范围中去。

08c1c4b66ab7453bb0e5aa6d644741b0.png

3.3.查询集群中的值

4ea7ea8e080d43859558866f65205a53.png

4.故障处理

某组主从集体掉线以后,对应的这段插槽号集体失效,不会被均分到其他节点上。redis默认所有插槽都正常的时候才会对外正常提供服务,一旦出现上面的情况3,redis默认会无法正常进行工作,在配置文件中将cluster-require-full-coverage从注释中放出来,改为no即可修改默认机制。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
117 1
|
1月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
52 0
|
4天前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
4天前
|
存储 缓存 NoSQL
redis的原理(四)
redis的原理(四)
|
4天前
|
存储 缓存 NoSQL
redis的原理(二)
redis的原理(二)
|
4天前
|
缓存 NoSQL 安全
Redis的原理(一)
Redis的原理(一)
|
1月前
|
存储 NoSQL Java
深入理解Redis数据类型Hashes原理
本文深入分析了Redis中的hashes数据类型,这是一种用于存储行记录的数据结构,允许一个key下存储多条记录。
深入理解Redis数据类型Hashes原理
|
29天前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
1月前
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
1月前
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理