数据分布:将数据均匀的分不到多个存储节点
1. 副本之间的数据一致性 2. 自动容错,自动检测故障、自动迁移负载 1. **网络永远不可靠**
分布式存储系统中的异常
- 服务器宕机:节点失去内存信息,原因可能是内存错误、服务器停电等
- 网络异常
- 消息丢失
- 消息乱序(UDP)
- 网络报数据错误
- 网络分区:集群节点被划分为多个区域,每个区域内可以正常通信,区域之间无法通信
- 磁盘故障
- 磁盘损坏:丢失存储在磁盘上的所有数据
- 磁盘数据错误:读出来的内容和写进去的不一致(需要 checksum)
网络异常导致的 RPC 请求结果三态:成功、失败、未知
数据一致性:用户角度,客户端读写操作是否符合某种特性;存储系统角度哦,存储系统的多个副本之间数据是否一致,更新的顺序是否相同
- 强一致:如果 Client A 写入一个值,保证后续的 Client A, B, C 读取操作都返回最新值
- 弱一致:如果 Client A 写入一个值,不保证后续的 Client A, B, C 读取操作能够返回最新值
- 最终一致:如果 Client A 写入一个值,在一段时间后,能保证 Client A, B, C 读取操作能返回最新值
分布式存储系统衡量指标
- 性能:TPS、RT Average、RT99
- 可用性: / 系统正常服务的时间
- 一致性
- 可扩展性
数据分布策略
哈希:根据某个特征计算哈希值,并与集群中的服务器建立映射关系
- 很那找到一个散列特性很好的哈希函数,从而会出现数据倾斜问题
- 手动拆分:标记热点,将热点数据分拆到多台服务器
- 动态调整:将热点数据拆分到多台服务器
- 服务器上下线时,映射关系被打乱,数据需要重新分布,带来大量的数据迁移
- 哈希值与服务器的对应关系作为元数据,交给专门的元数据服务器关系,查询时分两步,第一步计算哈希值,根据哈希值查元数据服务器,第二步从元数据服务器获得具体的服务器地址
- 一致性哈希
- 哈希环位置信息维护
- 每台服务器只记录前一个节点和后一个节点的位置信息,O(1) 空间复杂度,O(N)时间复杂度
- 每台服务器维护一个路由表,第 i 元素为编号为
p+2^i-1
的后继节点,O(logN)空间复杂度,O(logN) 时间复杂度 - 每台服务器维护全量位置信息,O(N)空间复杂度,O(1)时间复杂度
- 很那找到一个散列特性很好的哈希函数,从而会出现数据倾斜问题
顺序分布:将大表熟顺序划分为连续的范围,每个范围称为一个字表
- 随之插入和删除,会出现数据分布不均匀,某个子表太大,需要进行分裂,某些子表太小需要合并,从而减少系统中的元数据
数据副本复制
- 主备复制(Primary-based protocol):客户端写主副本,主副本的变更同步到备副本,一般通过操作日志实现
- 多写复制(Replicated-write protocol):如 NWR,写入是写 W 个副本,读取是从 R 个副本中读,要求
W + R > N
- 主备复制(Primary-based protocol):客户端写主副本,主副本的变更同步到备副本,一般通过操作日志实现
一致性与可用性
- CAP
- 自动容错导致 P 必须满足,因此 A 和 P 无法同时满足
- CAP
容错
- 故障检测:租约(Lease)协议,worker 只在租约内才允许提供服务,租约快到期时需要重新申请租约,需要注意时钟不一致的问题
- 副本打散:避免数据的所有副本分布在同一个机架内
- 故障恢复
- 单层结构:系统中对每个数据分片维护多个副本
- 主从切换
- 永久故障时,需要增加副本并同步数据
- 双层结构:分为存储和服务两层,存储层对数据分配维护多个副本,服务层只有一个服务本提供服务,存储层会将数据持久化写入底层的分布式文件系统,每个数据分片同一时刻只有一个提供服务的节点
- 加载内存状态,如索引
- 加载内存状态,如索引
- 单层结构:系统中对每个数据分片维护多个副本
总控节点不会成为可扩展性瓶颈
- 总控节点职责:维护元数据(如数据分布信息)、worker 管理、数据定位、故障检测和恢复、负责均衡、调度,总体来说数据量很小
- 如果总控节点需要维护文件系统目录树,内存容量可能成为性能瓶颈,解决办法是加一层 Meta Server
- 如果总控节点只需要维护分片的位置信息,一般不会成为瓶颈
数据库拆分
- 同构系统:分库分表,扩容不够灵活、自动化程度低
- 异构系统:线性可扩、扩缩容成本低
- 数据按分片组织,每个分片可以在集群任意一个节点上
- 每个节点上维护一部分分片
- 同一个分片的副本分布在多个不同的节点上
- 同构系统:分库分表,扩容不够灵活、自动化程度低
分布式协议
- 2PC(Two-phase Commit)保证节点之间的原子性,用于实现分布式事务,是阻塞协议
- 2PC 面临的故障
- 事务参与者发生故障:某个事务参与者一直不响应 → 解决办法,引入超时时间
- 事务协调者发生故障:需要提供备用协调者
- 2PC 面临的故障
- 数据一致性协议 Paxos
- 保证
- 只有一个节点成为主节点
- 最终一定会有一个节点成为主节点,不会没有主节点
- 执行步骤
- 批准(Accept) Proposer 发送 accpet 消息,要求其他节点(acceptor)接受某个提议值,Acceptor 可以接受或拒绝
- 确认(Acknowledge) 如果超过一半的 acceptor 接受,则提议生效,Proposer 发送 acknowledge 消息通知所有的 Acceptor 提议生效
- 保证
- 2PC(Two-phase Commit)保证节点之间的原子性,用于实现分布式事务,是阻塞协议
跨机房部署
- 集群整体切换(Master 和 Worker 有租约)
- 单个集群跨机房(Master 和 Worker 有租约)
- Paxos 选主副本(Master 和 Worker 没有租约)、工程复杂度太高
- 集群整体切换(Master 和 Worker 有租约)