在 FreeWheel 的核心业务系统中,我们使用 MySQL 来存储数据。但随着数据量的不断增加,原有数据库已经无法满足如今的业务需求。经过前期大量的调研,我们决定将 MySQL 中的部分表迁移到 AWS Dynamodb 中。本文主要介绍从关系型数据库平顺迁移到非关系型数据库的实践经验。
业务挑战
最初我们使用 asset 表来存储客户的视频库存信息,但是随着时间的推移,系统中的 asset 表体量越来越大。目前,asset 表以及相关附属表已经占用了全部数据库 50%以上的存储,服务中使用的表联查操作以及复杂 SQL 操作都会使数据库的性能骤降,从而导致应用服务性能变差。在此情况下,我们不得不开始考虑拆表或者数据库迁移,其中拆表的方法并不能长久地解决这个问题。同时为了提升性能以及扩展性、降低成本,我们最终选择将 asset 及其相关表迁移出 MySQL 数据库。
主流非关系型数据库对比及选型
由于我们的业务需求要求在高并发下的读写速度以及良好的可扩展性,并且不需要强一致性,所以我们最终决定使用非关系型数据库来存储 asset 以及相关数据。
在非关系型数据库中,我们选取了几种主流的数据库进行对比。这里列出其中应用较为广泛的 MongoDB 以及 DynamoDB 进行对比,如下表所示。
比较基础 |
MongoDB |
DynamoDB |
简介 |
MongoDB是最著名的文档存储之一。 |
DynamoDB是Amazon提供的一种可扩展的托管NoSQL数据库服务,具有将数据存储在Amazon云中的功能。 |
数据库结构 |
MongoDB使用JSON类的文档来存储无模式数据。在MongoDB中,不需要预定义的结构来存储文档的集合。 |
在DynamoDB中,表由项目集合组成,并且每个项目都是属性的集合。主键用于唯一标识表中的每个项目,还用于DynamoDB中的辅助索引,以提供更大的查询灵活性。 |
高可用性 |
集群容错,自动化灾备机制。 |
基于云服务的完善的灾备、容错、监控能力。 |
安全 |
MongoDB的默认情况下会在未启用身份验证的情况下进行安装。 |
通过使用用户名和强密码启用用户身份验证。 DynamoDB中的安全性更安全,并且通常由可用的AWS安全措施提供。 |
根据上述对比,基于 DynamoDB 有着更加完善的安全服务及灾备容错能力,并且与 FreeWheel 的 AWS 云服务相匹配,因此我们最终决定选用 DynamoDB 作为迁移的数据库对象。下面主要介绍下 DynamoDB 的技术特性。
DynamoDB 技术特性
AWS DynamoDB 是一种完全托管的无服务器(Serverless)类型的 NoSQL 数据库,可以通过 HTTP API 来使用。同时它提供了托管的内存缓存,比较适用于需要存储大量数据并且同时要求低延迟的应用服务。
DynamoDB 有几个关键概念,它是由表(tables)、数据项(items)和每项数据的属性(attributes)来构成的。 表是数据项的集合,不同类型的数据项都可以放到一张表里。下图展示了这些关键概念的构成关系。