Redis主从复制原理详解

Redis主从复制原理详解。

Redis主从复制原理详解

我为大家说一说Redis主从复制原理详解的相关话题,如有不对的地方欢迎指正!

众所周知,一个数据库系统想要实现高可用,主要从以下两个方面来考虑:

    保证数据安全不丢失系统可以正常提供服务

而 Redis 作为一个提供高效缓存服务的数据库,也不例外。

上期我们提到的 Redis 持久化策略,其实就是为了减少服务宕机后数据丢失,以及快速恢复数据,也算是支持高可用的一种实现。

除此之外,Redis 还提供了其它几种方式来保证系统高可用,业务中最常用的莫过于主从同步(也称作主从复制)、Sentinel 哨兵机制以及 Cluster 集群

同时,这也是面试中出现频率最高的几个主题,这期我们先来讲讲 Redis 的主从复制。

2. 主从复制简介

Redis 同时支持主从复制和读写分离:一个 Redis 实例作为主节点 Master,负责写操作。

其它实例(可能有 1 或多个)作为从节点 Slave,负责复制主节点的数据。

2.1 架构组件

主节点Master

数据更新:Master 负责处理所有的写操作,包括写入、更新和删除等。

数据同步:写操作在 Master 上执行,然后 Master 将写操作的结果同步到所有从节点 Slave 上。

从节点Slave

数据读取:Slave 负责处理读操作,例如获取数据、查询等。

数据同步:Slave 从 Master 复制数据,并在本地保存一份与主节点相同的数据副本。

2.2 为什么要读写分离1)防止并发

从上图我们可以看出,数据是由主节点向从节点单向复制的,如果主、从节点都可以写入数据的话,那么数据的一致性如何保证呢?

有聪明的小伙伴可能已经想到了,那就是加锁!

但是主、从节点分布在不同的服务器上,数据跨节点同步时又会出现分布式一致性的问题。而在高频并发的场景下,解决加锁后往往又会带来其它的分布式问题,例如写入效率低、吞吐量大幅下降等。

而对于 Redis 这样一个高效缓存数据库来说,性能降低是难以忍受的,所以加锁不是一个优秀的方案。

那如果不加锁,使用最终一致性方式呢?

这样 Redis 在主、从库读到的数据又可能会不一致,带来业务上的挑战,用户也是难以接受的。

业务为用户服务,技术为业务服务

所以,为了权衡数据的并发问题和用户体验,我们只允许在主节点上写入数据,从节点上读取数据。

Redis主从复制原理详解。

Redis主从复制原理详解2)易于扩展

我们都知道,大部分使用 Redis 的业务都是读多写少的。所以,我们可以根据业务量的规模来确定挂载几个从节点 Slave,当缓存数据增大时,我们可以很方便的扩展从节点的数量,实现弹性扩展。

同时,读写分离还可以实现数据备份负载均衡,从而提高可靠性和性能。

3)高可用保障

不仅如此,Redis 还可以手动切换主从节点,来做故障隔离和恢复。这样,无论主节点或者从节点宕机,其他节点依然可以保证服务的正常运行。

3. 主从复制实现3.1 开启主从复制

要开启主从复制,我们需要用到 replicaof 命令。

当我们确定好主节点的 IP 地址和端口号,在从库执行 replicaof 这个命令,就可以开启主从复制。

注意,在 Redis5.0 之前,该命令为 slaveof

开启主从复制后,应用层采用读写分离,所有的写操作在主节点进行,所有读操作在从节点进行。

主从节点会保持数据的最终一致性:主库更新数据后,会同步给从库。

3.2 主从复制过程

那主从库同步什么时候开始和结束呢?

是一次性传输还是分批次写入?Redis 主从节点在同步过程中网络中断了,没传输完成的怎么办?

带着这些疑问我们来分析下,首先,Redis 第一次数据同步时分 3 个阶段。

1)建立连接,请求数据同步

主从节点建立连接,从库请求数据同步。

从服务器从 replicaof 配置项中获取主节点的 IP 和 Port,然后进行连接。

连接成功后,从服务器会向主服务器发送 PSYNC 命令,表示要进行同步。同时,命令中包含 runID 和 offset 两个关键字段。

    runID:每个 Redis 实例的唯一标识,当主从复制进行时,该值为 Redis 主节点实例的ID。由于首次同步时还不知道主库的实例ID,所以该值第一次为 ?offset:从库数据同步的偏移量,当第一次复制时,该值为 -1,表示全量复制

主服务器收到 PSYNC 命令后,会创建一个专门用于复制的后台线程(replication thread),然后记录从节点的 offset 参数并开始进行 RDB 同步。

2)RDB 同步

主库生成 RDB 文件,同步给从库。

当从服务器连接到主服务器后,主服务器会将自己的数据发送给从服务器,这个过程叫做

Redis主从复制原理详解。

Redis主从复制原理详解

全量复制。主服务器会执行 bgsave 命令,然后 fork 出一个子进程来遍历自己的数据集并生成一个 RDB 文件,将这个文件发送给从服务器。

在这期间,为了保证 Redis 的高性能,主节点的主进程不会被阻塞,依旧对外提供服务并接收数据写入缓冲区中。

从服务器接收到 RDB 文件后,会清空自身数据,然后加载这个文件,将自己的数据集替换成主服务器的数据集。

3)命令同步

在第一次同步过程中,由于是全量同步,所以用时可能比较长,这期间主库依旧会写入新数据

但是,在数据同步一开始就生成的 RDB 文件中显然是没有这部分新增数据的,所以第一次数据同步后需要再发送一次这部分新增数据。

这样,主服务器需要在发送完 RDB 文件后,将期间的写操作重新发送给从服务器,以保证从服务器的数据集与主服务器保持一致。

3.3 增量同步1)命令传播

在完成全量复制后,主从服务器之间会保持一个 TCP 连接,主服务器会将自己的写操作发送给从服务器,从服务器执行这些写操作,从而保持数据一致性,这个过程也称为基于长连接的命令传播(command propagation)。

增量复制的数据是异步复制的,但通过记录写操作,主从服务器之间的数据最终会达到一致状态。

2)网络断开后数据同步

命令传播的过程中,由于网络抖动或故障导致连接断开,此时主节点上新的写命令将无法同步到从库。

即便是抖动瞬间又恢复网络连接,但 TCP 连接已经断开,所以数据需要重新同步。

从 Redis 2.8 开始,从库已支持增量同步,只会把断开的时候没有发生的写命令,同步给从库。

详细过程如下:

    网络恢复后,从库携带之前主库返回的 runid,还有复制的偏移量 offset 发送 psync runid offset 命令给主库,请求数据同步;主库收到命令后,核查 runid 和 offset,确认没问题将响应 continue 命令;主库发送网络断开期间的写命令,从库接收命令并执行。

这时,有细心的小伙伴可能要问了,网络断开后,主库怎么知道哪些数据是新写入的呢?

这是个好问题,接下来我们详细说明一下。

3)增量复制的关键

Master 在执行写操作时,会将这些命令记录在 repl_backlog_buffer (复制积压缓冲区)里面,并使用

Redis主从复制原理详解。

Redis主从复制原理详解

master_repl_offset 记录写入的位置偏移量。

而从库在执行同步的写命令后,也会用 slave_repl_offset 记录写入的位置偏移量。正常情况下,从库会和主库的偏移量保持一致。

但是,当网络断开后,主库继续写入,而从库没有收到新的同步命令,所以偏移量就停止了。所以,master_repl_offset 会大于 slave_repl_offset。

注意:主从库实现增量复制时,都是在 repl_backlog_buffer 缓冲区上进行。

网络断开前后,主从库的同步图如下:

repl_backlog_buffer 复制积压缓冲区是一个环形缓冲区,如果缓冲区慢了(比如超过 1024),则会从头覆盖掉前面的内容。

所以,当网络恢复以后,主节点只需将 master_repl_offset 和 slave_repl_offset 之间的内容同步给从库即可(图中 256~512 这部分数据)。

需要注意的是,主库的积压缓冲区默认为 1M,如果从库网络断开太久,缓冲区之前的内容已经被覆盖,这时主从的数据复制就只能采取全量同步了。

所以我们需要根据业务量和实际情况来设置 repl_backlog_buffer 的值。

4. 小结

面让架构易于扩展,另一方面防止单体故障:当主库挂了,可以立即拉起从库,不至于让业务停滞太久。

而首次主从复制包括建立连接,RDB 同步和命令同步三个阶段。

为了保证同步的效率,除了第一次需要全量同步以外,例如当主从节点断连后,则只需要增量同步,这是由主从库的复制偏移量以及主库的 repl_backlog_buffer 复制积压缓冲区来控制的。

好了,以上就是本文的所有内容了,希望今天的文章能让大家更深入地了解 Redis 主从复制,并在面试或者实际工作中学以致用,探索更多的细节。

以上就是带来的Redis主从复制原理详解的详细讲解,我希望本文能给你带来生活上的帮助!



  • redis涓讳粠鏋舵瀯楂樺彲鐢ㄥ浣曞疄鐜
    绛旓細1. 浠涔堟槸Redis涓讳粠澶嶅埗 Redis涓讳粠澶嶅埗鏄寚鍦ㄤ竴涓猂edis闆嗙兢涓紝灏嗕竴涓猂edis鑺傜偣浣滀负涓昏妭鐐癸紝鍏朵綑鐨凴edis鑺傜偣浣滀负浠庤妭鐐广備富鑺傜偣璐熻矗鍐欏叆鏁版嵁锛屼粠鑺傜偣璐熻矗璇诲彇鏁版嵁銆傚綋涓昏妭鐐瑰彂鐢熷畷鏈烘垨鑰呮晠闅滄椂锛屼粠鑺傜偣鍙互璧峰埌澶囦唤鎴栬呮浛鎹㈢殑浣滅敤锛屼粠鑰屼繚闅淩edis闆嗙兢鐨勯珮鍙敤鎬с2. Redis涓讳粠鏋舵瀯楂樺彲鐢ㄧ殑瀹炵幇鏂瑰紡 Redis涓讳粠...
  • redis涓讳粠澶嶅埗鏈濂介噰鐢ㄥ摢绉嶇粨鏋
    绛旓細redis鐨勪富浠庡鍒鍒嗕负涓や釜闃舵: 1)鍚屾鎿嶄綔:灏嗕粠鏈嶅姟鍣ㄧ殑鏁版嵁搴撶姸鎬佹洿鏂拌嚦涓绘湇鍔″櫒褰撳墠鎵澶勭殑鏁版嵁搴撶姸鎬併 2)鍛戒护浼犳挱:鍦ㄤ富鏈嶅姟鍣ㄧ殑鏁版嵁搴撶姸鎬佽淇敼,瀵艰嚧涓讳粠鏈嶅姟鍣ㄧ殑鏁版嵁搴撶姸鎬佸嚭鐜颁笉涓鑷存椂,璁╀富浠庢湇鍔″櫒閲嶆柊鍥炲埌涓鑷寸姸鎬併 鍚屾 褰撳鎴风鍚戜粠鏈嶅姟鍣ㄥ彂閫 SLAVEOF 鍛戒护, 瑕佹眰浠庢湇鍔″櫒澶嶅埗涓绘湇鍔″櫒鏃, 浠庢湇鍔″櫒...
  • Redis鍝ㄥ叺鏈哄埗鍘熺悊娴呮瀽
    绛旓細涓婁竴绡囨枃绔Redis涓讳粠澶嶅埗鍘熺悊涓畝瑕佸湴璇存槑浜嗕富浠庡鍒剁殑涓涓熀鏈師鐞嗭紝鍖呭惈鍏ㄩ噺澶嶅埗銆佸鍒剁Н鍘嬬紦鍐插尯涓庡閲忓鍒剁瓑鍐呭锛屾湁鍏磋叮鐨勫悓瀛﹀彲浠ュ厛鐪嬩笅銆傚埄鐢ㄤ富浠庡鍒讹紝鍙互瀹炵幇璇诲啓鍒嗙銆佹暟鎹浠界瓑鍔熻兘銆備絾濡傛灉涓诲簱瀹曟満鍚庯紝闇瑕佽繍缁翠汉鍛樻墜鍔ㄥ湴灏嗕竴涓粠搴撴彁鍗囦负鏂颁富搴擄紝骞跺皢鍏朵粬浠庡簱slaveof鏂颁富搴擄紝浠ユ鏉ュ疄鐜版晠闅...
  • Redis璇︾煡璇﹁В
    绛旓細杩欑璁捐浣縍edis鑳藉湪鍗曠嚎绋嬩腑杞绘澗瀹炵幇姣忕鍗佷竾绾у埆鐨勫鐞嗚兘鍔涳紝闈為樆濉炴ā寮忚鍏跺湪绛夊緟IO鏃朵粛鑳藉鐞嗗叾浠栬姹傘傛暟鎹竴鑷存ф槸Redis鐨鍙︿竴澶т紭鍔裤涓讳粠澶嶅埗閫氳繃涓诲簱鍐欐搷浣滃悗鍚屾缁欎粠搴擄紝瀹炵幇鏁版嵁澶囦唤锛岃2.8鐗堟湰寮曞叆鐨勬柇鐐圭画浼犳満鍒朵繚璇佷簡鍦ㄨ繛鎺ユ柇寮鍚庣殑鑷姩鎭㈠銆傚摠鍏垫満鍒跺湪姝ゅ熀纭涓婃洿杩涗竴姝ワ紝褰撲富搴撴晠闅滄椂锛...
  • 缂撳瓨-redis 涓夌妯″紡鎼缓鍜岃繍琛鍘熺悊
    绛旓細鐒跺悗master浼氬皢鍐呭瓨涓紦瀛樼殑鍐欏懡浠ゅ彂閫佺粰slave锛宻lave涔熶細鍚屾杩欎簺鏁版嵁銆 slave node濡傛灉璺焟aster node鏈夌綉缁滄晠闅滐紝鏂紑浜嗚繛鎺ワ紝浼氳嚜鍔ㄩ噸杩炪俶aster濡傛灉鍙戠幇鏈夊涓猻lave node閮芥潵閲嶆柊杩炴帴锛屼粎浠呬細鍚姩涓涓猺db save鎿嶄綔锛岀敤涓浠芥暟鎹湇鍔℃墍鏈塻lave node銆備粠redis 2.8寮濮嬶紝灏辨敮鎸涓讳粠澶嶅埗鐨勬柇鐐圭画浼狅紝濡傛灉...
  • Redis涓讳粠涔嬪叏閲澶嶅埗鍜屽閲忓鍒
    绛旓細鍥犱负鍏ㄩ噺澶嶅埗鐨勬暟鎹噺杩囧ぇ锛屼細閫犳垚寰堝ぇ鐨勭綉缁滃紑閿锛屾墍浠Redis鍙湁鍦ㄥ繀瑕佺殑鎯呭喌涓嬫墠鍋氬叏閲忓鍒讹紝姣斿鍒濇澶嶅埗鍜屽叾浠栨棤娉曢儴鍒嗗鍒 鐢ㄤ簬鍒濇澶嶅埗鎴栧叾瀹冩棤娉曡繘琛岄儴鍒嗗鍒剁殑鎯呭喌锛屽皢涓昏妭鐐逛腑鐨勬墍鏈夋暟鎹兘鍙戦佺粰浠庤妭鐐广 褰撴暟鎹噺杩囧ぇ鐨勬椂鍊欙紝浼氶犳垚寰堝ぇ鐨勭綉缁滃紑閿 銆傜敤浜庡鐞嗗湪涓讳粠澶嶅埗涓 鍥犵綉缁滈棯閫绛夊師鍥犻犳垚鏁版嵁...
  • 璋冪爺Redis楂樺彲鐢ㄤ袱绉嶆柟妗
    绛旓細Redis涓涓讳粠鑺傜偣澶嶅埗鏁版嵁鏈夊叏閲忓鍒跺拰閮ㄥ垎澶嶅埗涔嬪垎銆傚叏閲忓鍒朵娇鐢╯nyc鍛戒护鏉ュ疄鐜帮紝鍏舵祦绋嬫槸锛氭棫鐗堟湰鍏ㄩ噺澶嶅埗鍔熻兘锛屽叾鏈澶х殑闂鏄粠鏈嶅姟鍣ㄦ柇绾块噸杩炴椂锛屽嵆渚垮湪浠庢湇鍔″櫒涓婂凡缁忔湁涓閮ㄥ垎鏁版嵁浜嗭紝涔熼渶瑕佽繘琛屽叏閲忓鍒讹紝杩欐牱鍋氱殑鏁堢巼寰堜綆锛屼簬鏄柊鐗堟湰鐨凴edis鍦ㄨ繖閮ㄥ垎鍋氫簡鏀硅繘銆傛柊鐗堟湰Redis浣跨敤psync鍛戒护鏉ヤ唬鏇縮ync...
  • 鐜╄浆Redis鐨楂樺彲鐢(涓讳粠銆佸摠鍏点侀泦缇)
    绛旓細Redis 楂樺彲鐢ㄧ殑涓昏鏈変笁绉嶆ā寮: 涓讳粠妯″紡, 鍝ㄥ叺妯″紡鍜岄泦缇ゆā寮忋 Redis 鎻愪緵浜 Redis 鎻愪緵浜澶嶅埗(replication)鍔熻兘,褰撲竴鍙 redis 鏁版嵁搴撲腑鐨勬暟鎹彂鐢熶簡鍙樺寲,杩欎釜鍙樺寲浼氳鑷姩鍦板悓姝ュ埌鍏朵粬鐨 redis 鏈哄櫒涓婂幓銆 Redis 澶氭満鍣ㄩ儴缃叉椂,杩欎簺鏈哄櫒鑺傜偣浼氳鍒嗘垚涓ょ被,涓绫绘槸涓昏妭鐐(master 鑺傜偣),涓绫绘槸浠庤妭鐐(slave 鑺傜偣)銆
  • Redis 鍥炬枃鎸囧崡
    绛旓細鏈鍒濓紝Redis娌胯浜哅emcached鐨勮交鐩堬紝浣嗙嫭鍏峰尃蹇冨湴澧炲姞浜嗘寔涔呭寲閫夐」锛屽ぇ澶ч檷浣庝簡鏁版嵁涓㈠け鐨勯闄╋紝纭繚浜嗗叧閿椂鍒荤殑鏁版嵁瀹夊叏銆Redis鐨鏋舵瀯璁捐宸у鍦板吋椤句簡鏄撶敤鎬т笌鍙潬鎬с傚崟鏈洪儴缃叉槸鍏ラ棬绾ч夋嫨锛岄傚悎灏忓瀷搴旂敤锛屼絾鍏跺崟鐐规晠闅滅殑椋庨櫓涓嶅蹇借锛涚浉姣斾箣涓嬶紝楂樺彲鐢ㄦч氳繃涓讳粠澶嶅埗瀹炵幇锛屾暟鎹疄鏃跺悓姝ワ紝鎻愪緵鎵╁睍闃呰鐨...
  • redis 涓讳粠鍚屾-master绔
    绛旓細set搴曞眰鏁版嵁缁撴瀯 redis zset搴曞眰鏁版嵁缁撴瀯 redis 瀹㈡埛绔鐞 redis 涓讳粠鍚屾-slave绔 redis 涓讳粠鍚屾-master绔 redis 涓讳粠瓒呮椂妫娴 redis aof鎸佷箙鍖 redis rdb鎸佷箙鍖 redis 鏁版嵁鎭㈠杩囩▼ redis TTL瀹炵幇鍘熺悊 redis cluster闆嗙兢寤虹珛 redis cluster闆嗙兢閫変富  redis 涓讳粠...
  • 扩展阅读:redis 缓存穿透 击穿 雪崩 ... redis数据复制到另一台 ... redis集群主从切换原理 ... redis哨兵工作原理 ... redis集群三主三从原理 ... redis集群和主从区别 ... redis主从模式和哨兵模式 ... Redis持久化原理 ... redis数据迁移到另一个redis ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网