
存储高可用,一般采用复制架构,复制架构,需要关注故障架构和状态决策2个要点
| 格式 | 优点 | 缺点 | 举例 | 
|---|---|---|---|
| 命令 | 数据量小 | 可能存在数据不一致 | Mysql 的statement同步方式,按commit顺序同步,可能存在数据不一致 | 
| Redis 的 AOF,每个操作室幂等的。 | |||
| MongoDB的oplog ,oplog中每个操作室幂等的 | |||
| 数据 | 保证数据一致性 | 数据量大 | Mysql的row模式 | 
| 文件 | 保证生成文件时数据一致性 | 数据量大 | Redis的RDB | 
| 复制的时候,数据可能有变化 | 
| 同步方式 | 特点 | 适用场景 | 
|---|---|---|
| 同步 | 最强一致性 | 主备,主从架构 | 
| 故障容忍度低 | ||
| 写入性能低 | ||
| 异步 | 会出现,数据不一致 | 数据存储集群 | 
| 故障容忍度高 | ||
| 写入性能高 | ||
| 半同步 | 同步,异步的折中方案 | 数据存储集群 | 
| 多数同步 | 数据一致性强 | 例如要求,分布式一致性 | 
| 故障容忍度高 | 例如:OceanBase | |
| 写入性能低,实现复制 | ||
| 最强高可用 | 
| 决策方式 | 特点 | 适用场景 | 
|---|---|---|
| 依靠决策者(利用zookeepr等) | 决策简单 | 大多数业务 | 
| 数据一致性中等 | ||
| 决策者本身高可用复杂 | ||
| 协商式 | 一般采用双通道,心跳机制 | 内部系统,网络设备 | 
| 数据一致性弱 | ||
| 标准算法式 | 决策过程复杂,一般采用标准算法 Raft,ZAB,Paxos等 | 余额,库存,或金融场景 | 
| 数据一致性最强 | ||
| 可用性最高,一般使用quorum 防止脑裂 | 
下图,是Redis,Sentinel 的架构图图:
Sentinel 是决策者, master 是主库,follow 是从库,下面按照数据复制,状态决策2个角度进行分析

redis是先写内存,后写AOF日志,不阻塞写操作
同步到磁盘的策略
AOF 重写 针对AOF文件大,redis优化方式
注:
   Redis的WAIT命令,可确保指定数量的Redis副本已确认
   在故障切换期间,已确认的写入可能会丢失,取决于Redis持久性的配置筛选
down-after-milliseconds * 10 以内的作为候选主库
down-after-milliseconds 主从库断连的最大连接超时时间。超过10倍,认为该候选库网络不好,剔除
打分
slave_repl_offset越接近master_repl_offset得分越高master_repl_offset,master写入的点位
slave_repl_offset 从库复制的点位
通知
让从库执行replicaof,与新主库同步
通知client 连接新的主库
Raft 协议的实现,大致流程如下:
注意:每个哨兵的quorum 和 down-after-milliseconds 必须一样