简介: PolarDB-X 2.1 是 PolarDB-X 非常重要的版本,也是第一次 PolarDB-X 分布式数据库的产品可以作为企业级的分布式数据库真正部署到客户的生产环境使用。

PolarDB-X 2.1 新版本发布

让“MySQL 原生分布式”触手可及

——黄贵(曲山)

阿里云数据首席架构师

了解更多PolarDB-X 内容:https://developer.aliyun.com/topic/polardbx_release

PolarDB-X 2.1 是 PolarDB-X 非常重要的版本,也是第一次 PolarDB-X 分布式数据库的产品可以作为企业级的分布式数据库真正部署到客户的生产环境使用。

一、一个好的MySQL分布式数据库应该是什么样的

C++语言设计的概念 Zero Overhead Abstraction ——0负担抽象原则,它有两个重要特性:

  • 无须为不用的特性付出代价: C 类用户升级到 C++ 时,如果不使用 C++里的高级特性,则无须为这些特性付出额外的代价。比如在 C 里面是 structure,到 C++ 里可能是class 。对于 C 中的 structure 和 C++ 中的 class ,如果不带 virtual function ,则在内存布局的性能消耗上是等同的,不用付出额外的代价。
  • 你所使用的代码,不可能手写得更好:如果想要使用更高级的特性,用 C++ 扩展的能力,一定比手写的代码更好,即C++ 提供的语言特性能够很好地帮助到用户。

C 语言的用户升级到 C++,必然是因为它带来了更新更强的能力,比如封装、抽象的能力,可以做继承、有多态。另外,C++ 提供了多种编程范式,比如面向对象、泛型编程、函数式编程等,这些特性都可以极大地拓展语言的抽象,带来能力的提升。

同理,从单机的 MySQL 数据库升级到分布式 MySQL 数据库,我们期望它能有哪些表现?

首先是完全兼容,可以由单机平滑过渡到分布式系统,无需对应用进行改造;第二,无需对数据库的结构进行改造;第三,不使用分布式能力则无须付出额外的开销。

单机到分布式最重要的变化是数据会分布在多个节点上,对于数据库中很多操作而言,尤其是事务,是需要付出一些额外代价的。如果事务涉及到多个数据的分区,而只是想将分布式系统作为单机数据库来用,同样也可以有单表的特性,无须付出分布式事务的代价。

升级到分布式系统后能够获得自动伸缩的能力,能够天然地利用分布式的特性实现跨地域的高可用,还可以处理混合的负载类型,包括事务的负载以及分析的负载,提供了高性价比的解决方案。

二、让分布式能力透明化

如何实现从单机到分布式完全透明化?

以从单机 MySQL 迁移到 PolarDB-X 2.1 版本为例:

第一步:建表。使用单机 MySQL 上的建表语句、DDL语句在新的分布式数据库上建表,无须做任何修改。

第二步:让应用跑起来。应用代码也无须做任何修改,原有的 SQL 语法、原有的客户端驱动程序都可以直接使用,只需要更换新的数据库连接地址。

第三步:性能调优。可以使用很多工具做压测,包括一些可视化工具,能够提供对整个系统 SQL 性能的分析, DAS自动调优工具能够帮助找到热点SQL,还可以通过 DDL 建新的索引或对数据分区进行调整,对热点 SQL 进行调优。

实现以上整个过程的大部分操作只是诊断和适配,无须进行过多改造工作。

对于分布式系统而言,要做到透明,核心就是对分布式事务的支持。分布式数据库与单机数据库的关键差异在于,分布式数据库是以一定的规则将数据做分片,然后分布在多个节点上,其中核心点在于如何在事务跨了多个数据分片时,保证它的 ACID 语义。这其中会涉及到如何做事务的 ACID 保证,如何做多版本处理并发的控制。有了事务 ACID 的保证,才能在此之上建立全局二级索引。

此外,很多其他功能比如备份恢复、时间回溯的查询以及分布式的备份等,都需要依赖分布式事务提供的全局一致性能力。数据的导入和导出也需要保证数据有全局快照的能力,在任何时间点都能读到一致的版本。

有了全局二级索引和多版本的并发控制等能力的支持,即可实现透明的分布式,无须显式地指定分区键,只需要像单机数库一样创建表,即能默认做数据的分区,也无须考虑数据分区带来的跨节点事务的处理。表的修改操作和Online DDL 也不会对数据库的其他操作产生影响。

PolarDB-X 实现的是全局一致性的分布式事务

(使用 TSO全局 timestamp)+ MVCC (多版本并发控制机制)实现的分布式数据库。主要的技术原理是基于 Paxos 做事务日志的同步来保证高可用。

在事务在处理的过程中,因为使用了两阶段提交的方式来做分布式事务的处理,如果发生了节点失效,也可以利用 Paxos 带来的高可用能力保证事务继续进行下去。

另外,使用了全局唯一的时间戳以及多版本并发控制的机制来保证它的隔离性,实现了 Snapshot Isolation 的隔离级别。

具体流程如下:GMS 组件提供全局事务的时间戳,在发起事务的过程中,如果事务要做提交,则会获取提交的时间戳并将其带到所有下面存储节点的参与者上。然后结合事务当前的状态,根据时间戳判断事务的可见性。每一条数据上都有其提交的时间戳,将其与当前事务的时间戳做比较,以决定这条数据在当前的事务中是否可见。

通过上述机制即可实现分布式事务的全局一致性和快照隔离。

本次 2.1 版本发布的最重要的功能就是自动模式数据库的功能。PolarDB-X 在 1.0 版本时代,是利用分库分表的模式来进行数据的自动分区。 2.0 的时代引入了全新的 AUTO 模式数据库,无需指定分区键。

上图展示了典型的电商交易场景,有交易记录表,其主键是事务 ID ,还有买家和卖家两个重要角色。对于交易的流水而言,通常除了按交易的流水日志 ID 查询以外,也有可能从买/卖家的维度查询。

表内可能有上亿条记录,需要将它创建为分区表。对于分布式数据库 PolarDB-X 而言,无需指定特定的分区键。因为这里的分区健,如果是按照buyer_id或者seller_id去查询,无法做分区裁剪。可以像使用单机数据库一样默认按主键 ID 做数据的分片。分片的算法默认是一致性哈希,也支持很多其他算法,包括 interval 做范围的划分、 range 的分区等,此类算法也可以通过 DDL 语句根据业务特点做调整,另外还可以通过多个查询维度建全局二级索引。

上图例子中建了两个全局二级索引,分别是买家 ID 和卖家 ID 。往表里面插入数据的时候,会针对数据根据数据的分区规则,将它均匀地分布在数据节点上。上图右侧两张索引表同样也按照分区规则做了均匀的分布。

数据自动负载均衡的功能,使得用户无需关心数据具体分布在哪个数据节点上,可由系统自动完成,主表以及两张索引表都按照一定的规则做数据的拆分,分片以后按照数据的大小和容量均匀分布到各个数据节点上。

有了自动负载均衡的能力以后,也就具备了在线扩缩容的能力,而在线扩缩容是单机到分布式平滑演进的重要基础。

上图有计算层的 CN 节点,也有存储层的 DN 节点。 CN 节点是无状态节点,扩容和缩容非常轻量化,因为所有 CN 的能力都对等,将 SQL 发送到任意 CN 节点都可以实现同样的处理能力,得到相同的结果。出于性能的考虑,一般会将数据就近调度到临近的 CN 节点上。

因此,CN 的扩容非常方便,只需简单地将 CN 节点添加到集群上,同步到 GMS 节点里即可。

DN 是有状态的数据节点,扩缩容需要做数据的迁移。增加了一组数据节点后,调度任务管理器会根据当前数据的分布状况,将一部分数据迁移到新的数据节点上,以此保证所有节点的数据处在均衡的分布状态。

性能和容量方面,PolarDB-X 最大可以支持 1024 个节点,单节点最大存储 5TB 数据,能够满足大部分数据库的容量需求。

缩容同理,下线数据节点后,会将它缺失的副本补足,然后重新均匀分布到其他数据节点上。

从单机数据库迁移到分布式数据库,可以基于 Online DDL 的能力动态完成单机大表切换到数据分片的模式。比如原来在单机上非常大的表,希望通过分布式系统的数据分布能力对其进行拆分,可以通过一些 DDL 的能力动态地修改其分区模式,来完成单表到数据分布表的转换。

对于单机分布式而言,PolarDB-X 完全兼容了 MySQL 的语义及其行为,包括上下游对接的生态,比如全局 CDC 可以生成全局一致的 Binlog,可以将其作为单机 MySQL 的日志流来使用。不管是同步到下游大数据系统,还是作为 MySQL 的备份,都可以通过 CDC 来对接。

Online DDL 最大的特点就是在做 DDL 的过程中对当前数据库正在处理的业务 DML 语句没有任何影响,极大减轻了数据库运维人员的负担。数据库难免会遇到一些修改表结构、增加点索引等诉求,如果每次都要在业务的低峰期去进行,对运维会造成很大困扰,而且不够及时。有了 Online DDL的支持以后,可以在任意时间点做变更。这些变更包括了创建索引、加减列、变更分区算法。

值得一提的是,加列操作使用了 Instant DDL 机制,可以只修改元数据,无须对全部数据进行修改,操作性能极高,为毫秒级,对业务的影响可以缩减到最小。

此外,可以将数据库由单表变成分区表。在分区表上还可以修改分区数、表组以及分区算法等。同时也可以将它修改成广播表,在每个数据节点上都有同样的复制表,对于频繁做 join 的小表非常有用。这些能力也使得用户可以灵活调整数据表的数据分布方式,以满足不同业务负载的需求。

三、分布式是一种全新数据库的模式

分布式是一种全新的数据库模式,它不仅是对单机数据库的完全兼容,更大的作用是带来了更多更强的能力。PolarDB-X 2.1版本带来了以下卓越的能力:

1. 高可用容灾能力

2.1 版本正式引入了 X-Paxos, 使用 Paxos 一致性协议保证数据的可靠性以及系统节点失效时的可用性。

它实现了 99.99% 可用性:任意节点的故障都不会影响集群的可用,数据 0 丢失。

提供了多种部署形态:

① 同城三机房,默认 2.5 副本。在 Paxos 协议框架下有几种角色,包括 leader节点(数据事务的主节点),它带有两个副本,分别是 follower 节点和 logger 节点。logger 节点为了节省成本,不存储全量数据,只存储日志来保证数据的一致性,同时也减少了数据副本的存储;另外还有 learner 节点,可以做只读的副本。

② 两地的三中心,默认五副本。

拥有分布式特性:用 Paxos 协议做一致性同步时,需要传输日志,而在网络上保证大量的日志传输的一致性较为困难。2.1版本支持日志分片的拆分,也做了行级热点的写入,支持自动合并,为很多电商的秒杀业务场景提供了保障;另外,通过对 follower 节点开放读,在 follower 节点上可以将全局 TSO 带过去,做一致性版本的读,利用 follower 节点的处理能力来提升整个系统的吞吐。

高可用的架构帮助我们提供了一个很好的基础。使得PolarDB-X 在容灾方面也提供了强有力的支撑,比如两地三中心的部署方式。采用5 副本(2+2+1)的机制,设置了很多规则,比如存储副本leader 节点失效重新选主的时候,会优先选择同机房的主节点,对整个系统服务的可靠性和延时不会带来太大的影响;另外,机房失效时,可以做五副本到三副本的降级操作,保证强一致性、持续的处理能力。

主可用区的概念是为了保证在同机范围内做网络访问时,最大可能地减小延时。

2. 冷热分离存储

冷热分离存储是基于分布式数据库做的成本上的优化。利用 TTL 机制,在创建表的时候指定其过期时间,将已经过期的数据归为冷数据,做归档的存储。归档存储于 OSS 里,相对于本地的在线存储,极大降低了成本。与此同时, OSS 上的存储格式进行了高度压缩,进一步降低了成本。

归档到 OSS 时采用了开放的格式,优点在于可以对接很多开源生态,比如Spark、Flink 的生态,然后做分析、查询。同时,其自身的查询引擎也支持快速查询在 OSS 归档的数据。

3.可观测性

PolarDB-X 的 Dashboard 集成了开源的 Prometheus 等工具做监控、告警,分析当前系统的运行状态。另外还建了一套做 performance 的 insight 工具,分析数据在各个节点上的分布状况以及他们在分区上的访问频率,帮助用户更好地发现系统的性能瓶颈,并进行调优。

四、未来往何处去

未来我们会持续在 PolarDB-X 开源版本上做更多投入。

我们会将开源的 codebase 与当前的商业版本对齐,所有能力在内核层面完全开源。也会继续做更多企业级能力的增强,使 PolarDB-X 完全变为企业级的分布式数据库。

全新的 HTAP 引擎使得 PolarDB-X 同时能够处理事务型和分析型的负载。另外还会做国产化适配调优,实现国产化替代的工作,包括深度诊断、自动化调优工具以及各种生态的对接等。

原文链接:http://click.aliyun.com/m/1000345635/

本文为阿里云原创内容,未经允许不得转载。

PolarDB-X 2.1 新版本发布 让“MySQL 原生分布式”触手可及的更多相关文章

  1. TarsGo新版本发布,支持protobuf,zipkin和自定义插件

    本文作者:陈明杰(sandyskies) Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,目前支持C++,Java,PHP,Nodejs,Golang语言.该框架为用户提供了涉及 ...

  2. [转帖]2018年的新闻: 国内首家!腾讯主导Apache Hadoop新版本发布

    国内首家!腾讯主导Apache Hadoop新版本发布   https://blog.csdn.net/weixin_34194317/article/details/88811258 腾讯也挖了很多 ...

  3. PHP数据库操作:从MySQL原生API到PDO

    本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的. 为了后面的测试,先建立数据库表test.包含表名user,s ...

  4. Cobar_基于MySQL的分布式数据库服务中间件

    Cobar是阿里巴巴研发的关系型数据的分布式处理系统,是提供关系型数据库(MySQL)分布式服务的中间件,该产品成功替代了原先基于Oracle的数据存储方案,它可以让传统的数据库得到良好的线性扩展,并 ...

  5. Cobar是提供关系型数据库(MySQL)分布式服务的中间件

    简介 Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明. 产品在阿里巴巴稳定运行3年以上. 接管了3000+ ...

  6. NCache:最新发布的.NET平台分布式缓存系统

    NCache:最新发布的.NET平台分布式缓存系统在等待Microsoft完成Velocity这个.NET平台下的分布式内存缓存系统的过程中,现在让我们将目光暂时投向其他已经有所建树的软件开发商.Al ...

  7. 新浪微博基于MySQL的分布式数据库实践

    提起微博,相信大家都是很了解的.但是有谁知道微博的数据库架构是怎样的呢?在今天举行的2011数据库技术大会上,新浪首席DBA杨海潮为我们详细解读了新浪微博的数据库架构——基于MySQL的分布式数据库实 ...

  8. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

  9. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...

  10. 【django后端分离】mysql原生查询命令后,RawQueryset类型的自定义序列化返回json格式

    1:设置mysql原生分页 # 监控系统首页显示分页 def MyPagination(limitid,offsetid): limitid =str(limitid) offsetid =str(o ...

随机推荐

  1. 二进制文件分析工具-hexdump使用指南

    一 概念: hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII.八进制.十进制.十六进制 格式进行 查看. 二 用法简介: 该工具的用法十分简单,具体如下所示: ...

  2. day16--Java常用类04

    Java常用类 4.字符串相关类练习 4.1StringBuilder练习 package li.normalclass.stringbuilder; public class TestBuffer ...

  3. JDK1.8版本java字符串常量池里存的是String对象还是引用?

    转载自http://t.csdn.cn/iD9LD 先下结论:对象! 众所周知,JDK1.8版本中,String常量池已经从方法区中的运行时常量池分离到堆中了,那么在堆中的String常量池里存的是S ...

  4. Android USB开发—USB通信

    USB通信两端分别称为:HOST(USB主机) 与 Device(USB从机/USB配件),常见的主机就是我们的计算机.而Android 可以支持USB主机模式与USB配件模式,意思就是Android ...

  5. HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(2) --- 模型生成及模型仿真(实例分析)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. 02.Android崩溃Crash库之App崩溃分析

    目录总结 01.抛出异常导致崩溃分析 02.RuntimeInit类分析 03.Looper停止App就退出吗 04.handleApplicationCrash 05.native_crash如何监 ...

  7. 初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法

    初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中,可能会遇到一些常见问题.以下是一些常见问题以及相应的处理方法: 1.顶点丢失 ...

  8. 记录--JS 的垃圾回收机制

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 垃圾回收(Garbage Collection)是一种内存管理机制,用于检测和清理不再被程序使用的内存,这些不再被使用的内存就被称为 ...

  9. C# SM2

    Cipher using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle. ...

  10. C# URL参数编码

    string s = "lw123abc测试信息!@#¥%--&*()--+"; Console.WriteLine("原数据:\t\t" + s); ...