redis复制
本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 。
这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外,您还会在Redis命令行上乱七八糟。 接下来是更高级的主题,例如复制,分片和集群,同时还介绍了Redis与Spring Data的集成。 在这里查看 !
目录
- 1.简介 2.在Redis中复制 3.在Redis中配置基本复制 4.验证复制是否有效 5.在运行时配置复制 6.高级复制配置
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 Configuration ,
slave-serve-stale-data
设置)
在几个建议的用例中,Redis复制可能非常方便。 首先,它可以用于具有多个从属服务器以进行只读查询或仅用于数据冗余。 其次,也可以使用复制来避免主服务器将整个数据集写入磁盘:从服务器可以配置为定期这样做。
另外,Redis 2.8中最近的一项非常重要的增强功能是:主服务器和从服务器通常能够继续复制过程,而无需在复制链接断开后进行完全重新同步。 实际上,这意味着,如果在主服务器和从服务器之间发生网络分区,则从服务器可以稍后通过获取丢失的更改集而不是整个数据集来追赶主服务器。
3.在Redis中配置基本复制
从站(或副本)配置非常简单,基本形式只需要在redis.conf
文件中设置单个参数slaveof
:主IP地址和端口。 值得一提的是,默认情况下,Redis从站以只读模式运行。 此行为由配置文件redis.conf
的slave-read-only
选项redis.conf
,可以在从属运行时使用CONFIG SET
命令更改(请参考本教程的第2部分 : Redis命令–使用Redis命令行 ) 。 只读从站将拒绝所有写命令。
反过来,非只读从设备将接受写命令。 请注意,以这种方式写入从站的数据是短暂的,当从站和主站重新同步或重新启动从站时,这些数据将消失。
为了在实践中了解Redis复制配置有多么容易,我们将配置一个主服务器和两个从属服务器(副本)。 一个从属服务器(副本)将具有默认的只读模式(在下面的图片中用绿色标记),而另一个从属服务器(副本)将被配置为支持写操作,以便我们可以实际看到发生了什么。
对于主服务器和从服务器,我们将使用Redis发行版中的配置模板redis.conf(请参阅本教程的第1部分 , Redis安装–如何安装Redis )。
- 对于
master
,只需将redis.conf
复制到redis-master.conf
:cp redis.conf redis-master.conf
并使用以下配置启动Redis服务器:
redis-server redis-master.conf
- 对于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
启动后,从站(副本)立即与主站同步(如下图所示)。
- 对于slave(副本)2,只需将
redis.conf
复制到redis-slave2.conf
:cp redis.conf redis-slave2.conf
并将以下配置设置添加到
redis-slave2.conf
(我们假设Redis master的主机名是master
):slaveof master 6379
将
slave-read-only
从yes (默认)更改为no ,从而有效地允许写入。slave-read-only no
最后使用此配置启动Redis服务器,将默认端口替换为
6381
:redis-server redis-slave2.conf --port 6381
启动后,从站(副本)立即与主站同步(如下图所示)。
此时,我们有了一个拓扑,其中连接了一个Redis主服务器和两个Redis从属服务器(副本)。
4.验证复制是否有效
有两种简单的技术可以确认Redis复制是否按预期工作。 最简单的方法是在主服务器上SET
一些密钥,然后在每个从服务器上对此密钥发出GET
命令以查看它是否已复制。
尝试在从站1上发出任何写命令都会导致错误,因为它是在只读模式下配置的(如下图所示)。
因此,在从机2上发出任何写命令都是合法的,但是一旦从机与主机重新同步,所有这些临时数据都将消失。
5.在运行时配置复制
如果您已经在运行多个独立的Redis服务器,则借助Redis运行时配置功能,可以配置主从复制而无需重新启动其中的一个。 为了在现场进行演示,我们将在端口6390
上运行常规Redis实例,然后使其成为另一个Redis实例( master
)的从属。 因此,让我们来看看独立实例:
redis-server --port 6390
现在,让我们使用redis-cli
连接到该实例,并使用SLAVEOF
命令( [2] ),使该实例成为正在运行的master
实例的从属(副本)。
实例通过使用完全同步立即与主服务器同步(如下图所示)。
也可以同时使用CONFIG SET
命令( [3] )将从站的默认只读模式更改为读写模式。
在任何时候,都可以使用CONFIG GET
命令查询当前配置设置。 以下示例检索slave-read-only
设置,以确保将其值更改为“ yes ”。
6.高级复制配置
除了我们的基本示例外,还有很多设置在实词场景中非常有用。 在本节中,将详细介绍其中的大部分内容,以指出如何使复制更加健壮。
仅当当前至少有N个从属服务器连接到Redis主服务器时,才可以将其配置为接受写入命令(但是无法确保从属服务器实际收到了给定的写入操作,仅在不足够的情况下限制丢失写入操作的暴露窗口从站可用)具有指定的秒数。
配置设置支持最小数量的从属设备( min-slaves-to-write
),该min-slaves-to-write
的延迟不大于最大秒数( slaves-max-lag
)。 如果不满足这些条件,则主机将返回一个错误,并且将不接受写入。
如果主服务器受密码保护(使用requirepass配置指令),则可以在开始复制同步过程之前告诉从服务器进行身份验证,否则主服务器将拒绝从服务器请求。
当从属服务器失去与主服务器的连接或复制仍在进行时,从属服务器可以通过两种不同的方式进行操作:
- 如果
slave-serve-stale-data
设置为“ yes ”(默认设置),slave仍将回复客户端请求,可能包含过期数据,或者如果这是第一次同步,则数据集可能为空 - 如果
slave-serve-stale-data
设置为“ no ”,则slave将对所有类型的命令( “INFO
( [4]” )和SLAVEOF
( [2] )进行答复,并显示错误“ 与主机进行同步 ”。
从站以预定义的间隔将PING
发送到服务器。 允许使用repl_ping_slave_period
选项更改此间隔。
可以配置主服务器和从服务器的复制超时(从服务器的角度来看是超时,当从服务器决定主服务器不可用时,从超时的角度来看,超时是从主服务器的角度来看,当主服务器决定从服务器的角度是超时时)不可用):
- 从站的角度来看,在SYNC期间进行批量传输I / O
- 从机角度来看主机超时
- 从主机角度来看从机超时
出于复制目的,Redis通过使用repl-disable-tcp-nodelay
选项支持一些底层TCP协议调整。 如果将其设置为“ yes ”,则Redis服务器将使用较少数量的TCP数据包和较少带宽将数据发送到从属服务器。 但这会增加数据显示在从属端的延迟(对于使用默认配置的Linux内核,此延迟最多为40毫秒)。 激活此设置在非常繁忙的流量条件下或当主从之间的距离很远时可能会很有用。 默认情况下,它设置为“ no ”,这意味着将减少数据出现在从属端的延迟,但是将使用更多带宽进行复制。
有两个配置参数可帮助主服务器管理从属断开连接和部分复制:复制积压大小和积压缓冲区生存时间。 待办事项是一个缓冲区,当从站断开连接一段时间后,该缓冲区会累积从站数据,因此,当从站要再次重新连接时,通常不需要完全重新同步,但是部分重新同步就足够了(只需将部分数据传递给从站即可)断开连接时错过)。 复制积压最大,从服务器可以断开连接的时间越长,以后就可以执行部分重新同步。 仅当连接了至少一个从站时,才分配积压。
主机在一段时间内不再连接从机后,积压的订单将被释放。 repl-backlog-ttl
选项配置从释放最后一个从属服务器开始到释放待办事项缓冲区所需的秒数。
最后,一个非常有趣的设置,即为Redis Sentinel( [5] )使用的从站(副本)分配优先级,以便在主站无法正常工作时选择要升级为主站的从站。 具有较低优先级编号的从属服务器更适合提升,例如,如果有三个具有优先级10、100和25的从属服务器,Redis Sentinel( [5] )将选择一个具有优先级10(最低的)的从属服务器。 但是,特殊优先级0表示从属服务器无法执行主机角色,因此Redis Sentinel( [5] )永远不会选择优先级为0的从属服务器进行升级。
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
redis复制