redis 简单整理——复制配置[二十二]
前言
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到 其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提 供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis 的基础,后面章节的哨兵和集群都是在复制的基础上实现高可用的。
正文
参与复制的Redis实例划分为主节点(master)和从节点(slave)。默认 情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以 同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节 点。配置复制的方式有以下三种:
1)在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。
2)在redis-server启动命令后加入--slaveof{masterHost}{masterPort}生效。
3)直接使用命令:slaveof{masterHost}{masterPort}生效。
综上所述,slaveof命令在使用时,可以运行期动态配置,也可以提前写 到配置文件中。例如本地启动两个端口为6379和6380的Redis节点,在 127.0.0.1:6380执行如下命令:
我这里先启动第二个docker 容器。
docker run -p 6380:6379 -v /myredis/conf2:/usr/local/etc/redis --name myredis2 redis redis-server /usr/local/etc/redis/redis.conf
主:
从:
这不是没有同步吗?
原因其实很简单,是因为这两个是docker通过127.0.0.1是不通的。
他们在同一个网络中,然后再次调用地址即可。
这样就成功了。
然后看一下主节点信息:
也是完美ok的。
断开复制
slaveof命令不但可以建立复制,还可以在从节点执行slaveof no one来断 开与主节点复制关系。上执行slaveof no one来断开复制
断开复制主要流程:
1)断开与主节点复制关系。
2)从节点晋升为主节点。
从节点断开复制后并不会抛弃原有数据,只是无法再获取主节点上的数据变化.
通过slaveof命令还可以实现切主操作,所谓切主是指把当前从节点对主 节点的复制切换到另一个主节点。执行slaveof{newMasterIp} {newMasterPort}命令即可.
切主操作流程如下:
1)断开与旧主节点复制关系。
2)与新主节点建立复制关系。
3)删除从节点当前所有数据。
4)对新主节点进行复制操作。
提示:切主后从节点会清空之前所有的数据,线上人工操作时小心slaveof在错 误的节点上执行或者指向错误的主节点。
安全性
对于数据比较重要的节点,主节点会通过设置requirepass参数进行密码 验证,这时所有的客户端访问必须使用auth命令实行校验。从节点与主节点 的复制连接是通过一个特殊标识的客户端来完成,因此需要配置从节点的 masterauth参数与主节点密码保持一致,这样从节点才可以正确地连接到主 节点并发起复制流程
只读
默认情况下,从节点使用slave-read-only=yes配置为只读模式。由于复 制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改 从节点会造成主从数据不一致。因此建议线上不要修改从节点的只读模式。
传输延迟问题
主从节点一般部署在不同机器上,复制时的网络延迟就成为需要考虑的 问题,Redis为我们提供了repl-disable-tcp-nodelay参数用于控制是否关闭 TCP_NODELAY,默认关闭,说明如下:
·当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节 点,这样主从之间延迟会变小,但增加了网络带宽的消耗。适用于主从之间 的网络环境良好的场景,如同机架或同机房部署。
·当开启时,主节点会合并较小的TCP数据包从而节省带宽。默认发送 时间间隔取决于Linux的内核,一般默认为40毫秒。这种配置节省了带宽但 增大主从之间的延迟。适用于主从网络环境复杂或带宽紧张的场景,如跨机房部署。
提示:部署主从节点时需要考虑网络延迟、带宽使用率、防灾级别等因素,如 要求低延迟时,建议同机架或同机房部署并关闭repl-disable-tcp-nodelay;如 果考虑高容灾性,可以同城跨机房部署并开启repl-disable-tcp-nodelay。
结
下一节介绍拓扑图。