文所描述的Postgres-XC版本:v1.2.1
項目主頁地址:http://sourceforge.net/projects/postgres-xc/
pdf文件下載: Postgres-XC集群搭建.PDF
一、理解Postgres-XC集群架構
Postgres-XC是基於PostgreSQL的SHARED NOTHING的分布式關系型數據庫集群,它可以管理和處理分布在多個不同主機上的海量數據。對於Postgres-XC來說,一個實例實際上是由多個獨立的 PostgreSQL 實例組成,它們分布在不同的物理(或虛擬)主機上協同工作,呈現給用戶的是一個數據庫實例的效果。每一個Coordinator都可以作為Postgres-XC系統的訪問入口,負責處理客戶端的連接及 SQL 命令、協調系統中的其他Coordinator和Datanode工作,Datanode負責管理和處理用戶數據,而GTM則遵循關系型數據庫的ACID特性提供保障。
1、開始之前
在搭建Postgres-XC集群之前,我們需要先熟悉Postgres-XC的各組件。Postgres-XC由三個主要的組件組成,分別為GTM(Global Transaction Manager), Coordinator和Datanode。下面分別介紹這三個組件。
GTM提供事務一致性管理,遵循數據庫的ACID要素;
Coordinator是應用程序的訪問入口,它的行為類似傳統的PostgreSQL的后端進程(backend process),無論何時,Coordinator不存儲任何數據,只接收SQL語句,取得必要的全局事務ID(Global Transaction Id)和全局快照(Global Snapshot),決定SQL分發到哪一個Datanode去執行。
Datanode是實際存儲和處理數據的地方。數據可以在Datanode之間分片保存,或每個Datanode保存一份副本。Datanode不具有對整個數據庫的全局視圖,它僅僅需要負責管理本地存儲的數據。
2、如何部署
如果只為試用和理解如何配置、運行Postgres-XC,可以將Postgres-XC安裝在一台服務器上,也可以在不同的虛擬機上安裝不同的Postgres-XC組件。盡管可以將Postgres-XC Cluster安裝在單節點的服務器上,但還是建議通過Virtual Box或VMWare安裝在多台虛擬服務器上,服務器的數量取決於你的Postgres-XC配置。建議使用64bit操作系統,至少4GB內存。可以選擇任意流行的Linux 64bit操作,開發團隊的開發與測試在CentoOS 5.4平台.
最低硬件配置便可以用來測試Postgres-XC的功能。當然,如果你想更好的體驗Postgres-XC如何擴展,我們建議您使用多台服務器搭建群集。
二、通過源碼編譯安裝Postgres-XC
1、為OS安裝Postgres-XC依賴的工具包和庫
編譯Postgres-XC需要GNU make version 3.80 或更高版本,編譯器推薦使用GCC,也可以使用其他的ISO/ANSI C compiler (at least C89-compliant);其他的還有GNU Readline library及必要的庫,例如如果需要Postgres-XC支持UUID,在編譯時需要引入UUID的頭文件及動態鏈接庫。
安裝所需包可以使用下面的命令一次性安裝所有依賴包:
yum -y install gcc* libtool* libxml2-devel readline-devel flex bison crypto* perl-ExtUtils-Embed zlib-devel pam-devel libxslt-devel openldap-devel python-devel openssl-devel cmake
2、通過源碼編譯安裝UUID(*可選)
這一步不是必須的,不需要UUID可以跳過。
在ossp下載OSSP-UUID:http://www.ossp.org/pkg/lib/uuid/,這里下載的是uuid-1.6.2,下載后解壓、編譯安裝:./configure --prefix=/opt/ossp-uuid/ && make && make install
在編譯PG-XC時不要忘記加上以下選項:
--with-ossp-uuid --with-libs=/opt/ossp-uuid/lib/ --with-includes=/opt/ossp-uuid/include/
3、編譯源碼並安裝
下載Postgres-XC源碼包並解壓
http://sourceforge.net/projects/postgres-xc/
tar -xf pgxc-v1.2.1.tar.gz
解壓之后,會在當前目錄創建一個存放源碼的postgres-xc-1.2.1目錄,進入該目錄開始后續的安裝步驟。Configuration和Build的選項與PostgreSQL是一樣的,可以完全參考傳統的PostgreSQL的配置和安裝步驟。
./configure --prefix=/opt/PostgreXC/1.2.1/ --with-perl --with-python --with-openssl --with-pam --without-ldap --with-libxslt --with-libxml --with-ossp-uuid --with-libs=/opt/ossp-uuid/lib/ --with-includes=/opt/ossp-uuid/include/ && gmake && gmake install
需要卸載Postgres-XC可以執行gmake uninstall。
三、搭建Postgres-XC數據庫集群
在每個集群節點執行安裝操作,安裝完畢后進行各節點的數據庫實例化以及集群的配置。在本例中我們使用4台機器搭建Postgres-XC集群,集群中包括1個主的GTM(Master),1個備的GTM(Standby),2個GTM-Proxy,2個Coordinator,2個Datanode。
1、創建Postgres-XC的OS用戶
adduser postgres -d /home/postgres
passwd postgres
2、實例化Coordinator和Datanode節點
首先在每個Coordinator和Datanode節點實例化數據庫,在架構設計階段需要我們確認使用多少個Coordinator和多少個Datanode,(官方文檔推薦的)最佳實踐是在哪里運行一個Datanode則在配置一個Coordinator。與傳統的PostgreSQL一樣,實例化數據庫使用initdb命令,使用-D選項指定數據目錄,可以通過設置環境變量PGDATA來簡化使用。但如果將Coordinator和Datanode節點配置在同一台SERVER上,-D參數必須指定不同的目錄,設置環境變量PGDATA便不方便了,同時它們的Port也需要是不同的。initdb的-D參數指定的數據目錄如果不存在,會自動進行創建,所以需要注意運行initdb的用戶有足夠的權限在指定的數據目錄創建所需目錄。
在每台機器創建各個組件的工作目錄,並修改屬主為postgres用戶
mkdir -p /db/pgsql/
chown -R postgres.postgres /db/pgsql/
需要注意initdb命令需要Postgre-XC用戶執行,它的命令使用方式與PostgreSQL類似,不同的是需要指定當前實例化的節點的名稱,節點名稱通過nodename選項指定:
$ initdb -D $PGDATA --nodename foo
也可以使用pg_ctl命令來執行數據庫實例化的動作,命令使用方法如下:
$ pg_ctl -D $PGDATA -o '--nodename foo' initdb
在實例化Coordinator和Datanode節點時,選項—nodename是必須的,如果不指定該選項,將會報出“Postgres-XC node name is mandatory”的錯誤。
下面分別在每個Coordinator和Datanode節點實例化數據
/opt/PostgreXC/1.2.1/bin/initdb -D /db/pgsql/data_coord(1...n) --nodename coord(1...n)
/opt/PostgreXC/1.2.1/bin/initdb -D /db/pgsql/data_datanode(1...n) --nodename datanode(1...n)
3、實例化GTM和GTM-Proxy節點
可以使用initgtm命令來實例化GTM或GTM-PROXY節點,initgtm有兩個重要的參數,-D參數用來指定$PGDATA,-Z參數指定實例化節點的類型是GTM還是GTM-PROXY,它的值可以為gtm或gtm_proxy。
在GTM主機上實例化GTM節點
/opt/PostgreXC/1.2.1/bin/initgtm -Z gtm -D /db/pgsql/data_gtm
在GTM-Proxy主機上實例化GTM-Proxy節點
/opt/PostgreXC/1.2.1/bin/initgtm -Z gtm_proxy -D /db/pgsql/data_gtmproxy(1...n)
4、配置Datanode節點
在啟動Coordinator和Datanode之前必須先對它們進行配置。在實例化節點時指定的數據目錄中的postgresql.conf文件進行配置。Datanode幾乎與原生的PostgreSQL加一些擴展是一樣的,Postgres-XC對它進行修改和擴展的參數如下:
max_connections和max_prepared_transactions
這個值不能簡單設置為每個Coordinator可以接受的最大連接數。因為每個Coordinator節點都有可能連接到不同的Datanode,所以應該將Datanode可接受的最大連接數配置為所有Coordinator節點可接受的最大連接數的總和,例如有3個Coordinator節點,每個Coordinator節點可接受最大100個並發連接,那這個值應該至少設置為300。在設置 max_connections 時,其依賴的參數max_prepared_transactions 參數也需要修改為max_connections相同的值。
pgxc_node_name
在GTM端需要識別每一個Datanode,pgxc_node_name為當前的Datanode指定一個唯一的標識。在initdb時選項--nodename指定的名稱會自動寫入配置文件;
gtm_port和gtm_host
這兩個參數用來配置GTM或GTM-Proxy的端口和地址,GTM默認的端口為6666。
修改各個Datanode的postgresql.conf文件
vi /db/pgsql/data_datanode(1...n)/postgresql.conf
gtm_host = '192.168.100.11'
gtm_port = 6666
pgxc_node_name = 'datanode(1...n)'
5、配置Coordinator節點
max_connections和max_prepared_transactions
Coordinator節點的max_connections參數只需要考慮最大接受多少來自用戶的連接,而不必考慮其他Coordinator節點和Datanode節點。max_prepared_transactions則至少設置為集群中Coordinator節點數量的總和,這與Datanode是不同的。下面是Coordinator特有的參數
max_pool_size和min_pool_size
像連接池一樣,Coordinator維護着Coordinator到Datanodes的連接。因為每個事務都可能被所有的Datanode參與,這個參數應該至少設置為當前Coordinator的max_connections*集群中Datanode的值。min_pool_size設置Coordinator到遠程節點的最小值,缺省值為1。
max_coordinators和max_datanodes
這兩個參數用來顯式指定集群中Coordinators和Datanodes的最大數量,它們的缺省值是16。如果不打算增加更多的Coordinators和Datanodes可以指定具體的值;如果需要動態的調整Coordinators和Datanodes的數量則指定足夠大的值。
enforce_two_phase_commit
是否強制使用兩階段提交(Two-Phase Commit,2PC),它的缺省值是on。
修改各個Coordinator的postgresql.conf文件
vi /db/pgsql/data_coord(1...n)/postgresql.conf
gtm_host = '192.168.100.11'
gtm_port = 6666
pgxc_node_name = 'coord(1...n)'
6、配置GTM-Proxy節點
vi /db/pgsql/data_gtmproxy(1...n)/gtm_proxy.conf
nodename = 'gtm_proxy_(1...n)'
port = 6666
gtm_host = '192.168.100.10'
gtm_port = 6666
7、配置GTM的Standby節點
GTM是Postgres-XC集群中最重要的節點,在上述配置中,只存在一個單獨的GTM節點,如果這個GTM節點宕掉,整個集群都會宕掉,所以必須避免GTM的單點故障。
實例化GTM節點的步驟同上,主要的區別在配置部分,修改gtm.conf文件:
vi /db/pgsql/data_gtm/gtm.conf
nodename = 'gtm'
listen_addresses = '*'
port = 6666
startup = STANDBY
active_host = '192.168.100.10'
active_port = 6666
其中active_host指定為GTM Master的主機名或地址,另外nodename的名稱必須與GTM Master的名稱一致。修改完配置之后啟動GTM Standby即可,具體各種failover的情況以及如何promote Standby到Master,在后續的測試部分再詳細描述。
8、啟動數據庫集群
需要注意啟動和關閉Postgres-XC集群的順序。
啟動順序為GTM->GTM-Proxy->Coordinators->Datanodes
關閉順序為Coordinators->Datanodes-> GTM-Proxy->GTM
啟動GTM和GTM Standby:
/opt/PostgreXC/1.2.1/bin/gtm_ctl start -Z gtm -D /db/pgsql/data_gtm/
啟動各節點的GTM-Proxies:
/opt/PostgreXC/1.2.1/bin/gtm_ctl start -Z gtm_proxy -D /db/pgsql/data_gtmproxy(1...n)/
啟動各節點的Datanodes:
/opt/PostgreXC/1.2.1/bin/pg_ctl start -Z datanode -D /db/pgsql/data_datanode(1...n)/
啟動各節點的Coordinators
/opt/PostgreXC/1.2.1/bin/pg_ctl start -Z coordinator -D /db/pgsql/data_coord(1...n)/
啟動和停止GTM(Proxy),Datanode,Coordinator推薦使用gtm_ctl和pg_ctl工具,他們可以有更多選項和精確的控制,例如在stop操作時指定SHUTDOWN MODE可以為smart、fast、immediate。
第一次啟動Postgres-XC集群,必須為所有的Coordinator節點注冊除本身節點之外的Coordinator節點以及所有的Datanode節點信息
/opt/PostgreXC/1.2.1/bin/psql -c "CREATE NODE coord(1...n) WITH (TYPE = 'coordinator', HOST = '192.168.100.12' , PORT = 5432)" postgres
/opt/PostgreXC/1.2.1/bin/psql -c "CREATE NODE datanode(1...n) WITH (TYPE = 'datanode', HOST = '192.168.100.11' , PORT = 15432)" postgres
配置完成在各Coordinator節點reload配置,這一步不是必須的。
/opt/PostgreXC/1.2.1/bin/psql -c "select pgxc_pool_reload();" postgres
9、查看集群中節點的信息
Postgres-XC的系統視圖中提供了一組相對PostgreSQL專有的系統視圖,pgxc_node保存了所有Coordinators和Datanodes節點的信息。通過psql工具連接上任意一台Coordinator查詢可以看到所有Coordinators和Datanodes節點的信息。
/opt/PostgreXC/1.2.1/bin/psql -c "select * from pgxc_node;" postgres
四、集群中各節點的參數配置建議
Postgres-XC集群實際上是由多個PostgreSQL實例所組成。在實際的應用中,每個Coordinators和Datanodes節點擁有自己的全局參數配置文件,所以在配置這些參數時,可以按照傳統PostgreSQL的調優方法進行調整。在新的機器上架前,可以先使用pgbench工具對單節點的服務器進行測試,確定一個比較合理的參數范圍。需要注意一點的是,如果在一台物理機上同時部署了Coordinator和Datanode,那么他們之間資源的分配比例大概保持在數據庫可用資源總量的30%和70%,根據各自可使用的資源再對單個節點參數進行調整。