Redis轻松添加从节点:零阻塞、零烦恼,系统性能再飙升

点击上方蓝字关注我

09d889c6c249d65ab0b1ed3cbd1cdeac.png

生成环境的Redis有时需要替换或添加从节点,如果此时主库较大,添加从节点时将可能因为主节点在做bgsave数据备份时使得主库压力大,从而引起其他操作变慢,进而出现阻塞等操作。那么有什么方法可以尽最大程度地减少对主节点的阻塞和影响呢?

1.   措施

当向Redis主节点添加从节点时,可以采取以下措施以最大程度地减少对主节点的阻塞和影响:

  • 使用初始同步:在添加从节点之前,可以先使用初始同步功能将主节点的数据复制到从节点。这样,在将从节点添加到主节点之前,从节点已经具有与主节点相同的数据集。通过这种方式,可以避免在添加从节点时对主节点进行复制,减少对主节点的阻塞。

  • 使用复制积压缓冲区:Redis提供了复制积压缓冲区(repl-backlog)的配置选项。通过适当调整该选项的大小,可以在添加从节点时允许主节点保存一定数量的复制命令,而不会阻塞主节点。复制积压缓冲区可以在一定程度上缓解主节点与从节点之间的网络延迟和传输速率不匹配的问题。

  • 配置合理的复制延迟:可以通过调整从节点的复制延迟(replica-replica-lag)来减轻主节点的压力。将复制延迟设置为适当的值,可以使从节点稍微滞后于主节点,从而减少对主节点的复制负载。

  • 增加主节点的资源:如果主节点的负载较重,而添加从节点会进一步加重主节点的负担,可以考虑增加主节点的资源,如增加内存、CPU等。这样可以提高主节点的处理能力,使其能够更好地处理复制请求和其他客户端请求。

  • 控制并发复制连接数:可以通过限制从节点的并发复制连接数,以控制对主节点的并发复制请求。通过适当设置最大连接数,可以确保主节点不会过载。

  • 调整其他复制相关参数: 通过加大复制相关参数的值,可以使得在大数据量复制过程中不会因为时间过长或数据在缓冲区中被刷掉导致初始化失败。

2.  具体操作

2.1  配置复制积压缓冲区

通过配置复制积压缓冲区大小,我们可以在添加从节点时缓解主从节点之间的网络延迟。

在主节点的redis.conf文件中添加以下配置:

repl-backlog-size 10mb  # 适当调整大小,根据需求设置

或 通过config set 命令进行设置

config set repl-backlog-size 10mb

这个缓冲区将保存历史复制数据,确保即使在添加从节点期间也能保留完整的复制记录。

2.2  配置复制延迟

调整从节点的复制延迟,以确保从节点稍微滞后于主节点,减轻主节点的复制压力。执行以下命令:

CONFIG SET replica-replica-lag 5  # 适当调整延迟时间

这样可以确保从节点不会对主节点造成过大的负担。

2.3 增加主节点资源

如果主节点负载较重,考虑增加主节点的资源。增加内存、CPU等可以提高主节点的处理能力,使其更好地处理复制请求和其他客户端请求。不过,在现实情况下,一般没有操作空间,因为主库主机在使用,无法扩容CPU或内存(非绝对,有的虚拟化方式可以做到在线扩容)

2.4 控制并发复制连接数

通过限制从节点的并发复制连接数,可以避免主节点过载。在从节点上执行以下命令:

CONFIG SET replica-max-replication-jobs 5  # 适当调整连接数

这有助于确保添加从节点时的流量控制,避免对主节点的并发请求过多。

2.5 从节点的磁盘写入延迟

通过配置repl-diskless-sync-delay参数,可以调整从节点在同步期间的磁盘写入频率。这对于降低从节点对磁盘的写入负载很有帮助。

CONFIG SET repl-diskless-sync-delay 5  # 适当调整延迟时间

2.6 从节点的最大内存限制

Redis从节点可以配置一个最大使用的内存量,以确保不会占用过多系统资源。

CONFIG SET maxmemory 8gb  # 适当调整内存限制

2.7  从节连接超时时间设置

根据系统的需要,你可能需要调整从节点的连接超时等设置。

CONFIG SET repl-timeout 60  # 适当调整超时时间

2.8 从节点检活时间修改

repl-ping-slave-period:该参数定义主节点定期检查从节点是否存活的时间间隔。增加这个间隔可能减轻主节点的负载,但会使主从节点之间的同步变得更加滞后。

CONFIG SET repl-ping-slave-period 60  # 适当调整间隔时间

2.9 复制积压缓冲区存活时间

repl-backlog-ttl:该参数定义复制积压缓冲区中数据的最大存活时间。适当调整可以在一定程度上控制主从节点之间的延迟。

CONFIG SET repl-backlog-ttl 3600  # 适当调整 TTL 时间

2.10 repl-disable-tcp-nodelay:

默认情况下,Redis使用TCP_NODELAY选项来减少传输延迟。但在某些情况下,你可能希望禁用这个选项以减轻网络负担。

CONFIG SET repl-disable-tcp-nodelay yes

2.11 复制刷盘同步参数设置

repl-diskless-sync:在磁盘同步时,Redis默认会写入一个临时文件。通过启用磁盘同步,你可以选择避免写入磁盘。

CONFIG SET repl-diskless-sync yes

2.12 从节点写入延迟

涉及min-replicas-to-write和min-replicas-max-lag,这两个参数用于在高可用性(HA)设置中,定义最小数量的从节点确认写入操作以及最大的允许延迟。

CONFIG SET min-replicas-to-write 3
CONFIG SET min-replicas-max-lag 10

3.  建议

Redis 单个实例内存使用过大可能会导致系统性能下降,甚至影响整个系统的稳定性。以下是一些方式可以避免Redis单个实例内存使用过大:

  • 设置合理的过期时间:如果你的数据集中有很多过期的键,确保设置了合理的过期时间,以便Redis可以自动清理不再需要的键。使用 EXPIRE 命令或在 SET 命令中添加 EX 选项来设置过期时间。

  • 优化数据结构:选择适当的数据结构,以减小存储空间。例如,如果可以使用 HASH 代替 STRING,或者使用 ZSET 代替 SET,就可以有效地减小内存占用。

  • 使用合理的数据存储方式:使用 HASH 或 ZSET 等数据结构存储多个相关字段,而不是使用多个独立的 STRING 类型。这可以减少内存的开销。

  • 启用压缩功能:Redis 6.0 以后的版本支持对字符串进行压缩。启用压缩可以减小存储空间,特别是当存储的是文本数据时。

# 在redis.conf文件中启用压缩
activate-key-compression yes
  • 分片(Sharding):将数据分散到多个Redis实例中,以减小每个实例的内存使用。这种方式需要对应用程序进行修改以支持分片。

  • 使用内存淘汰策略:Redis 提供了多种内存淘汰策略,例如 volatile-lru、allkeys-lru、volatile-ttl 等。选择适合你业务场景的淘汰策略,确保及时清理不再需要的键。

  • 限制每个数据集的大小:设置 maxmemory 参数,限制Redis使用的内存总量。当内存达到这个限制时,Redis会根据所配置的淘汰策略自动删除一些键。

# 在redis.conf文件中设置最大内存限制


maxmemory 8gb
  • 做好监控和优化:定期监控Redis的内存使用情况,使用Redis自带的 INFO 命令或者监控工具。根据监控结果,及时采取优化措施。

51d15022fbc1b7ea2979c3e7b818aabf.png

往期精彩回顾

1.  MySQL高可用之MHA集群部署

2.  mysql8.0新增用户及加密规则修改的那些事

3.  比hive快10倍的大数据查询利器-- presto

4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

5.  PostgreSQL主从复制--物理复制

6.  MySQL传统点位复制在线转为GTID模式复制

7.  MySQL敏感数据加密及解密

8.  MySQL数据备份及还原(一)

9.  MySQL数据备份及还原(二)

33b9624e73f156af70dbf7270b17385d.png

扫码关注     

ed153886dc3ce958c448159a88aa096b.jpeg

81a09d315bf19cd363c66db8fb43fdd8.png

4071e0a60c0068cbfc63bf66afbeb303.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/170254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针(pointers to pointers) 四、函数传值以及传引用 1.局部变量 2.从存储地…

【ctfshow】web入门-信息搜集-web21~28

SSS web21_爆破什么的,都是基操web22_域名也可以爆破的,试试爆破这个ctf.show的子域名web23_还爆破?这么多代码,告辞!web24_爆个🔨web25_爆个🔨,不爆了web26_这个可以爆web27_CTFsho…

软件测试之测试用例的设计

1. 测试用例的概念 软件测试人员向被测试系统提供的一组数据的集合,包括 测试环境、测试步骤、测试数据、预期结果 2. 为什么在测试前要设计测试用例 测试用例是执行测试的依据 在回归测试的时候可以进行复用 是自动化测试编写测试脚本的依据 衡量需求的覆盖率…

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7) 前面分析了身体的方向,在这里继续QuantizeFacingsFromSequence属性,这个属性就是通过序列定义文件里获取身体的方向。 根据前面分析可知,同样有一个信息类QuantizeFacingsFromSequenceInfo: [Desc("Deriv…

基于安卓android微信小程序美容理发店预约系统app

项目介绍 为美容院设计一个系统以减少员工的工作量就成为了想法的初始状态。紧接着对美容院进行进一步的调查发现我的想法已然落后。基本上每个美容院都以有了自己的信息系统,并且做的已经较完善了。 在这时我突然想到,现在关注美容养生的人越来越多&am…

Windows 安装 Docker Compose

目录 前言什么是 Docker Compose ?安装 Docker Compose配置环境变量结语开源项目 前言 在当今软件开发和部署领域,容器化技术的应用已成为提高效率和系统可移植性的关键手段。Docker,作为领先的容器化平台,为开发人员提供了轻松构…

MobaXterm如何连接CentOS7的Linux虚拟机?Redis可视化客户端工具如何连接Linux版Redis?

一、打开Lunix虚拟机,进入虚拟机中,在终端中输入ifconfig,得到以下信息,红框中为ip地址 二、打开MobaXterm,点击session 选择SSH,在Remote host中输入linux得到的IP地址,Specify username中可起一个任意的连接名称。 输入密码 四、…

RoCE、IB和TCP等网络的基本知识及差异对比

目前有三种RDMA网络,分别是Infiniband、RoCE(RDMA over Converged Ethernet)、iWARP。 其中,Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输 ,技术先进,但是成本高昂。 而RoCE 和 iWARP都是基于以太网的…

leetcode数据结构与算法刷题(三)

目录 第一题 交叉链表 思想: 注意点 第一步先求两个链表的长度 第二步 让长的先走,当长短一样时一起走。 犯错点 第二题 判断是有环 思想: 注意 错误分享 第三题(重点面试题) 思路: 这题面试问题&a…

InnoDB 的一次更新事务是怎么实现的?

大体流程: 步骤: 1.加载数据到缓存中(Buffer Pool): 在进行数据更新时,InnoDB首先会在缓冲池(Buffer Pool)中查找该记录是否已经在内存中。如果记录不在内存中,会将需要更新的数据…

java学习part06数组工具类

1比较内容 2输出信息 3值填充 4快速排序 5二分查找 负数没找到,其他表示下标

Redis常用的八种场景

作为一名 Java后端人员,对 Redis肯定并不陌生,Redis作为一种内存数据库,以其速度之快在编程的舞台上纵横多年,那么,Redis到底适合哪些业务场景?今天就来聊一聊。 1. 缓存/数据库 缓存(Cache&am…

ESP32 http 请求

目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…

校园报修抢修小程序系统开发 物业小区报修预约上门维修工单系统

开发的功能模块有: 1.报修工单提交:学生、教职员工等可以使用小程序提交报修请求。这通常包括选择报修的问题类型(如水漏、电器故障、照明问题等),地点,报修联系人,联系电话等,并提供…

C语言——I /深入理解指针(一)

一、内存和地址 1byte(字节) 8bit(比特位) 1KB 1024byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB一个比特位可以存放二进制的0/1的一位 ⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为…

Java学习day14:权限修饰符,集合(知识点+例题详解)

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) 往期回顾 Java学习day13:泛型&…

kettle创建数据库资源库kettle repository manager

数据库资源库是将作业和转换相关的信息存储在数据库中,执行的时候直接去数据库读取信息,很容易跨平台使用。 创建数据库资源库,如图 1.点击Connect 2.点击Repository Manager 3.点击Other Repository 4.点击Database Repository 在选择Ot…

Selenium IDE录制脚本

文章目录 1.环境搭建1.1 Chrome浏览器安装1.2 Chrome驱动安装1.3 Selenium IDE插件的安装 2.Selenium IDE插件介绍2.1 初始化界面2.2 菜单栏2.3 工具栏2.4 地址栏2.5 测试用例窗口2.6 测试脚本窗口2.7 日志和引用窗口 3.元素定位3.1 通过id进行元素定位3.2 通过name进行元素定位…

听GPT 讲Rust源代码--src/bootstrap

图片来自 使用rust的image库进行图片压缩[1] File: rust/src/bootstrap/build.rs 在Rust源代码中,rust/src/bootstrap/build.rs这个文件是一个构建脚本。构建脚本是一个在编译Rust编译器本身时运行的程序,它用于初始化和配置Rust编译器的构建过程。build…

数据结构【栈】

文章目录 数据结构 栈栈的概念与结构栈接口实现 数据结构 栈 栈的概念与结构 栈是是一种特殊的线性表,栈的规定是只在一端插入删除数据,插入删除的一端叫做栈顶,另一端叫栈底。根据上面的特性,栈的数据是后入先出 栈接口实现 栈接…