近些年,大数据技术在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中文社区网站。