在分布式系统中为了解决单点故障的问题,我们通常会把数据复制多个副本部署到不同的机器,满足故障恢复和负载均衡等需求。
Redis也是如此,它为我们提供了复制功能,Redis复制实现了相同数据的多个副本。可以解决单点问题以及分担读写压力。
Redis复制的主从节点:
参与Redis实例复制的节点划分为主节点(master)和从节点(slaver)
默认情况下,Redis节点都是主节点
每个从节点只能有一个主节点,每个主节点可以有多个从节点
复制的数据流从主节点复制到从节点
1.建立复制
配置Redis复制的方式有以下三种:
从节点在配置文件中加入 slaveof 随Redis启动生效
从节点在启动命令后加入 -- slaveof 生效
在Redis节点中使用命令:slaveof 生效
我们现在启动两个Redis节点,一个端口6379,另一个端口6380,现在在6380节点上执行 slaveof 命令:
那么此时6379节点作为master,6380节点作为slave,6380节点从6379节点中复制数据。
2.查看主从关系
info replication 命令可以帮我们查看复制状态信息。
在主节点6379上执行命令:
在从节点6380上执行命令:
通过 info replication 命令我们可以很明确的看出:
6379节点是主节点,并且对应一个子节点
6380节点是从节点,并且显示对应主节点信息
还有一些其他的参数在这里暂时不做介绍。
3.断开复制
可以通过 slaveof no one 命令来断开从节点与主节点的复制关系。
通过上面的命令可以看到,在从节点6380上执行 slaveof no one 命令断开与主节点6379的复制关系之后,从节点6380晋升为主节点。
从节点断开复制后并不会抛弃原有数据,只是无法再同步主节点上的数据变化。
4.切主操作
切主操作指的是将从节点对主节点的复制切换到另一个主节点,比如说把6380节点从原先复制6379节点变成复制6381节点,切主流程:
断开节点6380与节点6379的复制关系
节点6380与节点6381建立复制关系
删除节点6380当前所有数据
对新的主节点6381进行复制操作
切主操作会删除节点上的所有数据,所以在线上人工操作时需要小心。
5.安全性
Redis的主从复制通过 slaveof 就可以实现,但是对于安全性高的节点使用这个命令进行复制会显得不够安全,所以Redis还提供了auth命令进行校验。
主节点可以在配置文件中设置 requirepass 参数来进行密码验证,这时从节点配置文件中的 requirepass 参数必须和主节点中的 requirepass 参数一致才能连接到主节点,并且发起复制流程。
6.只读
由于Redis复制只能从主节点同步到从节点,对于从节点的写操作主节点是无法感知到的,所以对于从节点的修改会破坏主从节点的数据一致性。
因此从节点上建议配置:
7.传输延迟
Redis主从节点传递消息的原理是从节点建立一个socket套接字,接受主节点发送的复制命令。那么主从节点之间一定是存在传输延迟的。
传输延迟和带宽的取舍一直是数据库主从设计上的一个难点,而两者之间的取舍一般不取决于架构,而取决于具体的业务场景,Redis提供了参数 repl-disable-tcp-nodelay 来供我们进行设置:
repl-disable-tcp-nodelay=no:主节点产生的命令无论大小都会及时的发送给从节点,这样主从延迟变小,但是会增大网络带宽的消耗
repl-disable-tcp-nodelay=yes:主节点会合并较小的TCP数据包来节省带宽。默认发送时间间隔取决于Linux内核,一般不超过40毫秒。这种配置会节约带宽,但是会增大主从之间数据复制的延迟
我们可以根据具体业务场景来配置 repl-disable-tcp-nodelay,数据一致性要求高的场景可以关闭,带宽不足(跨机房)的场景可以开启。repl-disable-tcp-nodelay配置可以让我们在数据一致性和带宽上根据具体业务场景做出自己的选择。
领取专属 10元无门槛券
私享最新 技术干货