Redis集群(cluster)-上:Redis集群介绍
mhr18 2024-11-19 06:49 18 浏览 0 评论
Redis集群简述
本篇文章对Redis集群做一个简单的了解,并介绍如何快速部署一套Redis集群,测试以及操作集群,对Redis的深入介绍将会留在下一篇文章.
这里需要注意的是,Redis集群是在Redis Version 3.0新推出的功能,老的版本并不支持.
Redis集群提供了一种数据会自动切片到多个节点上的部署方式,想象一张表,假设这张表有一亿行数据,那么切片相当于将该表分成N份,每一个节点都保存该表的数据的1/N,Redis的切片就是将数据切割分散到集群中各个节点中,每个节点都会维护Redis数据中的一部分,每个节点都是不可分割的.
Redis集群同时也提供了在部分集群节点故障时集群的可靠性,这也意味着在集群部分节点宕机后集群仍然可以正常提供服务,然而这也不代表集群是一劳永逸的,因为一旦大规模的集群宕机发生后,例如机柜断电跳闸等,集群依旧会出现服务不可用的现象.
综上所述,Redis集群主要提供以下功能:
- 自动将数据切片并分散到多个集群节点.
- 集群中部分节点宕机后不影响集群正常提供服务.
Redis集群TCP端口号
Redis集群中的每个节点需要两个tcp端口,一个是6379,该端口主要服务于客户端的连接,另一个端口是16379,即在服务客户端的端口号默认加10000,如TCP5000端口号用来服务客户端,那么另外一个端口就是TCP15000.
第二个端口号用来实现集群的bus功能,bus的意思是集群所有节点都是通过该端口来,就像一根总线将各个节点串起来一样,Redis bus是一种通过二进制协议点到点的通道,集群节点通过Redis bus进行故障探测,配置更新,故障转移授权等等.客户端不会尝试连接该bus端口.
Redis数据分片
Redis集群不使用一致性哈希,而是不同形式的分片,这可以确保每个key都可以存入到一个我们称之为哈希槽(hash slot)中
Redis集群中共有16384个哈希槽(hash slot),通过CRC16算法可以计算出一个给定的key属于哪个哈希槽中.集群中的每个节点都负责处理这16384个哈希槽的一部分.
例如,在一个三个节点组成的集群中:
- 节点A负责处理0到5500个哈希槽
- 节点B负责处理5501到11000个哈希槽
- 节点C负责处理11001到16383个哈希槽
通过这种方法我们可以很方便的向集群添加或者移除节点.例如我们想添加一个节点D到集群,只需要从节点A或B或C负责的哈希槽中转移一部分到节点D上,节点D即可以上线提供服务.又例如节点A因硬件性能问题需要退役,我们只需要将节点A负责的哈希槽转移到其他节点上,即可将A节点从集群剔除.
从集群节点移动哈希槽到另一个节点不需要停止服务,增加或者移除节点,修改一个集群节点负责处理的哈希槽的百分比等等也不需要宕机时间.
Redis集群支持多键操作,前提是单个命令执行(事务或者lua脚本)中所涉及的键都属于同一个哈希槽,这里可以通过使用成为哈希标记(hash tag)的方式来强制所有的键被分配到统一个槽.
所谓的hash tag,例如在如下key中通过CRC16算法计算后会属于不同的槽
user_id_12389_username
user_id_12389_age
user_id_12389_address
但是我们通过将键的关键字user_id_12389使用花括号括起来时,只有花括号中的部分才会被CRC16算法哈希,这样它们的计算结果是一样的,所以都会被分配到一个哈希槽.
{user_id_12389}_username
{user_id_12389}_age
{user_id_12389}_address
Redis集群的主从模式
前面提到过,Redis集群支持在部分集群节点宕机后仍然可以向外提供服务,这个功能依赖于集群节点的主从模式,Redis集群使用主从模式确保在每个Master节点负责处理的哈希槽能够复制到它的从节点.
传统Redis集群架构
引入主从模式的Redis集群架构
如上图所示,在Redis集群中没有引入主从模式之前,如果节点B因为故障导致下线,那么节点B负责的5501~11000哈希槽也会进入下线状态,并没有其他节点负责处理这些哈希槽,因此会导致整个集群无法提供服务.
Redis集群引入主从模式(就是在每个提供服务的节点添加一个从节点)后,集群变成了三主三从(假设集群有6个节点),那么当节点B宕机后,它的从节点B1会被集群授权并选举为主节点接管节点B的5501~11000哈希槽并继续接收服务请求.
这里需要注意的是,如果节点B和它的从节点B1同时宕机,那么集群也会服务不可用,但是这种现象出现的概率还是比较低的.
Redis集群一致性保证
Redis集群没有严格意义的一致性,这也意味着在特定的条件下,Redis集群可能会丢失系统已经反馈客户端写入成功的部分写操作.
这是因为Redis集群采用的是异步的复制,这就意味着,一个写操作会按照如下步骤发生.
- 客户端将数据写到节点B上.
- 节点B回复客户端写入完成.
- 节点B将写操作复制到B的从节点B1,B2,B3.
从上述写的步骤可以看到,节点B在回复客户端写入成功之前并不会等待从节点B1,B2,B3反馈确认写入从节点成功的回复.这会导致一个问题,例如节点B回复客户端写入成功后宕机了,恰好这个写操作还没有同步到从节点,其中一个从节点B1被授权并升级成主节点继续提供服务,但是B1已经丢失了同步失败的数据.
这和传统数据库中每秒将内存数据刷新到磁盘的操作相似,即使我们可以强制要求回复客户端写成功之前必须先确保数据已经写入到从节点,但是这会带来延迟的问题.
Redis集群也支持同步写操作,通过wait命令可以实现,这可以将写操作丢失的风险降到最低,这里需要注意的是Redis集群非强一致性,即使我们引入同步复制,可能会有更加复杂的情况会导致从节点会落后于主节点.
另外还一种情况会使Redis集群丢失部分写操作,例如在一个网络分区故障下,Redis集群被分割两个部分,而客户端连接的正好是这个集群中的一小部分(这个小部分至少包含一个Master节点).
Redis集群网络分区故障
例如在上述现象中,节点A因为网络分区故障导致和集群大多数节点隔离,恰巧此时客户端连接的是节点A,同时写入数据的哈希槽也是由节点A负责,那么客户端还是可以正常写入的,因为客户端并不知道集群已经出现网络故障,如果网络分区故障很快恢复后,那么集群仍然可以正常提供服务,然而如果网络分区故障超过特定的时间,导致从节点A1被集群授权并选举为新的主节点向外提供服务,那么之前客户端写入到节点A的操作都会丢失.
需要注意的是,在网络分区故障中,客户端写入数据到节点A有一个最大的时间窗口限制,如果超过最大时间限制后节点A仍然故障,那么集群中大多数节点会将从节点A1选举为新的主节点接替节点A的工作,处于网络故障的主节点A就会停止接收客户端的写入操作.
在Redis集群中这个最大时间窗口限制的配置参数称为"node timeout".
该超时参数的值非常重要,如果节点故障并超过该timeout的值,那么该节点会被集群认为故障,可以被它的从节点替换掉,相似的,如果发生故障的主节点超过该timeout的值后没有和集群大多数节点通信,也会认为自己处于故障状态,将自己进入错误状态并停止接收写入操作.
Redis集群配置参数
- cluster-enabled <yes/no>: 是否启动Redis集群模式
- cluster-config-file <filename>: 这里需要注意的是,该文件不是可编辑的,是由Redis集群自动去维护,Redis集群将集群状态,基本信息等持久化到该文件,每次集群配置变更时,都会同步到该文件,所以该文件会经常自动被覆盖,在下次Redis集群重启后会自动加载该文件,该文件包含集群其他节点的信息,状态,持久化的一些变量等.
- cluster-node-timeout <milliseconds>: 集群节点不可达的最大的超时时间,但并不会被认为是故障,如果一个主节点达到该超时时间后仍然不可达,该主节点将会被它的从节点执行故障转移,该参数也控制着Redis集群中其他重要的设置,尤其是当集群中的节点发现自己在超过timeout时间限制后仍然无法与集群中大多数节点通信,那么该节点将会停止接收客户端的查询等操作.
- cluster-slave-validity-factor <factor>: 如果该值设置为0,从节点将会一直尝试故障转移主节点,而不管从节点与主节点之间的链路到底断开了多久,有没有超过cluster-node-timeout 的值的限制,如果该值是一个正数,那么该值乘以cluster-node-timeout的值得出来的时间就是一个节点断开的最大时间,如果该节点是从节点,那么主从节点之间的链路断开后,即使超过了该值,从节点也不会执行故障转移(这是因为从节点和主节点的链路断开,但是主节点和集群中的大部分节点链路是正常的).例如,如果cluster-node-timeout 的值为5000,即5秒,cluster-slave-validity-factor的值为10,那么从节点和主节点断开超过50秒后,从节点不被允许执行故障转移,这里需要注意的是,任何非0值都会导致没有从节点的主节点宕机后执行故障转移导致集群不可用,这种情况下只有当主节点重新加入集群后集群才会继续提供服务.
- cluster-migration-barrier <count>: 这是Redis集群特性“副本移动“(Replicas migration)的参数配置,该参数表明一个主节点最少的从节点数量,在副本移动的时候要保证原主节点至少有该参数指定的从节点数量的前提下才会将该主节点多余的从节点移动到其他没有从节点的主节点。
- cluster-require-full-coverage <yes/no>: 默认是yes,如果哈希槽没有被任何节点负责处理,集群将会停止写入。如果设置为no,即使集群故障仍可以处理部分哈希槽数据,集群仍然可用。
- cluster-allow-reads-when-down <yes/no>: 默认是no,当集群认为有节点出现故障时,该故障可能是因为网络分区导致该节点与集群隔离开,或者该节点无法得到集群大多数节点的认同时,此时该故障节点将会拒绝任何读写请求,这样的好处是将阻止客户端从该节点读取到不一致的数据。该参数也可以被配置为yes,即使该节点故障也允许读操作,这在应用要求优先进行读取操作但是可以阻止不一致性写入的情况下比较有用,当Redis集群仅有少量切片情况下且没有从节点执行故障转移时可以考虑使用。
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)