框架環境
192.168.100.102 --虛擬ip 172.18.5.23 --主服務器 172.18.5.41 -- 從服務器
安裝PostgreSQL-主從結構中使用
下載安裝
網頁端地址:https://yum.postgresql.org/rpmchart/ 可以查看各個版本的pgsql,點擊12版本進去,查看需要安裝的內容:
點擊:PostgreSQL Database Server 12 PGDG 在此頁面選擇要下載的內容,點擊進入二層菜單,下載特定版本的安裝包,pgsql安裝需要下載的安裝包,如下:
postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-contrib-12.4-1PGDG.rhel7.x86_64 postgresql12-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm
安裝
yum install -y postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-contrib-12.4-1PGDG.rhel7.x86_64.rpm
安裝出現下面的問題的時候:
缺少依賴性 ,聯網的情況下可以用: yum install krb5-server 等進行安裝。未聯網的情況下,請參考下面的文章:
具體參考:離線安裝:https://www.cnblogs.com/whitebai/p/12128037.html 在線安裝:https://www.cnblogs.com/whitebai/p/12122240.html 安裝依賴:https://www.cnblogs.com/whitebai/p/12128078.html
創建目錄
mkdir -p /app/pgsql/data && chown postgres:postgres /app/pgsql/data; -- 數據目錄 mkdir -p /app/pgsql/pg_archive && chown postgres:postgres /app/pgsql/pg_archive; --用於歸檔的目錄(主從復制時用) cd /app/pgsql && chmod 700 data; --分配擁有者讀寫權限 cd /app/pgsql && chmod 700 pg_archive; --分配擁有者讀寫權限
切換用戶
su - postgres --切換回postgres 用戶 /usr/pgsql-12/bin/initdb -D /app/pgsql/data/ --初始化數據庫
修改數據庫路徑
su 切換為root用戶,以root身份
vim /usr/lib/systemd/system/postgresql-12.service --修改Service Environment=PGDATA=/app/pgsql/data/ --修改數據庫路徑
自動啟動
su 切換為root用戶,以root身份
systemctl enable postgresql-12 systemctl start postgresql-12
登錄postgresql並設置密碼,postgresql在安裝時默認添加用戶postgres
su - postgres psql ALTER USER postgres WITH PASSWORD '123456'; \q
允許遠程登錄
修改pg_hba 指定數據庫路徑時:
vi /app/pgsql/data/pg_hba.conf # IPv4 local connections: 下面添加 host all all 0.0.0.0/0 md5
修改postgresql 指定路徑時:修改時候去掉前面的# 注釋
vi /app/pgsql/data/postgresql.conf listen_addresses = '*'
重啟服務
systemctl restart postgresql-12 netstat -ltpn | grep 5432 --查看狀態 ,可以不用執行
允許通過防火牆
firewall-cmd --zone=public --add-port=5432/tcp --permanent firewall-cmd --reload
主從配置
主服務器
添加pg用於同步的用戶名
su - postgres psql CREATE ROLE replica login replication encrypted password '123456'; -創建具有復制流操作的用戶:replica
修改配置文件:pg_hba.conf,信任從服務器訪問
vi /app/pgsql/data/pg_hba.conf #文件尾部添加信任的從服務器 # replica為postgres用戶 # XX.XX.XX.XX為從節點的完整IP,如果為網段配置就不是32了,md5為允許密碼驗證,trust為免密 # TYPE DATABASE USER ADDRESS METHOD host replication replica 172.18.5.41/32 trust
、允許10.1.1.0~10.1.1.255網段登錄數據庫:
1
|
host all all 10.1.1.0/24 md5
|
2、修改配置文件:postgresql.conf
vi /app/pgsql/data/postgresql.conf
# 新增或修改下列屬性設置(使用命令“/”來查找,否則眼花)
listen_addresses = '*' # (修改)監聽所有IP
max_connections = 100 # (修改)最大連接數,據說從機需要大於或等於該值
archive_mode = on # (修改)開啟歸檔
archive_command = 'test ! -f /app/pgsql/pg_archive/%f && cp %p /app/pgsql/pg_archive/%f'
# 9.6開始沒有hot_standby(熱備模式) wal_level = replica #最多有2個流復制連接 max_wal_senders = 2 wal_keep_segments = 16 #流復制超時時間 wal_sender_timeout = 60s # 最大連接數,據說從機需要大於或等於該值 max_connections = 100
3、重啟服務
systemctl restart postgresql-12
4、在從節點上驗證訪問
psql -h 172.18.5.23 -U postgres
FATAL: no pg_hba.conf entry for host “XXX” user “”xxx“”
# 如果發現不知道密碼或密碼不正確,修改postgres用戶密碼(數據庫)
ALTER USER postgres WITH PASSWORD '你的密碼';
三、從服務器
1、停止服務
systemctl stop postgresql-12
2、切換用戶(一定要)
su - postgres
3、清空數據文件夾(是這樣的,沒錯)
rm -rf /app/pgsql/data/*
cd /app/pgsql/data
4、從主節點獲取數據
# 使用replica用戶,從主節點獲取備份數據(這條命令建議照抄,有興趣在深究內部參數)
pg_basebackup -h 172.18.5.23 -p 5432 -U replica -Fp -Xs -Pv -R -D /app/pgsql/data
5、編輯standby.signal文件(就在數據文件夾內,以此標識從節點,當從節點提升為主節點后會自動刪除)
# 添加
standby_mode = 'on'
6、修改postgresql.conf文件
vi /app/pgsql/data/postgresql.conf
primary_conninfo = 'host=172.18.5.23 port=5432 user=replica password=123456'
recovery_target_timeline = latest # 默認
max_connections = 120 # 大於等於主節點,正式環境應當重新考慮此值的大小
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
7、重新啟動從節點
systemctl start postgresql-12
四、驗證主從
方法一:
登錄主節點數據庫執行如下命令
su postgres
psql
select client_addr,sync_state from pg_stat_replication;
結果如下:
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
---------------+------------
172.18.5.41 | async
(1 row)
說明104服務器是從節點,在接收流,而且是異步流復制
方法二:
在主節點與從節點分別執行如下命令
ps -ef | grep postgres
可以看到主節點有wal receiver進程
postgres 2638 2606 0 17:12 ? 00:00:00 postgres: walsender replica 172.18.5.41(51504) streaming 0/7000660
可以看到從節點有wal receiver進程
postgres 1960 1953 0 17:12 ? 00:00:02 postgres: walreceiver streaming 0/7000660
五、主備切換(主庫出現故障時)
當主庫出現故障時,我們需要將備庫提升為主庫進行讀寫操作。
0、在pg12之前我們一般使用2種方式:
1)pg_ctl 方式: 在備庫主機執行 pg_ctl promote shell 腳本
2)觸發器文件方式: 備庫配置 recovery.conf 文件的 trigger_file 參數,之后在備庫主機上創建觸發器文件
1、pg12開始新增了一個pg_promote()函數,讓我們可以通過SQL命令激活備庫。
pg_promote()語法:
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
兩個參數:
wait: 表示是否等待備庫的 promotion 完成或者 wait_seconds 秒之后返回成功,默認值為 true。
wait_seconds: 等待時間,單位秒,默認 60
2、切換舉例:
1)主庫操作:關閉主庫,模擬主庫故障:
systemctl stop postgresql-12
2)備庫操作:激活備庫:
su postgres
psql
select pg_promote(true,60);
4、驗證:
/usr/pgsql-12/bin/pg_controldata /app/pgsql/data
主備庫英文顯示如下:
Database cluster state: in production
Database cluster state: in archive recovery
主備庫中文顯示如下:
數據庫簇狀態: 在運行中
數據庫簇狀態: 正在歸檔恢復
六、原主庫修復后降為備庫(其實大部分操作與建立備庫時一樣,只是修改幾個IP地址)
1、新主庫(104):
# vi /app/pgsql/data/pg_hba.conf
host replication replica 172.18.5.23/32 trust
# systemctl restart postgresql-12
2、新備庫(103)
# systemctl stop postgresql-12
# su - postgres
# rm -rf /app/pgsql/data/*
# cd /app/pgsql/data
# pg_basebackup -h 172.18.5.41 -p 5432 -U replica -Fp -Xs -Pv -R -D /app/pgsql/data
# vi standby.signal
# 添加
standby_mode = 'on'
vi /app/pgsql/data/postgresql.conf
primary_conninfo = 'host=172.18.5.41 port=5432 user=replica password=123456'
# systemctl start postgresql-12
七、再次將老主庫切回主庫
1、當前備庫:
> 停止服務
> 刪除“/app/pgsql/data/standby.signal”文件
> 啟動服務
2、當前主庫:
> 停止服務
> 以“postgres”用戶創建“/app/pgsql/data/standby.signal”文件,添加內容:standby_mode = 'on'
> 啟動服務
https://blog.csdn.net/luxingjyp/article/details/104637798 https://www.cnblogs.com/VicLiu/p/12993542.html
pgPool 負載均衡搭建(搭建未完成,請勿參考)
服務器環境
172.18.5.23 master 172.18.5.41 slave 172.18.5.42 vip -虛擬ip
.host 添加配置
vi /etc/hosts
/etc/init.d/network restart --修改完成后刷新
使用yum下載rpm包安裝pgpool-II,注意下載的安裝包須與PG的版本一致。安裝包目錄詳見https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-8-x86_64/。
yum install https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-2.noarch.rpm
yum install pgpool-II-pg12 yum install pgpool-II-pg12-debuginfo yum install pgpool-II-pg12-devel yum install pgpool-II-pg12-extensions
服務開機啟動
systemctl enable pgpool.service
啟動停止服務
systemctl start pgpool.service systemctl stop pgpool.service
目錄/相關命令授權
因為pgpool-ii 配置中會以 postgres 用戶執行一些系統權限命令, 需要使用設置普通用戶授權:
chmod u+x /usr/sbin/ip chmod u+s /usr/sbin/arping chmod u+s /sbin/ip chmod u+s /sbin/ifconfig
配置中相關的日志目錄,pid 目錄權限:
chown -R postgres.postgres /etc/pgpool-II --給postgres 用戶權限 mkdir /var/run/pgpool/ chown postgres.postgres /var/run/pgpool/ mkdir -p /var/log/pgpool/ touch /var/log/pgpool/pgpool_status chown -R postgres.postgres /var/log/pgpool/
配置程序運行的用戶和組為 postgres 一般10以上,postgres 就在postgres 組下面,沒有的話,可以搜索如何創建組
修改pgpool運行用戶和組為postgres
vi /usr/lib/systemd/system/pgpool.service --10如果采取默認的基本不需要修改 User=postgres Group=postgres
服務器SSH免密設置
# 主機/備機操作 su - postgres ssh-keygen # 一直enter
繼續在postgres用戶下執行
ssh-copy-id -i .ssh/id_rsa.pub master ssh-copy-id -i .ssh/id_rsa.pub slave
如果提示輸入postgres密碼的時候,請輸入postgres 用戶的密碼(非postgres數據庫的密碼),如果沒有設置,可以切換回root用戶 sudo
-u postgres
passwd
設置密碼
以上操作主機、備機都要執行
pgpool-ii 相關配置(/etc/pgpool-II/)
pool_hba.conf
(主備相同)
pool_hba.conf
是配置用戶鏈接時的驗證策略, 和postgresql
的pg_hba.conf
保持一致,要么都是trust
,要么都是md5
驗證方式,這里采用了md5驗證方式如下設置
su - postgres cd /etc/pgpool-II/ vim pool_hba.conf
編輯內容如下(這里和postgressql設置一樣, trust/md5保持一致)
配置pg_hba.conf,認證方式保持一致
修改 vi /app/pgsql/data/pg_hba.conf 與上面保持一致
非必要可選步驟,為了集群可擴展性,可以將復制的認證條件放寬
pcp.conf
/ pool_passwd (主備相同)
這個文件是pgpool管理器自己的用戶名和密碼,用於管理集群的.
在 /etc/pgpool-II/ 目錄下
pg_md5 postgres e8a48653851e28c69d0506508fb27fc5 vi pcp.conf --添加 #USERID:MD5PASSWD postgres:e8a48653851e28c69d0506508fb27fc5
pg_md5 -p -m -u postgres pool_passwd #數據庫登錄用戶是postgres,這里輸入登錄密碼,不能出錯 #輸入密碼后,在/etc/pgpoll-II目錄下會生成一個pool_passwd文件
pgpool.conf
(重點)
這里我們配置主節點的,然后備節點直接拷貝過去
su - postgres cd /etc/pgpool-II/ touch failover_stream.sh chmod u+x failover_stream.sh vim failover_stream.sh -- 鍵入一下內容 #! /bin/sh # Failover command for streaming replication. # Arguments: $1: new master hostname. new_master=$1 trigger_command="/usr/pgsql-12/bin/pg_ctl promote -D /app/pgsql/data" # Prompte standby database. /usr/bin/ssh -T $new_master $trigger_command exit 0;