我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis中如何实现主从复制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis中如何实现主从复制

Redis中如何实现主从复制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Redis复制概论

数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常由被复制方和复制方组成,被复制方和复制方之间建立网络连接,复制方式通常为被复制方主动将数据发送到复制方,复制方接收到数据存储在当前实例,最终目的是为了保证双方的数据一致、同步。

Redis中如何实现主从复制

复制示意图

Redis复制方式

Redis的复制方式有两种,一种是主(master)-从(slave)模式,一种是从(slave)-从(slave)模式,因此Redis的复制拓扑图会丰富一些,可以像星型拓扑,也可以像个有向无环:

Redis中如何实现主从复制

Redis集群复制结构图

通过配置多个Redis实例独立运行、定向复制,形成Redis集群,master负责写、slave负责读。

复制优点

通过配置多个Redis实例,数据备份在不同的实例上,主库专注写请求,从库负责读请求,这样的好处主要体现在下面几个方面:

1、高可用性

在一个Redis集群中,如果master宕机,slave可以介入并取代master的位置,因此对于整个Redis服务来说不至于提供不了服务,这样使得整个Redis服务足够安全。

2、高性能

在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供读服务从而提高了响应和读取速度。

3、水平扩展性

通过增加slave机器可以横向(水平)扩展Redis服务的整个查询服务的能力。

复制缺点

复制提供了高可用性的解决方案,但同时引入了分布式计算的复杂度问题,认为有两个核心问题:

  1. 数据一致性问题,如何保证master服务器写入的数据能够及时同步到slave机器上。

  2. 编程复杂,如何在客户端提供读写分离的实现方案,通过客户端实现将读写请求分别路由到master和slave实例上。

上面两个问题,尤其是第一个问题是Redis服务实现一直在演变,致力于解决的一个问题。

复制实时性和数据一致性矛盾

Redis提供了提高数据一致性的解决方案,本文后面会进行介绍,一致性程度的增加虽然使得我能够更信任数据,但是更好的一致性方案通常伴随着性能的损失,从而减少了吞吐量和服务能力。然而我们希望系统的性能达到最优,则必须要牺牲一致性的程度,因此Redis的复制实时性和数据一致性是存在矛盾的。

Redis复制原理及特性

slave指向master

举个例子,我们有四台redis实例,M1,R1、R2、R3,其中M1为master,R1、R2、R3分别为三台slave redis实例。在M1启动如下:

./redis-server ../redis8000.conf --port 8000

下面分别为R1、R2、R3的启动命令:

 ./redis-server ../redis8001.conf --port 8001 --slaveof 127.0.0.1 8000 ./redis-server ../redis8002.conf --port 8002 --slaveof 127.0.0.1 8000 ./redis-server ../redis8003.conf --port 8003 --slaveof 127.0.0.1 8000

这样,我们就成功的启动了四台Redis实例,master实例的服务端口为8000,R1、R2、R3的服务端口分别为8001、8002、8003,集群图如下:

Redis中如何实现主从复制

Redis集群复制拓扑

上面的命令在slave启动的时候就指定了master机器,我们也可以在slave运行的时候通过slaveof命令来指定master机器。

复制过程

Redis复制主要由SYNC命令实现,复制过程如下图:

Redis中如何实现主从复制

Redis复制过程

上图为Redis复制工作过程:

  1. slave向master发送sync命令。

  2. master开启子进程来讲dataset写入rdb文件,同时将子进程完成之前接收到的写命令缓存起来。

  3. 子进程写完,父进程得知,开始将RDB文件发送给slave。

  4. master发送完RDB文件,将缓存的命令也发给slave。

  5. master增量的把写命令发给slave。

值得注意的是,当slave跟master的连接断开时,slave可以自动的重新连接master,在redis2.8版本之前,每当slave进程挂掉重新连接master的时候都会开始新的一轮全量复制。如果master同时接收到多个slave的同步请求,则master只需要备份一次RDB文件。

增量复制

上面复制过程介绍的最后提到,slave和master断开了、当slave和master重新连接上之后需要全量复制,这个策略是很不友好的,从Redis2.8开始,Redis提供了增量复制的机制:

Redis中如何实现主从复制

增量复制机制

master除了备份RDB文件之外还会维护者一个环形队列,以及环形队列的写索引和slave同步的全局offset,环形队列用于存储最新的操作数据,当slave和maste断开重连之后,会把slave维护的offset,也就是上一次同步到哪里的这个值告诉master,同时会告诉master上次和当前slave连接的master的runid,满足下面两个条件,Redis不会全量复制:

  1. slave传递的run id和master的run id一致。

  2. master在环形队列上可以找到对呀offset的值。

满足上面两个条件,Redis就不会全量复制,这样的好处是大大的提高的性能,不做无效的功。

增量复制是由psync命令实现的,slave可以通过psync命令来让Redis进行增量复制,当然最终是否能够增量复制取决于环形队列的大小和slave的断线时间长短和重连的这个master是否是之前的master。

环形队列大小配置参数:

repl-backlog-size 1mb

Redis同时也提供了当没有slave需要同步的时候,多久可以释放环形队列:

repl-backlog-ttl 3600

免持久化复制

免持久化机制官方叫做Diskless Replication,前面基于RDB文件写磁盘的方式可以看出,Redis必须要先将RDB文件写入磁盘,才进行网络传输,那么为什么不能直接通过网络把RDB文件传送给slave呢?免持久化复制就是做这个事情的,而且在Redis2.8.18版本开始支持,当然目前还是实验阶段。

值得注意的是,一旦基于Diskless Replication的复制传送开始,新的slave请求需要等待这次传输完毕才能够得到服务。

是否开启Diskless Replication的开关配置为:

repo-diskless-sync no

为了让后续的slave能够尽量赶上本次复制,Redis提供了一个参数配置指定复制开始的时间延迟:

repl-diskless-sync-delay 5

slave只读模式

自从Redis2.6版本开始,支持对slave的只读模式的配置,默认对slave的配置也是只读。只读模式的slave将会拒绝客户端的写请求,从而避免因为从slave写入而导致的数据不一致问题。

半同步复制

和MySQL复制策略有点类似,Redis复制本身是异步的,但也提供了半同步的复制策略,半同步复制策略在Redis复制中的语义是这样的:

允许用户给出这样的配置:在maste接受写操作的时候,只有当一定时间间隔内,至少有N台slave在线,否则写入无效。

上面功能的实现基于Redis下面特性:

  1. Redis slaves每秒钟会ping一次master,告诉master当前slave复制到哪里了。

  2. Redis master会记住每个slave复制到哪里了。

我们可以通过下面配置来指定时间间隔和N这个值:

min-slaves-to-write <number of slaves>min-slaves-max-lag <number of seconds>

当配置了上面两个参数之后,一旦对于一个写操作没有满足上面的两个条件,则master会报错,并且将本次写操作视为无效。这有点像CAP理论中的“C”,即一致性实现,虽然半同步策略不能够完全保证master和slave的数据一致性,但是相对减少了不一致性的窗口期。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis中如何实现主从复制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis主从复制如何实现

redis主从复制是一种实现数据冗余和高可用性的机制,通过以下步骤实现:建立连接、部分复制、增量复制、更新状态和同步完成。它具有数据冗余、高可用性、负载均衡和灾难恢复等优势,但也应注意其单向复制、异步复制、网络延迟和过期数据的问题。Redi
redis主从复制如何实现
2024-06-12

Redis中怎么实现主从复制

今天就跟大家聊聊有关Redis中怎么实现主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.首先下去官网下载并安装redis若安装成功点击redis-server 如此是成功2
2023-06-20

PostgreSQL中如何实现主从复制

要实现PostgreSQL中的主从复制,可以按照以下步骤进行操作:配置主服务器:首先在主服务器上打开postgresql.conf文件,设置参数wal_level为hot_standby,max_wal_senders为至少1,和wal_k
PostgreSQL中如何实现主从复制
2024-04-09

Redis搭建主从复制实现高可用(如何保证 Redis 主从复制的高可用性?)

高可用 HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
Redis搭建主从复制实现高可用(如何保证 Redis 主从复制的高可用性?)
2024-11-01

Redis server 主从复制配置实现

Redis主从复制是一种数据复制机制,确保数据高可用性和易扩展性。配置主服务器涉及设置IP地址、端口和密码。配置从服务器需要指定主服务器信息、只读模式和复制积压。高级选项包括控制复制积压大小、空闲超时和写操作限制。最佳实践包括使用多个从服务器、监控复制积压、进行故障转移演练以及利用RedisSentinel进行自动化管理。
Redis server 主从复制配置实现
2024-04-02

如何使用PHP实现Redis数据库主从复制

这篇文章主要介绍“如何使用PHP实现Redis数据库主从复制”,在日常操作中,相信很多人在如何使用PHP实现Redis数据库主从复制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用PHP实现Redis数
2023-07-06

Redis设计与实现2.1:主从复制

主从复制这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记SLAVEOF新旧复制功能旧版复制功能旧版复制功能的实现为 同步 和 命令传播:当刚连上Master时,要做一次全同步:sequenceDiagramparticipant Sl
Redis设计与实现2.1:主从复制
2021-05-11

Redis中的主从复制是如何工作的

在Redis中,主从复制是指通过将主服务器的数据复制到从服务器上,实现数据的备份和读写分离。主从复制的工作流程如下:主服务器将写操作的命令记录到自己的内存中,并将该操作发送给所有从服务器。从服务器接收到主服务器发送的写操作命令后,将该操作
Redis中的主从复制是如何工作的
2024-04-09

Redis实现主从复制方式(Master&Slave)

目录主从复制方式(Master&Slave)一、Master&Slave是什么?二、它能干嘛?三、怎么玩?四、复制原理五、哨兵模式(sentinel)六、复制的缺点Redis master, slave节点部署详解主从复制方式(Master
2022-06-20

使用Docker怎么实现Redis主从复制

今天就跟大家聊聊有关使用Docker怎么实现Redis主从复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。安装docker的命令如下所示curl -sSL https://get.
2023-06-14

怎么在Redis中实现持久化与主从复制

这篇文章给大家介绍怎么在Redis中实现持久化与主从复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么需要持久化Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之
2023-06-14

redis主从复制的实现方法是什么

本篇内容介绍了“redis主从复制的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 简介这篇文章主要讲述Redis的主从复制
2023-06-05

Redis实现主从复制的方法是什么

本篇内容介绍了“Redis实现主从复制的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Master&Slave是什么?也就是我
2023-07-02

编程热搜

目录