1. 程式人生 > 其它 >【入門教程】PostgreSQL+SequoiaDB HA 實踐

【入門教程】PostgreSQL+SequoiaDB HA 實踐

前言

SequoiaDB作為分散式資料庫,從設計之初就已經支援SQL訪問。目前,SequoiaDB自研的SQL訪問元件SequoiaSQL作為企業版的功能之一已經提供給上百家企業使用者使用,並且已經實現分散式架構下的SQL 2003支援。

對於SequoiaDB社群版使用者,我們可以通過SequoiaDB對接PostgreSQL 實現社群版的分散式SQL訪問。這一應用方式基本也可以滿足大部分的社群版需求。

本文就主要探討如何使用PostgreSQL引擎對接SequoiaDB社群版實現HA高可用架構。

操作環境介紹

在一臺機上分別安裝centos 6.5、SequoiaDB 2.6、postgresql 9.3.4 、pgpool II 3.6.2,其中SequoiaDB為預設安裝,PostgreSQL資料庫則手動安裝,安裝在不同的目錄中,使用不同的埠號。pgpool II 3.6.2則單獨手動安裝一個,並設好免密認證。

注:需要先配好PostgreSQL資料庫之間免密登入及關閉防火牆。

安裝部署PostgreSQL複製流

1.PostgreSQL的安裝

Step1

./configure --without-readline --without-zlib --prefix=/opt/postgresql/data02/pgpool/master

注:--prefix=path,是指PostgreSQL的二進位制程式和文件將被安裝到這個目錄。預設值為 /usr/local

Step2:編譯

make

Step3:安裝

make install

Step4:修改檔案許可權

chown -R sdbadmin:sdbadmin_group /opt/postgresql/data02/pgpool/master

當安裝完成後,可通過echo $? 命令驗證,如果為0則表示安裝成功,非0表示失敗。安裝成功如圖1所示:

2.PostgreSQL複製流部署

先配置主庫,再配置備庫。

1)配置主庫

Step1:初始化資料庫

mkdir /opt/postgresql/data02/pgpool/master /pg_data

/opt/postgresql/data02/pgpool/master /bin/initdb -D pg_data/

初始化成功則如圖2所示:

Step2:修改 postgresql.conf配置檔案

listen_addresses = '*'

port = 7654

wal_level = hot_standby #這個是設定主為wal的主機

archive_mode = on #開啟日誌歸檔

archive_command = 'cp %p /opt/postgresql/data02/pgpool/master/pg_data/backup/%f' #WAL歸檔路徑。

max_wal_senders = 1 #這個設定了可以最多有幾個流複製連線,差不多有幾個從,就設定幾個

wal_keep_segments = 250 #設定log file 的段大小

wal_sender_timeout = 60s #設定流複製主機發送資料的超時時間

max_connections = 100 # 這個設定要注意下,從庫的max_connections必須要大於主庫的。

在搭建流複製環境時,並不必須設定 archive_mode 引數為 on ,很多資料在介紹搭建流複製環境時設定這個引數為 on ,可能是出於開啟 WAL 歸檔更安全的原因,因為在主庫宕機並且較長時間不能恢復時,從庫依然可以讀取歸檔目錄的 WAL,從而保證不丟資料; 另一方面,如果主庫設定了較大的 wal_keep_segments ,也可以不用開啟archive_mode,因為主庫保留了足夠的 WAL,從而大大降低了因從庫所需要的 WAL 被主庫覆蓋而需要從歸檔去取 WAL 的情況。所以從這方面說,archive_mode 引數的設定與搭建流複製並沒有直接關係。提示:對於比較繁忙的庫,在搭建流複製從庫時,建議主庫設定較大的 wal_keep_segments 引數。

其實可以在同一個postgresql.conf中把所有主從屬性配置都配好,postgresql資料庫能夠自動識別哪些是主庫引數,哪些是從庫引數,但注意,有些引數在主庫中不能配置,否則出錯,比如不能再主庫中開啟熱備模式(hot_standby = on)。配置完成後我們可以拷貝該庫都另一個目錄,當成備庫。

注:當日志報“xxxxxxxxxxxxxxxxxxx WAL已經被移異常”時,有可能是 WAL被覆蓋引起的或者DBA不小心把主庫或從庫的某個日誌檔案刪了(如果開啟了歸檔,則包含歸檔檔案),即主庫有而備庫沒有,或者備庫有而主庫沒有都會引起該異常。解決方法:如果是主備日誌檔案異常(某個庫缺個日誌檔案),則根據日誌的異常把報錯日誌考到 另一個沒有的庫,在重啟,如果是WAL日誌被覆蓋,則把主庫整個pg_data資料路徑下的pg_xlog日誌檔案拷到備庫,如果是在開啟歸檔模式下出現的異常,需要把歸檔檔案都重新覆蓋備庫的,再重啟,都不能解決,那就暴力的把整個pg_data目錄拷貝到備庫,在重啟就可以了。

Step3:修改pg_hba.conf配置檔案

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host replication all 0.0.0.0/0 trust

Step4:啟動服務,建立使用者

/opt/postgresql/data02/pgpool/master/bin/pg_ctl -D /opt/postgresql/data02/pgpool/master/pg_data/ -l /opt/postgresql/data02/pgpool/master/log/pg.log start; #啟動服務

/opt/postgresql/data02/pgpool/master/bin/createuser -P -d -a -c 5 --replication -e sequoiadb -p 7654

Enter password for new role:

Enter it again:

CREATE ROLE sequoiadb PASSWORD 'md570b40d6703c0a012afc8356f4511c197' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN REPLICATION CONNECTION LIMIT 5;

建立使用者可根據自己需求賦予許可權。

2)配置從庫

Step1:拷貝主庫為從庫

cp -r /opt/postgresql/data02/pgpool/master /opt/postgresql/data02/pgpool/slave

Step2:修改從庫 postgresql.conf配置檔案

listen_addresses = '*'

port = 4567

max_connections = 1000 # 一般查多於寫的應用從庫的最大連線數要比較大

hot_standby = on #說明這臺機器不僅僅是用於資料歸檔,也用於資料查詢

max_standby_streaming_delay = 30s # 資料流備份的最大延遲時間

wal_receiver_status_interval = 1s # 多久向主報告一次從的狀態,當然從每次資料複製都會向主報告狀態,這裡只是設定最長的間隔時間

hot_standby_feedback = on # 如果有錯誤的資料複製,是否向主進行反饋

由於主備模式,主庫可進行任何增刪改查等操作,而從庫只能提供查詢操作,這是為了資料的一致性,因此,通常情況下會把查詢都向從庫進行,以減輕主庫的壓力。

Step2: 修改recovery.conf配置檔案

把/share/recovery.conf.sample檔案拷貝到資料庫目錄中,在複製模板。

cp /opt/postgresql/data02/pgpool/slave/share/recovery.conf.sample /opt/postgresql/data02/pgpool/slave/pg_data/

cp recovery.conf.sample recovery.conf

standby_mode = on # 這個說明這臺機器為從庫

primary_conninfo = 'host=centos01 user=sequoiadb password= 123456 port=7654 keepalives_idle=60' # 這個說明這臺機器對應主庫的資訊

其中,primary_conninfo配置可以與不需要使用者名稱及密碼,這是由於在pg_hba.conf中的信任關係為trust,所以可以不用填寫。

3)主庫對接SequoiaDB

Step1:從 SequoiaDB 的安裝包中,拷貝 PostgreSQL 的擴充套件檔案

su – sdbadmin

cd /opt/postgresql/data02/pgpool/master

cp /opt/sequoiadb/postgresql/sdb_fdw.so_2.8.1_27726 lib/

cp /opt/sequoiadb/postgresql/sdb_fdw.control share/extension/

cp /opt/sequoiadb/postgresql/sdb_fdw--1.0.sql share/extension/

cd lib/

ln -s sdb_fdw.so_2.8.1_27726 sdb_fdw.so

新增完軟連線完成後,可檢視檔案(ls –trl )驗證,如圖3展示,則表示成功。

Step2:登入主庫,建立連線

/opt/postgresql/data02/pgpool/master/bin/psql –U sequoiadb –d postgres –p 7654

create extension sdb_fdw;

create server sdb_server foreign data wrapper sdb_fdw options(address 'centos01', service '11810');

Step3:測試連線

create foreign table foo (name text, age int) server sdb_server options ( collectionspace 'foo', collection 'bar', decimal 'on' ) ;

select * from test limit 1;

測試結果如圖4:

4)測試複製流

Step1:啟動備庫

/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data/ -l /opt/postgresql/data02/pgpool/slave/log/pg.log start

檢視日誌如圖5表示啟動成功,進入主備模式。

Step2:登入主庫,進行非同步複製

select pg_start_backup('hot_backup');

select pg_is_in_backup();#檢視是否在備份中backup。返回"t"表示true。“f”表示false。

select pg_stop_backup();

其中,select pg_start_backup('hot_backup');語句裡的hot_backup引數不是固定的,這裡的 hot_backup 是任意DBA想使用的這次備份操作的唯一標識,DBA也可以指定備份檔案存放全路徑,如:select pg_start_backup('/opt/backup/backup_20170413');這是推薦使用的方式;select pg_stop_backup(),Postgresql將會生成一個檔案,如“000000010000000000000000.003911E0.backup”,這是一個備份的歷史檔案。pg_stop_backup()將保留本次生成的備份歷史檔案,然後把上次執行本方式備份產生的備份歷史檔案清理掉,然後發訊號告知歸檔程序(pg_stop_backup -> CleanupBackupHistory -> XLogArchiveCheckDone -> XLogArchiveNotify -> SendPostmasterSignal),可以歸檔了。

操作結果如圖6所示:

Step3:登入備庫,進行檢視

../bin/psql –U sequoiadb –d postgres –p 4567

select * from test limit 1;

測試結果如圖7所示,表示成功。

安裝部署pgpool

1)安裝pgpool

./configure --prefix=/opt/postgresql/data02/pgpool-II-3.6.2 --with-pgsql=/opt/postgresql/data02/pgpool/master

make

make install #需要root許可權。

在編譯安裝過程中,如果出現libtool異常,重新編譯安裝時加上引數 --disable-libtool-lock,如:./configure -–prefix --with-pgsql=pg_path --disable-libtool-lock,特別注意的是,當不指定—prefix時,會預設安裝在/usr/local/目錄下,且無論是否把安裝目錄拷貝出來,每次執行都會到/usr/local/預設目錄下讀取配置資訊,所以二手手游出售地圖建議指定安裝路徑(--prefix)。如果安裝成功,則會如圖8所示:

2)安裝 pgpool_regclass, pgpool_recovery 函式

安裝pgpool_regclass, pgpool_recovery 函式庫時,進入目錄src/sql下,但無法直接使用make編譯,會報找不到pg_config檔案,因此,需要找到pg_config配置檔案,該檔案存在於postgresql安裝目錄中,如上面安時指定的—with-pgsql引數路徑中尋找,並把其全路徑替換掉Makefile檔案中的變數PG_CONFIG =pg_config引數值,才能安裝。當在src/sql目錄下把Makefile引數改了,還是沒能夠編譯安裝時,則需要依次登入其庫目錄src/sql/pgpool_regclass和src/sql/pgpool_recovery,在分別替換掉Makefile檔案中的變數PG_CONFIG =pg_config引數值,就能夠安裝 了。具體部署如下:

find /opt/postgresql/data02/pgpool/master -name “pg_config”;

cd /opt/postgresql/data02/pgpool/pgpool-II-3.6.2/src/sql/pgpool-regclass;

vi Makefile

PG_CONFIG ?= /opt/postgresql/data02/pgpool/master/bin/pg_config

:wq

make

make install

詳情操作可如圖9和圖10 所示:

安裝pgpool_regclass函式庫成功後,會在postgresql中的 /share/extension/目錄下會有三個檔案,分別為pgpool_regclass.control、pgpool_regclass--1.0.sql和pgpool-regclass.sql,而安裝成功pgpool_recovery函式庫,則在postgresql 中的 /share/extension/目錄下也有三個檔案,分別為:pgpool_recovery.control、pgpool-recovery.sql和pgpool_recovery--1.1.sql。

pgpool_regclass與pgpool_recovery函式庫安裝成功則如圖11:

3)配置pgpool.conf檔案

listen_addresses = '*'

port = 9999

socket_dir = '/tmp'

pcp_listen_addresses = '*'

pcp_port = 9898

pcp_socket_dir = '/tmp'

backend_hostname0 = 'centos01' #配置資料節點,可以是主機名或IP地址

backend_port0 = 7654

backend_weight0 = 1 #負載均衡中的權重值

backend_data_directory0 = '/opt/postgresql/data02/pgpool/master/pg_data' #指定節點0資料路徑

backend_flag0 = 'ALLOW_TO_FAILOVER' #允許自動切換

backend_hostname1 = 'centos01'

backend_port1 = 4567

backend_weight1 = 1

backend_data_directory1 = '/opt/postgresql/data02/pgpool/slave/pg_data'

backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on #開啟pool_hba驗證

pool_passwd = 'pool_passwd' #驗證檔案(pool_passwd格式為,客戶端連線到pgpool的賬戶名 root:md5生成的密碼)

authentication_timeout = 60 #驗證超時時間。

pid_file_name = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/run/pgpool.pid'

logdir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/status'

load_balance_mode = on #開啟負載模式

master_slave_mode = on #開啟主備模式

master_slave_sub_mode = 'stream' #開啟流模式

sr_check_period = 10 #流式複製檢查週期預設為禁用(0)

sr_check_user = 'sequoiadb' #流複製模式檢測使用者

sr_check_password = '123456' #檢測使用者密碼

sr_check_database = 'postgres' #檢測使用者下的資料庫

health_check_period = 10 #每10s檢測資料庫節點狀態

health_check_timeout = 20 #20s無反應測超時,即檢測兩次無反應就超時,禁用為0。

health_check_user = 'sequoiadb' #檢測某使用者資料庫節點狀態

health_check_password = '123456' //被檢測使用者密碼

health_check_max_retries = 0

health_check_retry_delay = 1

connect_timeout = 10000

failover_command = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/fail.sh %H'

memqcache_oiddir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/oiddir'

其中健康檢測狀態有四種,即status 由數字 [0 - 3]來表示。0 - 該狀態僅僅用於初始化,PCP從不顯示它。1 - 節點已啟動,還沒有連線。2 - 節點已啟動,連線被緩衝。3 - 節點已關閉,。在節點關閉或者為0的時候可以用pgpool的pcp_attach_node命令來動態增加節點,包括以後動態擴充節點也可以。

在配置過程中,需要注意的時,在3.3.4版本的pgpool II中,如果你配置pid_file_name. logdir等預設路徑為/tmp變數引數,則在登入pgpool時有可能應環境而無法等路pgpool,這是由於postgresql無法找到pgpool的 .s.PGSQL.8989和.s.PGSQL.6868檔案,因為postgresql是在/tmp/目錄下尋找的,即使你修改postgresql的unix_socket_directories引數值和pgpool上指定的路徑相同,還是會出現異常,因此建議用預設值。

4)配置pcp.conf

cp pcp.conf.sample pcp.conf

../bin/pg_md5 -u pgpool -p

password:

e10adc3949ba59abbe56e057f20f883e

操作詳情如圖12所示:

5)配置pool_hba.conf

cp pool_hba.conf.sample pool_hba.conf

vi pool_hba.conf

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host sequoiadb postgres 0.0.0.0/0 trust

這裡特別注意,不能用md5效驗,因為md5不支援複製流模式、主備模式以及並行查詢模式。

6)配置pool_passwd

Pool_passwd配置哪些使用者可以通過pgpool登陸資料庫,格式user:md5

vi pool_passwd

sequoiadb:md570b40d6703c0a012afc8356f4511c197

7)配置fail.sh指令碼

# Failover command for streaming replication.

# This script assumes that DB node 0 is primary, and 1 is standby.

#

# If standby goes down, do nothing. If primary goes down, create a

# trigger file so that standby takes over primary node.

#

# Arguments: $1: failed node id. $2: new master hostname. $3: path to

# trigger file.

new_master=$1

echo "new_master info =============== ${new_master}";

trigger_command="/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data –l /opt/postgresql/data02/pgpool/slave/log/pg.log start"

# Do nothing if standby goes down.

if [ $failed_node = 1 ]; then

exit 0;

fi

# Create the trigger file.

/usr/bin/ssh -T $new_master $trigger_command

exit 0;

8)啟動pgpool

../bin/pgpool –n –d > ../log/pgpool.log 2>&1 & #-n表示取消後臺模式,-d 表示列印除錯資訊。

bin/psql -U sequoiadb -d postgres -p 9999 #通過postgresql工具psql登入pgpool

postgres=# show pool_nodes;

node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay

---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------

0 | centos01 | 7654 | up | 0.500000 | primary | 2 | true | 0

1 | centos01 | 4567 | up | 0.500000 | standby | 0 | false | 0

(2 rows)

postgres=#

當手動關閉主庫,等一會兒在重啟主庫,缺發現沒有了主庫,具體如下圖13與所示:

目前還沒有找到原因,實現線上恢復功能,即主節點掛後自動選主,且在主庫關閉在重啟過程中,有可能會出現原主庫節點直接down掉,即status狀態值為down,pgpool一致報無法找到主節點的異常,具體如圖14所示:

可通過pgpool自帶的工具pcp_attach_node進行處理,處理命令為:bin/pcp_attach_node -U pgpool -h centos01 -p 9898 -n 0 –d –W,具體則如圖15:

該命令本身是可以把原主節點拉起並使其成為主節點的,執行後結果如圖16所示:

小結

使用PostgreSQL+SequoiaDB實現HA高可用架構,可以說為社群使用者提供了一個更為簡單的技術選擇,使得SequoiaDB除了原生API之外,為社群開發者提供了SQL的介面。

當然,如果有更為複雜的需求或者更為龐大的業務資料需要管理,我們還是會推薦購買企業版的SequoiaDB,包括其中的SequoiaSQL分散式SQL引擎。