在实际场景中,单一节点的 redis 容易面临风险node
机器故障git
容量瓶劲github
总结redis
配置文件数据库
启动命令安全
客户端命令服务器
查看复制信息 - 经过 info replication 命令能够看到复制的一些信息 配置文件中注意事项 - 查看 LOG 文件位置 - 保护模式 - 密码配置
1.链接创建阶段「准备阶段」网络
2.数据同步阶段架构
3.命令传播阶段并发
从节点执行 slaveof 命令后,会进行如下步骤进行复制
保存主节点信息
主从节点创建 socket 链接
从节点经过内部运行定时任务,维护复制相关逻辑,当定时任务发现新的主节点后,会尝试与该节点进行网络链接
关于链接失败
发送Ping 命令
创建链接成功后,从节点发送 Ping 请求进行首次通讯,Ping 命令的主要目的
 \  - 从节点发送的 Ping 命令成功返回后,Redis 打印日志,并继续后续的复制流程  4. 权限验证 - 若是主节点设置了 requirepass 参数,则须要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能验证经过,若是验证失败,复制将终止,从节点从新发起复制流程 5. 同步数据集 - 主从复制链接正常通讯后,对于首次创建的复制场景,主节点会把全部的数据所有发送给从节点,这步是耗时最长的步骤 6. 命令持续复制 - 当主节点把当前数据所有发送到从节点后,便完成了复制流程,接下来主节点会持续的把命令发送给从节点,保证主从数据的一致性 
全量复制过程
全量复制的开销
部分复制的过程
redis 选择决策
如何避免全量复制?
调整积压缓冲区的大小
服务器运行ID「runid」
主节点
从节点
slave 节点须要配置该项,指向 master 的 IP 和 端口
若是 master 启用了密码保护,则配置该项须要填写 master 的启动密码,若是master 未启动该项,则该项须要注释
指定 master 和 slave 链接中断时的动做。\
默认是 yes,表示 slave 会继续应答来自 client的请求,但这些数据可能已通过期「由于链接中断可能没法进行master同步」;
若配置为 no , 则 slave 除正常应答 INFO 和 slaveof 「配置命令」外,其他来自客户端的请求命令均会获得 “SYNC with master in progress” 的应答,直到该 slave 和master重建链接成功或者 slave 提高为 master
指定 slave 是否为只读,默认为 yes\
若配置为 no ,表示slave 是可写的,但写的内容在主从同步之后会被清空
指定向 slave 同步数据时,是否禁用 socket 的NO_DALY 选项,若配置为 yes ,则表示禁用 NO_DALY ,则 tcp 协议栈会合并小包统一发送,这样能够减小主从传输间的包数量和减小带宽,但会增长同步到 slave 的时间;
若配置为 no , 代表启用 NO_DALY,则 tcp 协议栈 不会延迟小包的发送时机,这样数据同步的延时会减小,但须要更大的宽带;
一般状况下,应该配置为 no 以下降同步的延时,但在主从节点间网络负载很高的状况下,能够配置为 yes
指定 slave 的优先级,在不仅一个 slave 节点的部署环境下,当 master 宕机时,redis-sentinel 会将 priorty 值最小的 slave 提高为 master 。\
须要注意的是,若是该配置项值为 0,则对应的 slave 永远不会提高为 master
虽然读写有优点,可以让读这部分分配给各个从节点,若是不够直接添加 slave 从节点,可是会出现如下问题
复制数据延迟
对于N个从节点链接的时候才容许写入「比较极端的方式」
解释如下这个特性是怎么工做的
主节点配置须要两个参数
从节点故障问题
例如:maxmemory 不一致,若是主机配置 maxmemory 为8G,从机 slave 设置为 4G,这个时候是能够用的,还不会报错,单数若是要作高可用,让从节点变成主节点的时候,就会发现数据已经丢失了,并且没法挽回
例如:第一次的全量复制是不可避免的,这时须要选择小主节点,且 maxmemory 值不要过大,这样就会比较快,同时选择在低峰值的时候作全量复制
形成全量复制的缘由
主节点若是重启,runid 将会发生变化,若是从节点监控到 runid 是不一样一个,它就会认为你的节点不安全,当发生故障转移的时候,若是主节点发生故障,那么从机就会变成主节点。 1. 复制缓冲区空间不足。 好比默认值:1M 能够部分复制,但若是缓冲区不够大的话,首先须要网络中断,部分复制就没法知足,其次须要增大复制缓冲区配置「relbacklogsize」,对网络的缓冲加强 解决方案: - 在一些场景下,可能但愿对主节点进行重启。 例如:主节点内存碎片率太高,或者但愿调整一些只能在启动时调整的参数,若是使用普通的手段重启主节点,会使得 runid 发生变化,可能致使没必要要的全量复制 - 为了解决这个问题,redis 提供了 debug reload 的重启的方式,重启后,主节点的 runid 和 offset 都不受影响,避免了 全量复制 3.当一个主机下面挂了不少个 slave 从机的时候,主机master 挂了,这时 master 主机重启后,由于 runid 发生了变化,全部的 slave 从机都要作一次全量复制,这将引发但节点和但机器的复制风暴,开销会很是大 - 解决方案: - 通常使用一主多从,由于主节点还同时担任写操做 - 能够采用树状结构下降多个从节点对主节点的消耗 - 从节点采用树状结构很是有用,网络开销给位于中间层的从节点,而没必要消耗顶层的主节点,可是这种树状结构也带来了运维的复杂性,增长了手动和自动处理故障转移的难度\ 
解决方案:
没有最合适的方案,只有最合适的场景,读写分离须要业务能够容忍必定程度的数据不一致,适合读多写少的业务场景,读写分离,是为了要创建一主多从的架构,才能横向任意扩展 slave node 去支撑更大的读吞吐量