postgresql 主備或熱備


基礎的知識請移步前面的文章,下面直接開始熱備/主備的搭建

兩台服務器分別作為主和備

主:192.168.56.13

備:192.168.56.52

主的配置

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 
yum install -y postgresql14-server
/usr/pgsql-14/bin/postgresql-14-setup initdb

systemctl start postgresql-14

創建用戶復制的專用用戶和修改postgres用戶密碼

su - postgres

psql

ALTER USER postgres with encrypted password '123456'; #修改postgres密碼
create user replica login replication encrypted password 'replica';       #創建主從復制的專用用戶replica

 

 

 

修改主配置文件postgresql.conf

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10 # 最大發送進程,默認 10,讀寫分離一寫多服務讀,請設置為讀數據庫的數量 synchronous_commit
= on # 將事務提交方式改為本地提交,默認為 on,在 on 模式下事務需要等備份數據庫一起提交,這里改為 local 讓備份數據庫不影響主庫,如若是先配置讀寫分離,請設置為默認 on

修改主配置文件pg_hba.conf

host all all 0.0.0.0/0 md5                            #允許其他主機連接該數據庫,記住防火牆也要開放5432端口才能連接,或者直接關閉防火牆
host all all 192.168.56.52/32 trust
host replication replica 192.168.56.52/32 md5         #其中replica就是創建的用戶

重啟主節點:

systemctl restart postgresql-14

主節點就配置完成了

 

從節點配置:

1,安裝

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 
yum install -y postgresql14-server
/usr/pgsql-14/bin/postgresql-14-setup initdb
systemctl start postgresql-14

2,停掉服務並刪除data目錄下的數據

systemctl stop postgresql-14
su - postgres
rm -rf /var/lib/pgsql/14/data/*
pg_basebackup -h 192.168.56.13 -D /var/lib/pgsql/14/data -U replica -P -v  -R -X stream -C -S pgstandby1    #復制后從節點的配置文件會和主節點的一樣,並且一並復制的還有數據庫文件,里面的數據也一樣,意味着主節點有什么用戶數據從節點也有
  • -h –指定作為主服務器的主機。
  • -D –指定數據目錄。
  • -U –指定連接用戶。
  • -P –啟用進度報告。
  • -v –啟用詳細模式。
  • -R–啟用恢復配置的創建:創建一個standby.signal文件,並將連接設置附加到數據目錄下的postgresql.auto.conf
  • -X–用於在備份中包括所需的預寫日志文件(WAL文件)。流的值表示在創建備份時流式傳輸WAL。
  • -C –在開始備份之前,允許創建由-S選項命名的復制插槽。
  • -S –指定復制插槽名稱。

備份過程完成后,會在data目錄下創建了一個standby.signal,並將primary_conninfo寫入postgresql.auto.conf

[root@localhost data]# cat postgresql.auto.conf 
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica password=replica channel_binding=prefer host=192.168.56.13 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'pgstandby1'
[root@localhost data]# 

如果postgresql.conf中的hot_standby參數設置為on(默認值),並且數據目錄中存在Standby.signal文件,則replication slave將在“熱備”模式下運行。

查看主節點復制插槽

# su - postgres
$ psql -c "SELECT * FROM pg_replication_slots;"
$ exit
#systemctl start postgresql-14

查看從節點接收狀態:#此信息只有從節點才會有

[root@localhost data]# su - postgres
上一次登錄:二 1月 25 14:09:09 CST 2022pts/0-bash-4.2$ psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
擴展顯示已打開.
-[ RECORD 1 ]---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 19364
status                | streaming
receive_start_lsn     | 0/5000000
receive_start_tli     | 1
written_lsn           | 0/5000148
flushed_lsn           | 0/5000148
received_tli          | 1
last_msg_send_time    | 2022-01-25 14:17:21.287421+08
last_msg_receipt_time | 2022-01-25 14:17:21.285926+08
latest_end_lsn        | 0/5000148
latest_end_time       | 2022-01-25 14:17:21.287421+08
slot_name             | pgstandby1
sender_host           | 192.168.56.13
sender_port           | 5432
conninfo              | user=replica password=******** channel_binding=prefer dbname=replication host=192.168.56.13 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any

查看主節點發送狀態:#此信息只有主節點才會有

[root@localhost 14]# su - postgres
上一次登錄:二 1月 25 14:13:45 CST 2022pts/0-bash-4.2$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"
擴展顯示已打開.
-[ RECORD 1 ]----+------------------------------
pid              | 10923
usesysid         | 16384
usename          | replica
application_name | walreceiver
client_addr      | 192.168.56.52
client_hostname  | 
client_port      | 43944
backend_start    | 2022-01-25 14:17:21.278794+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/5000148
write_lsn        | 0/5000148
flush_lsn        | 0/5000148
replay_lsn       | 0/5000148
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2022-01-25 14:19:41.738165+08

至此從節點也配置完成

可以驗證下:

主節點創建數據庫test,看看從節點是否同步成功:

 

 可以看到同步成功

 

下面是一些優化的操作:

vim /etc/sysctl.conf

net.core.wmem_default=262144
fs.file-max=76724600
vm.mmap_min_addr=65536
net.core.somaxconn=4096
net.core.wmem_max=4194304
net.core.netdev_max_backlog=10000
# 信號量,ipcs -l 或 或 -u 查看,每 16 個進程一組,每組信號量需要 17 個信號量。
# 不重新修改該值。四個參數: SEMMSL SEMMNS SEMOPM SEMMNI。SEMMSL * SEMMNI = SEMMNS (參數1 * 參數4 = 參數2),SEMMSL = SEMOPM (參數1 = 參數3)。
# 參數1(SEMMSL): max semaphores per array, 信號量,表示每個信號集中的最大信號量數目,信號量是多線程環境下使用的一種設施,它負責協調各個線程, 以保證它們能夠正確、合理的使用公共資源。信號量設置時,最小250,對於processes參數設置較大的系統建議設置為processes+10。
# 參數2(SEMMNS): max semaphores system wide, 所有信號的最大數量、即系統范圍內的最大信號量總數目,SEMMSL * SEMMNI。
# 參數3(SEMOPM): max ops per semop call, 代表調用單個信號集中最大信號數量,即每個信號發生時的最大系統操作數目,大於17,一般設置至少100,或者等於SEMMSL。
# 參數4(SEMMNI): max number of arrays, 代表是組(信號集的最大值),即系統范圍內的最大信號集總數目。最少128。
# kernel.sem = 4096 2147483647 2147483646 512000 官方是給的這個設置。如果不設置,系統默認值(ipcs -sl 命令可查看)為 :250 3200 32 128。我沒有使用官方的設置,也沒有使用默認值,我調整了一下
kernel.sem = 4096 83886080 4096 20480
net.core.rmem_max=4194304
vm.overcommit_ratio=90
net.ipv4.tcp_tw_reuse=1
net.core.rmem_default=262144
net.ipv4.ip_local_port_range=40000 65535
#net.netfilter.nf_conntrack_max=1200000
net.ipv4.tcp_rmem=8192 87380 16777216
net.ipv4.tcp_max_syn_backlog=4096
fs.nr_open=20480000
net.ipv4.tcp_wmem=8192 87380 16777216
vm.dirty_writeback_centisecs=100
vm.dirty_ratio=95
# 所有共享內存段相加大小限制( 建議內存的 80% ,單位 page ,查看 page 大小 getconf PAGE_SIZE)
# 設置時根據自己的實際內存大小進行計算和設置,例如:page 大小 4096,8G 內存的 80% 設置為:8*1024*1024*1024/4096*80%=1677721
kernel.shmall = 1677721 #Mem*80%
# 最大單個共享內存段大小(建議為大於shared_buffer值,單位bytes。需要計算。一般建議設置為內存的50%。例如:8G內存,則參數設置為:8*1024*1024*1024*50%=4294967296。如果因為該參數導致啟動失敗時,可以嘗試調整為75%
# kernel.shmmax = 4294967296 # 50%
kernel.shmmax = 6442450944 #Mem*75%
# 系統范圍內共享內存段的最大數量(一共能生成多少共享內存段),每個PG數據庫集群至少2個共享內存段,不重新修改該值
# kernel.shmmni = 819200 官方設置819200,我設置該值會報錯 Invalid argument,我調整為默認值4096
kernel.shmmni = 4096 #default 4096
vm.swappiness=0
net.ipv4.tcp_mem=8388608 12582912 16777216
vm.dirty_background_bytes=409600000
#net.nf_conntrack_max=1200000
net.ipv4.tcp_max_tw_buckets=262144
fs.aio-max-nr = 1048576

注意:net.nf_conntrack_max & net.netfilter.nf_conntrack_max 這兩個參數的優化如果開啟的話,我會遇到報錯:
sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory
sysctl: cannot stat /proc/sys/net/nf_conntrack_max: No such file or directory
可能是 conntrack沒有加載,lsmod |grep conntrack ,如果 返回 為空,表示沒有加載
執行命令加載: modprobe ip_conntrack
重新執行 sysctl -p 即可。也可以忽略該錯誤、或者注釋掉 net.nf_conntrack_max & net.netfilter.nf_conntrack_max 這兩個參數的優化。

關於ip_conntrack:
ip_conntract就是linux NAT的一個跟蹤連接條目的模塊,用來跟蹤和記錄連接狀態,是netfilter的一部份。ip_conntrack模塊會使用一個哈希表記錄 tcp 通訊協議的 established connection 記錄。當這個哈希表滿了的時候,便會導致 nf_conntrack: table full, dropping packet 錯誤。

我直接注釋掉了 net.nf_conntrack_max & net.netfilter.nf_conntrack_max 的優化。
OS limits配置:

echo '
#for PostgreSQL
postgres soft core unlimited
postgres hard nproc unlimited
postgres soft nproc unlimited
postgres hard memlock unlimited
postgres hard nofile 1024000
postgres soft memlock unlimited
postgres soft nofile 1024000
' >> /etc/security/limits.conf

此種配置也適用於其他版本:

 

 https://www.postgresql.org/docs/14/warm-standby.html#PREPARING-PRIMARY-FOR-STANDBY

參考文檔:

https://blog.csdn.net/sunny05296/article/details/121000196


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM