redis主从复制:
1.配置:
master:修改:bind 0.0.0.0
想设置密码:requirepass
slave:
(1)修改配置文件:slaveof
(2)启动从节点server的时候:redis-server redis.conf --slaveof masterip masterport
(3)直接在客户端命令执行:slaveof masterip msterport
如果主节点设密码了:masterauth
2.主从复制原理:
主从第一-次连接进行全量复制,从节点发送复制请求给主节点,主节点受到请求进行rdb持久化
然后把rdb文件传送给从节点。从节点接收到rdb文件后清空旧数据,然后将rdb文件加载到内
存中。之后主节点数据的更新会同步到从节点。主从复制是异步的。
psync:当从节点由于故障断开和主节点的连接,如果每次恢复连接后对主节点进行全量复制会给主节点造成性能力和带宽浪费。使用psync可以实现部分复制:从节点在每次完成数据同步后都会保存一个数据的复制偏移量,然后从节点通过psync命令将定期将主节点的运行id和复制偏移量发送给主节点。主节点先验证运行id,根据复制偏移量来判断需要部分复制的数据,然后将这部分数据传送给从节点。
psync [runid] [offset]
runid:主节点每次启动都会生成一个16进制的id,从节点连接主节点后会保存这个runid
offset:当前从节点已复制的数据偏移量;
复制积压缓存区(环形队列)repl-backlog:主节点在内存当中维护的一个环形的队列,每次执行写命令后主节点都会将命令发送给他,从节点发送的offset在复制积压缓存区内,就把缓存区内的数据发送给从节点完成部分复制,复制积压缓存区的大小默认1M,我们通过设置repl-backlog-size可以调整他的大小,如果从节点的offset已经不在缓存区内,那就只能进行全量复制
master重启了,他的runid会发生变化,或发生从节点维护的runid和主节点不一致,所以此时也会进行全量复制
断开主从复制:slaveof命令不但可以建立复制,还可以在从节点执行slaveof no one 断开从节点的复制链接,断开后我们从节点上已经复制的数据不会丢失
slaveof命令还可以实现切换主节点。
slaveof 新主节点的ip 新主节点的port
实现流程:
1.断开与旧主的复制关系
2.与新主建立关系
3.删除从节点的所有数据
4.对新主节点进行复制
只读:建立主从复制关系后,从节点默认设置是只读:slave-read-only=yes,为了保证主从数据的一致性
传输延迟:repl-disable-tcp-nodelay 参数用来控制是否关闭tcp_nodelay,默认关闭;
(1)当关闭时,主节点产生的命令数据无论大小都会及时的发送给从节点,这样主从之间的延时会变小,但是增加了网络带宽的消耗,适用于主从主键的网络环境良好的场景,同机架或同机房
(2)开启时,主节点会合并较小的tcp数据包从而节省带宽,默认发送时间间隔取决于linux的内核,一般默认40毫秒,适用于主从网络环境复杂或带宽紧张的场景。
主从复制的结构:
(1)一主一从
(2)一主多从
(3)树状主从结构
心跳:
主从节点连接后,他们之间维护着长连接并彼此发送心跳命令;
client list:可以查看客户端信息
(1)主节点默认每10 秒给从发送ping命令,判断从节点的存活性和连接状态,可以通过
repl-ping-slave-period 10设置多少秒发送ping命令
(2)从节点在主线程每隔1秒发送replconf ack [offset]给主节点上报自身当前的复制偏移量
1.读写分离:
(1)复制数据延迟
(2)读到过期数据
(3)从节点故障
2.主从配置不一致:
maxmemory,hash-max-ziplist-entries等参数配置不一致
3.避免全量复制:配置自动故障转移方案;
4.避免复制风暴:
(1)大量的从节点连接一个主节点,容易出现复制风暴,对单节点的复制风暴
(2)单主机的复制风暴,多台主节点部署在同一服务器上。