Redis 之复制-初入江湖
一.前言
在分布式系统中,为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复合负载均衡等需求.Redis也是如此,它为我们提供了复制的功能,实现了相同数据的多个Redis副本.复制功能是Redis高可用的基础,后面的哨兵和集群都是在复制的基础上实现高可用的.
二.复制的配置
1.如何建立配置
参与复制的Redis实例划分为master(主节点)和slave(从节点).在默认情况下,Redis都是master节点,每个节点只能有一个master节点,而master节点是可以同时具有多个slave节点的(如图一所示).复制数据的流是单向的,只能由master节点复制到slave节点.配置复制的方式有三种,如下:
- 在配置文件中加入slaveof {masterHost} {masterPort} 虽Redis启动生效.
- 在redis-server启动命令后加入--slaveof {mastaerHost} {masterPort} 生效.
- 直接使用命令:slaveof {mastaerHost} {masterPort}生效
2.如何断开复制
slaveof命令不但可以建立复制,还可以在从节点执行 slaveof no one 来断开于主机节点的复制关系(如图二所示).从节点在断开复制后并不会抛弃原有的数据,只是无法获取主节点上的数据变化而已.其主要流程如下:
- 断开于主节点的复制关系
- 从节点晋升为主节点
通过slaveof命令还可以实现切主操作,所谓的切主是指把当前的从节点对主节点的复制切换到另一个主节点.执行slaveof {newMastaerIp} {newMasterPort}命令即可,切主其流程如下:
- 断开与旧主节点复制关系
- 与新主节点建立复制关系
- 删除从节点当前所有数据
- 对新主节点进行复制操作
图1:
图2:
注意:切主后从节点会清空之前所有的数据,线上人工操作时小心slaveof在错误的节点上之行或者指向错误的主节点
3.关于链接的安全性
对于比较重要的节点,主节点会通过设置requeirepass参数进行密码验证,这时所有的客户端访问必须使用auth命令进行校验.从节点与主节点的复制连接是通过一个特殊的客户端来完成的,因此需要配置从节点的masterauth参数与主节点密码保持一致,这样从节点才可以正确的连接到主节点并发起复制流程.
4.只读
默认情况下,从节点使用 alave-read-only=yes 配置为只读模式.由于复制只能从主节点到从节点,对于从节点的任何修改,主节点都是无法感知的,修改从节点会造成数据不一致.因此,建议不要修改这个配置.
5.传输延迟
从节点一般部署到不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis为我们提供了 repl-disable-tcp-nodelay 参数用于控制是否关闭TCP_NODELAY,默认关闭.
三.复制拓扑
Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为三种:一主一从、一主多从、树形主从结构.
1.一主一从
一主一从是最简单的复制拓扑结构,用于主节点出现宕机时,从节点提供故障转移支持(如下图所示)。当应用写命令并发量较高且需要持久化时,可一只在从节点上开启AOF,这样既能保证数据安全性,也避免了持久化对主节点性能的影响.
注意:当主节点因为提高性能关闭了 AOF 持久化功能,如果主节点脱机要避免自动重启的操作,因为主节点之前并没有开启持久化功能,自动重启后数据集是为空的,如果从节点继续复制主节点的话,从节点的数据也会被清空!这样也就丧失了持久化的意义了.所以,如果想保留数据,正确的做法是先执行slaveof no one断开从节点和主节点的复制连接,然后再重启主节点来避免这一问题.
2.一主多从
一主多从,又称星形拓扑结构,使得应用端可以利用多个从节点实现读写分离(如下图所示),对于读占比较大的场景,可以通过多个读节点分担主节点压力.同时,在日常开发中,一些耗时命,如:keys、sort等,可以在其中一台上执行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性.但是如果写并发量较高的话,多个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加重了主节点负载影响服务稳定性.
3.树形主从
树形主从,又称:树状拓扑结构(如下图所示),使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制.通过引入复制中间层,可以有效的降低主节点负载均衡和需要传送给从节点的数据量但是当主节点需要挂载多个从节点时,为了对主节点的性能干扰,可以采用树状主从结构降低主节点压力.这样一主多从的缺点(多个从节点导致的消耗过多网络带宽)就解决了.
但是,这样还会有新的问题出现,如果图中某个slave节点故障,那么后面的slave节点便将无法收到主节点的信息,因此对于运维来讲,增添了许多复杂度,需要手动将节点启动.
参考:《Redis开发与运维》
版权声明:尊重博主原创文章,转载请注明出处 https://www.cnblogs.com/hsdy