Skip to main content

moregeek program

redis cluster 原理说的头头是道,这些配置不懂就是纸上谈兵_wx630f055ce23fc的博客-多极客编程

Redis Cluster 集群相关配置,使用集群方式的你必须重视和知晓。别嘴上原理说的头头是道,而集群有哪些配置?如何配置让集群快到飞起,实现真正的高可用却一头雾水,通过下面这些配置详解也让你对集群原理更加深刻。

cluster-enabled

普通的 Redis 实例是不能成为集群的一员,想要将该节点加入 Redis Cluster,需要设置 ​​cluster-enabled yes​​。

cluster-config-file

​cluster-config-file nodes-6379.conf​​ 指定集群中的每个节点文件。

集群中的每个节点都有一个配置文件,这个文件并不是让程序员编辑的,是我自己创建和更新的,每个节点都要使用不同的配置文件,一定要确保同一个集群中的不同节点使用的是不同的文件。

cluster-node-timeout

设置集群节点不可用的最大超时时间,节点失效检测。集群中当一个节点向另一个节点发送PING命令,但是目标节点未在给定的时限内返回PING命令的回复时,那么发送命令的节点会将目标节点标记为PFAIL(possible failuer,可能已失效);

如果master 节点超过这个时间还是无响应,则用它的从节点将启动故障迁移,升级成主节点。

注意,任何一个节点在这个时间之内如果还是没有连上大部分的主节点,则此节点将停止接收任何请求。

默认配置是 ​​cluster-node-timeout 15000​​,单位是毫秒数。

cluster-port

该端口是集群总线监听 TCP 连接的端口,默认配置为 ​​cluster-port 0​​,我就会把端口绑定为客户端命令端口 + 10000(客户端端口默认 6379,所以绑定为 16379 作为集群总线端口)。每个 Redis Cluster 节点都需要开放两个端口:

  • 一个用于服务于客户端的 TCP 端口,比如 6379.
  • 另一个称为集群总线端口,节点使用集群总线进行故障监测、配置更新、故障转移等。客户端不要与集群总线端口通信,另外请确保在防火墙打开这两个端口,否则 Redis 集群接地那将无法通信。

cluster-replica-validity-factor

该配置用于决定当 Redis Cluster 集群中,一个 master 宕机后,如何选择一个 slave 节点完成故障转移自动恢复(failover)。如果设置为 0 ,则不管 slave 与 master 之间断开多久,都认为自己有资格成为 master。

下面提供了两种方式来评估 slave 的数据是否太旧。

  • 如果有多个 slave 可以 failover,他们之间会通过交换信息选出拥有拥有最大复制 offset 的 slave 节点。
  • 每个 slave 节点计算上次与 master 节点交互的时间,这个交互包含最后一次​​ping​​ 操作、master 节点传输过来的写指令、上次可 master 断开的时间等。如果上次交互的时间过去很久,那么这个节点就不会发起 failover。

针对第二点,交互时间可以通过配置定义,如果 slave 与 master 上次交互的时间大于 ​​(node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period​​,该 slave 就不会发生 failover。

例如,``node-timeout = 30​​ 秒,​​cluster-replica-validity-factor=10​​,​​repl-ping-slave-period=10`秒, 表示slave节点与master节点上次交互时间已经过去了310秒,那么slave节点就不会做failover。

调大 ​​cluster-replica-validity-factor​​ 则允许存储过旧数据的 slave 节点提升为 master,调小的话可能会导致没有 slave 节点可以升为 master 节点。

考虑高可用,建议大家设置为 cluster-replica-validity-factor 0​。

cluster-migration-barrier

没有 slave 节点的 master 节点称为孤儿 master节点,这个配置就是用于防止出现裸奔的 master。

当某个 master 的 slave 节点宕机后,集群会从其他 master 中选出一个富余的 slave 节点迁移过来,确保每个 master 节点至少有一个 slave 节点,防止当孤立 master 节点宕机时,没有slave节点可以升为 master 导致集群不可用。

默认配置为 ​​cluster-migration-barrier 1​​,是一个迁移临界值。

含义是:迁移后 master 节点至少还有 1 个 slave 节点才能做迁移操作。比如 master A 节点有2个以上 slave 节点 ,当集群出现孤儿 master B 节点时,A 节点富余的 slave 节点可以迁移到 master B 节点上。

生产环境建议维持默认值,最大可能保证高可用,设置为非常大的值或者配置 ​​cluster-allow-replica-migration no​​ 禁用自动迁移功能。

​cluster-allow-replica-migration​​ 默认配置为 yes,表示允许自动迁移。

cluster-require-full-coverage

默认配置是 ​​yes​​,表示为当 redis cluster 发现至少还有一个 哈希槽没有被分配时禁止查询操作。

这就会导致集群部分宕机,整个集群就不可用了,当所有哈希槽都有分配,集群会自动变为可用状态。

如果你希望 cluster 的子集依然可用,配置成 ​​cluster-require-full-coverage yes​​。

cluster-replica-no-failover

默认配置为 ​​no​​,当配置成 ​​yes​​,在master 宕机时,slave 不会做故障转移升为 master。

这个配置在多数据中心的情况下会很有用,你可能希望某个数据中心永远不要升级为 master 节点,否则 master 节点就漂移到其他数据中心了。

cluster-allow-reads-when-down

默认是 ​​no​​,表示当集群因主节点数量达不到最小值或者哈希槽没有完全分配而被标记为失效时,节点将停止所有客户端请求。

设置成 ​​yes​​,则允许集群失效的情况下依然可从节点中读取数据,保证了高可用。

cluster-allow-pubsubshard-when-down

配置成 ​​yes​​,表示当集群因主节点数量达不到最小值或者哈希槽没有完全分配而被标记为失效时,pub/sub 依然可以正常运行。

cluster-link-sendbuf-limit

设置每个集群总线连接的发送字节缓冲区的内存使用限制,超过限制缓冲区将被清空(主要为了防止发送缓冲区发送给慢速连接时无限延长时间的问题)。

默认禁用,建议最小设置1gb,这样默认情况下集群连接缓冲区可以容纳至少一pubsub消息(client-query-buffer-limit 默认是1gb);

©著作权归作者所有:来自51CTO博客作者小二上酒8的原创作品,请联系作者获取转载授权,否则将追究法律责任

redis ”高级“应用场景 -- 限流、延时队列、幂等处理_wx630f055ce23fc的博客-多极客编程

🎨本篇脑图速览🎯🎈Redis限流是怎么做的?固定窗口计数固定窗口计数是指,假设我们的限流规则是:1min内最多只能访问10次,那么固定窗口就是固定了【 1min-2min】这个窗口内,只能有10次访问 ,相应的我们就要给这个窗口维护一个计数器。 为了节省空间,其实我们不需要维护一个个窗口,只需要维护当前访问时间所在的窗口即可,以及对应的计数器,当新的访问到达了下一个窗口时,则计数器重置即可。red

like模糊匹配查询慢解决之道——mysql全文索引_wx630f055ce23fc的博客-多极客编程

需求需要模糊匹配查询一个单词select * from t_phrase where LOCATE('昌',phrase) = 0;select * from t_chinese_phrase where instr(phrase,'昌') > 0;select * from t_chinese_phrase where phrase like '%昌%'explain一下看看执行计划由ex

为什么单线程的redis那么快?_wx630f055ce23fc的博客-多极客编程

1\. Redis单线程的本质其实,​​Redis​​并不是单线程,我们之所以会一直称​​Redis​​是单线程,这是因为​​Redis​​在处理客户端的读写请求时,只有一个主线程,而在处理以下这些操作时,​​Redis​​会​​fork​​出其他的子线程来处理:主从数据同步切片集群数据同步过期键值异步删除AOF或RDB持久化所以整体来看​​Redis​​并不是单线程。在​​Redis6.0​​中

spring boot + redis 实现分布式锁,还有谁不会??_码农小宋的博客-多极客编程

一、业务背景有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。二、分析流程使用 ​​Redis​​ 作为分布式锁,将锁的状态放到 ​​Redis​​ 统一维护,解决集群中单机 ​​JVM​​ 信息不互通的问题,规定操作顺序,保护用户的数据正确。梳理设计流程新建注解 @interface,在注解里设定入参标志增加 AOP 切点,扫描特

redis的数据存储及string类型的实现_wx630f055ce23fc的博客-多极客编程

1 引言Redis作为基于内存的非关系型的K-V数据库。因读写响应快速、原子操作、提供了多种数据类型String、List、Hash、Set、Sorted Set、在项目中有着广泛的使用,今天我们来探讨下下Redis的数据结构是如何实现的。2 数据存储2.1 RedisDBRedis将数据存储在redisDb中,默认0~15共16个db。每个库都是独立的空间,不必担心key冲突问题,可通过sele

百度工程师教你玩转设计模式(适配器模式)_百度geek说的博客-多极客编程

作者 | 北极星小组在现实生活中,经常会遇到两个“对象” 因为接口不兼容而不能一起工作的场景,这时需要第三者进行适配,如:国内的充电线插头不一定适用国外的插座需要借助转接头、SD卡无法直接链接电脑需要借助读卡器、用直流电的笔记本电脑接交流电源时需要一个电源适配器等。在软件设计中,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很

【python基础学习】第十五节 类与继承(类与继承,这一篇就足够了)_这么神奇的博客-多极客编程

Python基础学习之类与继承 1. 面向对象 名词解释 类(Class): 用来描述具有相同的属性和方法的对象的集合。类中定义了类对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数,被称为:方法。 属性:类中的类变量,我感觉都可以被叫做属性。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 对象:对象是类的实例。对象包括两

redis ”高级“应用场景 -- 限流、延时队列、幂等处理_wx630f055ce23fc的博客-多极客编程

🎨本篇脑图速览🎯🎈Redis限流是怎么做的?固定窗口计数固定窗口计数是指,假设我们的限流规则是:1min内最多只能访问10次,那么固定窗口就是固定了【 1min-2min】这个窗口内,只能有10次访问 ,相应的我们就要给这个窗口维护一个计数器。 为了节省空间,其实我们不需要维护一个个窗口,只需要维护当前访问时间所在的窗口即可,以及对应的计数器,当新的访问到达了下一个窗口时,则计数器重置即可。red

like模糊匹配查询慢解决之道——mysql全文索引_wx630f055ce23fc的博客-多极客编程

需求需要模糊匹配查询一个单词select * from t_phrase where LOCATE('昌',phrase) = 0;select * from t_chinese_phrase where instr(phrase,'昌') > 0;select * from t_chinese_phrase where phrase like '%昌%'explain一下看看执行计划由ex

spring boot + redis 实现分布式锁,还有谁不会??_码农小宋的博客-多极客编程

一、业务背景有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。二、分析流程使用 ​​Redis​​ 作为分布式锁,将锁的状态放到 ​​Redis​​ 统一维护,解决集群中单机 ​​JVM​​ 信息不互通的问题,规定操作顺序,保护用户的数据正确。梳理设计流程新建注解 @interface,在注解里设定入参标志增加 AOP 切点,扫描特

redis的数据存储及string类型的实现_wx630f055ce23fc的博客-多极客编程

1 引言Redis作为基于内存的非关系型的K-V数据库。因读写响应快速、原子操作、提供了多种数据类型String、List、Hash、Set、Sorted Set、在项目中有着广泛的使用,今天我们来探讨下下Redis的数据结构是如何实现的。2 数据存储2.1 RedisDBRedis将数据存储在redisDb中,默认0~15共16个db。每个库都是独立的空间,不必担心key冲突问题,可通过sele

栈和队列不分家_玄鸟轩墨的博客-多极客编程

写在前面对于我个人来说,我会把数据机构初阶分为三个台阶,今天谈的和之前谈的是一个阶段,后面的二叉树一个,排序一个.栈和队列也同样是我们后面模拟实现二叉树递归和广度遍历的基础,这个算是一个过渡的内容,在博客后面我们会谈一个循环队列的实现,这个主要会在选择题中出现.Stack一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元