Greenplum 连接管理
Greenplum 连接管理5 Greenplum 连接管理5.1 客户端应用5.2数据库应用接口5.3用psql连接5.4连接问题的发现及解决5.5PgBouncer连接池配置PgBouncerPgBouncer授权文件格式为PgBouncer配置基于HBA的授权启动PgBouncer管理PgBouncer
5 Greenplum 连接管理
5.1 客户端应用
名称 | 用法 |
---|---|
createdb | 创建一个新数据库 |
createlang | 定义一种新的过程语言 |
createuser | 定义一个新的数据库角色 |
dropdb | 移除一个数据库 |
droplang | 移除一种过程语言 |
dropuser | 移除一个角色 |
psql | PostgreSQL交互式终端 |
reindexdb | 对一个数据库重建索引 |
vacuumdb | 对一个数据库进行垃圾收集和分析 |
在使用这些客户端应用时,用户必须通过Greenplum的Master实例连接到一个数据库。用户将需要知道目标数据库的名称、Master的主机名和端口号,还有用于连接的数据库用户名。这些信息可以在命令行上分别用选项-d、-h、 -p和-U来提供。如果找到不属于任何一个选项的参数,它将被首先解释为数据库名。
所有这些选项都有默认值,如果该选项没有被指定就会使用其默认值。默认主机是本地主机。默认 端口号是5432。默认用户名是用户的操作系统用户名,同时也是默认的数据库名。注意操作系统用户名和Greenplum数据库用户名并不需要一样。
如果默认值和实际情况不同,用户可以设置环境变量PGDATABASE、PGHOST、PGPORT和PGUSER为合适的值,或者使用一个psql~/.pgpass文件来包含常用的口令。
[gpadmin@mdw greenplum-db]$ cd bin [gpadmin@mdw bin]$ ls analyzedb gpaddmirrors gpconfig_modules gpinitsystem gpreload gpstart pg_dump atmsort.pl gpbackup gpcopy gpkafka gprestore gpstate pg_dumpall atmsort.pm gpbackup_ddboost_plugin gpcopy_helper gpload gp_restore gpstop pg_receivexlog changetrackingdump gpbackup_helper gpcrondump gpload.py gp_restore_agent gpstringsubs.pl pg_resetxlog clusterdb gpbackup_s3_plugin gpdbrestore gpload.pyc gprestore_filter.py gpsys1 pg_restore createdb gp_bsa_delete_agent gpddboost gplogfilter gprestore_filter.pyc gptransfer pg_upgrade createlang gp_bsa_dump_agent gpdeletesystem gpmapreduce gprestore_post_data_filter.py gptransfer_modules postgres createuser gp_bsa_query_agent gp_df gpmfr gprestore_post_data_filter.pyc initdb postmaster dld.pl gp_bsa_restore_agent gpdiff.pl gpmfr.py gpscp ipcclean psql dropdb gpcheck gp_dump gpmfr.pyc gpsd lib README droplang gpcheckcat gp_dump_agent gpmmon gpseginstall minirepro reindexdb dropuser gpcheckcat_modules gpexpand gpmovemirrors gpsmon openssl test_gpmfr.py ecpg gpcheckcloud gpfdist gpperfmoncat.sh gpsourcify.pl pg_basebackup throttlingD.cnf explain.pm gpcheckmirrorseg.pl gpfilespace gpperfmon_install gpss pgbouncer throttlingD.py generate-greenplum-path.sh gpcheckperf gpgenfsmap.py gppkg gpssh pg_config throttlingD.pyc get_ereport.pl gpcheckresgroupimpl gpgenfsmap.pyc gp_primarymirror gpssh-exkeys pg_controldata vacuumdb gpactivatestandby gpconfig gpinitstandby gprecoverseg gpssh_modules pg_ctl xlogdump [gpadmin@mdw bin]$ ls -l crea* -rwxr-xr-x 1 gpadmin gpadmin 191421 Aug 10 2018 createdb -rwxr-xr-x 1 gpadmin gpadmin 233175 Aug 10 2018 createlang -rwxr-xr-x 1 gpadmin gpadmin 194607 Aug 10 2018 createuser [gpadmin@mdw bin]$ ls -l drop* -rwxr-xr-x 1 gpadmin gpadmin 189535 Aug 10 2018 dropdb -rwxr-xr-x 1 gpadmin gpadmin 239108 Aug 10 2018 droplang -rwxr-xr-x 1 gpadmin gpadmin 187329 Aug 10 2018 dropuser [gpadmin@mdw bin]$ ls -l psql reindexdb vacuumdb -rwxr-xr-x 1 gpadmin gpadmin 1233919 Aug 10 2018 psql -rwxr-xr-x 1 gpadmin gpadmin 195732 Aug 10 2018 reindexdb -rwxr-xr-x 1 gpadmin gpadmin 111752 Aug 10 2018 vacuumdb
5.2数据库应用接口
用户可能想要开发用户自己的客户端应用接入到Greenplum数据库。PostgreSQL为最常用的数据库应用编程接口(API提供了数种数据库驱动,这些同样也能在Greenplum数据库中使用。这些驱动作为一个独立的下载提供。每一种驱动(除了随PostgreSQL提供的libpq)都是一个独立的PostgreSQL开发项目并且必须被下载、安装并且配置以连接到 Greenplum数据库。可用的驱动如下:
API | PostgreSQL驱动 | 下载链接 |
---|---|---|
ODBC | psqlODBC | https://odbc.postgresql.org/window.location='https://odbc.postgresql.org/'). |
JDBC | pgjdbc | https://jdbc.postgresql.org/window.location='https://jdbc.postgresql.org/') |
Perl DBI | pgperl | https://metacpan.org/release/DBD-Pgwindow.location='https://metacpan.org/release/DBD-Pg') |
Python DBI | pygresql | http://www.pygresql.org/window.location='http://www.pygresql.org/') |
libpq C 库 | libpq | https://www.postgresql.org/docs/9.4/libpq.htmlwindow.location='https://www.postgresql.org/docs/9.4/libpq.html') |
用API访问Greenplum数据库的一般步骤是:
-
从合适的来源下载用户的编程语言平台以及相应的API。例如,用户可以从Oracle得到Java开发工具包(JDK)和JDBC API。
-
根据API规范编写用户的客户端应用。在编程时,注意Greenplum数据库中的 SQL支持这样用户才不会使用不被支持的SQL语法。 更多信息请见
Greenplum数据库参考指南。
5.3用psql连接
依靠用户使用的默认值或者已经设置的环境变量,下面的例子展示了如何通过psql 来访问数据库:
$ psql -d gpdatabase -h master_host -p 5432 -U gpadmin $ psql gpdatabase $ psql
5.4连接问题的发现及解决
很多事情都可能阻止客户端应用成功地连接到Greenplum数据库。这个主题解释了一些常见的连接问题 的原因以及如何改正它们。
问题 | 解决方案 |
---|---|
没有用于主机或者用户的pg_hba.conf配置 | 要允许Greenplum数据库接受远程客户端连接,用户必须配置用户的Greenplum数据库的Master实例,这样来自于客户端主机和数据库用户的连接才会被允许连接到Greenplum数据库。这可以通过在pg_hba.conf配置文件(位于Master实例的数据目录中)中增加 合适的条目就能做到。更多详细的信息请见允许访问Greenplum数据库。 |
Greenplum数据库没有运行 | Greenplum数据库的Master实例没有运行,用户将无法连接。用户可以通过在Greenplum的Master主机上运行gpstate工具来 验证Greenplum数据库系统是否正常运行。 |
网络问题Interconnect 超时 | 如果用户从一个远程客户端连接到Greenplum的Master主机,网络问题可能阻止连接(例如,DNS主机名解析问题、主机系统没有运行等等)。为了确认网络问题不是原因, 可尝试从远程客户端主机连接到Greenplum的Master主机。例如:ping hostname 。 如果系统不能解析主机名和Greenplum数据库所涉及的主机的IP地址,查询和连接将会失败。对于某些操作,到Greenplum数据库Master的连接会使用localhost而其他连接使用真实的主机名,因此用户必须能解析两者。如果用户遇到这种错误,首先确认用户能够从Master主机通过网络连接到 Greenplum数据库阵列中的每一台主机。在Master和所有Segment的/etc/hosts文件中 确认有Greenplum数据库阵列所涉及所有主机的正确的主机名和IP地址。IP 127.0.0.1 必须解析为localhost。 |
已有太多客户端连接 | 默认情况下,Greenplum数据库被配置为在Master和每个Segment上分别允许最多250和 750个并发用户连接。导致该限制会被超过的连接尝试将被拒绝。这个限制由Greenplum数据库Master的 postgresql.conf配置文件中的max_connections参数控制。 如果用户为Master更改了这个设置,用户还必须在Segment上做出适当的更改。 |
5.5PgBouncer连接池
PgBouncer工具可以管理PostgreSQL和Greenplum数据库连接的连接池。
PgBouncer连接池来自于PostgreSQL社区,它被包括在Greenplum数据库中。PgBouncer可以为多个数据库管理连接池,并且这些数据库可以位于不同的Greenplum数据库集群或者 PostgreSQL后端。PgBouncer会为每一种数据库用户与数据库的组合建立一个池。一个被 池化的连接只能被来自于同一个用户和数据库的另一个连接请求重用。当客户端断开连接后 PgBouncer会将连接归还给连接池以做下次重用。
PgBouncer有三种池模式来共享连接:
-
会话池化 – 当一个客户端连接时,只要它保持连接状态,就分配给它一个连接。当该客户端断开连接时,该连接才被放回到池中。
-
事务池化 – 在一个事务运行期间,分配一个连接给客户端。当PgBouncer发现事务完成,该连接就被放回到池中。这种模式只能被用于不使用依赖于会话的特性的应用。
-
语句池化 – 语句池化类似于事务池化,但是不允许多语句事务。这种模式的目标是为了在客户端强制自动提交模式,且它的定位是PostgreSQL上的PL/Proxy。
配置PgBouncer
通过配置文件配置PgBouncer和它到Greenplum数据库的访问。配置文件通常命名为pgbouncer.ini, 提供Greenplum数据库的位置信息。pgbouncer.ini文件也指定PgBouncer的进程、连接池、授权用户和授权配置。
pgbouncer.ini
配置文件示例内容如下:
[databases] postgres = host=127.0.0.1 port=5432 dbname=postgres pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb [pgbouncer] pool_mode = session listen_port = 6543 listen_addr = 127.0.0.1 auth_type = md5 auth_file = users.txt logfile = pgbouncer.log pidfile = pgbouncer.pid admin_users = gpadmin
PgBouncer授权文件格式
PgBouncer有自己的用户授权文件。用户可以在pgbouncer.ini配置文件 的auth_file属性中定义文件名。auth_file文本文件格式如下:
"username1" "password" ... "username2" "md5abcdef012342345" ...
auth_file为每个用户占用一行。每行至少有两个域,两个都用双引号包裹 (" ")。第一部分定义Greenplum数据库用户名,第二部分为明文或MD5编码的密码。PgBouncer忽略改行余下的部分。
(auth_file文件格式与Greenplum数据库所用的授权信息文件 pg_auth相似。PgBouncer可以直接使用Greenplum数据库授权文件。)
使用MD5编码的密码,密码格式如下:
"md5" + MD5_encoded(<password><username>)
可以从pg_shadow视图中获取所有Greenplum数据库用户的MD5编码密码。
为PgBouncer配置基于HBA的授权
PgBouncer支持基于HBA的授权。要为PgBouncer配置基于HBA的授权,在pgbouncer.ini配置文件中设置auth_type=hba,并在pgbouncer.ini文件中配置 HBA格式文件参数auth_hba_file。
名称为hba_bouncer.conf的PgBouncer HBA文件的内容如下:
local all bouncer trust host all bouncer 127.0.0.1/32 trust
相关pgbouncer.ini配置文件中的对应配置部分:
[databases] p0 = port=15432 host=127.0.0.1 dbname=p0 user=bouncer pool_size=2 p1 = port=15432 host=127.0.0.1 dbname=p1 user=bouncer ... [pgbouncer] ... auth_type = hba auth_file = userlist.txt auth_hba_file = hba_bouncer.conf
启动PgBouncer
用户可以在Greenplum数据库master主机或其他服务器上运行PgBouncer。如果在一台单独的服务器上 安装PgBouncer,用户可以使用PgBouncer管理客户端,通过更新PgBouncer配置文件和重载配置很容易的 切换客户端连接到standby master。
参考以下配置设置PgBouncer。
-
创建PgBouncer配置文件。例如,增加以下文本到文件pgbouncer.ini中:
[databases] postgres = host=127.0.0.1 port=5432 dbname=postgres pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb [pgbouncer] pool_mode = session listen_port = 6543 listen_addr = 127.0.0.1 auth_type = md5 auth_file = users.txt logfile = pgbouncer.log pidfile = pgbouncer.pid admin_users = gpadmin
该文件列出了数据库和它们连接的详细信息。该文件也配置了PgBouncer实例 有关PgBouncer配置文件内容和格式的详细信息,请参考Refer to the pgbouncer.iniwindow.location='http://47.92.231.67:8080/6-0/utility_guide/admin_utilities/pgbouncer-ini.html')参考页面。
-
创建授权文件。文件名应该和pgbouncer.ini文件中定义的auth_file参数名字一样,users.txt
。每行包含一个用户名和一个密码。密码的格式应该匹配PgBouncer配置文件中定义的auth_type。如果auth_type参数为plain,密码串应该为干净的文本文件密码,例如:
"gpadmin" "gpadmin1234"
如果auth_type如下面例子中为md5,授权部分必须是MD5编码格式。 MD5编码的密码格式如下:
"md5" + MD5_encoded(<password><username>)
-
开始启动pgbouncer:
$ $GPHOME/bin/pgbouncer -d pgbouncer.ini
-d选项代表以后台进程的形式运行PgBouncer。pgbouncer命令的 语法和选项,请见pgbouncerwindow.location='http://47.92.231.67:8080/6-0/utility_guide/admin_utilities/pgbouncer.html')参考页面。
-
更新客户应用连接到
pgbouncer,以代替直接连接到Greenplum数据库服务器。例如连接到上面配置的Greenplum数据库mydb,像如下方式一样运行psql:
$ psql -p 6543 -U someuser pgb_mydb
-p选项的值代表用户配置的PgBouncer实例的listen_port端口号。
管理PgBouncer
PgBouncer提供一个类psql的管理控制台,可以通过指定PgBouncer端口号 和虚拟数据库名称pgbouncer来登录到PgBouncer管理控制台。该控制台接受类SQL命令,这些命令允许用户监控、重新配置和管理PgBouncer。
有关PgBouncer管理控制台命令的完整文档,请参考 PgBouncer管理控制台window.location='http://47.92.231.67:8080/6-0/utility_guide/admin_utilities/pgbouncer-admin.html')命令参考。
要开始使用PgBouncer管理控制台,请遵循下列步骤。
-
用psql登录到pgbouncer虚拟数据库:
$ psql -p 6543 -U username pgbouncer
username必须是pgbouncer.ini配置文件中admin_users参数中所设置的值。如果pgbouncer进程运行在用户登录的当前Unix用户的UID下,用户还可以用该用户名登录。
-
要看PgBouncer管理控制台命令,运行
SHOW help
命令:
pgbouncer=# SHOW help; NOTICE: Console usage DETAIL: SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM SHOW DNS_HOSTS|DNS_ZONES SHOW STATS|STATS_TOTALS|STATS_AVERAGES SET key = arg RELOAD PAUSE [<db>] RESUME [<db>] DISABLE <db> ENABLE <db> KILL <db> SUSPEND SHUTDOWN
-
如果用户对PgBouncer配置文件pgbouncer.ini做了修改,用户可以用RELOAD命令重载它:
pgbouncer=# RELOAD;