阿里云有15款数据库,为什么又造了POLARDB?

2014 年,AWS 发布了关系型数据库 Aurora,当时,数据库的演化正向内存和分布式发展,甚至RDBMS本身都受到了NoSQL的挑战。Aurora没有采用分布式的思路,而是用共享存储和读写分离的方式,在提高性能的同时解决了可扩展性问题,实现了对MySQL 100%的兼容,让传统互联网公司可以无痛迁移到云上,这让它成为云计算时代数据库的一个代表。

前天,阿里云宣布其自研的关系型数据库POLARDB开始公测,它采用了Aurora相同的思路,同时性能更强,达到单机100W QPS,成为阿里云已提供的15种数据库之外的另一款产品。

阿里为何要重新造轮子,这个新的POLARDB又有何不同?带着这些疑问, InfoQ 采访了阿里云研究员余锋(花名:褚霸)。

为何要自研POLARDB

褚霸表示,自研数据库的出发点来自刚需。自从棱镜门事件曝光后,国家开始注重信息产业的安全性,要求关键软件实现可控,数据库就在其中。作为云计算厂商,要想为更多的客户提供服务,必须要有自研数据库。

至于为什么选择Aurora这条路线,褚霸说:“ AWS 作为第一个吃螃蟹的人,是值得尊重的,阿里云作为追随者,有前人开路,会走的更踏实稳健。”

褚霸将阿里云的这些数据库产品比喻成自己的孩子们,这群孩子各有所长,无可替代。不过从采访过程中,可以看出他对POLARDB这个孩子是格外偏爱,寄予厚望。

POLARDB有哪些优异之处

据褚霸介绍,POLARDB 是阿里云数据库团队研发的基于第三代云计算架构下的商用关系型云数据库产品,实现 100% 向下兼容 MySQL5.6 的同时,支持单库容量扩展至上百TB以及计算引擎能力及存储能力的秒级扩展能力,对比 MySQL 有 6 倍性能提升及相对于商业数据库实现大幅度降低成本。

首先,受益于第三代分布式共享存储架构,使 POLARDB 实现了计算节点(主要做 SQL 解析以及存储引擎计算的服务器)与存储节点(主要做数据块存储,数据库快照的服务器)的分离,提供了即时生效的可扩展能力和运维能力。

众所周知,在传统数据库上做扩容、备份和迁移等操作,花费的时间和数据库的容量成正比,往往上TB的数据库容量加个只读副本就需要一到两天时间。POLARDB 的存储容量可以实现无缝扩展,不管数据量有多大,2分钟内即可实现只读副本扩容,1分钟内即可实现全量备份,为企业的快速业务发展提供了弹性扩展能力。

其次,与传统云数据库一个实例一份数据拷贝不同, POLARDB 同一个实例的所有节点(包括读写节点和只读节点)都实现访问存储节点上的同一份数据,使得 POLARDB 的数据备份耗时实现秒级响应。(备份时间与底层数据量无关)

最后,借助优秀的 RDMA 网络以及最新的块存储技术,实现服务器宕机后无需搬运数据重启进程即可服务,满足了互联网环境下企业对数据库服务器高可用的需求。

为什么 POLARDB 能做到 6 倍于 MySQL 的性能?

这里分别以存储性能、计算性能来进行解读诠释。

POLARDB 的存储引擎性能优化

1.持续释放硬件红利

众所周知,关系型数据库是 IO 密集型的应用,IO 性能的提高对数据库的性能提升至关重要。过去十年我们看到在数据库领域, SSD 替换 HDD 的过程给数据库数据处理的吞吐能力带来了数量级的提升。

POLARDB 采用了领先的硬件技术:包括使用 3DXpoint 存储介质的 Optane 存储卡、 NVMeSSD 和 RoCE RDMA 网络。同时面向新硬件架构实现软硬一体优化:从数据库、文件系统到网络通讯协议、分布式存储系统和设备驱动,POLARDB 实现纵贯软件栈各层次的整个 IO 链条的深度优化。

为了将 3DXpoint 颗粒的高性能和3D NAND颗粒的低成本结合起来,POLARDB 创新的在软件层实现对高速的 Optane 卡和大容量高吞吐的 NVMeSSD 进行组合,实现一个名为混合存储层。既保证数据写入的低延迟、高吞吐、高 QoS,又使整体方案兼具较高的性价比。

2.旁路内核,榨干硬件能力

在 POLARDB 里,为了追求更高的性能、更低的延迟,阿里云数据库团队大胆的抛弃了 Linux 内核提供的各种机制,比如块设备、各种文件系统例如 ext4 ,以及 TCP/IP 协议栈和 socket 编程接口而选择了另起炉灶。最终, POLARDB 实现了一整套在用户态运行的 IO 和网络协议栈。

POLARDB 用户态协议栈解决了内核 IO 协议栈慢的问题。用户程序在用户态直接通过 DMA 操作硬件设备,通过轮询的方式监听硬件设备完成 IO 事件,消除了上下文切换和中断的开销。用户程序还可以将 IO 处理线程和 cpu 进行一一映射,每个 IO 处理线程独占 CPU,相互之间处理不同的IO请求,绑定不同的 IO 设备硬件队列,一个 IO 请求生命周期从头到尾都在一个线程一颗 CPU 上处理,不需要锁进行互斥。这种技术实现最大化的和高速设备进行性能交互,实现一颗 CPU 达每秒约 20 万次 IO 处理的能力,并且保持线性的扩展能力,也就意味着 4 颗 CPU 可以达到每秒 80 万次 IO 处理的能力,在性能和经济型上远高于内核。

网络也是类似的情况。过去传统的以太网,网卡发一个报文到另一台机器,中间通过一跳交换机,大概需要一百到两百微秒。 POLARDB 支持 ROCE 以太网,应用程序通过RDMA网络,直接将本机的内存写入另一台机器的内存地址,或者从另一台机器的内存读一块数据到本机,中间的通讯协议编解码、重传机制都由 RDMA 网卡来完成,不需要 CPU 参与,使性能获得极大提升,传输一个4k大小报文只需要 6、7 微秒的时间。如同内核的IO协议栈跟不上高速存储设备能力,再一次的,内核的 TCP/IP 协议栈跟不上高速网络设备能力,被 POLARDB 的用户态网络协议栈代替。

3.硬件 DMA 和物理复制实现的数据库多副本

大家都知道关系型数据库的重要特性归纳起来是 “ACID” ,其中 A 是原子性,C 是约束,I 是隔离性,D 是持久性。

POLARDB 将从两个维度出发,从根本上改进多副本复制。一个是保证数据库ACID 中的 D(Durable),把网络、存储硬件提供的 DMA 能力串起,用硬件通道高性能的把主库的日志数据持久化到三个存储节点的磁盘中;另一个是实现了高效的只读节点,在主库和只读节点之间通过物理复制同步数据,直接更新到只读节点的内存里。如何实现?

POLARDB 实现日志数据持久化到三个存储节点的磁盘中。主库通过 RDMA 将日志数据发送到存储节点的内存中,存储节点之间再通过 RDMA 互相复制,每个存储节点用 SPDK 将数据写入 NVMe 接口的存储介质里,整个过程 CPU 不用访问被同步的数据块(Payload),实现数据零拷贝。

同时由 RDMA 网卡和 NVMe 控制器完成数据传输和持久化, CPU 仅做状态机的维护,在一致性协议的协调下,把网卡和存储卡两块硬件串起来,存储节点之间数据同步采用并发 Raft(ParallelRaft) 协议,和 Raft 协议一样,决议在 leader 节点上是串行生成和提交的,但并发 Raft 协议可以允许主从之间乱序同步,简单的说,允许 follower 节点在漏掉若干条日志的情况先 commit 并 apply 后面过来的日志,并异步的去补之前漏掉的日志,数据同步的性能和稳定性都显著优于 Raft 协议。

POLARDB 在主库和只读实例之间的数据流上,放弃了基于 binlog 的逻辑复制,而是基于innodb的redolog实现了物理复制,从逻辑复制到物理复制对主库和从库性能带来的提升都非常明显。

在主库上,原本引擎需要和 binlog 做 XA 事务,事务要等到 binlog 和 redolog 同时写盘后才能返回,去掉 binlog 后,XA事务可以去掉,事务的执行路径更短, IO 开销也更小。在从库上,redolog由于是物理复制,仅需比对页面的 LSN 就可以决定是否回放,天然可以多线程执行,数据的正确性也更有保证,此外, POLARDB 的从库收到 redolog 后只需要更新缓存里的页面,并不需要写盘和 IO 操作,开销远低于传统多副本复制里的从库。

4.针对数据库加速的 Smart Storage

POLARDB 的存储节点针对数据库的 IO workload 进行了一些针对性的优化。

IO 优先级优化: POLARDB 在文件系统和存储节点两层都开了绿色通道,对 redolog 文件的更新进行优待处理,减少排队,提高 IO 的优先级。 redolog 也从 512 对齐调整为 4k 对齐,对 SSD 性能更加友好。

double write 优化: POLARDB 存储节点原生支持 1 MB的原子写,因此可以安全关闭doublewrite,从而节省了近一倍的 IO 开销。

group commit 优化:POLARDB 里一次 group 
commit 可以产生写入几百 KB 的单个大 IO 。对于单个 SSD ,延迟和 IO 的大小是呈线性的,而 POLARDB 从文件系统到存储节点都进行一系列优化来保证这种类型的 IO 能尽快刷下去,针对 redolog 文件进行条带化,将一个上百 KB 的大 IO 切割为一批 16 KB的较小 IO ,分发到多个存储节点和不同的磁盘上去执行,进一步的降低关键IO路径的延迟。

POLARDB 的计算引擎性能优化

1.使用共享存储物理复制

由于 POLARDB 使用共享存储和物理复制,实例的备份恢复也做到完全依赖 redolog,因此去掉了 binlog 。使得单个事务对 io 的消耗减少,有效减少语句响应时间,提升吞吐量。同时避免了引擎需要与 binlog 做的XA事务逻辑,事务语句的执行路径更短。

2.锁优化

POLARDB 针对高并发场景,对引擎内部锁做了大量优化,比如把 latch 分解成粒度更小的锁,或者把 latch 改成引用计数的方式从而避免锁竞争,例如 Undo segment mutex , log system mutex 等等。PolarDB 还把部分热点的数据结构改成了 Lock Free 的结构,例如 Server 层的 MDL 锁。

3.日志提交优化

Redolog 的顺序写性能对数据库性能的影响很大,为了减少 Redolog 切换时对性能的影响,我们后台采用类似 Fallocate 的方式预先分配日志文件,此外,现代的 SSD 硬盘很多都是 4K 对齐,而 MySQL 代码还是按照早期磁盘 512 字节对齐的方式刷日志的,这样会导致磁盘做很多不必要的读操作,不能发挥出 SSD 盘的性能,我们在这方面也做了优化。我们对日志提交时 Group Commit 进行优化,同时采用Double RedoLog Buffer 提升并行度。

4.复制性能

POLARDB 中物理复制的性能至关重要,我们不仅通过基于数据页维度的并行提高了性能,还对复制中的必要流程进行了优化,例如在 MTR 日志中增加了一个长度字段,从而减少了日志 Parse 阶段的 CPU 开销,这个简单的优化就能减少 60% 的日志 Parse 时间。我们还通过复用 Dummy Index 的内存数据结构,减少了其在 Malloc/Free 上的开销,进一步提高复制性能。

5.读节点性能

POLARDB 的 Replica 节点,日志目前是一批一批应用的,因此当新的一批日志被应用之前, Replica 上的读请求不需要重复创建新的 ReadView ,可以使用上次缓存下来的。这个优化也能提高 Replica 上的读性能。

POLARDB 的成本优化

1.存储资源池化

POLARDB 采用了一种计算和存储分离的架构,DB 运行在计算节点,计算节点组成了一个计算资源池,数据都放在存储节点上,存储节点组成了一个存储资源池。如果 CPU 和内存不够了,就扩充计算资源池,如果容量或者 IOPS 不够了,就扩充存储资源池,两个池子都是按需扩容。而且存储节点和计算节点可以分别向两个方向优化,存储节点会选择低配的 CPU 和内存,提高存储密度,而计算节点可以选择小容量、低配的SSD作为操作系统和日志盘,上多路服务器增加 CPU 的核数。

而传统的数据库部署模型则是一种烟囱模型,一台主机既跑数据库又存数据,这带来两个问题。一个是机型难以选择, CPU 和磁盘的配比主要取决于实际业务的需求,很难提前找到最优比例。第二是磁盘碎片问题,一个生产集群里,总有部分机器磁盘使用率是很低的,有的还不到 10% ,但出于业务稳定性要求,会要求独占主机的 CPU ,这些机器上的 SSD 其实是被浪费的。通过存储资源池化,这两个问题都能得到解决, SSD 的利用率得到提高,成本自然也降低下来。

2.透明压缩

POLARDB 的存储节点除了对ibd文件提供1MB的原子写,消除 double write 的开销,还支持对 ibd 文件的数据块进行透明压缩,压缩率可以达到 2.4 倍,进一步降低了存储成本。 
而传统数据库在 DB 内进行压缩的方案相比,存储节点实现透明压缩不消耗计算节点的CPU,不影响 DB 的性能,利用 QAT 卡进行加速,以及在 IO 路径上用 FPGA 进行加速。 POLARDB 的存储节点还支持快照去重(dedup)功能,数据库的相邻快照之间,如果页面没有发生修改,会链接到同一份只读页面上,物理上只会存储一份。

3.存储成本的只读实例

传统数据库做只读实例,实施一写多读方案,是通过搭建只读副本的方案,先拷贝一个最近的全量备份恢复一个临时实例,再让这个临时实例连接主库或者其他 binlog 源同步增量数据,增量追上后,把这个临时实例加到线上升级为一个只读副本。这种方法一个是耗时,搭建一个只读实例需要的时间与数据量成正比;另一方面也很昂贵,需要增加一份存储成本,比如用户购买一个主实例加上五个只读实例,需要付 7~8 份存储的钱( 7 份还是 8 份取决于主实例是两副本还是三副本)。

而在 PolarDB 架构中,这两个问题都得到解决,一方面新增只读实例不需要拷贝数据,不管数据量有多大都可以在 2 分钟内创建出来;另一方面,主实例和只读实例共享同一份存储资源,通过这种架构去增加只读副本,可以做到零新增存储成本,用户只需要支付只读实例消耗的 CPU 和内存的费用。

阿里巴巴集团整个数据库体系可以说是一直被业务追着跑步前进,一刻也没有停歇。无论是 IOE 架构的 Oracle 时代,还是 AliSQL 的分布式时代,以及轰轰烈烈充满各种争议的去 IOE 行为,阿里巴巴数据库团队一次又一次引领并推动了中国数据库产业的变革和发展。

数据库未来要怎么走?时间会给出答案

数据库领域目前出现了百花齐放的局面,很多大厂都推出了自己的数据库产品,甚至有不少都开源了出来。其中,完全兼容MySQL的POLARDB则是其中稳健派的代表。这些数据库,未来谁会独占鳌头?

风起于青萍之末,浪成于微澜之间。平稳的向前发展,是成就一切伟大的前提。今天,阿里云数据库既要适用于上百万中小企业对成本的要求,又要满足大型企业或金融机构乃至独角兽对数据量暴涨的需求,当谈及POLARDB的未来时,褚霸表示,阿里云的POLARDB团队也是在不断尝试,不断试错总结经验,未来无法预测,但阿里云数据库团队一定会脚踏实地的走好每一步,积跬步方能至千里。时间会给出答案。

阿里云的PLOARDB相关推荐

  1. “宝拉”快跑!阿里云发布超高性能云数据库POLARDB

    老孙看过一部很有意思的德国电影,叫做<罗拉快跑>,故事讲得是为了筹集男票遗失的走私赃款,拯救他随时会被黑帮大哥杀死的性命,罗拉必须在20分钟内得到10万马克,于是她狂奔在求助的路上,完成了 ...

  2. nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问

    nginx配置http.https访问 要设置https访问需要从对应的云厂商申请证书,并下载Nginx证书到服务器. 我这里从阿里云申请了免费的域名证书,然后将证书放置在服务器的/etc/ssl/. ...

  3. 阿里云K8S容器服务的使用

    使用阿里云k8s构建服务 一. 上传镜像 二. k8s运行 三. 服务配置导入 四. 服务路由 五. 节点亲和性和污点管理 一. 上传镜像 在阿里云控制台找到"容器镜像服务",开启 ...

  4. 阿里云Centos 解决挖矿程序:kdevtmpfsi--服务器CPU占用高、内存占用高

    前言 互联网存在很多的漏洞,如果我们使用不当,就会别被别人利用或者是盗取信息.之前在阿里云买的服务器,自己配置了nginx,mysql,redis等服务.由于在某些时候,本地程序开发中需要使用这些服务 ...

  5. 使用阿里云服务器安装docker,并用nginx示例

    一.前言 之前对docker了解不多,自从使用了一次之后,就感觉这个产品对开发者实在是太友好了,可以迅速在Linux,window等平台部署服务.常见的有数据库,nginx,消息队列,redis等.利 ...

  6. 阿里云服务器部署项目

    在阿里云服务器上部署自己的项目 小伙伴们是不是想部署自己的项目到服务器上,让自己的朋友,还有广大的网友看到自己的网站呢?下面我就把部署项目到服务器的方法写下来给大家,希望可以帮到有需要的人!!! 前期 ...

  7. windows阿里云服务器配置

    配置阿里云服务器 第一步: 第二步: 第三步: 找到自己的实例,并且找到自己的公网ip. 第六步: 下载xshell() 在这里下载xshell百度网盘网址 加我的qq,提供提取码. 关注我,提供后续 ...

  8. Jedis无法远程连接阿里云服务器的redis问题

    Jedis无法远程连接阿里云服务器的redis问题 查了很多资料才最终解决了这个问题,现在对上述问题进行总结. CentOS7版本解决办法: 1.停止并屏蔽firewalld服务 systemctl ...

  9. 阿里云https认证

    1.登录阿里云服务器,在控制台上选择 安全(云盾)---CA证书服务(数据安全) 2.点击购买证书--(阿里把免费的隐藏起来了,这显得很不厚道)默认都是付费的,如果要免费的需要先选择 品牌 Syman ...

最新文章

  1. Eclipse不编译解决方案
  2. Linux终端中设置vi编辑命令
  3. 组合模式测试组合模式(Composite Pattern)
  4. windows 安装metis_Eigen+suitesparse for windows 安装
  5. LeetCode MySQL 1435. 制作会话柱状图
  6. hdfs文件如何导出到服务器,[Hadoop] 如何将 HDFS 文件导出到 Windows文件系统
  7. java super用法_Java基础面试题汇总
  8. [bzoj3676]回文串[后缀数组+Manacher]
  9. ABBYY最新版本OCR文字图像识别软件v16
  10. ESP分区引导文件修复bcdboot .exe
  11. 软件测试面试问题总汇
  12. VASP服务器第一次安装各种软件(中)
  13. 米家扫地机器人充满电需要多长时间_【米家扫地机器人使用总结】充电|APP|清扫_摘要频道_什么值得买...
  14. CUE 文件及其格式说明
  15. 1168: PIPI的方格
  16. CF Canada Cup 2016 D 优先队列
  17. 武汉青少年计算机编程,武汉青少年编程学习
  18. 基于MSGEQ7的音乐节奏灯超详细适合入门
  19. 电脑上录屏的软件有哪些,屏幕录制软件哪个好用
  20. win10便签常驻桌面_出奇的好用!聊聊被习惯性忽视的Win10“便笺”

热门文章

  1. php链接mysql 老是die_php连接MySQL时, 为什么die(错误信息: . $conn-connect_error) 不返回错误信息?...
  2. 联想笔记本Manjaro dde 18 安装疑难杂症解决
  3. 毕业设计 stm32的人体健康状态检测系统(项目开源)
  4. SpringBoot-FastDFS
  5. CCNA-NAT协议 静态NAT 动态NAT(多对多) PAT(多对一) 内网与外网之间的通信 GNS3实验验证
  6. 关于校招和嵌入式软开的学习路线的总结和一些思考
  7. 川师大计算机专业好就业吗,四川师范大学好就业吗?附四川师范大学就业率最高的专业名单...
  8. 如何查看自己亚马逊的的库存容量?
  9. Python实现12306自动抢票小程序
  10. IoT设备与手机App之间如何实现实时消息通信——业务场景最佳实践