redis主从

主节点(master), 从节点(slave) 默认情况下每个从节点只能有一个主节点,而主节点可以有多个从节点。复制的数据流, 只能从主节点复制到从节点。

1. 建立复制

1)在配置文件中加入slaveof {masterHost} {masterPort} 随Redis启动生效
2)在redis-server启动命令后加入 --slaveof {masterHost} {masterPort}生效
3)直接使用命令:slaveof {masterHost} {masterPort}生效

例如本地启动两个端口为6379和6380的Redis节点 127.0.0.1: 6380执行如下命令:

127.0.0.1:6380>slaveof 127.0.0.1 6379

复制关系建立后执行如下命令测试:

127.0.0.1:6379>set hello redis
OK
127.0.0.1:6379>get hello
"redis"
127.0.0.1:6380>get hello
"redis"

从运行结果中看到复制已经工作了, 针对主节点6379的任何修改都可以 同步到从节点6380中.

主节点6379复制状态信息

127.0.0.1:6379>info replication
# Replication
role:master
onnected_slaves:1
slave0:ip=127.0.0.1,port=6379,state=online,offset=43,lag=0

从节点6380复制状态信息

127.0.0.1:6380>info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0

2. 断开复制

1.在6380节点上执行slaveof no one来断开复制 2.执行slaveof{newMasterIp} {newMasterPort}来实现切主操作, 切新主之前会删除掉旧的数据

3. 安全性

如果主节点通过requirepass选项设置了密码,则从节点需要 动态设置

127.0.0.1:6380> config set masterauth <password>

配置文件中

 masterauth <password>

4.传输延迟

repl-disable-tcp-nodelay参数用于控制是否关闭TCP_NODELAY, 默认关闭

当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节点,
这样主从之间延迟会变小,但增加了网络带宽的消耗,
适用于主从网络良好, 比如同机架或同机房部署

开启时, 主节点会合并较小的TCP数据包从而节省带宽。
默认发送时间间隔取决于Linux的内核,一般默认为40毫秒。
这种配置节省了带宽但增大主从之间的延迟,适用于主从网络复杂/带宽紧张, 比如跨机房部署

5.复制过程

1)保存主节点信息
2)主从建立socket连接
3)发送ping命令
4)权限检查
5)同步数据集
    对于首次建立复制的场景, 主节点会把所有持有数据全部发送给从节点
    主节点执行bgsave保存RDB到本地
    主节点发送RDB文件到从节点
6)命令持续复制
    主节点持续把写命令同步给从节点,保证主从数据一致性

6.数据同步

全量复制

适用于初次复制场景

部分复制

用于主从复制因为网络闪断等造成数据丢失场景 
原理: 从节点每秒上报自身复制偏移量给主节点 
        主节点响应写命令时候,除了把命令发送给从节点,也会写入复制积压缓存区

7.心跳

主从建立复制后,维护长连接并且彼此发送ping/ack命令

8.异步复制

主节点不但负责数据读写,还负责把写命令同步给从节点。写命令的发送过程是异步完成,也就是说主节点自身处理完写命令后直接返回给客户 端,并不等待从节点复制完成

问题: 存在主从之间数据延迟

参考: 《redis开发与运维》