一、前言
Greenplum作为一个面向数据仓库应用的开源MPP关系型(OLAP)数据库,具备强大的数据处理能力和出色的并行计算,性能在TB级别数据量的表现非常优秀,是大数据时代下多云大数据分析、BI、AI分析的主流DBMS工具,虽然也曝出“闭源”的风波(GreenPlum的GitHub库2021年1月6日后已停止更新,2023 年Broadcom 完成对 VMware 的收购后已限制了代码访问权限,目前只读),但依然有很多企业还在使用,转型和转向信创(华为的GaussDB(DWS)、阿里云ADB-PG、酷克数据的CloudberryDB、腾讯云的CynosDB for PostgreSQL、人大金仓的KingbaseES等)还需要时间。尽管如此,不妨碍我们继续在中小环境时序使用它,我们知道它基于流行的PostgreSQL开发,那它维护基本就可参照postgreSQL的方式进行,但两者又有什么异同呢?本文将记录Greenplum 6.x 版本中日常维护中的一些操作,用以指导后期及相关同学维护参照参考。
关联资源:Greenplum高并发数据库概览、GreenPlum分布式数据库存储及查询处理、greenplum_exporter、Greenplum数据库”6.0文档、tanzu-greenplum、/gpdbdoc、Greenplum 实时数据仓库实践、Greenplum数据库的最佳实践、PostgreSQL 9.4.4 中文手册
二、数据库访问
2.1、DBveaver 访问gpdb
1)联网的情况下如下:
2)离线状态下:
或
遇到报错:
Can’t create driver instance
Error creating driver ‘Greenplum’ instance.
Most likely required jar files are missing.You should configure jars in driver settings.
Reason: can’t load driver class ‘com.pivotal.jdbc.GreenplumDriver’
Error creating driver ‘Greenplum’ instance.
Most likely required jar files are missing.
You should configure jars in driver settings.Reason: can’t load driver class ‘com.pivotal.jdbc.GreenplumDriver’
com.pivotal.jdbc.GreenplumDriver
此时,需要把库里面其他文件都删除,且把jar放到dbveaver的类路径最好
如果报错:[Pivotal][Greenplum JDBC Driver][Greenplum]no pg_hba.conf entry for host “src_ip”, user “admin”, database “db_name”, SSL off. 会发现修改完pg_hba.conf,执行pg_ctl reload不生效,可找窗口重启尝试,一般管用。
#进入到data目录下,找到pg_hba.conf文件,添加
#允许任何用户连接到此数据库,用同一个加密密码
host all all 要远程连接的客户侧ip md5
#要是本地有防火墙,放开端口
sudo ufw allow 5432/tcp
su - postgres
$pg_ctl reload -D XXX #XXX表示:当前存放pg_hba.conf文件的路径,也是data的路径
2.2、java 连接 greenplum_GreenPlum的JDBC
如2.1所示,我们可以采用Greenplum的也可采用PostgreSql的,后者去postgresql下载驱动即可,比如:postgresql-42.2.29.jre7.jar。然后在Eclipse中引入这个驱动包,将JDBC驱动包复制到Java项目的lib目录中,并在IDE中添加依赖。例如,在Eclipse中,右击项目,选择Properties > Java Build Path > Libraries,点击Add JARs/Add External JARs,选择JDBC驱动包。或者在Java代码中使用ClassLoader加载JDBC驱动包。新建一个测试类,如下:
//在Java代码中使用ClassLoader加载JDBC驱动包
Class.forName(“com.pivotal.jdbc.GreenplumDriver”);
//创建JDBC连接
import java.sql.*;
public class GreenPlumDataBaseLink {
public static void main(String[] args) {
String usr = "用户名";
String pwd = "密码";
String url = "jdbc:postgresql://服务器IP地址:5432/你的数据库名称";
try{
Class.forName("org.postgresql.Driver");
System.out.println("Success loading Driver!");
}
catch(Exception e){
System.out.println("Fail loading Driver!");
e.printStackTrace();
}
try{
Connection db = DriverManager.getConnection(url, usr, pwd); //使用 DriverManager.getConnection()方法连接Greenplum数据库
System.out.println("Success connecting server!");
String sql = “SELECT col1, col2, col3 FROM table_name”;
Statement stmt = conn.createStatement(); //使用Statement对象执行SQL语句后,返回一个ResultSet对象
ResultSet rs = stmt.executeQuery(sql); //使用ResultSet对象可以获取SQL语句的执行结果,之后可使用getXxx()方法获取某个列的值
while (rs.next()) {
int col1 = rs.getInt(“col1”);
String col2 = rs.getString(“col2”);
Date col3 = rs.getDate(“col3”);
}
catch(Exception e){
System.out.println("Connection URL or username or password errors!");
e.printStackTrace();
}
}
}
//关闭连接:rs是ResultSet对象,stmt是Statement对象,conn是Connection对象;关闭JDBC连接可以避免数据库连接一直处于占用状态,在需要连接数较多的情况下,可以提高数据库服务器的响应速度
rs.close();
stmt.close();
conn.close();
2.3、pg_ctl 工具
pg_ctl 命令行工具可执行初始化、启动、停止或控制一个PostgreSQL服务器。参数:
- -D datadir 或–pgdata datadir //指定数据库配置文件的文件系统位置,如未指定,将使用环境变量PGDATA
- -c //尝试允许数据库实例在发生某些异常时产生一个coredump文件,以便从一个失败的服务器进程中获得一个栈跟踪而有助于调试或诊断问题
- -l filename 或–log filename //追加服务器日志输出到filename,如果该文件不存在,它会被创建。umask被设置成 077,即默认情况下不允许其他用户访问该日志文件
- -m mode等同–mode mode //指定关闭模式。mode可以是smart、fast或immediate,或者这三者之一的第一个字母。默认使用fast。
- -o options:直接传递给initdb命令的参数
- -p path //指定postgres可执行程序的位置。默认情况下,postgres可执行程序可以从pg_ctl相同的目录得到
- -s/–silent //只打印错误,不打印信息性的消息
- -t/–timeout //等待启动或关闭完成的最大秒数。默认值是环境变量 PGCTLTIMEOUT的值,如果该环境变量未设置,则默认值为 60
- -w //等待启动或关闭完成。等待是关闭的默认选项,但不是启动的默认选项。在等待启动时,pg_ctl会重复尝试连接到服务器。在等待关闭时,pg_ctl会等待服务器移除它的PID文件。这个选项允许在启动时等地啊一个SSL口令的进入。pg_ctl基于启动或关闭的成功返回一个退出码
- -W //不等待启动或关闭完成,就返回命令。这是启动和重启模式的默认值
-N servicename //windows中要注册的系统服务的名称。这个名称将被用于服务名和显示名。- -P password //启动该服务的用户的口令。
- -S start-type //要注册的系统服务的启动类型。启动类型可以是auto、demand或者两者之一的第一个字母。如果这被忽略,会使用auto。
- -U username //启动该服务的用户的用户名。对于域用户,使用格式DOMAIN\username
#初始化,它会调用initdb命令,创建一个新的PostgreSQL数据库集簇。一个数据库集簇是一个由单一服务器实例管理的数据库的集合。
pg_ctl init[db] [-s] [-D datadir] [-o initdb-options]
#启动,该服务器将被启动在后台,并且它的标准输出被附加到/dev/null,可以使用-l追加服务器的输出到一个日志文件来改变
pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path] [-c]
#停止
#-m选项可以选择三种不同的关闭方法。"Smart"模式等待所有客户端断开连接以及任何在线备份结束。如果该服务器是热备,一旦所有的客户端已经断开连接,恢复和流复制将被终止。"Fast"模式(默认)不会等待客户端断开连接并且将终止进行中的在线备份。所有活动事务都被回滚并且客户端被强制断开连接,然后服务器被关闭。"Immediate"模式将立刻中止所有服务器进程,而不是做一次干净的关闭。这将导致下一次重启时进行一次崩溃恢复。
pg_ctl stop [-W] [-t seconds] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
#重启:实际上先执行一次停止然后执行一次启动。这允许改变postgres的命令行选项。
#如果指定的相对路径是在服务器启动期间在命令行指定的,restart可能会失败
pg_ctl restart [-w] [-t seconds] [-s] [-D datadir] [-c] [-m s[mart] | f[ast] | i[mmediate] ] [-o options]
#重新加载配置:执行后简单地向postgres进程发送一个SIGHUP信号,导致它重新读取它的配置文件(postgresql.conf、pg_hba.conf等)。这允许改变配置文件选项而无需一次完整的重启来让改变生效,这期间不会重启进行,但会影响外访连接,建议在窗口期操作
pg_ctl reload [-s] [-D datadir]
#检查一个服务器是否运行在指定的数据目录中。如果有一个服务器正在运行,PID和用来调用它的命令行选项将被显示。
#如果服务器没有在运行,进程将返回退出状态 3。如果没有指定一个可以访问的数据目录,该进程将返回退出状态 4
pg_ctl status [-D datadir]
#运行在指定数据目录中的备用/镜像服务器被命令通知退出恢复并且开始读写操作
pg_ctl promote [-s] [-D datadir]
#向一个指定进程发送一个信号
pg_ctl kill signal_name process_id
或者直接kill -HUP 程序进程也行
#在Microsoft Windows上注册一个系统服务。-S选项允许选择服务启动类型,可以是"auto"(随系统自动启动)或"demand"(按需启动)
pg_ctl register [-N servicename] [-U username] [-P password] [-D datadir] [-S a[uto] | d[emand] ] [-w] [-t seconds] [-s] [-o options]
#在Microsoft Windows上移除一个系统服务的注册。这会撤销register命令的效果
pg_ctl unregister [-N servicename]
#示例
pg_ctl -w start //启动服务器并且等到服务器接受连接
pg_ctl -o "-F -p 5433" start //使用端口 5433 启动服务器并且运行时不使用fsync
pg_ctl kill INT pid //后台数据库服务进程号,结束gpdb执行的一个指定的后台任务,发送INT信号把正在执行的SQL命令取消
三、数据库增删改查
3.1、查询
## 查询连接对应的后台数据库服务进程号
postgres=# select pg_backend_pid();
postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
3.2、修改
3.3、增加
3.4、删除
四、数据库应用
五、监控和性能优化
5.1、监控
1) Greenplum 集成 Prometheus 的监控数据采集器
export GPDB_DATA_SOURCE_URL=postgres://gpadmin:password@10.172.10.2:5432/postgres?sslmode=disable
su - gpadmin
./greenplum_exporter --web.listen-address="0.0.0.0:9297" --web.telemetry-path="/metrics" --log.level=error
#验证
curl http://127.0.0.1:9297/metrics
六、sql语句使用
七、概念回顾
1)技术架构
2)Coodinator/Segment架构
客户端只会连接到Coodinator上并执行相关查询操作,Standby节点为Coordinator提供高可用支持,Mirror为primary的备,数据默认使用hash分布,另一种是随机(randomly)分布;Hash分布策略可选一个或者多个列作为分布键(distribution key,简称DK)。分布键做hash算法来确认数据存放到对应的segment上。相同分布键值会hash到相同的segment上。表上最好有唯一键或者主键,这样能保证数据均衡分不到各个segment上,如果没有主键或者唯一键,默认选择第一列作为分布键。
3)数据仓库设计规范参考
八、FAQ
8.1、master启动失败
#手动使⽤ Utility 模式启动master,调试观察日志
postgres -D /data1/master/gpseg-1 -i -p 5432 -c gp_role=utility -M master -b 1 -C -1 -z 0 -m
#集群初始化⼯具 gpinitsystem 是Bash脚本⼯具,有时它的报错信息很不清楚。这时可以使⽤ -D 选项
#gp_bash_functions.sh 是内部⼀个被频繁调⽤执⾏系统命令的函数,可在其中启用set -x ,这时shell 将会打印出每个命令执行前的完整形式,并且在输出中添加 + 符号,对调试 hang 问题很有效
8.2、段segment节点启动失败
export LD_LIBRARY_PATH=/home/gpadmin/build/gpdb.master/lib:/lib:;export PGPORT=40006;
#手动启动
./bin/pg_ctl -w -l /data1/primary/gpseg18/pg_log/startup.log
-D /data1/primary/gpseg18 -o "-i -p 40006 -M mirrorless -b 20 -C 18 -z 0" start
8.3、ipv6报错
#报错
ping cmdStr='/bin/ping6 -c 1 gp1′ had result: cmd had rc=2 completed=True halted=False
stdout=”
stderr='connect: Invalid argument'
#如果不支持,就关闭ipv6
vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sysctl -p