天天看點

timescaleDB雙機熱備流複制與測試

背景

最近有項目要用到熱備功能,timescaledb隻能相容pg的流複制,不能相容其他的複制政策,是以這裡我們采用pg的流複制功能鏡像部署,并進行了一些測試

timescaleDB安裝(兩台機器都安裝)

1.添加postgresql源

echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -c -s)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update      

2.安裝timescaledb

sudo add-apt-repository ppa:timescale/timescaledb-ppa
sudo apt-get update
sudo apt install timescaledb-1.7.5-postgresql-11      

3.安裝postgis

sudo apt install postgresql-11-postgis-2.5      

4.進行資料庫調優

sudo timescaledb-tune -yes      

5.建立一個300M的占位檔案,避免資料庫占滿硬碟空間,系統無法調試

dd if=/dev/zero of=./useless-placeholder bs=1M count=300      

timescaledb流複制配置(主節點配置)

修改配置檔案sudo nano /etc/postgresql/11/main/postgresql.conf

# postgresql.conf
wal_level = replica
max_wal_senders = 16                      # 最多多少各流複制連結
wal_keep_segments = 256                   # 流複制保留最多的xlog數
wal_sender_timeout = 60s                  # 流複制主機發送資料逾時時間
max_connections = 1000                    # 從庫的max_connections必須大于主庫的
 
full_page_writes = on                     # 使用pg_rewind指令同步資料庫要用
wal_log_hints = on                        # 使用pg_rewind指令同步資料庫要用
hot_standby = on                          # 使用pg_rewind指令同步資料庫要用
 
listen_addresses = '*'                    # 修改監聽
archive_mode = on                         # 開啟歸檔模式
archive_command = 'arch.sh %f %p'      

建立replica使用者,密碼replica123

sudo -u postgres psql
CREATE ROLE replica login replication encrypted password 'replica123';      

在/var/lib/postgresql/11/main建立arch.sh,用于定時删除超過7天的歸檔檔案内容如下

PGDATA=/var/lib/postgresql/11/main
#test ! -f $PGDATA/arch/$1 && cp -r --preserve=timestamps $2 $PGDATA/arch/$1 ; find $PGDATA/arch/ -type f -mtime +1 -exec rm -f {} \;
test ! -f $PGDATA/arch/$1 && cp -r --preserve=timestamps $2 $PGDATA/arch/$1 ;
# 一天的日志量太大,還是删除最近20個的吧
num=`ls -l $PGDATA/arch | grep '^-' | wc -l`
cd $PGDATA/arch
if [ $num -gt 20 ];
then
 #計算超過5個多少
 num=`expr $num - 20`
 clean=`ls -tr | head -$num | xargs`
 echo "will delete file:"
 echo ${clean}
 #-n1 每次處理1個檔案
 ls -tr | head -$num | xargs -i -n1 rm -rf {}
fi      

在/var/lib/postgresql/11/main建立arch目錄,賦權給arch和arch.sh

mkdir /var/lib/postgresql/11/main/arch
chown -R postgres:postgres arch*      

确認歸檔功能開啟

root@database-master:/var/lib/postgresql/11/main# ps -ef|grep archiver
postgres 29921 29916  0 08:36 ?        00:00:00 postgres: 11/main: archiver  
root     29953 29477  0 08:36 pts/0    00:00:00 grep --color=auto archiver      

配置sudo nano /etc/postgresql/11/main/pg_hba.conf

備注:192.168.0.31 是備節點的IP

# 在配置檔案末尾添加
pg_hba.conf
host    all             all             0.0.0.0/0               md5
host    replication     replica         192.168.0.31/32         md5      

重新開機資料庫

sudo systemctl restart postgresql      

timescaledb流複制配置(從節點配置)

# 在配置檔案末尾添加
pg_hba.conf
host    all             all             0.0.0.0/0               md5
host    replication     replica         192.168.0.31/32         md5      

删除資料目錄

sudo rm -rf /var/lib/postgresql/11/main
sudo pg_basebackup -D /var/lib/postgresql/11/main -Fp -Xs -v -P -h 192.168.0.30 -U replica -W      

複制之後,注意設定main目錄的權限為postgres

sudo chown -R postgres:postgres /var/lib/postgresql/11/main
sudo systemctl restart postgresql      

在 /var/lib/postgresql/11/main 下添加recovery.conf檔案,内容如下:

注意192.168.0.30是主節點的IP

standby_mode = on
primary_conninfo = 'host=192.168.0.30 port=5432 user=replica password=replica123'
recovery_target_timeline = 'latest'      
# postgresql.conf
max_connections = 10000                    # 從庫的max_connections必須大于主庫的
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
full_page_writes = on                     # 使用pg_rewind指令同步資料庫要用
wal_log_hints = on                        # 使用pg_rewind指令同步資料庫要用
hot_standby = on                          # 使用pg_rewind指令同步資料庫要用
listen_addresses = '*'      
sudo systemctl restart postgresql      

場景測試

功能說明:

主庫可讀可寫,備庫隻可讀。備庫的資料會通過異步的方式實時從主庫同步。

備庫關閉,不影響主庫的使用,備庫重新開機之後,能自動從主庫同步這段時間缺失的資料。

主庫關閉,備庫不會自動切換成主庫,等主庫開機之後,主備功能自動恢複。

場景1:确認foreign table可相容輕按兩下熱備

步驟1:在master機器上建立兩個庫,并對其中的一些表之間建立起foreign table。

步驟2:檢查slver機器上也自動生成了兩個庫和對應的外表

步驟3:在測試環境上安裝應用程式,進行sql insert操作

步驟4:檢查master和slaver上的4張表資料是否一緻

結論:foreign table功能能相容輕按兩下熱備,不會丢資料

場景2:在小資料量時,如果備庫關閉,過一段時間再重新開機,會有什麼後果?

步驟1:在完成場景1的情況下,修改插入頻率,提高到每間隔1秒500條資料

步驟2:持續了2分鐘之後,突然在slaver機器上運作systemctl stop postgresql

步驟3:master機器繼續工作,master上的資料持續增加

步驟4:1小時後,在slaver機器上運作systemctl start postgresql 啟動資料庫

步驟5:檢查slaver機器上缺少的資料是否會補充回來

結論:slaver機器關閉再重新開機,這段時間缺失的資料會補充回來

場景3:在大資料量時,如果備庫關閉,過一段時間再重新開機,會有什麼後果?

步驟1:在完成場景1的情況下,修改插入頻率,提高到每間隔1秒500000個條資料

步驟4:1小時候在slaver機器上運作systemctl start postgresql 啟動資料庫

結論:slaver機器關閉再重新開機,這段時間缺失的資料會通過wal日志補充回來,補充速度看備機的硬碟io

場景4:在大資料量時,如果主庫關閉,過一段時間再重新開機,主備能自動恢複連接配接嗎?

步驟1:在完成場景1的情況下,修改遙測頻率,提高到每間隔30秒50000個遙測資料

步驟2:持續了一段時間之後,突然在master機器上運作systemctl stop postgresql

步驟3:此時應用程式出錯,遙測無法上傳

步驟4:過60分鐘之後,在master機器上運作systemctl start postgresql 啟動資料庫

步驟5:檢查連接配接,和主備資料庫,删除和增加資料,檢查是否自動同步

select client_addr,sync_state from pg_stat_replication;      

結論:master機器關閉再重新開機,能夠自動與備庫建立連接配接,并且不影響後續使用,但是這裡要注意了,如果關閉時間過長,會産生巨量的pg_wal日志,速度很快,一天可能100G+此時不能删除pg_wal日志,還是需要把備庫完全起來,等備庫完成了資料同步之後,通過

pg_controldata /var/lib/postgresql/11/main指令找到【Latest checkpoint location】,然後通過pg_archivecleanup -d /var/lib/postgresql/11/main/pg_wal 【Latest checkpoint location】來清理日志檔案,若備庫沒有起來,千萬不要提前删除,會導緻備庫資料不同步,隻能通過pg_rewind重做備庫。在沒有出問題的情況下。pg_wal的日志會根據max_wal_size配置進行自動清理

場景5:主庫關閉,備庫切換成主庫,原主庫能改成備庫嗎,程式能繼續使用嗎?

步驟1:關閉主庫systemctl stop postgresql

步驟2:在備庫上linux使用者切換到postgres,然後添加pg_ctl到環境變量

$ cd ~
$ vim .profile
PATH=$PATH:/usr/lib/postgresql/11/bin
export PATH
$ . ~/.profile      

步驟3:在備庫上輸入pg_ctl promote -D /var/lib/postgresql/11/main。此時會發現/var/lib/postgresql/11/main下的recovery.conf變成了recovery.done

postgres@database-slaver:/home/sfere$ pg_ctl promote -D /var/lib/postgresql/11/main
waiting for server to promote.... done
server promoted      

步驟4:在老的主庫上,使用postgres使用者登入,使用pg_rewind同步資料

pg_rewind -D /var/lib/postgresql/11/main --source-server='hostaddr=192.168.0.31 port=5432 user=postgres password=postgres'      

步驟5:修改應用程式的資料庫連接配接配置到新的主庫,繼續進行sql insert操作

結論:主庫備庫切換完成之後,修改應用程式資料庫連接配接池配置,不影響後續使用