Redis复制

本文是我们学院课程的一部分,标题为Redis NoSQL键值存储

这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外,您将在Redis命令行中乱七八糟。 接下来是更高级的主题,例如复制,分片和集群,同时还介绍了Redis与Spring Data的集成。 在这里查看

1.简介

复制是任何面向数据的解决方案的一个非常重要的功能:复杂的关系数据库或简单的键/值存储。 通过复制,可以将数据的许多副本分布在许多节点(服务器),数据中心和/或地理区域中。

复制是可靠,水平可伸缩和容错系统的基础:一旦一个数据节点(服务器)发生故障,另一个就可以为具有故障数据的(大部分)最新数据的查询或请求服务。 更不用说能够在主节点和从节点(只读副本)之间有效地拆分写入和读取操作的功能。 一些有趣的软件系统模式基于此类决策,例如CQRS (命令查询责任分离)和复制缓存解决方案。

基本上有两个主要的复制类:

  • Master – Master (或Active – Active )和
  • Master – Slave (或Active – Passive )。

尽管Master – Master是进行自动故障转移的最佳选择,但它非常复杂,只有很少的数据解决方案。 在撰写本文时,Redis 2.8.4仅支持Master – Slave复制。

2.在Redis中复制

本部分的内容基于出色的Redis文档[1] 。 如前所述,Redis支持Master – Slave复制,该复制允许从服务器成为主服务器的精确副本。

有关Redis复制的一些事实:

  • Redis使用异步复制
  • Redis主服务器可以有多个从服务器
  • Redis从站可以接受来自其他从站的连接(级联复制)
  • Redis复制在主服务器端无阻塞:当一个或多个从服务器执行初始同步时,主服务器将继续处理查询
  • 可以将Redis复制配置为在从属端无阻塞:在从属端执行初始同步时,它可以使用旧版本的数据集处理查询(请参见Advanced Replication Configurationslave-serve-stale-data设置)

在几个建议的用例中,Redis复制可能非常方便。 首先,它可以用于具有多个从属服务器以进行只读查询或仅用于数据冗余。 其次,也可以使用复制来避免主服务器将整个数据集写入磁盘:从服务器可以配置为定期这样做。

另外,Redis 2.8中最近的一项非常重要的增强功能是:主服务器和从服务器通常能够继续复制过程,而无需在复制链接断开后进行完全重新同步。 实际上,这意味着,如果在主服务器和从服务器之间发生网络分区,则从服务器可以稍后通过获取丢失的更改集而不是整个数据集来追赶主服务器。

3.在Redis中配置基本复制

从站(或副本)配置非常简单,基本形式只需要在redis.conf文件中设置单个参数slaveof :主IP地址和端口。 值得一提的是,默认情况下,Redis从站以只读模式运行。 此行为由配置文件redis.confslave-read-only选项redis.conf ,可以在从属运行时使用CONFIG SET命令更改(请参阅本教程的第2部分Redis命令–使用Redis命令行 ) 。 只读从站将拒绝所有写命令。

反过来,非只读从设备将接受写命令。 请注意,以这种方式写入从站的数据是短暂的,当从站和主站重新同步或重新启动从站时,这些数据将消失。

为了在实践中了解Redis复制配置有多么容易,我们将配置一个主服务器和两个从属服务器(副本)。 一个从属服务器(副本)将具有默认的只读模式(在下图标记为绿色),而另一个将从属服务器(副本)将被配置为支持写操作,以便我们可以实际看到发生了什么。

图1. Redis主从拓扑

图1. Redis主从拓扑

对于主服务器和从服务器,我们将使用Redis发行版中的配置模板redis.conf(请参阅本教程的第1部分Redis安装–如何安装Redis )。

  1. 对于master ,只需将redis.conf复制到redis-master.conf
    cp redis.conf redis-master.conf

    并使用以下配置启动Redis服务器:

    redis-server redis-master.conf
    图2. Redis主服务器启动

    图2. Redis主服务器启动

  2. 对于slave(副本)1,只需将redis.conf复制到redis-slave1.conf
    cp redis.conf redis-slave1.conf

    并将以下配置设置添加到redis-slave1.conf (我们假设Redis master的主机名是master ):

    slaveof master 6379

    然后使用此配置启动Redis服务器,将默认端口覆盖为6380

    redis-server redis-slave1.conf --port 6380

    启动后,从站(副本)立即与主站同步(如下图所示)。

    图3. Redis从属服务器(副本)1已启动(默认情况下处于只读模式),并立即与主服务器同步

    图3. Redis从属服务器(副本)1已启动(默认情况下处于只读模式),并立即与主服务器同步

  3. 对于slave(副本)2,只需将redis.conf复制到redis-slave2.conf
    cp redis.conf redis-slave2.conf

    并将以下配置设置添加到redis-slave2.conf (我们假设Redis master的主机名是master ):

    slaveof master 6379

    slave-read-onlyyes (默认)更改为no ,有效地允许写入。

    slave-read-only no

    最后使用此配置启动Redis服务器,将默认端口替换为6381

    redis-server redis-slave2.conf --port 6381

    启动后,从站(副本)立即与主站同步(如下图所示)。

    图4. Redis从站(副本)2已启动(读写模式)并立即与主站同步

    图4. Redis从站(副本)2已启动(读写模式)并立即与主站同步

此时,我们有了一个拓扑,其中连接了一个Redis主服务器和两个Redis从属服务器(副本)。

4.验证复制是否有效

有几种简单的技术可以确认Redis复制是否按预期工作。 最简单的方法是在主服务器上SET一些密钥,然后在每个从服务器上对此密钥发出GET命令以查看它是否已复制。

图5.在主节点上设置密钥mykey

图5.在主节点上设置密钥mykey

图6a

图6a

图6b。在两个从节点上获取密钥mykey并验证是否复制了主节点上的更改

图6b。 在两个从节点上获取密钥mykey并验证是否复制了主节点上的更改

尝试在从站1上发出任何写命令都会导致错误,因为它是在只读模式下配置的(如下图所示)。

图7.只读从属服务器(slave1)上的SET命令返回错误

图7.只读从属服务器( slave1 )上的SET命令返回错误

因此,在从机2上发出任何写命令都是合法的,但是一旦从机与主机重新同步,所有这些临时数据都将消失。

图8.接受读写从机(slave2)上的SET命令

图8.接受读写slave( slave2 )上的SET命令

5.在运行时配置复制

如果您已经在运行多个独立的Redis服务器,则借助Redis运行时配置功能,可以配置主从复制而无需重新启动其中的一个。 为了在现场进行演示,我们将在端口6390上运行常规Redis实例,然后使其成为另一个Redis实例( master )的从属。 因此,让我们来看看独立实例:

redis-server --port 6390
图9.在端口6390上运行独立Redis实例

图9.在端口6390上运行独立Redis实例

现在,让我们使用redis-cli并使用SLAVEOF命令( [2] )连接到该实例,我们将使该实例成为正在运行的master实例的从属(副本)。

图10.使独立Redis实例成为从属(副本)

图10.使独立Redis实例成为从属(副本)

实例通过使用完全同步立即与主服务器同步(如下图所示)。

图11.独立Redis实例成为从属(副本),并与主实例进行完全重新同步

图11.独立Redis实例成为从属(副本),并与主实例进行完全重新同步

也可以同时使用CONFIG SET命令( [3] )将从站的默认只读模式更改为读写模式。

图12.将奴隶的默认只读模式更改为读写

图12.将slave的默认只读模式更改为读写

您可以随时使用CONFIG GET命令查询当前配置设置。 以下示例检索slave-read-only设置,以确保将其值更改为“ yes ”。

图13.查询从站的只读模式配置设置

图13.查询从站的只读模式配置设置

6.高级复制配置

除了我们的基本示例外,还有很多设置在实词场景中非常有用。 在本节中,将详细介绍其中的大部分内容,以指出如何使复制更加健壮。

仅当当前至少有N个从属服务器连接到Redis主服务器时,才可以将其配置为接受写入命令(但是无法确保从属服务器实际收到了给定的写操作,只是为了限制丢失丢失的写操作的暴露窗口从站可用)具有指定的秒数。

配置设置支持最小数量的从属设备( min-slaves-to-write ),该min-slaves-to-write的延迟不大于最大秒数( slaves-max-lag )。 如果不满足这些条件,则主机将返回一个错误,并且将不接受写入。

设置 min-slaves-to-write <从站数量>
描述 设置<奴隶数>,为了执行写命令,应该连接该奴隶数。 <奴隶数量>奴隶必须处于“在线”状态。 将该值设置为0将禁用此功能。
默认值 默认情况下,“ min-slaves-to-write设置为0(禁用功能)
min-slaves-to-write 3

表格1

设置 min-slaves-max-lag <秒数>
描述 以秒为单位设置必须小于或等于指定值的延迟。 它是根据从从站收到的最后一次ping计算得出的(通常每秒发送一次)。 将该值设置为0将禁用该功能。
默认值 默认情况下, min-slaves-max-lag设置为10
min-slaves-max-lag 10

表2

如果主服务器受密码保护(使用requirepass配置指令),则可以在开始复制同步过程之前告诉从服务器进行身份验证,否则主服务器将拒绝从服务器请求。

设置 大师认证
描述 配置用于与主服务器进行身份验证的密码
默认值 已注释掉(无身份验证)
masterauth mysectetpassword

表3

当从属服务器失去与主服务器的连接或复制仍在进行时,从属服务器可以通过两种不同的方式进行操作:

  • 如果slave-serve-stale-data设置为“ yes ”(默认),则slave仍将回复客户端请求,可能包含过期数据,或者如果这是第一次同步,则数据集可能为空
  • 如果slave-serve-stale-data设置为“ no ”,则slave会针对所有类型的命令( INFO[4]” )和SLAVEOF[2] )回复错误“ 与主机进行同步
设置 slave-serv-stale-data是| 没有
描述 配置从站失去与主站的连接时的行为
默认值 默认情况下, slave-serve-stale-data设置为yes
slave-serve-stale-data

表4

从站以预定义的时间间隔将PING发送到服务器。 可以使用repl_ping_slave_period选项更改此间隔。

设置 repl-ping-slave-period <秒数>
描述 配置从站将PING发送到服务器的频率
默认值 默认情况下, repl-ping-slave-period设置为10
repl-ping-slave-period 10

表5

可以为主服务器和从服务器配置复制超时(从服务器的角度来看是超时,当从服务器决定主服务器不可用时,从超时的角度来看,超时是在主服务器决定从服务器的角度来看,是超时。不可用):

  • 从站的角度来看,在SYNC期间进行批量传输I / O
  • 从机角度来看主机超时
  • 从主机的角度来看从机超时
设置 repl-timeout <秒数>
描述 配置复制超时。 重要的是要确保该值大于为repl-ping-slave-period指定的值,否则,每当主机与从机之间的通信量较低时,都会检测到超时。
默认值 默认情况下, repl-timeout设置为60
repl-timeout 60

表6

出于复制目的,Redis通过使用repl-disable-tcp-nodelay选项支持一些底层TCP协议调整。 如果将其设置为“ yes ”,则Redis服务器将使用较少数量的TCP数据包和较少带宽将数据发送到从属服务器。 但这会增加数据在从属端出现的延迟(对于使用默认配置的Linux内核,此延迟最多为40毫秒)。 激活此设置在非常繁忙的流量条件下或当主从之间的距离很远时可能会很有用。 默认情况下,它设置为“ no ”,这意味着将减少数据出现在从属端的延迟,但是将使用更多带宽进行复制。

设置 repl-disable-tcp-nodelay是| 没有
描述 SYNC后在从属套接字上禁用/启用TCP_NODELAY
默认值 默认情况下, repl-disable-tcp-nodelay设置为“ no ”(针对低延迟进行了优化)
repl-disable-tcp-nodelay

表7

有两个配置参数可帮助主服务器管理从服务器断开连接和部分复制:复制积压大小和积压缓冲区生存时间。 待办事项是一个缓冲区,当从站断开连接一段时间后,该缓冲区会累积从站数据,因此,当从站要再次重新连接时,通常不需要完全重新同步,但是部分重新同步就足够了(只需将部分数据传递给从站即可)断开连接时错过)。 复制积压最大,从服务器可以断开连接的时间越长,以后将能够执行部分重新同步。 仅当至少有一个从站连接时,才分配积压。

设置 repl-backlog-size
描述 设置复制积压大小
默认值 默认情况下, repl-backlog-size is set to “ 1mb
repl-backlog-size 1mb

表8

当主站不再连接从站一段时间后,积压的事务将被释放。 repl-backlog-ttl选项配置从释放上一个从属服务器开始到释放待办事项缓冲区所需的秒数。

设置 repl-backlog-ttl <秒数>
描述 设置积压缓冲区的生存时间,然后再释放它。 值为0表示从不释放积压。
默认值 默认情况下, repl-backlog-ttl设置为“ 3600
repl-backlog-ttl 3600

表9

最后,一个非常有趣的设置,即为Redis Sentinel( [5] )使用的从站(副本)分配优先级,以便在主站无法正常工作时选择要升级为主站的从站。 具有较低优先级编号的从属被认为更适合提升,例如,如果有三个具有优先级10、100、25的从属,Redis Sentinel( [5] )将选择具有优先级10(最低)的一个。 但是,特殊优先级0表示从属服务器无法执行主机角色,因此Redis Sentinel( [5] )永远不会选择优先级为0的从属服务器进行升级。

设置 从属优先级 <数字>
描述 从属优先级是Redis在INFO输出中发布的整数。
默认值 默认情况下, slave-priority设置为100
slave-priority 100

表10

Redis Sentinel( [5] )将在本教程的后面进行讨论。

[1] http://redis.io/topics/replication
[2] http://redis.io/commands/slaveof
[3] http://redis.io/commands/config-set
[4] http://redis.io/commands/info
[5] http://redis.io/topics/sentinel

翻译自: https://www.javacodegeeks.com/2015/09/redis-replication.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值