了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站
近些年,大数据技术在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单机版本。
1、系统环境
2、Greenplum环境
greenplum-db-6.0.0-rhel7-x86_64.rpm
greenplum-db-6.2.1-rhel7-x86_64.rpm
3、Oracle环境
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
4、MySQL环境
mysql-5.6.25
5、测试过程
用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");
}
用上述代码,基于三种数据库的配置进行相同代码过程测试,测试结果如下:
1、第一次测试:
本次测试使用的Greenplum为6.0版本,并使用默认配置参数
2、第二次测试:
本次测试使用的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上还会有大幅度提升,非常期待!!!
基于copy方式,作者编写了一个oracle/SqlServer/mysql/PostgreSQL表结构及数据向Greenplum数据库的离线同步小工具,希望给个star哦。
介绍详见:
https://blog.csdn.net/inrgihc/article/details/103739629