【入門教程】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引擎。