发布于: Nov 30, 2022
【概要】在将 Amazon RDS 部署为数据库分片时,大家还需要考虑到数据库引擎类型、数据库实例类以及 RDS 存储等要素。
实现分片数据库架构的前提条件是对数据进行数据分区并在各数据库分片之间发布这些分区。您可以使用多种策略对表进行分区,例如列表分区、范围分区或者哈希分区等等。您也可以在各个数据库分片内以独立表的形式容纳一个或者多个表分区。
下图所示,为 Invoice 表中以 customer_id 为分区键进行的横向分区示例。
当涉及多个表并绑定有外键关系时,我们可以在所有相关表上使用相同的分区键以实现横向分区。跨越多个表、但归属于同一个分区键的数据将被分配给同一个数据库分片。下图所示,为一组表内的横向分区示例。
其中使用的基本设计方法如下:
- 每个数据库分片都包含一个分区键映射表,即 customer,用于存储驻留在该分片上的分区键。应用程序从所有分片中读取此表,借此构建负责将分区键映射至数据库分片的数据映射逻辑。有时候,应用程序也可以使用预定义的算法来确定分区键具体位于哪个数据库分片中,这时也可以省略掉分区键映射表。
- 示例中的分区键为 customer_id,它将被添加至所有表内作为数据隔离点。分区键直接影响到系统如何将数据及工作负载分配至不同的数据库分片。指向单一分区的查询将包含此分区键,以便应用层内的数据跌幅逻辑能够利用分区键映射至正确的数据库分片并正确对查询进行路由。
- 主键在所有数据库分片中皆具有唯一的键值,以避免在将数据从一个分片迁移至另一分片、或在 OLAP 环境中合并数据时发生键冲突。例如,Invoice 表中的主键 invoice_id 使用交错的数字,并为 shard_id 保留了最后两位数字。另一种常见的作法是使用 GUID 或者 UUUID 作为主键。
- 可以在表中将带有时间戳数据类型的列定义为数据一致性点。在必要时,数据一致性点可被用作将数据库分片内数据合并至全局视图时的条件。例如,在将数据提取至 OLAP 环境中时,Invoice 表中的 creation_date 将负责提取查询中的过滤条件,从而为所有分片指定统一的时间范围。
经过良好设计的分片数据库架构可使数据与工作负载均匀分布在所有数据库分片之上。而指向不同分片的查询,也应始终能够达到预期的性能水平。需要注意的是,分片上的数据分区越多,数据库引擎的资源消耗量也将随之提升,甚至在大规模硬件上造成资源争用与性能瓶颈。要确定在各个分片上使用多少个数据分区,我们通常需要在优化查询性能与合并目标之间寻找平衡,从而更好地利用资源、削减成本。
在将 Amazon RDS 部署为数据库分片时,大家还需要考虑到数据库引擎类型、数据库实例类以及 RDS 存储等要素。为了帮助用户轻松管理数据库配置,Amazon RDS 提供一个数据库参数组,其中包含的一组配置值能够以一致性方式全面应用于所有数据库分片。
相关文章