有学习的小伙伴可以一起讨论,微信 15321502296
第五章 复制
复制功能 :是高可用redis的基础,后面的哨兵和集群都是在复制的基础上进行的,满足数据恢复和负载均衡
1、建立配置
主节点 和从节点 主上操作,从上学习
每个从节点只能有一个主节点,而主节点可以有多个从节点
复制的数据流是单向的,从复制主。方法有三种
(1)、在配置文件中加入(slaveof masterHost)(master Port)随redis启动生效
vim redis.conf
在slaveof下添加
(2)在redis-server启动命令后加入-slaveof(masterHost)(masterPort)生效
(3)在交互式界面直接使用命令 :slaveof(masterHost)(masterPort)生效
slaveof 192.168.4.60 6379
slaveof 节点值保留主节点的信息,然后返回
复制流程,以异步当时方式执行
查看主从信息
info replication
断开主从复制
slaveof no one
1、断开与主节点的复制关系
2、晋升为主节点
切主 :
把当前从节点上对主节点的复制,切换到另一台主节点上的复制
slaveof 新主的ip 新主的端口
流程 :
1、断开与旧的复制关系
2、与新主的节点建立联系
3、删除从节点当前的所有数据 (为了生产安全不要操作 !!)
4、对新主节点进行复制操作
安全性 : requirepass 密码验证 auth校检,配置 masterauth参数
vim redis.conf
在主上添加 requirepass 123.com 登录时用auth+密码验证
在从上 添加 masterauth 123.com 声明 主上的密码
只读 : slave-read-only yes 改成no 从节点修改,可能会造成数据没有统一性
传输延迟 :
再主上设置 repl-disable-tcp-nodelay 控制是否关闭 tcp-nodelay
关闭 ,主节点产生的命令数据不管大小都会及时发送给从节点,主从延迟会减小,增加了网络带宽消耗,在主从同机房,同机架、上部署。
开启 :主节点会合并比较小的tcp 数据包发送给从,节省带宽,一般40毫秒发送一次,一般在跨机房部署时使用。
拓扑图
星型 树状
复制过程·的原理
1、保存主节点信息 slaveof
2、从节点通过内部每秒运行的定时任务维护,复制相关的逻辑
从节点无法建立链接,定时任务会无限重复,直到成功
查看从节点失败的原因
命令操作 : info replicatio
查看 master_link_down_since_seconds
3、连接成功时,第一次发送ping命令,首次通信
检测主机网络套接字,是否接受处理的命令
4、执行权限的验证,密码验证
5、同步数据集,psync同步,主节点全部发送给从节点
6、命令持续复制
数据同步的方式
1、复制偏移量 (偏移量就是主节点宕掉之后,从节点代替主节点记录 所执行的操作时间,以及数量) 从节点每秒都会上报自身的偏移量,主记录到偏移量。主会根据自己的偏移量进行核对,同时保存自己的偏移量
2、复制积压缓冲区 :复制积压缓冲区是保存在主节点上的一个固定长度的列队,默认大小为1 mb。(缓冲区规则: 先进先出)
主会响应写命令,把命令发送给从节点,还会写入积压缓冲区
repl_blacklog_active:1 //开启积压缓冲区
repl_backlog_size:1048576 //缓冲区最大长度
repl_backlog_first_byte_offset:1984
repl_backlog_histlen:14
3、主节点运行的 id :每个redis'启动后都会有一个40位 16进制的字符串作为id,运行id 是 用来表示唯一识别redis的 节点,用info replication 查看,关闭再启动后,运行id会改变
4、psync 命令 : 从节点使用psync 完成部分操作和 全量操作
psync runid offset
运行id 复制偏移量
psync工作流程
主发送命令 :psync
主-从返回情况 :full resync、countinue、 err
全量复制 : 主节点吧全部数据一次性发送给从,量大,时间长
全量复制的流程
1、从节点 发送psync 复制请求 : 默认值为 ? 和 -1
2、主节点根据判断为全量复制回复 : full resync(全量复制)、continue(继续 ,出现在部分复制或者是增量复制)、err(错误)
3、从节点接受响应,保存 运行id 和偏移量
4、主节点执行bgsave 保存rdb文件到本地 ,
5、发送给从节点,从节点把接受的rdb文件保存到本地,并直接作为从节点的数据文件
6、从节点保存文件,并记录。主节点仍然响应
7、从节点删除自身的旧数据,加载rdb文件
8、加载完成后,会开启AOF持久化,进行学习
部分复制 重新建立连接,把之前断掉之后,没有发送的数据,剩下的部分继续发送
部分复制的工作流程
心跳
判断心跳的机制
通过 min-slaves-to-write、 min-slaves-max-log //参数定义
主节点根据 replication 判断从节点超时时间,如果超过默认的值,则判定从节点下线并段爱复制客户端连接。及时主节点判定从节点下线后,如果从节点重复恢复,心跳检测会继续进行。
异步复制
主节点复制的流程
1、主节点的端口6379 接收处理命令
2、命令处理完之后返回响应结果
3、对于修改命令异步发送给6380从节点,从节点在主线中执行命令
异步复制
主节点进行读写数据,并进行同步
开发或者运维中的问题
1、读写分离, 数据延迟 ,数据过期问题 ,从节点发生故障
数据延迟
1、 监控程序 :定期检查主从节点偏移量
2、当延迟字节量过高时,监控程序触发警报,并通知客户端从节点延迟过高
3、客户端接收到具体的从节点高延迟通知后,修改读命令到其他从节点或主节点。当延迟恢复后,在此通知客户端,恢复从节点的读命令请求
读到过期数据
惰性删除 主节点处理读取命令时,自动检测键的时间,如果超时自动删除
定时删除 在内部循环,定期查看键有没有过期,如果过期自动删除,之后同步给从节点
从节点的故障问题
在客户端维护,维护可用的节点列表,当从节点故障时,立刻切换到其他从节点或者主节点上,由监控程序去完成
主从配置不一样
内存相关的配置必须要一样,避免出现内存溢出
规避全量复制
建议在低峰时进行操作
复制积压缓冲区不足
把复制积压缓冲区,根据峰值进行设置
复制风暴
1、单主节点复制风暴 太多从节点
2、单机复制风暴 机柜
哨兵
redis setinel
哨兵 实现高可用的一种方式
自动完成故障发现和故障转移
配置哨兵
1、直接新建配置文件运行redis
cd /usr/local/redis-4.0.2 下
编辑新的配置文件
cp redis.conf redis.sentinel-26380.conf
修改端口
vim redis.sentinel-26380.conf
启动
service-server redis.sentinel-26380.conf --sentinel
配置主节点
底部添加以下内容
sentinel monitor mymaster 192.168.4.30 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel monitor <master name> <ip> <port> monitor : 监控
<master name> : 主节点名字
<quorum> :法定人数 最好设置为基数 哨兵节点数除以二加一 设置大 : 准确
setinel down-after-milliseconds <master name> <times>
通过 ping 命令 默认单位 毫秒
down-after-milliseconds : 定期发送 ping 命令
<times> 超过时间没响应就down掉
setinel parallel-sync <master name> <nums>
sentinel parallel-syncs :
一个从晋升为 主的时候 其他的从需要进行全量复制
会执行成为一个一个学习
setinel failover-time <master name> <time>
故障转移的超时时间
故障转移的过程
1、选出合适从节点
2、从节点晋升为主节点
3、其他的从节点向新主节点复制
4、等待原来的主节点恢复后命令他去复制新的主节点
故障转移失败 则 第一次超时时间是第二次超时时间的二倍
sentinel auth-pass <master name> <password>
setinel notification-script <master name> <script-path>
哨兵在故障转移期间出现问题 会触发脚本 发送邮箱配置文件
setinel client-reconfig-script <master name> <script-path>
部署redis sentinel 的技巧
1、setinel 节点不应该部署在一台物理机器上
2、 部署至少三个 奇数个数的sentinel
3、只有 一套sentinel,还是每个主节点配置一套
哨兵的 API
sentinel master 展示所有被监控的主节点的状态 和相关信息
setinel master <master name>
展示指定<master name > 的从节点状态 以及相关的统计信息
sentinel sentinels <master name>
展示指定 <master name>的 sentinel 节点集合
sentinel get-master-addr-by-name <master name>
返回指定<master name > 主节点的 ip地址端口
sentinel reset <pattern>
当前 sentinel 节点对符合 <pattern> 主节点的配置进行重置,包括 清除主节点相关状态
sentinel failover <master name>
对指定的<master name> 主节点进行强制故障转移
sentinel ckuquorum <master name>
检查当前可达的sentinel 节电数量是否 可达
<quorum>的 个数
sentinel flushconfig
将sentinel 节点的配置强制刷到磁盘上
sentinel remove <master name>
取消当前 sentinel 节点指定 <master name> 主节点的 监控
sentinel monitor <master name> <ip> <port> <quorum>
sentinel set <master name>
动态 修改 sentinel 的 配置
sentinel is-master-downby-addr
sentinel 节点之间用来交换 对主节点是否下线的判断
实现原理
三个定时监控任务
主观下线
客观下线
sentinel 领导选举
故障转移
有学习的小伙伴可以一起讨论,微信 15321502296