Redis --- Replication

来源:互联网 发布:数据库恢复策略 编辑:程序博客网 时间:2024/06/18 10:41

Redis --- Replication

注:以下内容翻译自网页:http://redis.io/topics/replication#replication

Redis复制是一种非常易于使用和配置的主从复制结构,可以允许从Redis服务器作为主服务器的一个精确拷贝。下面是一些关于Reidis复制的非常重要的内容:

·        Redis使用异步复制,从Redis2.8开始,从服务器会周期性的响应从复制流中获取并处理的数据的总量。

·        一个主服务器可以有多个从服务器。

·        从服务器可以接受来自其它从服务器的连接。除了可以将多个从服务器连接到同一个主服务器外,从服务器也可以连接到其它的从服务器,以一种图表的类似结构。

·        Redis复制在主服务器端是非阻塞的。这就意味着主服务器在当一个或多个从服务器正在进行初始同步时会继续处理查询。

·        复制在从服务器端也是非阻塞的。假如在redis.conf中进行了配置,当从服务器正在进行初始化同步时,它可以使用旧的版本数据集合来响应查询。或者你可以配置Redis 从服务器在 复制流过来时给客户端返回错误。然而再最初同步之后,旧的数据集必须可以删除,而新的必须被加载。在这个简短的时期,从服务器会对阻塞到来的连接。

·        服务可以被用来作为一种扩展性,使得有多个从服务器来处理只读请求(比如,繁重的SORT操作可以转义到从服务器),或者只是简单的作为数据冗余。

·        使用复制来避免主服务器将全量数据集写入硬盘的代价是可能的。只要在redis.conf中配置主服务器避免保存(只需要注释掉素有的save指示),然后连接一个从服务器并配置从服务器成不时保存。然而,这个步骤确保主服务器不会自动重启。(读取下一章获取更多内容)

当主服务器固话关闭时的复制的安全性

当配置Redis复制可用时,强烈推荐在主服务器端开启固化,或者当这样子不可时,比如由于延迟问题,实例也应该配置成避免自动重新启动。

To better understand why masters with persistence turnedoff configured to auto restart are dangerous, check the following failure modewhere data is wiped from the master and all its slaves:

为了更好的理解为什么当主服务器固话关闭时,配置了自动重启的危险,来检查下下面的故障模式,当数据从主服务器和它所有的从服务器擦除时:

  1. 节点A作为主服务器,关闭固化,节点B和C从节点A进行复制
  2. A崩溃,由于有自动重启系统,会重启这个进程,然而因为固化关闭了,重启后会使用空的数据集合
  3. 节点B和C会从A进行复制,这个时候A是空的,因此它们显然会摧毁他们复制的数据

当使用Redis Sentinel来作为高可用性时,同样在主服务器关闭固话并配置自动重启进程是危险的,因为在Sentinel中master可以非常快的重启,使得Sentinel无法检测到这个故障,因此上面的故障模式也会出现。

任何时候数据的安全都是重要的,因此复制在主服务器配置成非固化时,自动重启实例也应该关闭。

Redis复制如何工作

如果你启动了一个从服务器,当连接主服务器时会发送一个SYNC命令,不管这事该从服务器第一次连接还是重新连接。

主服务器会启动一个后台保存,并开始保存接收到的所有的改变数据集的命令。当后台保存完成时,主服务器会将数据库文件传输到从服务器,这个文件是保存到硬盘中的,然后会加载到内存中。主服务器然后会将所有保存命令发送到从服务器。这会以Redis协议本身一样的格式的命令流来完成。

你可以自己通过telnet尝试一下,当主服务器在处理任务时发送SYNC命令,你会看到一个块传输,然后是主服务器收到的每一个命令到会重新发送到telnet回话来。

从服务器可以在和主服务器连接中断时进行从连,如果一个主服务器接收到了多个兵法的从服务器同步请求,它会用一个后台的存储来顺序的响应这些请求。

当主服务器和从服务器在连接中断后进行重连时,一个完整的resync会执行。然而从2.8开始,部分重同步也可以了。

部分重同步

从Redis2.8开始,主服务器和从服务器可以在连接中断之后继续进行之前的复制过程,而不需要进行一个完整的重新同步。

这是通过在主服务器端创建一个内存中的复制流的日记来实现的。主服务器和所有的从服务器统一一个复制偏移和主运行ID,当连接中断后,从服务器会重新连接并请求主服务器继续进行复制。假设主服务器运行id是一样的,并且复制日记中的偏移是合法的。复制会从它中断的这个点继续进行。如果这些条件都不符合,一个完成的重新同步会进行。(这就像2.8之前的行为)。因为连接的主服务器的运行ID不是固话到硬盘的,当重服务器进行重启时,总是要进行一个完成的重新同步。

新的部分重新同步特性内部使用PSYNC命令。而旧的实现使用SYNC命令。一个Redis2.8的从服务器可以检测主服务器是否支持PSYNC,如果不的话使用SYNC。

无硬盘复制

正常来说一个完整同步会创建一个RDB文件到硬盘上,并从硬盘中加载RDB文件来将数据响应到从服务器。

在一个慢速的硬盘上这对于主服务器来说就是一件痛苦的事情,因此Redis2.8.18版本会是第一个版本来尝试支持无硬盘的复制。在这个过程中,子进程会直接将RDB发送给从服务器,而不会使用硬盘作为中间存储介质。

这个特性目前是作为实验性质的来考虑的。

配置

配置复制是很简单的:只要在从服务器的配置文件中添加下面的内容:

slaveof 192.168.1.1 6379

当然你需要将192.168.1.1 6379替换成你主服务器的IP地址和端口。你可以发送SLAVEOF命令,然后主服务器会启动一个和从服务器的同步操作。

也有一些参数可以对主服务器在进行部分同步时使用的复制日记进行调整。可以查看redis.conf中关于分布式的配置例子了解更多。

Diskless replication can be enabled using the repl-diskless-syncconfiguration parameter. The delay to start the transfer in order to wait moreslaves to arrive after the first one, is controlled by therepl-diskless-sync-delayparameter. Please refer to the example redis.conf file in theRedis distribution for more details.

无硬盘复制可以通过使用rep1-diskless-sync配置参数来使能。为了在接收到第一个从服务器之后等待接收更多从服务器的请求而增加的在传输之前的延迟可以通过rep1-diskless-sync-delay参数来控制。可以查看redis.conf中关于分布式的配置例子了解更多。

只读的从服务器

从Redis2.6开始,从服务器支持只读模式,而且也是默认的模式。这个特性可以通过配置文件redis.conf中的slave-read-only配置项来控制,在运行时也可以通过CONFIG SET命令来启用或关闭。

只读从服务器会拒绝所有的写服务器,以此就不能因为错误写到从服务器上了。这并不意味着该特性是为了将从服务器实例暴露到互联网或者有更多不可信客户端存在的网络里面,因为管理员命令,比如DEBUG或则CONFIG同样是打开的。然而只读实例的安全性可以通过在redis.conf文件中使用重命名指令来关闭这些命令来改善。

你可能想知道为什么会可能将恢复只读配置使得从服务器实例也可以处理写操作。在主服务器和从服务器进行同步或从服务器重启时这些写请求会被忽略,也存在一些合理的用例来在可写的从服务器上保存这些短时间的数据。将来这个特性可能会被丢弃。

设置从服务器向主服务器进行认证

如果你的主服务器在请求时需要一个密码,需要在从服务器中进行配置来在所有的sync操作中使用密码。

可以在运行实例上操作,使用redis-cli并输入:

config set masterauth <password>

也可以永久的设置,在配置文件中:

masterauth <password>

允许只有当N个复制附加时才支持写

从2.8开始,可以配置一个Redis主服务器在只有至少有N个从服务器同时连接到主服务器时才接受写请求。

然而,因为Redis使用异步复制,无法保证从服务器接收到一个给定的写请求,因此总是有一个窗口数据可能会丢失。

这个特性如下:

  • Redis会每秒ping一下主服务器,响应其处理的复制流的总量。
  • Redis主服务器会记下每一个从服务器的最后一次PING时间。
  • 用户可以配置一个最小的从服务器数量,这些从服务器和主服务器之间的中断不能超过一个最大的秒数

如果有最少N个从服务器,和主服务器之间的中断不超过M秒,写请求才会被接受。

你可能认为这就是CAP理论中C放松的版本,这里对于一个给定的读,一致性是没有得到保证的,但是至少数据丢失的时间窗口是被限制在一个给定的秒数内的。

如果条件没有符合,主服务器会拒绝写并返回一个错误。

这里有相关的两个配置:

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

更多的信息可以查看随Redis源码发布的Redis.conf配置例子。

0 0
原创粉丝点击