導語:近些年,大數據技術在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、系統環境
3、Oracle 環境
3.1 軟件版本
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
3.2 單機環境
4.3 數據庫驅動
5.3 測試代碼
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”); }二、測試結果
用上述代碼,基于三種數據庫的配置進行相同代碼過程測試,測試結果如下:
1、第一次測試:
本次測試使用的 Greenplum 爲 6.0 版本,並使用默認配置參數
Greenplum 調整的參數如下:
(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
注意:參數配置修改後,使用 gpstop -u 重新加載配置,並用 gpconfig -s 檢查了各個參數確認爲修改成功。