目录
服务器启动后,还要经过一系列配置,才能被客户端程序所连接。本篇说明如何配置客户端身份认证,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:
- 从 hawq-site.xml 文件的 hawq_master_directory 属性获得 master 数据目录的位置,并使用文本编辑器打开此目录下的 pg_hba.conf 文件。
- 在该文件中,为允许的每个连接增加一行。记录是顺序读取的,因此记录的顺序至关重要。例如图1:
图1 - 保存并关闭文件。
- 执行下面的命令重载 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:
- 通过 HAWQ service Configs > Advanced > Custom hawq-site > Add Property ... 配置max_connections、seg_max_connections 和 max_prepared_transactions 属性。
- 选择 Service Actions > Restart All 重载更新的配置。
使用命令行:
- 作为管理员登录 HAWQ 的 master 节点并设置环境:
source /usr/local/hawq/greenplum_path.sh
- 使用 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
- 重启 HAWQ 集群重载新的配置值。
$ hawq restart cluster
- 使用 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 集群:
- 通过 HAWQ service Configs > Advanced > Custom hawq-site 下拉列表设置 password_hash_algorithm 配置属性,有效值为 SHA-256。
- 选择 Service Actions > Restart All 重载更新的配置。
如果从命令行管理 HAWQ 集群:
- 作为管理员登录 HAWQ master 并设置路径:
$ source /usr/local/hawq/greenplum_path.sh
- 使用 hawq config 应用程序设置 password_hash_algorithm 为 SHA-256:
$ hawq config -c password_hash_algorithm -v 'SHA-256'
- 重载 HAWQ 配置:
$ hawq stop cluster -u
- 验证设置:
$ hawq config -s password_hash_algorithm
(2)会话级启用 SHA-256 加密
为单个数据库会话设置 password_hash_algorithm 服务器参数:
- 以超级用户登录 HAWQ 实例。
- 设置 password_hash_algorithm 参数为 SHA-256:
set password_hash_algorithm = 'SHA-256';
- 验证参数设置:
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 字段中。
- 作为超级用户登录。
- 执行下面的查询:
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