一、说在前面的话
话说搞IT好久了,忙起来好久没写过文章了。这次终于在周末挤出点时间写一篇了。
近些年,大数据技术在IT界里已经是必提的话题了,甚至朋友圈里经常看到一些先前同事、项目合作公司朋友们等发的大数据相关的各种分享。
最近工作中也在做一款与数据相关的产品,不幸的是,真正遇到数据量大的时候,发现常用的MySQL等数据库真是顶不住。百度一下,当前流行的Greenplum数据库映入眼帘。网上一查,还开源,查查各大招聘网站和APP,招聘Greenplum要求的还不少。
后来领导让调研下GP的性能,于是在公司用了四台虚拟机,开始搭建起来,记得当时GP的6.0版本还没发布,就搭建了一个5点几的版本,并用常规的JDBC等操作关系数据库的方式来使用GP,不料发现数据写入真是一个慢啊。网上百度发现不只是我一个人这么认为,试验了一些网上的方法也无济于事。没过几天,在github上搜索gpdb相关时,发现GP发布了6.0版本,同时也查到了GP的中文社区里的一篇文章,文章中说道GP6.0在OLTP上有很大提升,推掉5的环境,当天就将GP改为了6.0的,继续用JDBC来insert数据,发现还是很慢,起初怀疑自己的测试程序有问题,于是先后几次用GP自己的驱动包、kettle的API、datax工具等几种方式测试,仍然如此。无奈继续在网上搜索,好像阿里上有篇文章对GP的数据写入问题有过总结,印象比较深的是insert语句用批量values方式、用copy方式写入等吧。
感觉没过去几天,在一个Greenplum的群里听说GP出新版本了,想着下周再试试。谁知等我再次准备升级环境测试时,github上最新的已经是6.2.1版本了。再次测试,感觉数据写入速度好像还不如6.0的。后来得到一位大侠指点,要提高OLTP的写入性能,需要调整GP的一些默认配置参数下,经尝试,果然不一样。
接下来看看我的测试与调参过程吧。
二、我的测试过程
测试的数据库包括Greenplum集群版本、Oracle单机版本、MySQL单机版本。
1、系统环境:
操作系统: |
CentOS Linux release 7.5.1804 |
内存大小: |
7G |
磁盘大小: |
76G |
CPU型号: |
8核(Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz) |
2、Greenplum环境
(1)软件版本
greenplum-db-6.0.0-rhel7-x86_64.rpm
greenplum-db-6.2.1-rhel7-x86_64.rpm
(2)集群节点
节点 |
节点类型 |
备注 |
mdw |
master |
独用 |
smdw |
standby |
独用 |
sdw1 |
segment |
独用 |
Sdw2 |
segment |
独用 |
2、Oracle环境
(1)软件版本
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
(2)单机环境
节点 |
节点类型 |
备注 |
orcl |
单机 |
docker搭建 |
3、MySQL环境
(1)软件版本
mysql-5.6.25
(2)部署环境
节点 |
节点类型 |
备注 |
mysql |
单机 |
开发共用(系统空闲时进行的测试) |
4、数据库驱动
数据库 |
驱动包 |
备注 |
Greenplum |
greenplum-jdbc-5.1.4.jar |
官网下载 |
Oracle |
ojdbc7-12.1.0.2.jar |
官网下载 |
MySQL |
mysql-connector-java-8.0.16.jar |
pom里直接配置 |
5、测试过程
测试目标:用JDBC方式测试单表单线程Insert写入100W数据的性能
测试准备:在GP、Oracle、MySQL三种类型数据库中分别创建名为t_test_tang_1的表,表中包含两个字段:整型的ID和文本型的NAME。
greenplum |
oracle |
mysql; |
create table "t_test_tang_1" ( "ID" bigint, "NAME" text )distributed by("ID"); |
create table "t_test_tang_1" ( "ID" NUMBER(22) not null primary key, "NAME" VARCHAR2(2048) ) |
create table `t_test_tang_1` ( `ID` bigint not null primary key, `NAME` text )ENGINE=InnoDB DEFAULT CHARSET=utf8; |
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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"); } |
代码地址:https://gitee.com/inrgihc/GpdbTester/blob/master/src/main/java/com/weishao/jdbctester/TestInsert01Application.java
三、测试结果
用上述代码,基于三种数据库的配置进行相同代码过程测试,测试结果如下:
1、第一次测试:
本次测试使用的GP为6.0版本,并使用默认配置参数
Greenplum(6.0版本) |
Oracle11g |
Mysql5.6 |
1282323 ms (780条/秒) |
92910 ms (10752条/秒) |
519324 ms (1926条/秒) |
2、第二次测试:
本次测试使用的GP为6.2.1版本,分别为默认参数下测试和参数调整后测试,结果如下:
默认参数的数据库 |
测试次数 |
测试结果 |
Greenplum(6.2.1版本) |
第一次 |
3206731 ms(312条/秒) |
GP调整的参数如下:
1 2 3 4 5 6 7 8 9 10 11 12 | (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(6.2.1版本) |
第一次 |
442371 ms(2262条/秒) |
第二次 |
444364 ms(2252条/秒) |
四、测试总结
从测试结果中明显发现,经参数调优后的GP数据库Insert写入性能有很大程度提升,完成100W数据写入由每秒780条提升到2252条,写入速度已经与MySQL相媲美了。虽然与Oracle的差距还很远,毕竟GP与Oracle的侧重场景还是不同的嘛,如果GP采用copy或gpfdist方式灌数据,速度那才是惊人呢。
据说,Greenplum7在OLTP上还会有大幅度提升,期待中!!!
五、几句尾话
基于copy方式,本人编写了一个oracle/SqlServer/mysql/PostgreSQL表结构及数据向Greenplum数据库的离线同步小工具,希望给个star哦。多谢了!
介绍详见:https://blog.csdn.net/inrgihc/article/details/103739629