去O路上的歷程--開源分散式資料庫產品對比(TBase VS AntDB)

zjadolf發表於2019-11-16

最近公司的領導讓我這個 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 資料庫上,有些應用已經比較老舊,沒有人維護,針對這些應用的遷移,我們不希望有任何應用方面的更改,因此在資料庫和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 函式對月份解析有錯誤;
  tbase=# SELECT TO_date('January 15, 2010, 11:00 P.M.','Mon dd, YYYY, HH:MI   P.M.') FROM DUAL;
  ERROR:  invalid value "ar"   for "dd"
  DETAIL:  Value must be an integer.

支援

to_date+to_dsinterval

TBase 計算錯誤,正確值應該是 2016-01-04 14:20:50
  postgres=# select to_date('1-3-2016 10:30:00','MM-DD-yyyy hh:mi:ss') +   to_dsinterval('1 3:50:50')  as ndate   from dual;
          ndate       
  ---------------------
   2016-01-04 03:50:50
  (1 row)

支援

soundex

TBase 不支援 soundex 函式;
  tbase=# select soundex('moon') from dual;
  ERROR:  function soundex(unknown) does   not exist
  LINE 1: select soundex('moon') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

sys_extract_utc

TBase 不支援 sys_extract_utc 函式;
  tbase=# SELECT SYS_EXTRACT_UTC(TIMESTAMP '2012-04-19 17:30:00 +08:00 ')   "CURRENT UTC TIME" FROM     DUAL;
  ERROR:  function   sys_extract_utc(timestamp without time zone) does not exist
  LINE 1: SELECT SYS_EXTRACT_UTC(TIMESTAMP '2012-04-19 17:30:00 +08:00...
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

trunc

TBase   trunc 函式傳參引數型別支援不夠,對數值型的支援(正負)不夠,資料型別隱式轉換不夠;
  tbase=# select trunc(3.25,'') from dual;
  ERROR:  invalid input syntax for   integer: ""
  LINE 1: select trunc(3.25,'') from dual;
                            ^
  tbase=# select trunc(100.984,-2.8) from dual;
  ERROR:  function trunc(numeric,   numeric) does not exist
  LINE 1: select trunc(100.984,-2.8) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  tbase=# select trunc(100.984,2.8) from dual;
  ERROR:  function trunc(numeric,   numeric) does not exist
  LINE 1: select trunc(100.984,2.8) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

add_months

TBase add_months 對傳入的引數值轉換有錯誤;
  tbase=# select add_months(to_date('2000-2-29','YYYY-MM-DD'),12.1) from dual;
  ERROR:  function add_months(date,   numeric) does not exist
  LINE 1: select add_months(to_date('2000-2-29','YYYY-MM-DD'),12.1) fr...
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  tbase=# select add_months(to_date('2000-2-29','YYYY-MM-DD'),-12.55) from   dual;
  ERROR:  function add_months(date,   numeric) does not exist
  LINE 1: select add_months(to_date('2000-2-29','YYYY-MM-DD'),-12.55) ...
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

bitand

Tbase 不支援 bitand 函式;
  tbase=# select bitand(1,3) from dual;
  ERROR:  function bitand(integer,   integer) does not exist
  LINE 1: select bitand(1,3) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

instr

Tbase instr 函式傳參引數型別支援不夠,對數值型的支援不夠
 
,資料型別隱式轉換不夠;
  ERROR:  function instr(integer,   integer) does not exist
  LINE 1: select instr(1234,23) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  ERROR:  function instr(numeric,   unknown) does not exist
  LINE 1: select instr(to_number(123.56),'.') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  ERROR:  function instr(double   precision, integer) does not exist
  LINE 1: select instr(exp(2),0)  from   dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  ERROR:  function instr(double   precision, double precision) does not exist
  LINE 1: select instr(exp(2),exp(2))    from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

lpad

Tbase lpad 函式傳參引數型別支援不夠,對數值型的支援不夠
 
,資料型別隱式轉換不夠;
  tbase=# select lpad(3.545, 5) from dual;
  ERROR:  function lpad(numeric, integer)   does not exist
  LINE 1: select lpad(3.545, 5) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  tbase=# select lpad(4, 5) from dual;
  ERROR:  function lpad(integer, integer)   does not exist
  LINE 1: select lpad(4, 5) from dual;
                 ^
  HINT:  No function matches the given name   and argument types. You might need to add explicit type casts.

支援

nanvl

Tbase nanlvl 函式傳參引數型別支援不夠,對空值的支援不夠;
  tbase=# select nanvl('','') from dual;
  ERROR:  invalid input syntax for type   double precision: ""
  LINE 1: select nanvl('','') from dual;
                       ^
  tbase=# select nanvl('',null) from dual;
  ERROR:  invalid input syntax for type   double precision: ""
  LINE 1: select nanvl('',null) from dual;

支援

new_time

Tbase 不支援 new_time 函式;
  tbase=# select sysdate bj_time,new_time(sysdate,'PDT','GMT') los_angles from   dual;
  ERROR:  function new_time(timestamp   without time zone, unknown, unknown) does not exist
  LINE 1: select sysdate bj_time,new_time(sysdate,'PDT','GMT') los_ang...
                                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

next_day

Tbase 對函式 next_day 傳參支援資料型別不夠,不支援 numeric 隱式轉換為 int
  tbase=# select next_day(sysdate,2.4) from dual;
  ERROR:  function next_day(timestamp   without time zone, numeric) does not exist
  LINE 1: select next_day(sysdate,2.4) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

trim

Tbase 對函式 trim 傳引數據型別支援不夠,不支援數值型隱式轉換為字元型;
  tbase=# select trim(both 1 from 121) from dual;
  ERROR:  function   pg_catalog.btrim(integer, integer) does not exist
  LINE 1: select trim(both 1 from 121) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

translate

Tbase 對函式 translate 傳引數據型別支援不夠,不支援數值型隱式轉換為字元型;
  tbase=# SELECT TRANSLATE(121, 12, 3) FROM DUAL;
  ERROR:  function translate(integer,   integer, integer) does not exist
  LINE 1: SELECT TRANSLATE(121, 12, 3) FROM DUAL;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  tbase=# SELECT TRANSLATE('999,999.99', '9', 0) FROM DUAL;
  ERROR:  function translate(unknown,   unknown, integer) does not exist
  LINE 1: SELECT TRANSLATE('999,999.99', '9', 0) FROM DUAL;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

to_timestamp_tz

Tbase   to_timestamp_tz 函式對月份解析有錯誤;
  tbase=# SELECT to_timestamp_tz('January 15, 2010, 11:00 P.M.','Mon dd, YYYY,   HH:MI P.M.') FROM DUAL;
  ERROR:  invalid value "ar"   for "dd"
  DETAIL:  Value must be an integer.

支援

NLS_CHARSET_ID

Tbase 不支援函式 NLS_CHARSET_ID
  tbase=# SELECT NLS_CHARSET_ID('utf8') FROM DUAL;
  ERROR:  function   nls_charset_id(unknown) does not exist
  LINE 1: SELECT NLS_CHARSET_ID('utf8') FROM DUAL;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

NLS_CHARSET_NAME

Tbase 不支援函式 NLS_CHARSET_NAME
  tbase=# SELECT NLS_CHARSET_NAME(2) FROM DUAL;
  ERROR:  function   nls_charset_name(integer) does not exist
  LINE 1: SELECT NLS_CHARSET_NAME(2) FROM DUAL;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

nls_initcap

Tbase 不支援函式 nls_initcap
  tbase=# select nls_initcap('ab cde') from dual;
  ERROR:  function nls_initcap(unknown)   does not exist
  LINE 1: select nls_initcap('ab cde') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

nls_lower

Tbase 不支援函式 nls_lower
  tbase=# select nls_lower('AB CDe') from dual;
  ERROR:  function nls_lower(unknown)   does not exist
  LINE 1: select nls_lower('AB CDe') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

nls_upper

Tbase 不支援函式 nls_upper
  tbase=# select nls_upper('ab cDe') from dual;
  ERROR:  function nls_upper(unknown)   does not exist
  LINE 1: select nls_upper('ab cDe') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

nvl

Tbase 對函式 nvl 引數傳遞資料型別支援不夠,不支援資料型別隱式轉換;
  tbase=# select nvl(1.4,4) from dual;
  ERROR:  function nvl(numeric, integer)   does not exist
  LINE 1: select nvl(1.4,4) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.
  tbase=# select nvl(exp(2),4.8) from dual;
  ERROR:  function nvl(double precision,   numeric) does not exist
  LINE 1: select nvl(exp(2),4.8) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

nvl2

Tbase 對函式 nvl2 引數傳遞資料型別支援不夠,不支援資料型別的隱式轉換;
  tbase=# select nvl2(3,'4.9',5) from dual;
  ERROR:  invalid input syntax for   integer: "4.9"
  LINE 1: select nvl2(3,'4.9',5) from dual;
  tbase=# select nvl2(4,4.8,5) from dual;
  ERROR:  function nvl2(integer, numeric,   integer) does not exist
  LINE 1: select nvl2(4,4.8,5) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

to_timestamp

Tbase   to_timestamp 函式對月份解析有錯誤
  tbase=# SELECT TO_timestamp('January 15, 2010, 11:00 P.M.','Mon dd, YYYY,   HH:MI P.M.') FROM DUAL;
  ERROR:  invalid value "ar"   for "dd"
  DETAIL:  Value must be an integer.

支援

regexp_count

Tbase 不支援函式 regexp_count
  tbase=# select regexp_count('abcdfbc','Bc',1,'i') from dual;
  ERROR:  function regexp_count(unknown,   unknown, integer, unknown) does not exist
  LINE 1: select regexp_count('abcdfbc','Bc',1,'i') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

regexp_instr

Tbase 不支援函式 regexp_instr
  tbase=# SELECT regexp_instr('abc1def', '[[:digit:]]',1,1,1) output  from dual;
  ERROR:  function regexp_instr(unknown,   unknown, integer, integer, integer) does not exist
  LINE 1: SELECT regexp_instr('abc1def', '[[:digit:]]',1,1,1) output  ...
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

regexp_like

Tbase 不支援函式 regexp_like
  tbase=# select * from t4test where regexp_like(name,'345');
  ERROR:  function regexp_like(character   varying, unknown) does not exist
  LINE 1: select * from t4test where regexp_like(name,'345');
                                     ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

regexp_replace

Tbase 不支援函式 regexp_replace;
  tbase=# SELECT regexp_replace('abc1def2', '[[:digit:]]','@',1,2) output  from dual;
  ERROR:  function   regexp_replace(unknown, unknown, unknown, integer, integer) does not exist
  LINE 1: SELECT regexp_replace('abc1def2', '[[:digit:]]','@',1,2) out...
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

remainder

Tbase 不支援函式 remainder;
  tbase=# select remainder(7,5) from dual;
  ERROR:  function remainder(integer,   integer) does not exist
  LINE 1: select remainder(7,5) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

replace

Tbase 函式 replace 傳引數據型別支援不夠;
  tbase=# select replace('abc', 'a') from dual;
  ERROR:  function replace(unknown,   unknown) does not exist
  LINE 1: select replace('abc', 'a') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

round

Tbase 函式 round 傳引數據型別支援不夠,不支援資料型別隱式轉換;
  tbase=# select round(100.984,2.8) from dual;
  ERROR:  function round(numeric,   numeric) does not exist
  LINE 1: select round(100.984,2.8) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

rpad

Tbase 函式 rpad 傳引數據型別支援不夠,不支援資料型別隱式轉換;
  tbase=# select rpad(3.545, 5) from dual;
  ERROR:  function rpad(numeric, integer)   does not exist
  LINE 1: select rpad(3.545, 5) from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

to_number

Tbase 函式 to_number 引數傳遞的格式化選項支援不夠;
  tbase=# select to_number(89.987,'99.9999') from dual;
  ERROR:  function to_number(numeric,   unknown) does not exist
  LINE 1: select to_number(89.987,'99.9999') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

to_char

Tbase 函式 to_char 引數傳遞的格式化選項支援不夠;
  tbase=# select to_char(to_char(24.50),'099.999') from dual;
  ERROR:  function to_char(text, unknown)   does not exist
  LINE 1: select to_char(to_char(24.50),'099.999') from dual;
                 ^
  HINT:  No function matches the given   name and argument types. You might need to add explicit type casts.

支援

透過對比資料庫函式,TBase 在函式相容性方面和AntDB 差距較大,主要體現在部分函式無法支援,函式支援的資料型別不豐富,不支援資料型別的隱式轉換。而AntDB 完全相容Oracle 所列的常用的函式。此外,在函式相容性方面TBase 是透過UDF 、擴充套件等方式實現,相容有限,而AntDB 是資料庫核心級別實現的支援。

資料型別隱式轉換


TBase

AntDB

隱式資料型別轉換

 

在某些符合場景(函式傳參) TBase 對資料型別隱式轉換支援不夠 ; 包含 greatest least substr length trim next_day translate 等函式

示例:
  tbase=# SELECT SUBSTR(exp(2),1,6) sub FROM DUAL;
  ERROR:  function substr(double   precision, integer, integer) does not exist
 
  tbase=# SELECT SUBSTR('abcde',tanh(1),6) sub FROM DUAL;
  ERROR:  function substr(unknown, double   precision, integer) does not exist
 
tbase=# select '1'+'1' from dual;

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;
    SUB    
  --------
   7.3890
  (1 row)
 
  antdb=# SELECT SUBSTR('abcde',tanh(1),6) sub FROM DUAL;
    SUB   
  -------
   abcde
  (1 row)
  AntDB
支援 Oracle 資料型別隱式轉換

AntDB 在核心級別實現了相容Oracle 資料型別的隱式轉換,而TBase 僅僅支援有限的資料型別隱式轉換。

SQL 語法相容度


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:
      queries performed:
          read:                            140406
          write:                           40088
          other:                           20030
          total:                           200524
      transactions:                        10001  (
317.77 per sec. )
      read/write requests:                 180494 (
5735.07 per sec. )
      other operations:                    20030  (636.44 per sec.)
      ignored errors:                      28     (0.89 per sec.)
      reconnects:                          0      (0.00 per sec.)

 

OLTP   test statistics:
      queries performed:
          read:                            141120
          write:                           40242
          other:                           20082
          total:                           201444
      transactions:                        10002  (
674.30 per sec. )
      read/write requests:                 181362 (
12226.73 per sec. )
      other operations:                    20082  (1353.85 per sec.)
      ignored errors:                      78     (5.26 per sec.)
      reconnects:                          0      (0.00 per sec.)
 
AntDB 效能大致是 TBase 2 倍。

同等條件下 tpcc 測試

 

17:23:53,593   [Thread-15] INFO   jTPCC : Term-00,   mTOTAL: 7104    Memory Usage: 113MB /   1928MB              
  17:23:53,593 [Thread-15] INFO   jTPCC :   Term-00,
  17:23:53,593 [Thread-15] INFO   jTPCC :   Term-00,
Measured   tpmC (NewOrders) = 71.76
  17:23:53,594 [Thread-15] INFO   jTPCC :   Term-00, Measured tpmTOTAL = 156.9
  17:23:53,594 [Thread-15] INFO   jTPCC :   Term-00, Session Start     = 2019-11-12   17:16:56
  17:23:53,594 [Thread-15] INFO   jTPCC :   Term-00, Session End       = 2019-11-12   17:23:53
  17:23:53,594 [Thread-15] INFO   jTPCC :   Term-00, Transaction Count = 1090
  17:23:53,594 [Thread-15] INFO   jTPCC :   Term-00, New OrderTransaction Count = 499
  17:23:53,595 [Thread-15] INFO   jTPCC :   Term-00, Transaction that execution successfully Count = 619(56.79%)
  17:23:53,595 [Thread-15] INFO   jTPCC :   Term-00, Transaction that execution fails as expected Count = 3(0.28%)
  17:23:53,595 [Thread-15] INFO   jTPCC :   Term-00, Transaction that execution error Count = 468(42.94%)

16:44:46,438   [Thread-10] INFO   jTPCC : Term-00, ent   tpmTOTAL: 6912    Memory Usage: 443MB /   1928MB         
  16:44:46,438 [Thread-10] INFO   jTPCC :   Term-00,
  16:44:46,438 [Thread-10] INFO   jTPCC :   Term-00, Measured tpmC (NewOrders) =
105.87
  16:44:46,438 [Thread-10] INFO   jTPCC :   Term-00, Measured tpmTOTAL = 219.23
  16:44:46,438 [Thread-10] INFO   jTPCC :   Term-00, Session Start     = 2019-11-12   16:39:41
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, Session End       = 2019-11-12   16:44:46
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, Transaction Count = 1113
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, New OrderTransaction Count = 538
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, Transaction that execution successfully Count = 783(70.35%)
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, Transaction that execution fails as expected Count = 2(0.18%)
  16:44:46,439 [Thread-10] INFO   jTPCC :   Term-00, Transaction that execution error Count = 328(29.47%)
 
AntDB 大致是 TBase 1.5

 

可以看出AntDB 的效能大致是TBase 1.5-2 倍。

資料庫高可用


TBase

AntDB

叢集高可用

暫未提供自動故障恢復功能,需要手工執行故障切換、備節點提升等操作;

AntDB 提供叢集自愈功能,發現主節點故障自動提升從節點,待故障節點恢復後可以透過 rewind 功能重新加入叢集;

TBase 在叢集資料庫高可用方面提供了相關的手工處置方式,缺少自動化的實現,需要藉助於第三方工具。AntDB 提供了叢集自愈的功能,在發現主節點故障的情況下會自動切換從節點,並提供了主節點故障恢復後重新快速加入叢集的功能(可以輕鬆透過AntDB adbmgr 管理工具實現)。

資料庫執行計劃


TBase

AntDB

執行計劃改進

 

TBase 執行復雜查詢無法自動有效利用並行;
 
執行復雜的關聯查詢無法有效利用資料節點的計算能力;

 

AntDB 最佳化:
  1.
利用資料節點資源並行查詢
  2.
對於大量資料查詢執行計劃下沉資料節點執行減少節點間資料通訊

如下是取自TPCH 模型的Q6 Q8 測試SQL

Q6 查詢:

 

 

Q8 查詢:

 

 

檢視AntDB Q8 執行計劃:

 

經過上面的測試,AntDB 在複雜查詢執行計劃方面增強了並行查詢和採用Reduce 功能最佳化了Join 的效率,效果優於TBase

資料庫擴充套件工具集


TBase

AntDB

資料備份恢復

暫未提供全域性資料備份恢復工具;

可以使用 pg_dump 等邏輯備份工具進行資料備份;

AntDB 提供最佳化改進後的資料庫備份管理工具 barman ,支援基於 barrier 的備份恢復;

資料庫遷移 / 遷移評估

暫未提供資料庫遷移工具和遷移評估工具;

AntDB 提供最佳化改進後的 ora2pg 工具,可以實現從 Oracle MySQL AntDB 資料庫的遷移;
  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章