近些年,大數據技術在IT界裏已是必提的話題了,朋友圈裏常常看到一些同事們、項目合做公司朋友們轉發的大數據相關文章。最近工做中也在作一款與數據相關的產品,不幸的是,真正遇到數據量大的時候,發現經常使用的MySQL等數據庫真是頂不住。百度一下,當前流行的Greenplum數據庫映入眼簾。仔細一查,發現Greenplum仍是個開源數據庫,再去各大招聘網站和APP查看了一下,招聘Greenplum相關人才的還真很多。在一番調研後,經測試發現,參數調優後的Greenplum數據庫Insert寫入性能有很大程度提高,完成100W數據寫入由每秒780條提高到2252條,寫入速度已經與MySQL相媲美了。用這篇文章來記錄一下個人測試與調參過程。
開始接觸Greenplum是一次機緣巧合,當時領導讓調研下Greenplum的性能,因而我在公司用了四臺虛擬機,開始搭建起來。記得當時Greenplum的6.0版本還沒發佈,我便搭建了一個5點幾的版本,並用常規的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方式寫入等。mysql
感受沒過去幾天,在Greenplum技術羣裏據說Greenplum又出新版本了,便想着下週再試試。誰知等我再次準備升級環境測試時,Github上最新的已是6.2.1版本了。再次測試,感受數據寫入速度好像還不如6.0的。因而去Greenplum技術羣組中求助,獲得一位大俠指點,要提升OLTP的寫入性能,須要調整Greenplum的一些默認配置參數,經嘗試,果真很不同。sql
接下來看看個人測試與調參過程吧。數據庫
測試的數據庫包括Greenplum集羣版本、Oracle單機版本、MySQL單機版本。 併發
一、系統環境dom
二、Greenplum環境工具
greenplum-db-6.0.0-rhel7-x86_64.rpm性能
greenplum-db-6.2.1-rhel7-x86_64.rpm測試
三、Oracle環境大數據
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production優化
四、MySQL環境
mysql-5.6.25
五、測試過程
用JDBC方式測試單表單線程Insert寫入100W數據的性能
在Greenplum、Oracle、MySQL三種類型數據庫中分別建立名爲t_test_tang_1的表,表中包含兩個字段:整型的ID和文本型的NAME。
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"); }
用上述代碼,基於三種數據庫的配置進行相同代碼過程測試,測試結果以下:
一、第一次測試:
本次測試使用的Greenplum爲6.0版本,並使用默認配置參數
二、第二次測試:
本次測試使用的Greenplum爲6.2.1版本,分別爲默認參數下測試和參數調整後測試,結果以下:
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檢查了各個參數確認爲修改爲功。
從測試結果中明顯發現,經參數調優後的Greenplum數據庫Insert寫入性能有很大程度提高,完成100W數據寫入由每秒780條提高到2252條,寫入速度已經與MySQL相媲美了。雖然與Oracle的差距還很遠,畢竟Greenplum與Oracle的側重場景仍是不一樣的嘛,若是Greenplum採用copy或gpfdist方式灌數據,速度那纔是驚人呢。
聽說,Greenplum 7 在OLTP上還會有大幅度提高,很是期待!!!
得到更多關於Greenpum的技術乾貨,請訪問Greenplum中文社區網站。