数据库中间层
- 架构
- 数据库组:N 台数据库机器组成主备集群
- 元数据服务器:维护 dbgroup 拆分规则并用于 dbgroup 选主
- 扩容:MySQL Sharding 集群一般按照用户 id 进行哈希分区
- 面临的问题
- 集群容量不够(容量问题)
- 单个用户的数据量太大(热点问题)
- 通常使用双倍扩容方案,扩容时需要停写,大致流程为
- 等待主库数据同步到从库
- 停写,主从数据完全同步后接触主备关系
- 修改中间层映射规则,模 N 变成模 2N
- 开启写服务,原来的主备作为新的主,为他们增加新备
- 双倍扩容方案的优缺点
- 优点
- 对应用层透明
- 实现简单
- 缺点
- 数据库复制:主库压力较大时,主备复制延迟较大,主备切换可能会导致丢数据,需要人工接入
- 扩容问题:只能成倍扩容,并且容易出错
- 动态数据迁移问题:如果某个数据库组(分片)压力过大,需要迁移数据,需要总控节点协调,及其他节点配合,很难自动化
- 优点
- 面临的问题
Microsoft SQL Azure
- 数据模型:将数据划分为多个分区,限制事务只能在一个分区内执行来规避分布式事务
- 一个逻辑数据库称为一个表格组(table group),可以有主键,也可以没有
- 划分主键不需要是每个表格的聚集索引
- 表格组中所有划分主键相同的行集合称为行组(row group),只支持行组内的事务
- 如果表格组有主键,则支持自动水平拆分表格组
- 问题:
- 阻塞及性能
- 限制用户使用模式
- 只读事务可以跨多个 row group,但是事务隔离级别只能做到 RC
- 物理模型:表格组按照主键列有序分成多个数据分区(partition),分区之间互相不重叠
- 分区是复制、迁移、负载均衡的基本单位
- 分区的副本打散到不同的机架
- 每个分区有 1 主 2 从,3 个副本
- 主副本处理所有查询,更新以操作日志的方式同步到从副本
- 分区划分是动态的,可能动态合并或分裂
- 架构
- 复制与一致性
- Quorum Commit 复制协议,NWR
- 主副本与从副本之间传递逻辑操作日志,而不是磁盘物理页的 redo/undo log
- 容错:由全怒分区管理器统一调度,故障时每次选择一个分区执行重新配置
- 从副本故障:选择一台负载较轻的服务器,然后从主副本拷贝数据来增加副本
- 主副本故障:选择一个备副本作为新主副本,然后增加一个新从副本
- 云 SQL Server 与单机 SQL Server 的区别
- 不支持的操作:如 USE,因为不同的逻辑库可能存在不同的物理机
- 观念转变:请求的三态
Google Spanner
- Spanner 的表是层次化的,最底层是目录表(Directory Table),其他表创建时可以用
INTERLEAVE IN PARENT
表示层次关系- Spanner Directory 相当于 Megastore Entity Group
- Spanner 将同一个 Directory 存放在一起,优先将同一个 Directory 副本放在一台机器上
- 概念
- Universe 一个 Spanner 部署实例称为一个 Universe,全世界 3 个(开发、测试、线上),支持多数据中心部署、支持多业务共享同一个 Universe
- Zones 每个 Zone 属于一个数据中心,一个数据中心可以拥有多个 Zone
- 架构
- 多集群复制