上一章节我们介绍了腾讯云分布式数据库的发展历史,基本原理和使用方法;本章节我们继续分析下分布式数据库 DCDB 的优势和应用场景。
DCDB 是天然的 MPP (Massively Parallel Processing,大规模并行处理系统)架构,这意味着随着 DCDB 分片的增加,每个分片各自承担一部分分布式任务,意味着并发性能、处理能力、存储容量将线性增长。
并且 DCDB 默认采用线程池,且对调度算法进行了优化,改进当系统内核处于重负载时,查询和更新请求在线程组间分布不均衡等极端情况下性能,并且能够更好地利用计算资源,减少无谓的线程切换,减少请求在队列中的等待时间,及时处理请求。类似的内核优化还有很多,通过 sysbench 的压力测试,DCDB 单个分片纯写入操作能超过 12 万+TPS,纯查询操作能超过 48 万 QPS,是 MySQL5.6 性能的 4 倍,MySQL5.7 的 2 倍以上,且腾讯云数据库团体还在持续优化。
在生产系统中,通常都需要用高可用方案来保证系统不间断运行;数据库作为系统数据存储和服务的核心能力,其可用要求高于计算服务资源。目前,数据库的高可用方案通常是让多个数据库服务协同工作,当一台数据库故障,余下的立即顶替上去工作,这样就可以做到不中断服务或只中断很短时间;或者是让多台数据库同时提供服务,用户可以访问任意一台数据库,当其中一台数据库故障,立即更换访问另外数据库即可。
由于数据库中记录了数据,想要在多台数据库中切换,数据必须是同步的,所以数据同步技术是数据库高可用方案的基础;当前,数据复制方式有以下三种方式:
腾讯自主研发了的基于 MySQL 协议的异步多线程强同步复制方案(Multi-thread Asynchronous Replication MAR),简单来说,MAR 强同步方案强同步技术具有以下特点:
腾讯 MAR 方案强同步技术原理是,只有当备机数据同步(日志)后,才由主机向应用返回事务应答,示意图如下:
从性能上优于其他主流同步方案,通过在同样的测试方案下,我们发现其 MAR 技术性能优于 MySQL 5.6 半同步约 5 倍(此处测试使用 sysbench 标准用例测试)。
同步方案(跨IDC测试) | 最大QPS(100并发水平) | 平均耗时(ms) |
---|---|---|
MAR强同步 | 485624 | 26 |
MySQL 5.7 半同步 | 386513 | 32 |
MySQL 5.6 半同步 | 107200 | 42 |
DCDB 异步同步 | 486004 | 13 |
MySQL 5.7 异步同步 | 418186 | 12 |
DCDB 对应用来说,读写数据完全透明,对业务呈现的表实际上是逻辑表。逻辑表屏蔽了物理层实际存储规则,业务无需关心数据层如何存储,只需要基于业务表应该如何设计。
DCDB 为用户提供了三种类似的表分表,小表以及单表:
计划 2017 年 7 月支持
分布式事务,就是一个数据库事务在多个数据库实例上面执行,并且多个实例(分布式数据库上即多个分片)上面都执行了写入(insert/update/delete) 操作。实现分布式事务处理的最大难点,就是在这些多个数据库实例上面实现统一的数据库事务的ACID保障,而这里面最重要的算法就是两阶段提交算法。分布式事务能力理论虽然很早就被提出,而业内实际工程化实现和大规模业务验证的产品还较少。
DCDB 支持分布事务,可以为银行转账、电商交易等业务提供支持有效支持。当然,分布式事务处理的开销比会比单机架构事务处理开销要大一些,使用分布式事务会导致系统 TPS 降低,事务提交延时增大(我们不建议您分表上在分布式数据库上使用复杂的事务)。而腾讯 DCDB 通过多种优化,提供了高于开源 XA(分布式事务简称)的性能。
由于理论上,一个事务不会操作全部分片,仅操作1~2个分片(如转账业务),再加上 DCDB 的 MPP 架构的原因;因此一个分布式实例多个分片的分布式事务性能可以理论叠加(某些事务可能操作所有分片,会导致分片越多,性能反而下降)。
所以是否使用分布式事务要根据实际应用需求来定:数据量非常大或者数据访问负载非常高时,分布式事务会大大降低应用开发难度,DCDB 每个事务的查询语句的写法与使用单机架构实例完全相同,且获得事务的 ACID 保障。然而,业务中可能存在少量特别复杂的事务一次性操作所有分片,这势必会造成分布式事务性能的下降(若需要操作如此多数据,即使是单机实例耗时也会很长);遇到这种情况,我们建议业务谨慎平衡性能和开发难度的关系,或将事务拆解,巧妙设计;或引入一些等待机制,以优化用户体验。
计划 2017 年 7 月支持
DCDB 默认支持读写分离能力,架构中的每个从机都能支持只读能力,如果配置有多个从机,将由网关集群(TProxy)自动分配到低负载从机上,以支撑大型应用程序的读取流量;我们提供多种读写分离方案供您选择,且您无需关注若干从机是否完全存活,因为系统将根据策略自动调度
通过多种只读方案的组合,您可以配置出复杂的只读方案,以满足您各种业务需求和开发的灵活性。
计划 2017 年 8 月支持
DCDB 提供热点更新能力,可应用于秒杀或某些瞬时超大并发数据修改的业务场景。传统的方案是将商品库的子库前置在 cache 层或业务层,通过蜕化数据强一致(后通过第三方对账确保库存和抢购一致),而仅保证单个用户看到的库存减少规律一致(确保用户不会一会儿看见商品还有 10 个,过一会儿发现商品还剩 12 个导致投诉)。稍稍研究下,我们就会发现,这种实现方案相当复杂。而 DCDB 通过在数据库层直接实现热点更新能力来做到满足业务秒杀的需求,不仅减少了出错的概率,还提升了极大的开发效率。
数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局唯一数字序列(sequence)。 DCDB 全局唯一数字序列(以下简称 sequence,使用的是 unsigned long 类型,8 个字节长),使用方法与 MySQL的AUTO_INCREMENT 类似。目前 DCDB 可以保证该字段全局唯一和有序递增,但不保证连续性。
公有云虚拟化让多个租户的业务共享物理设备性能,而传统隔离方案严格限制了每个租户实例的性能大小。这种限制方案很公平,但没有考虑到业务特点:大多数业务仅在一天(一月)的少数时刻有较大的业务压力(如下图): 该业务日 CPU 平均使用率仅 30%,而一天中仅存在 7 次业务压力较大,CPU 使用率在 80%~100%。虽然云能够基于弹性扩容,然而普通的弹性方案在这种突发性的压力面前,仍然无能为力——可能当您反应过来,您的业务峰值已过;最终,您还得基于业务峰值配置实例。
闲时超用技术,即在绝对保证每个实例预分配性能下限的基础上,允许实例使用超过预分配的性能。举个例子:假定 A 实例承载上海股票交易所的业务,B 实例是承载纳斯达克股票的业务,A、B 实例被分配到一台物理设备中,A可以在B的空闲时间,抢占(有限的,并发全部)一部分空闲性能。当然,A、B同时面对峰值时,我们确保 A 分配的 CPU 基本数量。相对于传统的方案,闲时超用是一种更加灵活的性能隔离方案,让您的业务在面对偶然性峰值时也能游刃有余。
当然,如果您不想使用多租户方案,而期望独享整个物理集群,也欢迎您咨询腾讯工作人员,了解独享集群数据库
DCDB 支持在线实时扩容,扩容方式分为新增分片和对现有分片扩容两种方式;DCDB 在线扩容仅需管理员到腾讯云WEB控制台点击付费即可,扩容过程对业务完全透明,无需业务停机。扩容时仅部分分片存在秒级的只读(或中断),整个集群不会受影响。
DCDB 主要是采用自研的自动再均衡技术(rebalance)保证自动化的扩容和稳定,以新增分片为例,扩容过程如下下图:
为确保业务不停以及数据一致性,DCDB 的整个迁移过程采用移存量数据、迁移增量数据、数据检验、再追增量、切换路由、清理 六个步骤循环迭代进行。该能力经过腾讯内外海量业务迁移,至今未发生过一次数据异常错误或全集群停机。
分布式数据库 DCDB 未来将支持更多优秀特性以适应不同的业务场景。我们的目标是您的业务仅需要 2 个数据库就够了,一个用来部署正式业务,不增加存储成本基础上,能涵盖 OLTP&OLAP 场景,且可以覆盖多种数据类型;另一个,一个用来部署您的测试环境,用于新版本开发。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。