背景
最近有項目要用到熱備功能,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操作
結論:主庫備庫切換完成之後,修改應用程式資料庫連接配接池配置,不影響後續使用