01.17 「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

導語:近些年,大數據技術在IT界裡已經是必提的話題了,朋友圈裡經常看到一些同事們、項目合作公司朋友們轉發的大數據相關文章。最近工作中也在做一款與數據相關的產品,不幸的是,真正遇到數據量大的時候,發現常用的 MySQL 等數據庫真是頂不住。百度一下,當前流行的 Greenplum 數據庫映入眼簾。仔細一查,發現 Greenplum 還是個開源數據庫,再去各大招聘網站和 APP 查看了一下,招聘 Greenplum 相關人才的還真不少。在一番調研後,經測試發現,參數調優後的 Greenplum 數據庫 Insert 寫入性能有很大程度提升,完成 100W 數據寫入由每秒 780 條提升到 2252 條,寫入速度已經與 MySQL 相媲美了。用這篇文章來記錄一下我的測試與調參過程。

開始接觸 Greenplum 是一次機緣巧合,當時領導讓調研下 Greenplum 的性能,於是我在公司用了四臺虛擬機,開始搭建起來。記得當時 Greenplum 的 6.0 版本還沒發佈,我便搭建了一個 5.X 的版本,並用常規的 JDBC 等操作關係數據庫的方式來使用 Greenplum,不料發現數據寫入很慢。網上百度發現不只是我一個人這麼認為,試驗了一些網上的方法也無濟於事。

沒過幾天,在 Github 上搜索 GPDB 相關內容時,發現 Greenplum 發佈了 6.0 版本,同時也查到了 Greenplum 中文社區 ( greenplum.cn ) 裡的一篇相關文章,文章中提到 Greenplum 6.0 在 OLTP 上有很大提升,推掉5的環境,當天就將 Greenplum 改為了 6.0 的,繼續用 JDBC 來 insert 數據,發現還是很慢,一開始懷疑自己的測試程序有問題,於是先後幾次用 Greenplum 自己的驅動包、kettle 的 API、datax 工具等幾種方式測試,結果仍然沒有太大變化。無奈只好繼續在網上搜索,後來搜到阿里有篇文章對 Greenplum 的數據寫入問題有過總結,印象比較深的是 insert 語句用批量 values 方式、用 copy 方式寫入等。

感覺又沒過去幾天,在 Greenplum 技術群裡聽說 Greenplum 又出新版本了,便想著下週再試試。誰知等我再次準備升級環境測試時,Github 上最新的已經是 6.2.1 版本了。再次測試,感覺數據寫入速度好像還不如6.0的。於是去 Greenplum 技術群組中求助,得到一位大俠指點,要提高 OLTP 的寫入性能,需要調整 Greenplum 的一些默認配置參數,經嘗試,果然很不一樣。

接下來看看我的測試與調參過程吧。

一、測試過程

測試的數據庫包括Greenplum集群版本、Oracle單機版本、MySQL單機版本。

1、系統環境

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

2、Greenplum 環境

2.1 軟件版本

  1. greenplum-db-6.0.0-rhel7-x86_64.rpm
  2. greenplum-db-6.2.1-rhel7-x86_64.rpm

2.2 集群節點

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

3、Oracle 環境

3.1 軟件版本

  1. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production

3.2 單機環境

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

4、MySQL 環境

4.1 軟件版本

  1. mysql-5.6.25

4.2 部署環境

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

4.3 數據庫驅動

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

5、測試過程

5.1 測試目標

  1. 用JDBC方式測試單表單線程Insert寫入100W數據的性能

5.2 測試準備

在 Greenplum、Oracle、MySQL 三種類型數據庫中分別創建名為 t_test_tang_1 的表,表中包含兩個字段:整型的ID和文本型的NAME。

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

5.3 測試代碼

<code>public static void test(PropertiesConfig config)  throws Exception {
long begin = System.currentTimeMillis();
try {
Class.forName(config.driverClassName);
try (Connection conn = DriverManager.getConnection(config.jdbcUrl, config.username, config.password);) {
String sql = "insert into \"t_test_tang_1\" (\"ID\",\"NAME\") values (?,?)";
if (config.jdbcUrl.indexOf("mysql") > 0) {
sql = "insert into t_test_tang_1 (ID,NAME) values (?,?)";
}
try(PreparedStatement ps = conn.prepareStatement(sql);){
conn.setAutoCommit(false);
System.out.println("Opened database successfully");

long id = 1;
String namePrefix = RandomStringUtils.randomAlphanumeric(1024);
for(int i=0; i<1000; i++) {
for(int j=0; j<1000; j++) {
ps.setLong(1, id);
ps.setString(2, namePrefix);
ps.addBatch();
id++;
}
ps.executeBatch();
conn.commit();
}
} catch (Exception e) {
conn.rollback();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
} catch (Exception e) {
e.printStackTrace();
}

long end = System.currentTimeMillis();
System.out.println("total elipse = " + (end - begin)+" ms");
}/<code>

二、測試結果

用上述代碼,基於三種數據庫的配置進行相同代碼過程測試,測試結果如下:

1、第一次測試:

本次測試使用的 Greenplum 為 6.0 版本,並使用默認配置參數

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

2、第二次測試:

本次測試使用的 Greenplum 為 6.2.1 版本,分別為默認參數下測試和參數調整後測試,結果如下:

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

Greenplum 調整的參數如下:

<code>(1)全局死鎖檢測開關
在Greenplum 6中其默認關閉,需要打開它才可以支持併發更新/刪除操作;
gpconfig -c gp_enable_global_deadlock_detector -v on

(2) 禁用GPORCA優化器(據說GPDB6默認的優化器為:GPORCA)
gpconfig -c optimizer -v off

(3)關閉日誌
此GUC減少不必要的日誌,避免日誌輸出對I/O性能的干擾。
gpconfig -c log_statement -v none/<code>

注意:參數配置修改後,使用 gpstop -u 重新加載配置,並用 gpconfig -s 檢查了各個參數確認為修改成功。

「實戰系列」Greenplum6 JDBC insert 性能媲美 MySQL

三、測試總結

從測試結果中明顯發現,經參數調優後的 Greenplum 數據庫 Insert 寫入性能有很大程度提升,完成 100W 數據寫入由每秒780條提升到2252條,寫入速度已經與 MySQL 相媲美了。雖然與 Oracle 的差距還很遠,畢竟 Greenplum 與 Oracle 的側重場景還是不同的嘛,如果 Greenplum 採用 copy 或 gpfdist 方式灌數據,速度那才是驚人呢。

據說,Greenplum 7 在 OLTP 上還會有大幅度提升,非常期待!!!

四、結束語

基於 copy 方式,本人編寫了一個 oracle/SqlServer/mysql/PostgreSQL 表結構及數據向 Greenplum 數據庫的離線同步小工具,希望給個star哦。

介紹詳見:https://blog.csdn.net/inrgihc/article/details/103739629




湯一波


目前任職於銳捷網絡,JAVA架構設計與開發工程師,當前工作主要從事:基於 Greenplum 數據庫的數據產品建設,主要興趣集中在異構數據轉換、數據同步、數據處理等領域。


分享到:


相關文章: