最近公司的领导让我这个 DBA 继续调研可以用来去 O 的相关分布式数据库产品,此前已经调研过亚信科技的 AntDB 。鉴于腾讯的 TBase 在 2019 年 11 月 7 日的 Techo 大会现场官宣开源,正好借此机会研究下,并和 AntDB 做个对比测试。
鉴于之前已经对 AntDB 有所了解,知道它是基于提供写可靠性,多主节点数据同步,数据传输的开源集群方案 Postgres-XC 实现的。看过 TBase 开源地址的官方文档介绍,发现它也是基于开源 Postgres-XC 方案实现的。
既然两种产品的实现原理都是一样的,那么谁在数据库易用性、性能优化和 Oracle 的兼容性(去 O 成本考量)方面做得更好,谁就更容易被市场接受。
下面我就从下面几个方面对两款数据库产品做出比对测试,并给出分析报告:
1. 安装部署
2. Oracle 兼容度
3. 数据库的性能
4. 数据库高可用
5. 数据库执行计划
6. 数据库扩展工具集
此次对比采用三台虚拟主机,采用1GTM 2Coordinator 2Datanode 节点的集群架构;
TBase 版本:psql (PostgreSQL 10.0 TBase V2)
AntDB 版本:psql (5.0devel based on PG 11.5)
|
TBase |
AntDB |
数据库版本 |
TBase pg10.0 |
AntDB pg11.5 |
相较于pg10,pg11在并行计算、分区功能增强、存储过程支持等方面得到了增强。
TBase 源码包按照官方文档编译并安装;
AntDB 源码包同上;
TBase 集群部署,和PGXC 采用一样的方式,使用pgxc_ctl 命令,生成pgxc_ctl.conf 配置文件,通过修改该配置文件完成集群的初始化、启停等管理操作;
AntDB 集群部署提供了adbmgr 管理工具,通过该工具的指令实现主机节点添加修改、分发、集群节点的添加修改、初始化、集群节点参数配置、集群启停等操作,易用性要优于TBase ;
|
TBase |
AntDB |
安装部署管理 |
安装过程采用pgxc_ctl 安装部署模式,手动编辑pgxc_ctl.conf 配置文件 |
通过adbmgr 管理工具部署管理集群,指令式操作,部署简单快捷 |
当前我们很多的应用跑在了Oracle 数据库上,有些应用已经比较老旧,没有人维护,针对这些应用的迁移,我们不希望有任何应用方面的更改,因此在数据库和Oracle 的兼容性方面,我们希望能达到一个较高的兼容度。接下来对TBase 和AntDB 对Oracle 的兼容性我会重点进行对比测试。
测试的要点:
l 数据类型
l 数据库函数
l 数据类型隐式转换
l SQL 语法兼容度
|
TBase |
AntDB |
浮点 |
支持 |
支持 |
整形 |
支持 |
支持 |
小数 |
支持 |
支持 |
字符串 |
支持 |
支持 |
二进制 |
不支持 CLOB 、 BLOB 、 LONG |
支持 CLOB 、 BLOB 、 LONG |
日期 / 时间 |
部分支持, TBase date 类型不带时间和 Oracle date 不完全兼容 |
支持 |
布尔类型 |
支持 |
支持 |
rowid |
不支持 |
支持 |
xml |
支持 |
支持 |
json |
支持 |
支持 |
|
TBase |
AntDB |
substr |
支持 |
支持 |
sign |
支持 |
支持 |
sinh |
支持 |
支持 |
tanh |
支持 |
支持 |
cosh |
支持 |
支持 |
trim |
支持 |
支持 |
coalesce |
支持 |
支持 |
extract |
支持 |
支持 |
greatest |
支持 |
支持 |
last_day |
支持 |
支持 |
least |
支持 |
支持 |
length |
支持 |
支持 |
lnnvl |
支持 |
支持 |
max |
支持 |
支持 |
min |
支持 |
支持 |
mod |
支持 |
支持 |
month_between |
支持 |
支持 |
to_yminterval |
支持 |
支持 |
nullif |
支持 |
支持 |
numtodsinterval |
支持 |
支持 |
numtoyminterval |
支持 |
支持 |
round_date |
支持 |
支持 |
to_timestamp |
支持 |
支持 |
rpad |
支持 |
支持 |
to_single_byte |
支持 |
支持 |
sessiontimezone |
支持 |
支持 |
to_date |
Tbase to_date
函数对月份解析有错误;
|
支持 |
to_date+to_dsinterval |
TBase
计算错误,正确值应该是
2016-01-04 14:20:50
;
|
支持 |
soundex |
TBase
不支持
soundex
函数;
|
支持 |
sys_extract_utc |
TBase
不支持
sys_extract_utc
函数;
|
支持 |
trunc |
TBase
对
trunc
函数传参参数类型支持不够,对数值型的支持(正负)不够,数据类型隐式转换不够;
|
支持 |
add_months |
TBase add_months
对传入的参数值转换有错误;
|
支持 |
bitand |
Tbase
不支持
bitand
函数;
|
支持 |
instr |
Tbase
对
instr
函数传参参数类型支持不够,对数值型的支持不够
|
支持 |
lpad |
Tbase
对
lpad
函数传参参数类型支持不够,对数值型的支持不够
|
支持 |
nanvl |
Tbase
对
nanlvl
函数传参参数类型支持不够,对空值的支持不够;
|
支持 |
new_time |
Tbase
不支持
new_time
函数;
|
支持 |
next_day |
Tbase
对函数
next_day
传参支持数据类型不够,不支持
numeric
隐式转换为
int
;
|
支持 |
trim |
Tbase
对函数
trim
传参数据类型支持不够,不支持数值型隐式转换为字符型;
|
支持 |
translate |
Tbase
对函数
translate
传参数据类型支持不够,不支持数值型隐式转换为字符型;
|
支持 |
to_timestamp_tz |
Tbase to_timestamp_tz
函数对月份解析有错误;
|
支持 |
NLS_CHARSET_ID |
Tbase
不支持函数
NLS_CHARSET_ID
;
|
支持 |
NLS_CHARSET_NAME |
Tbase
不支持函数
NLS_CHARSET_NAME
;
|
支持 |
nls_initcap |
Tbase
不支持函数
nls_initcap
;
|
支持 |
nls_lower |
Tbase
不支持函数
nls_lower
;
|
支持 |
nls_upper |
Tbase
不支持函数
nls_upper
;
|
支持 |
nvl |
Tbase
对函数
nvl
参数传递数据类型支持不够,不支持数据类型隐式转换;
|
支持 |
nvl2 |
Tbase
对函数
nvl2
参数传递数据类型支持不够,不支持数据类型的隐式转换;
|
支持 |
to_timestamp |
Tbase to_timestamp
函数对月份解析有错误
|
支持 |
regexp_count |
Tbase
不支持函数
regexp_count
;
|
支持 |
regexp_instr |
Tbase
不支持函数
regexp_instr
;
|
支持 |
regexp_like |
Tbase
不支持函数
regexp_like
;
|
支持 |
regexp_replace |
Tbase
不支持函数
regexp_replace;
|
支持 |
remainder |
Tbase
不支持函数
remainder;
|
支持 |
replace |
Tbase
函数
replace
传参数据类型支持不够;
|
支持 |
round |
Tbase
函数
round
传参数据类型支持不够,不支持数据类型隐式转换;
|
支持 |
rpad |
Tbase
函数
rpad
传参数据类型支持不够,不支持数据类型隐式转换;
|
支持 |
to_number |
Tbase
函数
to_number
参数传递的格式化选项支持不够;
|
支持 |
to_char |
Tbase
函数
to_char
参数传递的格式化选项支持不够;
|
支持 |
通过对比数据库函数,TBase 在函数兼容性方面和AntDB 差距较大,主要体现在部分函数无法支持,函数支持的数据类型不丰富,不支持数据类型的隐式转换。而AntDB 完全兼容Oracle 所列的常用的函数。此外,在函数兼容性方面TBase 是通过UDF 、扩展等方式实现,兼容有限,而AntDB 是数据库内核级别实现的支持。
|
TBase |
AntDB |
隐式数据类型转换
|
在某些符合场景(函数传参) TBase 对数据类型隐式转换支持不够 ; 包含 greatest 、 least 、 substr 、 length 、 trim 、 next_day 、 translate 等函数
示例:
ERROR: operator is not unique: unknown + unknown |
示例: antdb=# select '1'+'1' from dual; ?COLUMN? ---------- 2 (1 row)
antdb=# SELECT SUBSTR(exp(2),1,6) sub FROM DUAL;
|
AntDB 在内核级别实现了兼容Oracle 数据类型的隐式转换,而TBase 仅仅支持有限的数据类型隐式转换。
|
TBase |
AntDB |
connect by |
TBase 不支持 start with connect by 的层次查询语法; |
AntDB 支持 connect by 语法;
|
rownum , rowid |
TBase 不支持 rownum 、 rowid ; |
AntDB 支持 rownum 、 rowid ; |
listagg 、 wm_concat |
TBase 不支持 listagg 、 wm_concat ; |
AntDB 支持 listagg 、 wm_concat 行列转换; |
minus 运算 |
TBase 不支持minus 运算符; |
AntDB 支持minus 运算; |
乘法运算 |
TBase 进行乘法运算的时候数据类型隐式转换支持不够; |
AntDB 乘法运算兼容Oracle 数据隐式转换; |
加法运算 |
TBase 进行加法运算的时候数据类型隐式转换支持不够; |
AntDB 加法运算兼容Oracle 数据隐式转换; |
减法运算 |
TBase 进行减法运算的时候数据类型隐式转换支持不够; |
AntDB 减法运算兼容Oracle 数据隐式转换; |
除法运算 |
TBase 进行除法运算的时候数据类型隐式转换支持不够; |
AntDB 除法运算兼容Oracle 数据隐式转换; |
|| 字符连接运算 |
TBase 对|| 连接运算时候数据类型的数值转换为字符型隐式转换支持不够; |
AntDB|| 连接运算兼容Oracle 数据隐式转换; |
表别名 |
Tbase 不支持表数据更新时的表别名; |
AntDB 支持表数据更新时的表别名; |
Oracle 投影列名大小写保持一致 |
Oracle 字段名是大写,TBase 不兼容; |
AntDB 支持设置参数upper_out_oracle_target 控制是否兼容Oracle 字段大写; |
oracle 中表左右连接 (+) 写法 |
TBase 不兼容Oracle 中表连接(+ )这种写法; |
AntDB 支持Oracle 表连接(+ )的写法; |
alter 修改表结构 |
Tbase 不支持modify 命令,不支持add 后面列名加括号的写法; |
AntDB 支持modify 语法,支持add 命令后面加括号的写法; |
PLSQL/PIPE ROW
|
Tbase 不支持 Oracle PLSQL 语法,不支持函数创建,不支持 pipe row 的使用
|
AntDB 支持Oracle 函数、存储过程创建,支持PIPE ROW 的使用 |
PLSQL/table() 函数
|
Tbase 不支持 Oracle table 函数; |
AntDB 支持 Oracle table 函数;
|
分析函数 keep first/last
|
TBase 不支持 keep first/last 分析函数; |
AntDB 支持 keep first/last 分析函数;
|
序列取值
|
Tbase 不支持使用 .nextval 的方式获取序列的下一返回值; |
Antdb 支持使用序列 .nextval 的方式返回序列的值; |
多表关联更新
|
Tbase 不支持 Oracle 多表关联 update 语法; |
AntDB 支持 Oracle 多表关联 Update 语法;
|
死锁检测
|
TBase 在跨 CN 节点无法检测死锁,事务一直锁等待; |
AntDB 在跨 CN 节点可以发现检测死锁; |
分区表 |
TBase 不支持 Oracle 的分区表建表语法; |
AntDB 兼容 Oracle 语法支持 Hash 、 Range 、 List 分区; |
存储过程、函数 |
TBase 不支持 Oracle 存储过程、函数的创建;
|
AntDB 兼容 Oracle 存储过程、函数的语法,支持存储过程、函数的创建; |
Savepoint |
TBase 支持事务 savepoint ,支持子事务; |
AntDB 不支持子事务,不支持 savepoint ; |
从上表可以看出在SQL 语法兼容方面,AntDB 对Oracle 的支持度远比TBase 要高,但是在子事务的支持性上不如TBase 。
为验证数据库的性能,我采用了sysbench 和benchmarksql 两种测试工具,分别对AntDB 和TBase 在同等条件(硬件环境、数据库参数配置、测试数据量)下进行了性能比对;
|
TBase |
AntDB |
同等条件下 sysbench 测试
|
OLTP test statistics:
|
OLTP test statistics:
|
同等条件下 tpcc 测试
|
17:23:53,593 [Thread-15] INFO jTPCC : Term-00, mTOTAL: 7104 Memory Usage: 113MB / 1928MB
|
16:44:46,438 [Thread-10] INFO jTPCC : Term-00, ent tpmTOTAL: 6912 Memory Usage: 443MB / 1928MB
|
可以看出AntDB 的性能大致是TBase 的1.5-2 倍。
|
TBase |
AntDB |
集群高可用 |
暂未提供自动故障恢复功能,需要手工执行故障切换、备节点提升等操作; |
AntDB 提供集群自愈功能,发现主节点故障自动提升从节点,待故障节点恢复后可以通过 rewind 功能重新加入集群; |
TBase 在集群数据库高可用方面提供了相关的手工处置方式,缺少自动化的实现,需要借助于第三方工具。AntDB 提供了集群自愈的功能,在发现主节点故障的情况下会自动切换从节点,并提供了主节点故障恢复后重新快速加入集群的功能(可以轻松通过AntDB 的adbmgr 管理工具实现)。
|
TBase |
AntDB |
执行计划改进
|
TBase
执行复杂查询无法自动有效利用并行;
|
AntDB
优化:
|
如下是取自TPCH 模型的Q6 和Q8 测试SQL :
Q6 查询:
Q8 查询:
查看AntDB 的Q8 执行计划:
经过上面的测试,AntDB 在复杂查询执行计划方面增强了并行查询和采用Reduce 功能优化了Join 的效率,效果优于TBase 。
|
TBase |
AntDB |
数据备份恢复 |
暂未提供全局数据备份恢复工具; 可以使用 pg_dump 等逻辑备份工具进行数据备份; |
AntDB 提供优化改进后的数据库备份管理工具 barman ,支持基于 barrier 的备份恢复; |
数据库迁移 / 迁移评估 |
暂未提供数据库迁移工具和迁移评估工具; |
AntDB
提供优化改进后的
ora2pg
工具,可以实现从
Oracle
、
MySQL
到
AntDB
数据库的迁移;
|
SQL Replay |
暂未提供数据库 sql replay 的工具; |
AntDB 提供 a2o 工具(基于逻辑复制的方式实现)支持 AntDB 数据库同步数据至其他数据库; |
Web 监控 |
暂未提供 web 监控工具; |
AntDB 提供了 AdbMonitor Web 监控工具,查看当前数据库集群的运行状态、慢查询、锁信息等内容; |
相比于TBase ,AntDB 在数据库备份恢复、数据库迁移、SQL Replay 、Web 监控方面提供了各种工具,方便了数据库的运维管理。
经过上面的测试,可以看出, AntDB 从数据库的安装部署, Oracle 的兼容性,到数据库的性能,执行计划优化、运维工具集的完善,都要比开源的 TBase V2 版本要更符合我们的去 O 的需求。当然了,不论是 AntDB 还是 TBase 和 Oracle 比起来,还是有很多需要支持和完善的地方( AWR 报告、 EM 、数据闪回功能等),毕竟 Oracle 已经称霸关系型数据库这么多年了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10937267/viewspace-2664456/,如需转载,请注明出处,否则将追究法律责任。