近些年,大数据技术在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方式写入等。
感觉没过去几天,在Greenplum技术群里听说Greenplum又出新版本了,便想着下周再试试。谁知等我再次准备升级环境测试时,Github上最新的已经是6.2.1版本了。再次测试,感觉数据写入速度好像还不如6.0的。于是去Greenplum技术群组中求助,得到一位大侠指点,要提高OLTP的写入性能,需要调整Greenplum的一些默认配置参数,经尝试,果然很不一样。
接下来看看我的测试与调参过程吧。
测试的数据库包括Greenplum集群版本、Oracle单机版本、MySQL单机版本。
greenplum-db-6.0.0-rhel7-x86_64.rpm
greenplum-db-6.2.1-rhel7-x86_64.rpm
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
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版本,分别为默认参数下测试和参数调整后测试,结果如下:
(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上还会有大幅度提升,非常期待!!!
基于copy方式,作者编写了一个oracle/SqlServer/mysql/PostgreSQL表结构及数据向Greenplum数据库的离线同步小工具,希望给个star哦。
介绍详见:
https://blog.csdn.net/inrgihc/article/details/103739629
获得更多关于Greenpum的技术干货,请访问 Greenplum中文社区网站 。