Redis:浅谈Redis集群的复制原理

2024-09-02 06:52

本文主要是介绍Redis:浅谈Redis集群的复制原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Redis的集群方案

主从复制集群:手动切换的主从复制集群、带有哨兵的HA的主从复制集群。
分片集群:客户端实现路由索引的分片集群、使用中间件代理层的分片集群、Redis自身实现的Cluster分片集群。

二、Redis主从复制的原理

1、主从复制机制

当一个master实例和一个slave实例连接正常时, master 会发送一连串的命令流来保持对slave的更新,以便于将自身数据集的改变复制给 slave , 包括客户端的写入、key的过期或被逐出等等。

当master和slave之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave重新连接上master会尝试进行部分同步,这意味着它会尝试只获取在断开连接期间内丢失的命令流。

当无法进行部分重同步时, slave会请求进行全量重同步。这会涉及到一个更复杂的过程,例如master需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到slave。

2、主从复制的关注点

Redis使用异步复制:slave和master之间异步地确认处理的数据量。

一个master可以拥有多个slave,slave可以接受其他slave的连接。除了多个slave可以连接到同一个master之外,slave之间也可以像层叠状的结构(cascading-likestructure)连接到其他slave。自Redis4.0起,所有的sub-slave将会从master收到完全一样的复制流。

Redis复制在master侧是非阻塞的。这意味着master在一个或多个slave进行初次同步或者是部分重同步时,可以继续处理查询请求。

Redis复制在slave侧大部分也是非阻塞的。当slave进行初次同步时,它可以使用旧数据集处理查询请求,假设你在redis.conf中配置了让Redis这样做的话。在初次同步之后,旧数据集必须被删除,同时加载新的数据集。此外,你也可以配置如果复制流断开,Redis的slave会返回一个error给客户端。slave在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自Redis4.0开始,可以配置Redis使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞slave。

三、主从复制的具体过程

每一个Redis的master都有一个replicationID,这是一个较大的伪随机字符串,标记了一个给定的数据集。每个master也持有一个偏移量offset,master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。偏移量offset即使在没有一个slave连接到master时,也会自增,所以基本上每一对给定的ReplicationID,offset都会标识一个master数据集的确切版本。

当slave连接到master时,它们使用PSYNC命令来发送它们记录的旧的master节点的replicationID和它们至今为止处理的偏移量。通过这种方式,master能够仅发送slave所需的增量部分。但是如果master的缓冲区中没有足够的命令积压缓冲记录,或者如果slave引用了不再知道的历史记录(replicationID),则会转而进行一个全量重同步:在这种情况下,slave会得到一个完整的数据集副本,从头开始。

下面是一个全量同步的工作细节:
master开启一个后台保存进程,以便于生产一个RDB文件。同时它开始缓冲所有从客户端接收到的新的写入命令。当后台保存完成时,master将数据集文件传输给slave,slave将之保存在磁盘上,然后加载文件到内存。再然后master会发送所有缓冲的命令发给slave。这个过程以指令流的形式完成并且和Redis协议本身的格式相同。

你可以用telnet自己进行尝试。在服务器正在做一些工作的同时连接到Redis端口并发出SYNC命令。你将会看到一个批量传输,并且之后每一个master接收到的命令都将在telnet回话中被重新发出。事实上SYNC是一个旧协议,在新的Redis实例中已经不再被使用,但是其仍然向后兼容:但它不允许部分重同步,所以现在PSYNC被用来替代SYNC。

之前说过,当主从之间的连接因为一些原因崩溃之后,slave能够自动重连。如果master收到了多个slave要求同步的请求,它会执行一个单独的后台保存,以便于为多个slave服务。

补充-无需磁盘参与的复制:正常情况下,一个全量重同步要求在磁盘上创建一个RDB文件,然后将它从磁盘加载进内存,然后slave以此进行数据同步。如果磁盘性能很低的话,这对master是一个压力很大的操作。Redis2.8.18是第一个支持无磁盘复制的版本。在此设置中,子进程直接发送RDB文件给slave,无需使用磁盘作为中间储存介质。

这篇关于Redis:浅谈Redis集群的复制原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129305

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit