HAWQ 技术解析(五) —— 连接管理

本文介绍HAWQ数据库的客户端连接配置流程,包括客户端身份认证配置、角色与权限管理、使用psql连接HAWQ数据库的方法、用Kettle工具连接HAWQ数据库的过程以及连接过程中常见的问题排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、配置客户端身份认证

1. 配置 pg_hba.conf 文件

2. 限制并发连接

二、管理角色与权限

1. HAWQ 角色与权限概述

2. 角色和权限的安全最佳实践

3. 创建角色(用户)

4. 角色成员

5. 管理对象权限

6. 口令加密

(1)系统级启用 SHA-256 加密

(2)会话级启用 SHA-256 加密

(3)验证口令加密方式生效

三、使用 psql 连接 HAWQ

四、用 Kettle 连接 HAWQ

五、连接常见问题


        服务器启动后,还要经过一系列配置,才能被客户端程序所连接。本篇说明如何配置客户端身份认证,HAWQ 的权限管理机制,HAWQ 最常用的命令行客户端工具 psql 及与 mysql 命令行常用命令类比,最后还将列举一些客户端连接 HAWQ 数据库的常见问题排查。

一、配置客户端身份认证

        上一篇曾经提到,HAWQ 系统初始安装后,数据库包含一个预定义的超级用户,这个用户和安装 HAWQ 的操作系统用户用户具有相同的名字,叫做 gpadmin。缺省时,系统只允许使用gpadmin 用户从本地连接至数据库,为了允许任何其他用户从本地或远程主机连接数据库,需要配置 HAWQ 允许此类连接。

        HAWQ 脱胎于 PostgreSQL,它的客户端访问与认证,是由标准的 PostgreSQL 基于主机的认证文件 pg_hba.conf 所控制,master 和每个 segment 的数据目录下都存在一个 pg_hba.conf 文件。在 HAWQ 中,master 实例的 pg_hba.conf 文件控制客户端对 HAWQ 系统的访问和认证。而 segment 的 pg_hba.conf 文件,作用只是允许每个 segment 作为 master 节点主机的客户端连接数据库,而 segment 本身并不接受其他客户端的连接。正因如此,不要修改 segment 实例的 pg_hba.conf 文件。

        pg_hba.conf 的格式是普通文本,其中每行一条记录,表示一个认证条目,HAWQ 忽略空行和任何 # 注释字符后面的文本。一行记录由四个或五个以空格或 tab 符分隔的字段。如果字段值中包含空格,则需要用双引号引起来,并且记录不能跨行。与 MySQL 类似,HAWQ 也接受 TCP 连接和本地的 UNIX 套接字连接。

        每个 TCP 连接客户端的访问认证记录具有以下格式:

host|hostssl|hostnossl   <database>   <role>   <CIDR-address>|<IP-address>,<IP-mask>   <authentication-method>

        本地 UNIX 域套接字的访问记录具有下面的格式:

local   <database>   <role>   <authentication-method>

        表1 描述了每个字段的含义。

字段

描述

local

匹配使用 UNIX 域套接字的连接请求。如果没有此种类型的记录,则不允许 UNIX 域套接字连接。

host

匹配使用 TCP/IP 的连接请求。除非在服务器启动时使用了适当的 listen_addresses 服务器配置参数(缺省值为“*”,允许所有 IP 连接),否则不能远程 TCP/IP 连接。

hostssl

匹配使用 TCP/IP 的连接请求,但是仅当连接使用 SSL 加密时。服务器启动时必须通过设置 ssl 配置参数启用 SSL。

hostnossl

匹配不使用 SSL 的 TCP/IP 的连接请求。

<database>

指定匹配此行记录的数据库名。值“all”指示匹配所有数据库。多个数据库名用逗号分隔。可以指定一个包含数据库名的文件,在文件名前加“@”。

<role>

指定匹配此行记录的数据库角色名。值“all”指示匹配所有角色。如果指定的角色是一个组并且希望包含所有的组成员,在角色名前面加一个“+”。多个角色名可以通过逗号分隔。可以指定一个包含角色名的文件,在文件名前加“@”。

<CIDR-address>

指定此行记录匹配的客户端主机的IP地址范围。它包含一个以标准点分十进制记法表示的IP地址,和一个 CIDR 掩码长度。IP 地址只能用数字表示,不能是域或主机名。掩码长度标识客户端IP地址必须匹配的高位数。在 IP 地址、斜杠和 CIDR 掩码长度之间不能有空格。CIDR 地址典型的例子有,单一主机如 192.0.2.2/32,小型网络如 192.0.2.0/24,大型网络如 192.0.0.0/16。指定单一主机时,IPv4 的 CIDR 掩码是 32,Ipv6 的是 128。网络地址不要省略尾部的零。

<IP-address>,<IP-mask>

这个字段是 CIDR-address 表示法的另一个替代表示方法。用不同列表示的掩码替换掩码长度。例如,255.255.255.255 对应的 CIDR 掩码长度是 32。此字段应用于 host、hostssl 和 hostnossl 记录。

<authentication-method>

指定连接认证时使用的方法。HAWQ 支持 PostgreSQL 9.0 所支持的认证方法(Trust、Password、GSSAPI、SSPI、Kerberos、Ident-based、LDAP、RADIUS、Certificate、PAM)。

表1

1. 配置 pg_hba.conf 文件

        这个例子显示如何编辑 master 的 pg_hba.conf 文件,以允许远程客户端使用加密口令认证,用所有角色访问所有数据库。注意:对于更高安全要求的系统,应考虑从 master 的 pg_hba.conf 文件中删除所有信任认证方式(Trust)的连接。信任方式意味着角色被授予访问权限而不需要任何认证,因此会绕过所有安全检查。

        编辑 pg_hba.conf:

  1. 从 hawq-site.xml 文件的 hawq_master_directory 属性获得 master 数据目录的位置,并使用文本编辑器打开此目录下的 pg_hba.conf 文件。
  2. 在该文件中,为允许的每个连接增加一行。记录是顺序读取的,因此记录的顺序至关重要。例如图1:
    图1
  3. 保存并关闭文件。
  4. 执行下面的命令重载 pg_hba.conf 文件的配置,使修改生效。
    hawq stop cluster -u -M fast

2. 限制并发连接

        HAWQ 的某些资源分配是以连接为基础的,因此推荐配置允许的最大连接数。为了限制 HAWQ 系统的并发会话数量,可以配置 master 的 max_connections 服务器配置参数,或者 segment 的 seg_max_connections 服务器配置参数。这些参数是本地参数,因此必须在所有 HAWQ 实例的 hawq-site.xml 文件中进行设置。

        如果设置了 max_connections,必须也要设置其依赖参数 max_prepared_transactions。该参数值必须大于等于 max_connections 的值,并且所有 HAWQ 实例要配置相同的值。下面是一个 $GPHOME/etc/hawq-site.xml 配置示例:

<property>
    <name>max_connections</name>
    <value>500</value>
</property>
<property>
    <name>max_prepared_transactions</name>
    <value>1000</value>
</property>
<property>
    <name>seg_max_connections</name>
    <value>3000</value>
</property>

        增加这些值会引起 HAWQ 需要更多的共享内存。为了缓解内存使用压力,可以考虑降低其他内存相关的服务器配置参数,如 gp_cached_segworkers_threshold 等。

        不需要手工编辑每个节点的 hawq-site.xml 文件设置允许的连接数。可以使用 Ambari 或命令行配置这些参数。

        使用 Ambari:

  1. 通过 HAWQ service Configs > Advanced > Custom hawq-site > Add Property ... 配置max_connections、seg_max_connections 和 max_prepared_transactions 属性。
  2. 选择 Service Actions > Restart All 重载更新的配置。

        使用命令行:

  1. 作为管理员登录 HAWQ 的 master 节点并设置环境:
    source /usr/local/hawq/greenplum_path.sh
  2. 使用 hawq config 应用程序设置 max_connections、seg_max_connections 和 max_prepared_transactions 参数值,max_prepared_transactions 的值必须大于等于 max_connections。例如: 
    $ hawq config -c max_connections -v 100
    $ hawq config -c seg_max_connections -v 640
    $ hawq config -c max_prepared_transactions -v 200
  3. 重启 HAWQ 集群重载新的配置值。
    $ hawq restart cluster
  4. 使用 hawq config 的 -s 选项显示服务器配置参数的值,确认配置生效:
    $ hawq config -s max_connections
    $ hawq config -s seg_max_connections

二、管理角色与权限

1. HAWQ 角色与权限概述

        pg_hba.conf 文件限定了允许连接 HAWQ 的客户端主机、用户名、访问的数据库,认证方式等。用户名、口令,以及用户对数据库对象的使用权限保存在 HAWQ 的元数据表中(pg_authid、pg_roles、pg_class 等)。

        HAWQ 采用基于角色的访问控制机制,通过角色机制,简化了用户和权限的关联性。HAWQ 系统中的权限分为两种:系统权限和对象权限。系统权限是指系统规定用户使用数据库的权限,如连接数据库、创建数据库、创建用户等。对象权限是指在表、序列、函数等数据库对象上执行特殊动作的权限,其权限类型有 select、insert、update、delete、references、trigger、create、connect、temporary、execute 和 usage 等。

        与 Oracle、SQLServer 等数据库中角色的概念不同,这些系统中的所谓角色,是权限的组合和抽象,创建角色最主要的目的是简化对用户的授权。举一个简单的例子,假设需要给五个用户每个授予相同的五种权限,如果没有角色,需要授权二十五次,而如果把五种权限定义成一种角色,只需要先进行一次角色定义,再授权五次即可。

        然而 HAWQ 中的角色既可以代表一个数据库用户,又可以代表一组权限,而角色所拥有的预定义的系统权限是通过角色的属性实现的。角色可以是数据库对象(例如表)的属主,也可以给其他角色赋予访问这些对象的权限。角色可以是其他角色的成员,因此一个成员角色可以从其父角色继承对象权限。

        HAWQ 系统可能包含多个数据库角色(用户或组),这些角色并不是运行服务器上操作系统的用户和组。但是为方便起见,可能希望维护操作系统用户名和 HAWQ 角色名的关系,因为很多客户端应用程序,如 psql,使用当前操作系统用户名作为缺省的角色,gpadmin 就以最典型的例子。

        用户通过 master 实例连接 HAWQ,mater 通过 pg_hba.conf 里的条目验证用户的角色和访问权限,之后 master 以当前登录的角色,从后台向 segment 实例发布 SQL 命令。系统级定义的角色对系统中所有数据库都是有效的。为了创建更多的角色,首先需要使用超级用户 gpadmin 连接 HAWQ。

2. 角色和权限的安全最佳实践

  • 保证 gpadmin 系统用户安全。HAWQ 需要一个 UNIX 用户 ID 安装和初始化 HAWQ 系统。这个系统用户 ID 在 HAWQ 文档中被称为 gpadmin。gpadmin 用户是 HAWQ 中缺省的数据库超级用户,也是 HAWQ 安装及其底层数据文件的文件系统属主。这个缺省的管理员账号是 HAWQ 的基础设计,缺了这个用户系统无法运行,并且,没有方法能够限制 gpadmin 用户对数据库的访问。应该只使用 gpadmin 账号执行诸如扩容和升级之类的系统维护任务。任何以这个用户登录 HAWQ 主机的人,都可以读取、修改和删除任何数据,尤其是系统目录数据和数据库访问权力。因此,gpadmin 用户的安全非常重要,仅应该提供给关键的系统管理员使用。应用的数据库用户应该永不作为 gpadmin 登录,ETL 或者生产环境的应用程序也不应该以 gpadmin 用户连接数据库。
  • 赋予每个登录用户不同的角色。出于记录和审核目的,每个登录 HAWQ 的用户都应该被赋予自己的数据库角色。对于应用程序或者 web 服务,最好为每个应用或服务创建不同的角色。
  • 使用组管理访问权限。
  • 限制具有超级用户角色属性的用户。超级用户角色绕过 HAWQ 中所有的访问权限检查和资源队列,所以只应该将超级用户权限授予系统管理员。

3. 创建角色(用户)

        此时的角色指的是一个可以登录到数据库,并开启一个数据库会话的用户。使用 create role 命令创建一个角色时,必须授予 login 系统属性(功能类似于 Oracle 的 connect 角色),使得该角色可以连接数据库。例如:

create role jsmith with login;

        一个数据库角色有很多属性,用以定义该角色可以在数据库中执行的任务类型,或者具有的系统权限。表2 描述了有效的角色属性。

属性

描述

SUPERUSER | NOSUPERUSER

确定一个角色是否是超级用户。只有超级用户才能创建新的超级用户。缺省值为 NOSUPERUSER。

CREATEDB | NOCREATEDB

确定角色是否被允许创建数据库。缺省值为 NOCREATEDB。

CREATEROLE | NOCREATEROLE

确定角色是否被允许创建和管理其他角色。缺省值为 NOCREATEROLE。

INHERIT | NOINHERIT

确定角色是否从其所在的组继承权限。具有 INHERIT 属性的角色可以自动使用所属组已经被授予的数据库权限,无论角色是组的直接成员还是间接成员。缺省值为 INHERIT。

LOGIN | NOLOGIN

确定角色是否可以登录。具有 LOGIN 属性的角色可以将角色作为用户登录。没有此属性的角色被用于管理数据库权限(即用户组)。缺省值为 NOLOGIN。

CONNECTION LIMIT connlimit

如果角色能够登录,此属性指定角色可以建立多少个并发连接。缺省值为 -1,表示没有限制。

PASSWORD ’password

设置角色的口令。如果不准备使用口令认证,可以忽略此选项。如果没有指定口令,口令将被设置为 null,此时该用户的口令认证总是失败。一个 null 口令也可以显示的写成 PASSWORD NULL。

ENCRYPTED | UNENCRYPTED

控制口令是否加密存储在系统目录中。行为由 password_encryption 配置参数所决定,缺省的设置是 md5,如果要改为 SHA-256 加密,设置此参数为 password。如果给出的口令字符串已经是加密格式,那么它被原样存储,而不管指定 ENCRYPTED 还是 UNENCRYPTED(因为系统不能对加密的口令字符串进行解密)。这种设计允许在 dump/restore 时重新导入加密的口令。

VALID UNTIL ’timestamp

设置一个日期和时间,在该时间点后角色的口令失效。如果忽略此选项,口令将永久有效。

RESOURCE QUEUE queue_name

赋予角色一个命名的资源队列用于负载管理。角色发出的任何语句都受到该资源队列的限制。注意,这个 RESOURCE QUEUE 属性不会被继承,必须在每个用户级(登录)角色设置。

 DENY {deny_interval | deny_point}

在此时间区间内禁止访问。指定天或者天和时间。

表2

        可以在创建角色时,或者创建角色后使用 alter role 命令指定这些属性。例如:

alter role jsmith with password 'passwd123';
alter role admin valid until 'infinity';
alter role jsmith login;
alter role jsmith resource queue adhoc;
alter role jsmith deny day 'sunday';

        使用 drop role 或 drop user 命令删除角色(用户)。在删除角色前,先要收回角色所拥有的全部权限,或者先删除与角色相关联的所有对象,否则删除角色时会提示“cannot be dropped because some objects depend on it”错误。

4. 角色成员

        通常将多个权限合成一组,能够简化对权限的管理。使用这种方法,对于一个组中的用户,其权限可以被整体授予和回收。在 HAWQ 中的实现方式为,创建一个表示组的角色,然后为用户角色授予组角色的成员。

        下面的 SQL 命令使用 create role 创建一个名为 admin 组角色,该组角色具有 createrole 和 createdb 系统权限。

create role admin createrole createdb;

        一旦组角色存在,就可以使用 grant 和 revoke 命令添加或删除组成员(用户角色)。例如:

grant admin to john, sally;
revoke admin from bob;

        为了简化对象权限的管理,应当只为组级别的角色授予适当的权限,成员用户角色继承组角色的对象权限。例如:

grant all on table mytable to admin;
grant all on schema myschema to admin;
grant all on database mydb to admin;

        角色属性 LOGIN、SUPERUSER、CREATEDB 和 CREATEROLE 不会当做普通的数据库对象权限被继承,为了让用户成员使用这些属性,必须执行 SET ROLE 指定一个具有这些属性的角色。在上面的例子中,我们已经为 admin 指定了 CREATEDB 和 CREATEROLE 属性,sally 是 admin 的成员,当以 sally 连接到数据库后,执行以下命令,使 sally 可以拥有父角色的 CREATEDB 和 CREATEROLE 属性。

set role admin;

        有关角色属性信息可以在系统表 pg_authid 中找到,pg_roles 是基于系统表 pg_authid 的视图。系统表 pa_auth_members 存储了角色之间的成员关系。

5. 管理对象权限

        当一个对象(表、视图、序列、数据库、函数、语言、模式或表空间)被创建,它的权限被赋予属主,属主通常是执行 create 语句的角色。对于大多数类型的对象,其初始状态是只允许属主或超级用户在对象上做任何操作。为了允许其他角色使用对象,必须授予适当的权限。HAWQ 对每种对象类型支持的权限如表3 所示。

对象类型

权限

Tables、Views、Sequences

SELECT、INSERT、RULE、ALL

External Tables

SELECT、RULE、ALL

Databases

CONNECT、CREATE、TEMPORARY | TEMP、ALL

Functions

EXECUTE

Procedural Languages

USAGE

Schemas

CREATE、USAGE、ALL

Custom Protocol

SELECT、INSERT、RULE、ALL

表3

        注意:必须为每个对象单独授权。例如,授予数据库上的 ALL 权限,并不会授予数据库中全部对象的访问权限,而只是授予了该数据库自身的数据库级别的全部权限(CONNECT、CREATE、TEMPORARY)。

        使用 grant SQL 语句为一个角色授予一个对象权限。例如:

grant insert on mytable to jsmith;

        使用 revoke 命令回收权限。例如:

revoke all privileges on mytable from jsmith;

        也可以使用 drop owned 和 reassign owned 命令为一个角色删除或重新赋予对象属主权限。只有对象的属主或超级用户可以删除或重新赋予对象的属主权限。例如:

reassign owned by sally to bob;
drop owned by visitor;

        HAWQ 不支持行级和列级的访问控制,但是可以使用视图限制查询的行或列,模拟行级和列级访问控制,此时角色被授予对视图而不是基表的访问权限。

        对象权限,存储在 pg_class.relacl 中,更多对象权限的信息,可以参考“PostgreSQL 表和列权限(ACL)解读”。

6. 口令加密

        HAWQ 缺省使用 MD5 为用户口令加密,通过适当配置服务器参数,也能实现口令的 SHA-256 加密存储。为了使用 SHA-256 加密,客户端认证方法必须设置为 password 而不是缺省的 MD5。口令虽然以加密形式存储在系统表中,但仍然以明文在网络间传递,为了避免这种情况,应该建立客户端与服务器之间的 SSL 加密通道。

(1)系统级启用 SHA-256 加密

        如果使用 Ambari 管理 HAWQ 集群:

  1. 通过 HAWQ service Configs > Advanced > Custom hawq-site 下拉列表设置 password_hash_algorithm 配置属性,有效值为 SHA-256。
  2. 选择 Service Actions > Restart All 重载更新的配置。

        如果从命令行管理 HAWQ 集群:

  1. 作为管理员登录 HAWQ master 并设置路径:
    $ source /usr/local/hawq/greenplum_path.sh
  2. 使用 hawq config 应用程序设置 password_hash_algorithm 为 SHA-256:
    $ hawq config -c password_hash_algorithm -v 'SHA-256'
  3.  重载 HAWQ 配置:
    $ hawq stop cluster -u
  4. 验证设置:
    $ hawq config -s password_hash_algorithm

(2)会话级启用 SHA-256 加密

        为单个数据库会话设置 password_hash_algorithm 服务器参数:

  1. 以超级用户登录 HAWQ 实例。
  2. 设置 password_hash_algorithm 参数为 SHA-256:
    set password_hash_algorithm = 'SHA-256';
  3. 验证参数设置:
    show password_hash_algorithm;

(3)验证口令加密方式生效

        建立一个具有 login 权限的新角色,并设置口令:

create role testdb with password 'testdb12345#' login;

        修改客户端认证方法,允许存储 SHA-256 加密的口令。打开 master 的 pg_hba.conf 文件并添加下面一行:

host all testdb 0.0.0.0/0 password

        重启集群:

hawq restart cluster

        以刚创建的 testdb 用户登录数据库。

psql -d postgres -h hdp3 -U testdb

        在提示时输入正确的口令。

        验证口令被以 SHA-256 哈希方式存储,哈希后的口令存储在 pg_authid.rolpasswod 字段中。

  1. 作为超级用户登录。
  2. 执行下面的查询:
    select rolpassword from pg_authid where rolname = 'testdb';

        查询结果如图2 所示。

图2

三、使用 psql 连接 HAWQ

        用户可以使用与一个 PostgreSQL 兼容的客户端程序连接到 HAWQ,最常用的客户端工具就是 psql。再次强调,用户和管理员总是通过 master 连接到 HAWQ,segment 不能接受客户端连接。

        为了建立一个到 master 的连接,需要知道表4 所示的连接信息,并在 psql 命令行给出相应参数或配置相关的环境变量。

连接参数

描述

环境变量

应用名

连接数据库的应用名称。连接参数 application_name 中配置的缺省值是 psql。

$PGAPPNAME

数据库名

连接的数据库名称。对于一个新初始化的系统,首次连接使用 template1 数据库。

$PGDATABASE

主机名

HAWQ master 的主机名。缺省主机时 localhost。

$PGHOST

端口

HAWQ master 实例运行的端口号。缺省是 5432。

$PGPORT

用户名

连接数据库的用户(角色)名称。与操作系统用户名相同的用户名不需要此参数。注意,每个 HAWQ 系统都有一个在初始化时自动创建的超级用户账号。这个账号与初始化 HAWQ 系统的操作系统用户同名(典型地是 gpadmin)。

$PGUSER

表4

        下面的例子显示如何通过 psql 访问一个数据库,没有指定的连接参数依赖于设置的环境变量或使用缺省值。

psql -d mytest -h hdp3 -p 5432 -U `gpadmin`
psql mytest
psql

        如果一个用户定义的数据库还没有创建,可以通过连接 template1 数据库访问系统。例如:

psql template1

        连接数据库后,psql 提供一个由当前连接的数据库名后跟 => 构成的提示符(超级用户是 =#)。例如:

mytest=>

        在提示符下,可以键入 SQL 命令,一个 SQL 命令必须以;(分号)结束,以发送到诉服务器执行。例如:

select * from mytable;

        psql 常用命令与 mysql 命令行的比较如表5 所示。

功能描述

psql

mysql

联机帮助

help:简要帮助

\?:psql命令帮助

\h:SQL命令帮助

help、?、\?、\h:都是等价的简要帮助。后面可以跟SQL命令,显示详细的命令语法

执行 SQL

分号或\g

分号、\g或\G

退出

\q

\q、exit或quit

列出所有数据库

\l

show databases;

改变当前连接的数据库

\c DBNAME

use db_name;

列出内部表

\dt

show tables;

列出外部表

\dx

表的描述

\d NAME

desc tbl_name;

列出索引

目前不支持索引

show index from tbl_name;

列出视图

\dv

show tables;

列出序列

\ds

列出系统表

\dtS+

show tables from mysql;

show tables from information_schema;

show tables from performance_schema;

表5

四、用 Kettle 连接 HAWQ

1. 在 pg_hba.conf 文件中添加客户端连接

echo "host  all     kettle     192.168.8.187/32      md5" >> /data/hawq/master/pg_hba.conf

2. 重载 pg_hba.conf 文件使修改生效

hawq stop cluster -u -M fast

3. 在 psql 中建立用户并授权

create role kettle with login;
alter role kettle with password '123456';
\t on
\o /tmp/grant.sql
select 'grant select on '||tablename || ' to kettle;' from pg_tables where schemaname='public';
\o
\i /tmp/grant.sql

4. 在 Kettle 中建立 DB 连接
(1)新建转换。
(2)选中“主对象树” -> 转换 -> 转换1 -> DB连接,右键点击“新建”。
(3)如图3 配置数据库连接。

图3

(4)点击“测试”,弹出图4 所示的测试成功页面。

图4

(5)新建一个“表输入”步骤,在编辑窗口中,“数据库连接”选择“hawq”,然后点击“获取查询SQL语句...”,在图5 所示的弹出窗口中选择一个表并确定,结果如图6 所示。

图5

图6

(6)点击“预览”,结果如图7 所示。

图7

        正确显示出查询的数据,连接成功。如果在 HAWQ 中授予 kettle 用户的 insert 权限,HAWQ 也可作为表输出步骤的数据库连接,在 Kettle 中创建转换,从其他数据源向 HAWQ 导入数据

五、连接常见问题

        很多问题会引起客户端应用连接 HAWQ 失败。表6 是 HAWQ 提供的造成连接问题的常见原因及其排查方法。

问题

解决方案

No pg_hba.conf entry for host or user

为了让 HAWQ 接受远程客户端连接,必须配置 HAWQ 的 master 实例上配置位于 master 实例数据目录下的 pg_hba.conf 文件,在该文件中增加适当的条目,允许客户端主机和数据库用户连接到 HAWQ。

HAWQ is not running

如果 HAWQ master 实例宕机,用户将不能连接。可以在 HAWQ master 上运行 hawq state 应用程序,验证 HAWQ 系统正在运行。

Network problem

Interconnect timeouts

当用户从远程客户端连接到 HAWQ master 时,网络问题可能阻止连接,例如,DNS 主机名解析问题,主机系统断网等等。为了确认不是网络问题,从远程客户端所在主机连接HAWQ master 所在主机。例如:ping hostname。

如果系统不能解析 HAWQ 主机 IP 地址所涉及的主机名,查询和连接将失败。有些操作使用 localhost 进行连接,而另一些操作使用实际的主机名,所以两种情况都必须能正确解析。如果碰到连接错误,首先核实能够从 HAWQ master 所在主机连接到集群主机。在 master 和所有段的 /etc/hosts 文件中,确认有 HAWQ 集群中所有主机的正确的主机名和 IP 地址。127.0.0.1 必须被解析成 localhost。

Too many clients already

缺省时,HAWQ master 和 segment 允许的最大并发连接数分别是 200 和 1280,超出此限制的连接将被拒绝。这个限制由 master 实例的 max_connections 参数和 segment 实例的 seg_max_connections 参数所控制。如果修改了 master 的设置,也必须在 segment 节点上做适当的修改。

Query failure

HAWQ 集群网络中必须配置 DNS 反向解析。如果 DNS 反向解析没有配置,失败的查询将在 HAWQ master 的日志文件中产生“Failed to reverse DNS lookup for ip <ip-address>”警告消息。

表6

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值