Redis-复制功能

news2024/9/23 11:25:33

    0 序言 

     复制功能是Redis提供的多机功能中最基础的一个,这个功能是通过主从复制(master-slave replication)模式实现的,它允许用户为存储着目标数据库的服务器创建出多个拥有相同数据库副本的服务器,其中存储目标数据库的服务器被称为主服务器(master server),而存储数据库副本的服务器则被称为从服务器(slave server,或者称为replica)。

Redis的复制功能可以从性能、安全性和可用性3个方面提升整个Redis系统:

●首先,在性能方面,Redis的复制功能可以给系统的读性能带来线性级别的提升。从理论上来说,用户每增加一倍数量的从服务器,整个系统的读性能就会提升一倍。 

●其次,通过增加从服务器的数量,用户可以降低系统在遭遇灾难故障时丢失数据的可能性。具体来说,如果用户只有一台服务器存储着目标数据库,那么当这个服务器遭遇灾难故障时,目标数据库很有可能会随着服务器故障而丢失。但如果用户为Redis服务器(即主服务器)设置了从服务器,那么即使主服务器遭遇灾难故障,用户也可以通过从服务器访问数据库。从服务器的数量越多,因为主服务器遭遇灾难故障而出现数据库丢失的可能性就越低。

●最后,通过同时使用Redis的复制功能和Sentinel功能,用户可以为整个Redis系统提供高可用特性。具有这一特性的Redis系统在主服务器停机时,将会自动挑选一个从服务器作为新的主服务器,以此来继续为客户提供服务,避免造成整个系统停机。

1 REPLICAOF:将服务器设置为从服务器

Redis 5.0.0之前的版本,使用SLAVEOF命令

        SLAVEOF host port

从5.0.0版本开始,Redis正式将SLAVEOF命令改名为REPLICAOF命令

        REPLICAOF host port

命令的host参数用于指定主服务器的地址,而port参数则用于指定主服务器的端口号。

在接收到REPLICAOF命令之后,主从服务器将执行数据同步操作:从服务器原有的数据将被清空,取而代之的是主服务器传送过来的数据副本。数据同步完成之后,主从服务器将拥有相同的数据。

1.1  通过配置选项设置从服务器

在从服务器的配置文件中,添加:

        replicaof <host> <port>

从服务器启动时,将自动设置。

1.2 取消复制

在使用REPLICAOF命令或者replicaof配置选项将一个服务器设置为从服务器之后,我们可以通过执行以下命令,让从服务器停止复制,重新变回主服务器:

        REPLICAOF no one

服务器在停止复制之后不会清空数据库,而是会继续保留复制产生的所有数据。

2 ROLE:查看服务器的角色

可以通过执行ROLE命令来查看服务器当前担任的角色:

ROLE

2.1 主服务器执行ROLE命令 

如果执行ROLE命令的是主服务器,那么命令将返回一个由3个元素组成的数组作为结果:

●数组的第1个元素是字符串"master",它表示这个服务器的角色为主服务器。

●数组的第2个元素是这个主服务器的复制偏移量(replication offset),它是一个整数,记录了主服务器目前向复制数据流发送的数据数量。

●数组的第3个元素是一个数组,它记录了这个主服务器属下的所有从服务器。这个数组的每个元素都由3个子元素组成,第1个子元素为从服务器的IP地址,第2个子元素为从服务器的端口号,而第3个子元素则为从服务器的复制偏移量。从服务器的复制偏移量记录了从服务器通过复制数据流接收到的复制数据数量,当从服务器的复制偏移量与主服务器的复制偏移量保持一致时,它们的数据就是一致的。

2.2  从服务器执行ROLE命令

如果执行ROLE命令的是从服务器,那么命令将返回一个由5个元素组成的数组作为结果:

●数组的第1个元素是字符串"slave",它表示这个服务器的角色是从服务器。

●数组的第2个元素和第3个元素记录了这个从服务器正在复制的主服务器的IP地址和端口号。

●数组的第4个元素是主服务器与从服务器当前的连接状态,这个状态的值及其表示的意义如下:○"none":主从服务器尚未建立连接。○"connect":主从服务器正在握手。○"connecting":主从服务器成功建立了连接。○"sync":主从服务器正在进行数据同步。○"connected":主从服务器已经进入在线更新状态。○"unknown":主从服务器连接状态未知。

●数组的第5个元素是从服务器当前的复制偏移量。

3 数据同步

当用户将一个服务器设置为从服务器,让它去复制另一个服务器的时候,主从服务器需要通过数据同步机制来让两个服务器的数据库状态保持一致。

3.1 完整同步

当一个Redis服务器接收到REPLICAOF命令,开始对另一个服务器进行复制的时候,主从服务器会执行以下操作:

1)主服务器执行BGSAVE命令,生成一个RDB文件,并使用缓冲区存储起在BGSAVE命令之后执行的所有写命令。

2)当RDB文件创建完毕,主服务器会通过套接字将RDB文件传送给从服务器。

3)从服务器在接收完主服务器传送过来的RDB文件之后,就会载入这个RDB文件,从而获得主服务器在执行BGSAVE命令时的所有数据。

4)当从服务器完成RDB文件载入操作,并开始上线接受命令请求时,主服务器就会把之前存储在缓存区中的所有写命令发送给从服务器执行。因为主服务器存储的写命令都是在执行BGSAVE命令之后执行的,所以当从服务器载入完RDB文件,并执行完主服务器存储在缓冲区中的所有写命令之后,主从服务器包含的数据库数据将完全相同。

这个通过创建、传送并载入RDB文件来达成数据一致的步骤,我们称之为完整同步操作。每个从服务器在刚开始进行复制的时候,都需要与主服务器进行一次完整同步。

3.2 在线更新

主从服务器在执行完完整同步操作之后,它们的数据就达到了一致状态,但这种一致并不是永久的:每当主服务器执行了新的写命令之后,它的数据库就会被改变,这时主从服务器的数据一致性就会被破坏。

为了让主从服务器的数据一致性可以保持下去,让它们一直拥有相同的数据,Redis会对从服务器进行在线更新:

●每当主服务器执行完一个写命令之后,它就会将相同的写命令或者具有相同效果的写命令发送给从服务器执行。

●因为完整同步之后的主从服务器在执行最新出现的写命令之前,两者的数据库是完全相同的,而导致两者数据库出现不一致的正是最新被执行的写命令,因此从服务器只要接收并执行主服务器发来的写命令,就可以让自己的数据库重新与主服务器数据库保持一致。

只要从服务器一直与主服务器保持连接,在线更新操作就会不断进行,使得从服务器的数据库可以一直被更新,并与主服务器的数据库保持一致。

3.3 部分同步

当因故障下线的从服务器重新上线时,主从服务器的数据通常已经不再一致,因此它们必须重新进行同步,让两者的数据库再次回到一致状态。

●当一个Redis服务器成为另一个服务器的主服务器时,它会把每个被执行的写命令都记录到一个特定长度的先进先出队列中。

●当断线的从服务器尝试重新连接主服务器的时候,主服务器将检查从服务器断线期间,被执行的那些写命令是否仍然保存在队列里面。如果是,那么主服务器就会直接把从服务器缺失的那些写命令发送给从服务器执行,从服务器通过执行这些写命令就可以重新与主服务器保持一致,这样就避免了重新进行完整同步的麻烦。

●如果从服务器缺失的那些写命令已经不存在于队列当中,那么主从服务器将进行一次完整同步。

Redis为这个队列设置的默认大小为1MB,用户也可以根据自己的需要,通过配置选项repl-backlog-size来修改这个队列的大小。

4 无须硬盘的复制

,主服务器在进行完整同步的时候,需要在本地创建RDB文件,然后通过套接字将这个RDB文件传送给从服务器。但是,如果主服务器所在宿主机器的硬盘负载非常大或者性能不佳,那么创建RDB文件引起的大量硬盘写入将对主服务器的性能造成影响,并导致复制进程变慢。

使用无须硬盘的复制特性,我们只需要将repl-diskless-sync配置选项的值设置为yes即可:

        repl-diskless-sync <yes|no>

启用了这个特性的主服务器在接收到REPLICAOF命令时将不会再在本地创建RDB文件,而是会派生出一个子进程,然后由子进程通过套接字直接将RDB文件写入从服务器。这样主服务器就可以在不创建RDB文件的情况下,完成与从服务器的数据同步。

无须硬盘的复制特性只是避免了在主服务器上创建RDB文件,但仍然需要在从服务器上创建RDB文件。

5 降低数据不一致情况出现的概率

,因为复制的在线更新操作以异步方式进行,所以当主从服务器之间的连接不稳定,或者从服务器未能收到主服务器发送的更新命令时,主从服务器就会出现数据不一致的情况。

为了尽可能地降低数据不一致的出现概率,以min-replicas开头的配置选项:

        min-replicas-max-lag <seconds>//成功通信间隔

       min-replicas-to-write <numbers>//从服务器个数

同时不满足上述两个条件的话,会执行在线更新。

6 可写的从服务器

Redis的从服务器在默认状态下只允许执行读命令。Redis之所以将从服务器默认设置为只读服务器,是为了确保从服务器只能通过与主服务器进行数据同步来得到更新,从而保证主从服务器之间的数据一致性。

可以通过将replica-read-only配置选项的值设置为no来打开从服务器的写功能:

        replica-read-only <yes|no>

从服务器写的命令,可能会被主服务器覆盖,并且在进行完整同步时,从服务器独特的数据会被清空。

为了避免主从服务器冲突,一个比较简单的方法是在客户端向从服务器写入数据的同时,为数据设置一个比较短的过期时间,使得这些数据可以在使用完毕之后自动被删除。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们&#xff0c;今天给大家分享一篇stack、queue模拟…

Kubernetes operator系列:webhook 知识学习【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

【大厂AI课学习笔记NO.80】深度学习行业人才能力图谱

深度学习领域的就业岗位及所需关键技术、工具、能力分析 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来得到了飞速的发展。随着技术的不断进步和应用场景的不断拓展&#xff0c;深度学习领域的就业岗位也日益增多。本文将从领军人才、产业研发人才、应用开发人才…

Lombok原理及实例(Java) - 简化JavaBean开发

Lombok 1.作用:简化javabean开发 2.使用:a.下插件 -> 如果是idea2022不用下载了,自带b.导lombok的jar包c.修改设置 1.lombok介绍 Lombok通过增加一些“处理程序”&#xff0c;可以让javabean变得简洁、快速。 Lombok能以注解形式来简化java代码&#xff0c;提高开发效…

HttpServer整合模块设计与实现(http模块五)

目录 类功能 类定义 类实现 编译测试 源码路标 类功能 类定义 // HttpServer模块功能设计 class HttpServer { private:using Handler std::function<void(const HttpRequest &, HttpResponse &)>;std::unordered_map<std::string, Handler> _get_r…

JS实现漂浮广告案例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>漂浮广告</title><style>#link {…

每日一练:LeeCode-209、长度最小的子数组【滑动窗口+双指针】

每日一练&#xff1a;LeeCode-209、长度最小的子数组【滑动窗口双指针】 思路暴⼒解法滑动窗口 本文是力扣 每日一练&#xff1a;LeeCode-209、长度最小的子数组【滑动窗口双指针】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐 L…

css超出部分显示省略号

目录 前言 一、CSS单行实现 二、CSS多行实现&#xff08;CSS3出的&#xff0c;兼容性需要注意&#xff09; 三、微信小程序超过2行出现省略号实现 四、JavaScript脚本实现 前言 CSS文本溢出就显示省略号&#xff0c;就是在样式中指定了盒子的宽度与高度,有可能出现某些内…

BUGKU-WEB shell

题目描述 题目截图如下&#xff1a; 描述&#xff1a; $poc "a#s#s#e#r#t";$poc_1 explode("#", $poc);$poc_2 $poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];$poc_2($_GET[s])进入场景看看&#xff1a;是一个空白的界面 解题思路 …

基于51单片机的智能浇花系统的设计与实现

项目介绍 本设计是基于51系列单片机而设计的智能浇花系统&#xff0c;本系统结合单片机编程技术、传感器技术以及GSM通信技术实现系统基本功能&#xff0c;使系统根据不一样的土壤湿度&#xff0c;能够相应的改变浇水要求。本系统主要由湿度显示模块、湿度设置模块、湿度采集模…

第六届上海国际垃圾焚烧发电展将于12月11-13日上海举办

第六届上海国际垃圾焚烧发电暨固废处理技术展览会 2024年12月11-13日 上海新国际博览中心 主办单位&#xff1a;中华环保联合会 废弃物发电专委会 支持单位&#xff1a;垃圾焚烧技术与装备国家工程实验室 承办单位&#xff1a;上海怡涵展览服务有限公司 展会介绍&#xff1a…

男人圣经 7

男人圣经 7 高逼格长期目标的行动飞轮1. 品牌价值和声誉2. 人脉网络和关系3. 企业文化和价值观4. 专有技术和知识产权5. 管理经验和专业知识 为什么只追求高经济、高科技&#xff1f;为什么说道德仁义是表面&#xff0c;而利益才是一切背后的真相&#xff1f; 高逼格长期目标的…

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

【微服务学习笔记&#xff08;一&#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…

部署快捷、使用简单、推理高效!大模型部署和推理框架 Xinference 来了!

今天为大家介绍一款大语言模型&#xff08;LLM&#xff09;部署和推理工具——Xinference[1]&#xff0c;其特点是部署快捷、使用简单、推理高效&#xff0c;并且支持多种形式的开源模型&#xff0c;还提供了 WebGUI 界面和 API 接口&#xff0c;方便用户进行模型部署和推理。 …

LORA_ LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

paper: https://arxiv.org/pdf/2106.09685.pdf code: https://github.com/microsoft/LoRA 摘要 作者提出了低秩自适应&#xff0c;或称LoRA&#xff0c;它冻结了预先训练的模型权值&#xff0c;并将可训练的秩分解矩阵注入变压器架构的每一层&#xff0c;大大减少了下游任务的…

金山办公内推

作为金山办公刚刚校招等待入职的一员&#xff0c;我诚挚地邀请您加入我的内推计划&#xff0c;与我一起共同打造卓越的工作环境和未来。 我能帮你 &#xff08;与直接填我的内推码不同&#xff0c;我直接通过内部问卷帮你投&#xff09; 1&#xff0c;直接通过校招群里的连接…

提交数据加快百度搜索引擎收录

百度站长工具做了更新&#xff0c;百度收录的地址分享如下&#xff0c;新站点提交后&#xff0c;可以加快百度收录。 普通收录_加快网站内容抓取&#xff0c;快速提交数据工具_站长工具_网站支持_百度搜索资源平台普通收录工具可实时向百度推送数据&#xff0c;创建并提交site…

Android应用Java开发规范

常规编程 魔法值与魔法数字 1.【强制】不允许任何魔法值&#xff08;即未经预先定义的常量&#xff09;直接出现在代码中。 反例&#xff1a; // 开发者 A 定义了缓存的 key。 String key "Id#taobao_" tradeId; cache.put(key, value); // 开发者 B 使用缓…

香港优才计划子女读书内地高考政策解读,3个黄金年龄段不要错过!

香港优才计划子女读书内地高考政策解读&#xff0c;3个黄金年龄段不要错过&#xff01; 孩子年龄多大&#xff0c;适合办理香港身份&#xff1f; 关注子女教育的家长们&#xff0c;应该对于“孩子有了香港身份&#xff0c;400分轻松上名校”的说法都有耳闻&#xff0c;但很少有…

altgraph的安装和用途说明

前言 altgraph 是 graphlib 的一个分支&#xff1a;一个图&#xff08;网络&#xff09;包&#xff0c;用于构建图、BFS 和 DFS 遍历、拓扑排序、最短路径等&#xff0c;带有 graphviz 输出。 安装 pip install altgraph 函数和用例 生物链 from altgraph import Graph# 定…