redis相关总结-主从
Contents
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开发与运维》
Author tmackan
LastMod 2019-02-01