2021年3月8日 星期一

【IT Notes】在Ubuntu20.04上安裝PostgreSQL資料庫可主從複寫與切換的Cluster

過年期間有研究一下如何使用PostgreSQL,聽說是個不錯用的資料庫,實際操作過後也確實好用,指令和核心都有公開資料可循,也算是很好理解,就把這花費幾天的研究成果記錄下來,也許將來有機會用到。


一‧事前準備

三台VM,基本配備:

4核心CPU4GB RAM50GB硬碟

node1:10.113.112.84   (Primary)

node2:10.113.112.85   (Standby)

node3:10.113.112.86   (Standby)

(要先確認彼此都能pingssh得到)


二.安裝軟體及套件

三台node都先安裝postgresqlrepmgr

$ sudo apt update

$ sudo apt -y install vim bash-completion wget

$ sudo apt -y upgrade

$ sudo apt -y install postgresql-12 postgresql-client-12

$ sudo apt -y install postgresql-12-repmgr

$ service postgresql status

$ service repmgrd status

repmgrd是主從切換的重要套件,必須安裝才能做failover測試)


三.node1(Primary)建立複寫用帳號及資料庫

--第一台主機先作為Primary node,主要擔任資料寫入工作。

$ sudo -i -u postgres                \\切換資料庫預設administrator:postgres

$ createuser --replication --createdb --createrole --superuser repmgr  \\建立一個複寫用途的user 

$ psql -c 'ALTER USER repmgr SET search_path TO repmgr_test, $user", public;'

$ createdb repmgr --owner=repmgr                                                        \\建立一個複寫用途的db

--(可以直接在外部用指令建立userdb)


四.各台node配置複寫用設定

1.修改基本設定檔的參數(root)

# vim /etc/postgresql/12/main/postgresql.conf

listen_addresses = '*'                                                 \\星號是指全通,嚴謹的設定只需要設定彼此node的ip 

max_wal_senders = 10

max_replication_slots = 10

wal_level = 'replica'                                                   \\舊版的此設定參數是hot_standby,不建議再使用

wal_log_hints = on

hot_standby = on                                                       \\重要的設定!有此參數的node才有機會啟動複寫

archive_mode = on

archive_command = '/bin/true'

shared_preload_libraries = 'repmgr'


2.修改連線設定檔的參數(root)

# vim /etc/postgresql/12/main/pg_hba.conf

--在最下面新增互連用的設定

local   replication   repmgr                                       trust

host    replication   repmgr      127.0.0.1/32             trust

host    replication   repmgr      10.113.112.0/24       trust


local   repmgr        repmgr                                       trust

host    repmgr        repmgr      127.0.0.1/32             trust

host    repmgr        repmgr      10.113.112.0/24       trust


3.測試各台node互連狀況

--上面設定完後要先重啟資料庫服務

# systemctl enable postgresql-12.service

# systemctl restart postgresql-12.service

$ su – postgres                                              \\psql得要先切換回postgres

$ psql ‘host=10.113.112.84 dbname=repmgr user=repmgr’

$ psql ‘host=10.113.112.85 dbname=repmgr user=repmgr’

$ psql ‘host=10.113.112.86 dbname=repmgr user=repmgr’

--(正常的話各台node都能夠訪問彼此的資料庫)


五.各台node配置複寫用工具的參數

1.確認repmgrd工具已可以啟用(用root

# vim /etc/default/repmgrd

REPMGRD_ENABLED=yes                                               \\啟用複寫套件

REPMGRD_CONF="/etc/repmgr.conf"                               \\重要!指定複寫工具配置檔的位置


2.自行新增並配置複寫工具(用root

$vim /etc/repmgrd.conf                  \\預設沒有此檔案,自己新增

node_id=1                                      \\ node號碼,另兩台是23,不會隨便變化

node_name=node1                       \\ node 名稱,另兩台是node2node3,主從複寫的參考值

conninfo='host=10.113.112.84 user=repmgr dbname=repmgr connect_timeout=2'

data_directory='/var/lib/postgresql/12/main'            \\資料庫所有參數的放置處

failover='automatic'                          \\ failover後自動切換

priority=100                                       \\ node的地位順序,node1設定100最高、node2設定80node2設定40

connection_check_type=ping

reconnect_attempts=6

reconnect_interval=10

monitoring_history=yes

monitor_interval_secs=2

standby_disconnect_on_failover=true

primary_visibility_consensus=true

log_status_interval=60

promote_command='repmgr standby promote -f /etc/repmgr.conf --log-to-file'   \\ failover發生後,standby node要升等的指令

follow_command='repmgr standby follow -f /etc/repmgr.conf --log-to-file'  \\ failover發生後,standby node要跟隨新primary的指令

log_file='/var/log/postgresql/repmgr.log'

log_level=NOTICE

service_start_command = 'systemctl start postgresql'  \\重要的參數,之前測試node沒有跟隨新primary,研究半天就是少了以下

service_stop_command = 'systemctl stop postgresql'

service_restart_command = 'systemctl restart postgresql'

service_reload_command = 'systemctl reload postgresql'

repmgrd_service_start_command = 'systemctl start repmgr'

repmgrd_service_stop_command = 'systemctl stop repmgr'


六.各node註冊身份

1.node1註冊primary(切換postgres

$ repmgr primary register

--檢查是否註冊成功

$ repmgr cluster show


2.node23註冊standby(切換postgres

$ cd /var/lib/postgresql/12/main

$ rm -rf *   \\先將本身的instance全部移除

$ repmgr -h 10.113.112.84 -U repmgr -d repmgr standby clone --dry-run \\先預演複製node1instance

$ repmgr -h 10.113.112.84 -U repmgr -d repmgr standby clone           \\正式複製node1instance

$ exit                                                                                                       \\換回root

# systemctl restart postgresql                                                                 \\重啟資料庫

# su - postgres                                                                                        \\換回postgres

$ repmgr standby register

--檢查是否註冊成功

$ repmgr cluster show

--接下來就會看到資料庫複寫狀態呈現這樣






(standby的資料庫都是read-only,不能夠寫入資料)


七.測試failover主從切換

1.關閉node1的資料庫

$ service postgresql stop


2.node2切換primary

--從node1觀看,這時候會看到三台node的狀態改變了,node2出現異動的驚嘆號,node2升等為primary,node3 follow的對象仍然還是node1


*(如果系統沒有自動切換時,用以下兩種指令)

$ repmgr standby promote           \\ repmgr primary register 直接升級為primary



--從node2查看狀態,發現node1變成驚嘆號、node2升等為primary



3.重啟node1並轉換成standy

$ sudo -i

# service postgresql start

# cd /var/lib/postgresql/12/main

# rm -rf * 

# repmgr -h 10.113.112.85 -U repmgr -d repmgr standby clone --dry-run

# repmgr -h 10.113.112.85 -U repmgr -d repmgr standby clone

#systemctl restart postgresql           \\複製instance後資料庫一定要再重啟,下一步註冊才會生效

$ su - postgres

$ repmgr standby register        \\node1不會自動降級為standby,必須重新手動註冊

$ repmgr standby follow       \\node1變成standby後,必須改跟隨node2


--任挑一台node查看狀態,node1變成standby了







4.node3的follow對象轉換成node2

# su - postgres

$ repmgr standby follow

最終結果:node2變成新的primary,其他兩個standby node的upstream也都變成node2。

最後跟隨的部分我還沒有研究出更自動化的做法,正常來說應該要在failover發生後每台node都能自己去追隨新的primary,不過已經先達成我要的結果了,就先告一段落。





沒有留言:

張貼留言

【IT Notes】透過api移轉Gmail到Exchange

 在雲端裡面串接api不是一件很好學的技術,第一次有機會學習到將GWS的Gmail信件全部轉移到M365的Exchange,其實方法很多種,像以前用的pst檔匯出轉移的方式等,但透過api串接,可以批次和排程轉移,是非常方便且準確的作法。唯一讓人感到困難的是學習成本不小,通常需要...