Redis的复制特性

对于有扩展平台以适应更高负载经验的工程师和管理员来说,复制(replication)是不可或缺的。复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。关系数据库通常会使用一个主服务器(master)向多个从服务器(slave)发送更新,并使用从服务器来处理所有读请求。Redis也采用了同样的方法来实现自己的复制特性,并将其用作扩展性能的一种手段。本节将对Redis的复制配置选项进行讨论,并说明Redis在进行复制时的各个步骤。

尽管Redis的性能非常优秀,但它也会遇上没办法快速地处理请求的情况,特别是在对集合和有序集合进行操作的时候,涉及的元素可能会有上万个甚至上百万个,在这种情况下,执行操作所花费的时间可能需要以秒来进行计算,而不是毫秒或者微秒。但即使一个命令只需要花费10毫秒就能完成,单个Redis实例(instance)1秒也只能处理100个命令。

SUNIONSTORE命令的性能作为对Redis性能的一个参考,在主频为2.4GHz的英特尔酷睿2处理器上,对两个分别包含10000个元素的集合执行SUNIONSTORE命令并产生一个包含20000个元素的结果集合,需要花费Redis七八毫秒的时间。

在需要扩展读请求的时候,或者在需要写入临时数据的时候(第7章对此有详细的介绍),用户可以通过设置额外的Redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本(initialcopyofthedata)之后,客户端每次向主服务器进行写入时,从服务器都会实时地得到更新。在部署好主从服务器之后,客户端就可以向任意一个从服务器发送读请求了,而不必再像之前一样,总是把每个读请求都发送给主服务器(客户端通常会随机地选择使用哪个从服务器,从而将负载平均分配到各个从服务器上)。

接下来的一节将介绍配置Redis主从服务器的方法,并说明Redis在整个复制过程中所做的各项操作。

对Redis的复制相关选项进行配置

当从服务器连接主服务器的时候,主服务器会执行BGSAVE操作。因此为了正确地使用复制特性,用户需要保证主服务器已经正确地设置了代码清单4-1里面列出的dir选项和dbfilename选项,并且这两个选项所指示的路径和文件对于Redis进程来说都是可写的(writable)。

尽管有多个不同的选项可以控制从服务器自身的行为,但开启从服务器所必须的选项只有slaveof一个。如果用户在启动Redis服务器的时候,指定了一个包含slaveofhostport选项的配置文件,那么Redis服务器将根据该选项给定的IP地址和端口号来连接主服务器。对于一个正在运行的Redis服务器,用户可以通过发送SLAVEOFnoone命令来让服务器终止复制操作,不再接受主服务器的数据更新;也可以通过发送SLAVEOFhostport命令来让服务器开始复制一个新的主服务器。

开启Redis的主从复制特性并不需要进行太多的配置,但了解Redis服务器是如何变成主服务器或者从服务器的,对于我们来说将是非常有用的和有趣的过程。

Redis复制的启动过程

本章前面曾经说过,从服务器在连接一个主服务器的时候,主服务器会创建一个快照文件并将其发送至从服务器,但这只是主从复制执行过程的其中一步。表4-2完整地列出了当从服务器连接主服务器时,主从服务器执行的所有操作。

通过使用表4-2所示的办法,Redis在复制进行期间也会尽可能地处理接收到的命令请求,但是,如果主从服务器之间的网络带宽不足,或者主服务器没有足够的内存来创建子进程和创建记录写命令的缓冲区,那么Redis处理命令请求的效率就会受到影响。因此,尽管这并不是必须的,但在实际中最好还是让主服务器只使用50%~65%的内存,留下30%~45%的内存用于执行BGSAVE命令和创建记录写命令的缓冲区。

设置从服务器的步骤非常简单,用户既可以通过配置选项SLAVEOFhostport来将一个Redis服务器设置为从服务器,又可以通过向运行中的Redis服务器发送SLAVEOF命令来将其设置为从服务器。如果用户使用的是SLAVEOF配置选项,那么Redis在启动时首先会载入当前可用的任何快照文件或者AOF文件,然后连接主服务器并执行表4-2所示的复制过程。如果用户使用的是SLAVEOF命令,那么Redis会立即尝试连接主服务器,并在连接成功之后,开始表4-2所示的复制过程。

从服务器在进行同步时,会清空自己的所有数据因为有些用户在第一次使用从服务器时会忘记这件事,所以这里要特别提醒一下:从服务器在与主服务器进行初始连接时,数据库中原有的所有数据都将丢失,并被替换成主服务器发来的数据。

警告:Redis不支持主主复制(master-masterreplication)因为Redis允许用户在服务器启动之后使用SLAVEOF命令来设置从服务器选项(slavingoptions),所以可能会有读者误以为可以通过将两个Redis实例互相设置为对方的主服务器来实现多主复制(multi-masterreplication)(甚至可能会在一个循环里面将多个实例互相设置为主服务器)。遗憾的是,这种做法是行不通的:被互相设置为主服务器的两个Redis实例只会持续地占用大量处理器资源并且连续不断地尝试与对方进行通信,根据客户端连接的服务器的不同,客户端的请求可能会得到不一致的数据,或者完全得不到数据。

当多个从服务器尝试连接同一个主服务器的时候,就会出现表4-3所示的两种情况中的其中一种。

在大部分情况下,Redis都会尽可能地减少复制所需的工作,然而,如果从服务器连接主服务器的时间并不凑巧,那么主服务器就需要多做一些额外的工作。另一方面,当多个从服务器同时连接主服务器的时候,同步多个从服务器所占用的带宽可能会使得其他命令请求难以传递给主服务器,与主服务器位于同一网络中的其他硬件的网速可能也会因此而降低。

主从链

有些用户发现,创建多个从服务器可能会造成网络不可用—当复制需要通过互联网进行或者需要在不同数据中心之间进行时,尤为如此。因为Redis的主服务器和从服务器并没有特别不同的地方,所以从服务器也可以拥有自己的从服务器,并由此形成主从链(master/slavechaining)。

从服务器对从服务器进行复制在操作上和从服务器对主服务器进行复制的唯一区别在于,如果从服务器X拥有从服务器Y,那么当从服务器X在执行表4-2中的步骤4时,它将断开与从服务器Y的连接,导致从服务器Y需要重新连接并重新同步(resync)。

当读请求的重要性明显高于写请求的重要性,并且读请求的数量远远超出一台Redis服务器可以处理的范围时,用户就需要添加新的从服务器来处理读请求。随着负载不断上升,主服务器可能会无法快速地更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。为了缓解这个问题,用户可以创建一个由Redis主从节点(master/slavenode)组成的中间层来分担主服务器的复制工作,如图4-1所示。

尽管主从服务器之间并不一定要像图4-1那样组成一个树状结构,但记住并理解这种树状结构对于Redis复制来说是可行的(possible)并且是合理的(reasonable),将有助于读者理解之后的内容。AOF持久化(参考:Redis数据持久化)的同步选项可以控制数据丢失的时间长度:通过将每个写命令同步到硬盘里面,用户几乎可以不损失任何数据(除非系统崩溃或者硬盘驱动器损坏),但这种做法会对服务器的性能造成影响;另一方面,如果用户将同步的频率设置为每秒一次,那么服务器的性能将回到正常水平,但故障可能会造成1秒的数据丢失。通过同时使用复制和AOF持久化,我们可以将数据持久化到多台机器上面。

为了将数据保存到多台机器上面,用户首先需要为主服务器设置多个从服务器,然后对每个从服务器设置appendonly yes选项和appendfsync everysec选项(如果有需要的话,也可以对主服务器进行相同的设置),这样的话,用户就可以让多台服务器以每秒一次的频率将数据同步到硬盘上了。但这还只是第一步:因为用户还必须等待主服务器发送的写命令到达从服务器,并且在执行后续操作之前,检查数据是否已经被同步到了硬盘里面。

参考资料

黄健宏:<Redis实战>

原文地址:https://www.cnblogs.com/junzi2099/p/9048823.html

时间: 2024-10-13 13:04:14

Redis的复制特性的相关文章

Redis 的 GEO 特性将在 Redis 3.2 版本释出

Redis 的 GEO 特性将在 Redis 3.2 版本释出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作. 本文将对 Redis 的 GEO 特性进行介绍, 说明这个特性相关命令的用户, 并在最后说明如何使用这些命令去实现"查找附近的人"以及"摇一摇"这两个功能. 版本要求 因为 Redis 目前的稳定版本为 Redis 3.0 , 而 GEO 特性是 Redis 3.2 版本的特性, 所以如果你想要使用这个特性的话, 那么就需要到 R

涂抹mysql笔记-mysql复制特性

<>mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主从单向复制),B再复制到C.也可以实现A直接复制到B和C(单主多从复制),甚至A的数据复制给B,B的数据也复制会A(双主复制) <>mysql复制处理数据时,有三种不同的模式: 1.基于语句复制(Statement Based Replication):基于实际执行的sql语句的模式方案简称SBR 2.基于记录复制(Ro

Redis学习第八课:Redis高级实用特性(二)

Redis高级实用特性 4.持久化机制 Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式:(1).snapshotting(快照) 也是默认方式.  快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式.我们可以配置redis在n秒内如果超过m个key的修改就自动做快照. 修改配置文件redis.conf:save 9

Redis学习(6)-Redis高级实用特性

Redis高级实用特性: 1.安全性2.主从复制3.事务处理4.持久化机制5.发布订阅消息6.虚拟内存的使用 安全性: 设置客户端连接后进行任何其他指定前需要使用的密码警告:因为Redis速度相当快,所以一台比较好的服务器下一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解配置方法: requirepass beijing(在配置文件中配置密码) auth beijing(授权方式1) redis-cli -a beijing(授权方式2) 主

Redis学习-复制

Redis支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品.以下是关于 Redis 复制功能的几个重要方面: Redis使用异步复制. 从 Redis2.8开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度. 一个主服务器可以有多个从服务器. 不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器,

Redis的复制(Master/Slave)

是什么 : 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 能干嘛: 读写分离,容灾恢复 怎么玩: 1.配从(库)不配主(库) 2.从库配置:slaveof 主库IP 主库端口 每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件 Info replication 3.修改配置文件细节操作 拷贝多个redis.conf文件 开启daemonize yes Pid文件名字

Jedis/JedisPool和Redis数据类型与特性

1.介绍Jedis Jedis 是 Redis 的 java 版本客户端,使用Jedis可以连接 Redis的数据库,Jedis连接方式有三种Jedis/JedisPool 连接.ShardedJedis/ShardedJedisPool 连接.JedisCluster 连接,今天主要讲解用 Java 代码连接 Jedis 连接池 1.1连接Jedis/JedisPool  首先在Redis 中加入username 如图 下面是连接Jedis的具体过程 public class JedisTes

Redis的复制

复制解决了单点问题,满足了故障恢复和负载均衡的需求,也是稍后Redis Sentinel和Cluster的基础. 配置复制,主要是SLAVEOF命令的使用,其可以建立复制关系,断开复制关系,和切换主节点. 127.0.0.1:6379> help SLAVEOF SLAVEOF host port summary: Make the server a slave of another instance, or promote it as master 复制的过程中,数据同步是影响整个复制是否高效

Redis学习十:Redis的复制(Master/Slave)【重要】

一.是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛 读写分离  容灾恢复 三.怎么玩 1.配从(库)不配主(库) 2.从库配置:slaveof 主库IP 主库端口 说明: 每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件 Info replication 3.修改配置文件细节操作 [1]拷贝多个redis.conf文件 [2]开启dae