PolarDB-X 2.0:使用一个透明的分布式数据库是一种什么体验
简介: 透明分布式,是PolarDB-X即将发布的能力,它能让应用在使用PolarDB-X的过程中,犹如使用单机数据库一般的体验。与传统的中间件类型的“分布式数据库”相比,有了透明分布式能力的PolarDB-X,不再需要应用考虑分区键的概念,应用可以完全将单机MySQL上开发的建表语句、应用代码直接迁移到PolarDB-X上运行起来。本文将为大家介绍PolarDB-X透明分布式的新体验。
透明分布式,是PolarDB-X即将发布的能力,它能让应用在使用PolarDB-X的过程中,犹如使用单机数据库一般的体验。
与传统的中间件类型的“分布式数据库”相比,有了透明分布式能力的PolarDB-X,不再需要应用考虑分区键的概念,应用可以完全将单机MySQL上开发的建表语句、应用代码直接迁移到PolarDB-X上运行起来。
本文将为大家介绍PolarDB-X透明分布式的新体验。
在PolarDB-X上安装一个WordPress
WordPress是一个开源的博客软件,它使用MySQL作为其数据库。操作是在PolarDB-X上安装一个WordPress,来体验PolarDB-X的透明分布式能力。
我们将遵循简单的三步走:
- 不修改DDL直接建表
- 不修改应用直接跑起来
- 做下压测,做下调优
总结如下:
- 使用官方的WordPress镜像,不做任何修改,其安装程序就能自动的在PolarDB-X上完成建表、数据初始化等工作,其使用的都是标准的MySQL语法。
- 对此WordPress进行压测,PolarDB-X的各项监控数据显示,各节点处于的负载、数据量均处于均衡的状态。
- 通过PolarDB-X提供的SQL分析、DAS等工具,可以方便的找到系统中热点SQL。
- DBA可以直接通过创建索引、修改数据分布等DDL语句对系统性能做进一步的优化,不需要修改应用。
PolarDB-X实现透明分布式的武器
下面为大家分享下,PolarDB-X是如何实现透明分布式的。
透明数据分区
PolarDB-X是一个典型的Share Nothing的分布式数据库,其简化架构如下:

其核心组件为无状态的计算节点CN,与有状态的存储节点DN。
要了解PolarDB-X的透明分布式能力,首先要了解数据在PolarDB-X上是如何分布的。
在PolarDB-X中,一个表由多个索引组成,包括主键、二级索引等。PolarDB-X会对每个索引进行独立的进行分区,其分区键为索引的key。
例如一个典型的电商场景,订单表,拥有一个主键(id),两个索引(seller_id与buyer_id):
create table orders (
id bigint,
buyer_id varchar comment '买家',
seller_id varchar comment '卖家',
primary key(id),
index sdx(seller_id),
index bdx(buyer_id)
)
- 对于主键索引,会按照id对其进行分区
- 对于索引sdx,会按照seller_id进行分区
- 对于索引bdx,会按照buyer_id进行分区
如下图所示:

对索引进行分片之后,PolarDB-X会将这些分片打散到不同的存储节点里,并会按照数据量等信息进行负载均衡,如下图所示:

在PolarDB-X中,建表语句中可以不考虑分区键,PolarDB-X也能自动的对表进行分片与负载均衡。
因此,应用迁移PolarDB-X时,可以将单机MySQL中的建表语句导出,不需要修改直接在PolarDB-X中执行即可。
透明的分布式事务
分布式事务是PolarDB-X中的最重要的基础能力,它广泛的应用于业务内,避免了业务对事务代码进行改造;同时,PolarDB-X内部也用事务来实现索引。
PolarDB-X的分布式事务有以下几个特征:
- 与Spanner一样,满足外部一致性这种最强的一致性级别
- 语法与MySQL完全兼容,无需对应用进行改造
- 行为上支持兼容MySQL的RC与RR级别

Online DDL
PolarDB-X支持类型丰富的Online DDL,这里介绍一些有代表性的DDL类型。
索引维护
与单机MySQL的索引有所差异,PolarDB-X的索引均为全局索引,包含以下几种类型:
- 普通索引
- 唯一索引
- 聚簇索引
其中聚簇索引是PolarDB-X相对于MySQL的一种新类型的索引,它会包含表中的所有列,从而避免了回表的代价。
PolarDB-X中对索引的创建都通过DDL来完成,并且都是Online的,不会阻塞业务。
例如:
- 创建一个普通的索引:CREATE INDEX idx1 ON t1(name)
- 创建一个聚簇的索引:CREATE CLUSTERED INDEX idx1 ON t1(name)
INSTANT ADD COLUMN
加列操作是业务中最为常见的DDL类型。在MySQL中,加列操作的耗时是与数据量相关的(MySQL8.0中在表的最后面加列是INSTANT的)。
在PolarDB-X中,在任意位置加列都是INSTANT的,这个代表加列操作为恒定的秒级耗时,与数据量无关,不会对业务产生任何影响。
分区调整
PolarDB-X支持4种表的分布策略,Hash、Range、List、Broadcast。由于Hash能避免连续写入的热点,PolarDB-X默认使用Hash策略,大多数情况下,此策略能够很好的满足系统的性能需要。
但是如果业务在运行期间,希望选择合适的分区策略来提升系统性能,在PolarDB-X中可以方便的通过DDL语句进行调整,PolarDB-X会按照新的分区策略重新组织表的数据。
例如:
- 修改表的分区策略为Hash:ALTER TABLE t1 PARTITION BY HASH(name)
- 修改表的分片数为32:ALTER TABLE t1 PARTITION BY HASH(name) PARTITIONS 32
- 将表变为广播表:ALTER TABLE t1 BROADCAST
- 修改表的分区策略为RANGE:ALTER TABLE t1 PARTITION BY RANGE(id)
任意两种分区策略之间都可以通过DDL语句进行转换:

回填速度自适应
想必很多同学有过这样的经验:一个超大的表进行DDL操作,由于数据量比较大,这个DDL操作无法在一天内完成,为了避免对业务影响,人肉在白天业务高峰期来临的时候,调整参数,降低DDL的回填速度,晚上在业务高峰期结束后,提高DDL的回填速度。
PolarDB-X中的回填,会根据当前的系统负载,自动调节速度。
例如:


在这个例子中,分了四个阶段:
- 开始没有业务负载,DDL回填速度上升到25W行/s
- 业务负载开始上升,DDL回填速度迅速下降到13W行/s
- 业务TPS稳定在1W5,DDL回填速度稳定在13W行/s
- DDL结束后,业务TPS稳定在1W6
从这个例子中,我们可以看到PolarDB-X DDL的回填速度会自动根据业务负载进行调整,并且DDL期间,对业务的TPS影响很小。
让Online更Online
为了进一步减少DDL期间对业务的影响,PolarDB-X还使用了多项技术,例如:
- 元数据多版本,详见:https://zhuanlan.zhihu.com/p/347885003
- 可暂停、可取消
- MDL死锁检测
我们会在今后的文章里详细介绍这些技术的细节,请关注我们的知乎专栏:https://www.zhihu.com/org/polardb-x
总结
PolarDB-X的透明分布式能力,将极大的减少应用从单机数据库迁移分布式数据库的成本。同时,我们未来也会让它变得更透明,我们正在做的一些事情包括:
- 更精细的调度策略
- 热点数据的可视化展示,与SQL审计分析联动的智能诊断
- 在有全局索引的情况下,支持分区级的truncate
- 数据的按时间滚动、清理
- 等等
原文链接
本文为阿里云原创内容,未经允许不得转载。
PolarDB-X 2.0:使用一个透明的分布式数据库是一种什么体验的更多相关文章
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
- 基于vue2.0的一个豆瓣电影App
1.搭建项目框架 使用vue-cli 没安装的需要先安装 npm intall -g vue-cli 使用vue-cli生成项目框架 vue init webpack-simple vue-movie ...
- 用java从0生成一个简单的excel
用java从0生成一个简单的excel 目标 用代码实现对一个excel的基础操作,包括创建,插入文字,(好像就这些了),生成的excel可以用wps打开,如果直接用c++的文件流会生成假的xls表格 ...
- Vue1.x 到Vue2.0的一个变化
小弟初来乍到,写的不好的地方还望指正.谢谢各位! 废话不多说 进入正题: Vue1.x到2.0的一个变化 1. 在每个组件模板,不在支持片段代码 组件中模板: 之前: <templa ...
- Cocos2d-x 3.0 打造一个全平台概念文件夹
Cocos2d-x 3.0 打造一个全平台概念文件夹http:// www.eoeandroid.com/thread-328055-1-1.html
- Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
Oracle 远程访问配置 服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...
- 【转】 c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59
[转] c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59 stp1为第一个DateTimePicker this.dtp1.Value=this.dtp1 ...
- Vuejs2.0构建一个彩票查询WebAPP(2)
一,Vuex的使用 import Vue from 'vue' import Vuex from 'vuex' import MsgModules from './MsgModules' Vue.us ...
- Vuejs2.0构建一个彩票查询WebAPP(1)
说明:本人也是刚接触VUE.js,作为一个学习笔记,旨在与初学者共同学习.其中编程语法错误或者写作水平刺眼,还望轻喷. 使用工具:Visual Studio Code.技术栈为vue2+vuex+ax ...
- Vuejs2.0构建一个彩票查询WebAPP(3)
整个工程的目录及截图如下,源码下载 使用心得: 1.了解Vue的生命周期很有必要,详情参见博文Vue2.0 探索之路——生命周期和钩子函数的一些理解 2.Vuex全局状态管理真是美味不可言 st ...
随机推荐
- cpp面向对象
面向对象编程 目录 面向对象编程 类 拷贝构造函数 常量函数 友元 友元函数 友元类 静态成员 重载函数 函数重载 操作符重载 继承 多态 虚函数 虚析构函数 1.虚析构函数的作用:避免内存泄漏. 2 ...
- 《On Java 8》笔记 2
第十一章 内部类 Java 8 的 Lambda 表达式和方法引用减少了编写内部类的需求 外部类可以提供一个方法返回一个指向内部类的引用 链接外部类 内部类还拥有其外部类的所有元素的访问权 使用 .t ...
- Oracle 隐式数据类型转换
Oracle类型转换规则: 对于insert和update操作,oracle将值转换为受影响的的列的类型. 对于select操作,oracle会将列的值的类型转换为目标变量的类型. 看如下实验: 1. ...
- KingbaseESV8R6中查看索引常用sql
前言 KingbaseES具有丰富的索引功能,对于运行一段时间的数据库,经常需要查看索引的使用大小,使用状态等. 尤其重复索引的存在,有时会因为索引过多而造成维护成本加大和减慢数据库的运行速度. 下面 ...
- KingbaseES V8R6在解决复制冲突中hot_standby_feedback参数的重要性
背景 如果我们看到这样的类似报错:那说明可能遇到了复制冲突. 复制冲突的理解:当备库正在应用主库传输过来的wal日志与备库正在进行的查询产生冲突就会有此报错.比如说备库正在执行基于某个表的查询,这时主 ...
- Java实现哈希表
2.哈希表 2.1.哈希冲突 冲突位置,把数据构建为链表结构. 装载因子=哈希表中的元素个数 / (散列表)哈希表的长度 装载因子越大,说明链表越长,性能就越低,那么哈希表就需要扩容,把数据迁移到新的 ...
- 05 Ajax请求(扩展,延伸)
05 Ajax请求(扩展,延伸) 首先, 我们用Flask创建一个后台服务器(自己做网站了哈) 目录结构: 服务端: from flask import Flask, render_template, ...
- #树形dp#C 树上排列
分析 设\(dp[x][i]\)表示以\(x\)为根的子树中\(x\)的排名为\(i\)的方案数, 然后枚举子节点转移即可,Talk is cheap,Show me the code 代码 #inc ...
- 开源LaTex可视化编辑器推荐,支持LaTex代码补全,一键套用模板!
https://latexlive.com/ 这还是个开源项目,不过是C#的,搭建的成本比较大,没PHP好搞. 下面是这个网站
- openGauss/MOGDB时间消耗相关视图
openGauss/MOGDB 时间消耗相关视图 本文出处:https://www.modb.pro/db/388212 数据库版本 openGauss/MOGDB-2.1.1 一.显示当前用户在各个 ...