1. 程式人生 > >HAWQ技術解析(五) —— 連線管理

HAWQ技術解析(五) —— 連線管理

        伺服器啟動後,還要經過一系列配置,才能被客戶端程式所連線。本篇說明如何配置客戶端身份認證,HAWQ的許可權管理機制,HAWQ最常用的命令列客戶端工具psql及與mysql命令列常用命令類比,最後還將列舉一些客戶端連線HAWQ資料庫的常見問題排查。

一、配置客戶端身份認證
        上一篇曾經提到,HAWQ系統初始安裝後,資料庫包含一個預定義的超級使用者。這個使用者和安裝HAWQ的作業系統使用者使用者具有相同的名字,叫做gpadmin。預設時,系統只允許使用gpadmin使用者從本地連線至資料庫。為了允許任何其它使用者從本地或遠端主機連線資料庫,需要配置HAWQ允許此類連線。

1. 配置允許連線至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中,更多物件許可權的資訊,可以參考


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