国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于Patroni+etcd+流復制搭建PostgreSQL高可用

IT那活兒 / 2324人閱讀
基于Patroni+etcd+流復制搭建PostgreSQL高可用

點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了?。。?/strong>

Patroni方案簡介

Patroni是一個基于zk、etcd、consul等的pg ha模板,可以使用python來創建和定制高可用性解決方案。Patroni使用分布式key-value數據庫作為數據存儲,主節點故障時進行主節點重新選舉。通過PG內置的流復制,支持同步和異步復制。
由于數據庫信息記錄在ETCD中,通過增加部署實例數可以避免腦裂,且該方案自動化程度較高,可以自動初始化PG實例;當STANDBY實例關閉后,支持自動嘗試拉起;支持當主庫宕機后自動選取新主庫。

ETCD是一個基于RAFT協議的分布式Key-Value數據庫,基于Go語言編寫,Patroni監控本地的PG數據庫狀態,并將相關信息寫入ETCD。每個Patroni都能讀寫ETCD的KEY,從而獲取其他主機的PG數據庫實例信息。

部署環境

  • 操作系統:CentOS Linux 7.8
  • 數據庫版本:PostgreSQL 13.1
  • Python版本:Python3.8
  • ETCD版本:3.3
  • Patroni版本:2.0.1

部署規劃:

主機名
IP
組件
備注
PG1
192.168.21.135
PostgreSQL、Patroni、ETCD
MASTER
PG2
192.168.21.136
PostgreSQL、Patroni、ETCD
STANDBY
PG3
192.168.21.137
PostgreSQL、Patroni、ETCD
STANDBY


環境準備

1. 安裝PostgreSQL以及搭建流復制

本節內容不在此文展示。

2. 所有節點安裝etcd

  • PG1:
Sudo yum install -y etcd
Vi /etc/etcd/etcd.conf
ETCD_NAME="node1"
ETCD_DATA_DIR="/var/lib/etcd/node1.etcd"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.135:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.135:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.21.135:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.21.135:2380"
ETCD_INITIAL_CLUSTER="node1=http://192.168.21.135:2380,node2=http://192.168.21.136:2380,node3=http://192.168.21.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  • PG2:
Sudo yum install -y etcd
Vi /etc/etcd/etcd.conf
ETCD_NAME="node2"
ETCD_DATA_DIR="/var/lib/etcd/node2.etcd"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.136:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.136:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.21.136:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.21.136:2380"
ETCD_INITIAL_CLUSTER="node1=http://192.168.21.135:2380,node2=http://192.168.21.136:2380,node3=http://192.168.21.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  • PG3:
Sudo yum install -y etcd
Vi /etc/etcd/etcd.conf
ETCD_NAME="node3"
ETCD_DATA_DIR="/var/lib/etcd/node3.etcd"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.137:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.21.137:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.21.137:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.21.137:2380"
ETCD_INITIAL_CLUSTER="node1=http://192.168.21.135:2380,node2=http://192.168.21.136:2380,node3=http://192.168.21.137:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

3. 所有節點安裝patroni

3.1 依賴包安裝

注意:所有節點都需要安裝:
Yum install -y libffi-devel libuuid libuuid-devel
3.2 安裝python
注意:所有節點都需要安裝。
Tar -xzvf python-3.8.7.tgz
Cd python-3.8.7
./configure
Make -j 7
Make -j 7 install
設置系統默認的Python版本:
Rm -rf /usr/bin/python
Ln -s /usr/local/bin/python3 /usr/bin/pyhon
注意:操作yum使用的python2版本,修改默認的python版本后,yum無法正常使用,解決:
vi /usr/bin/yum
修改#!/usr/bin/python 為#!/usr/bin/python2

3.3 安裝patroni

Pip3 install psycopg2-binary
Pip3 install patroni[etcd]

3.4 創建patroni配置文件

  • PG1:
Mkdir /etc/patroni
Vi /etc/patroni/patroni.conf
scope: etcd_patroni_pg
namespace: /data/
name: pg1
restapi:
listen: 192.168.21.135:8008
connect_address: 192.168.21.135:8008
etcd:
host: 192.168.21.135:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_address: "*"
port: 5432
max_connections: 2000
hot_standby: "on"
max_locks_per_transactions: 128
max_prepared_transactions: 2000
max_replication_slots: 10
max_wal_sender: 10
max_worker_precesses: 256
track_commit_timestamp: "on"
wal_keep_size: 0
wal_level: replica
wal_log_hints: "on"
log_directory: "log"
log_destination: "stderr"
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.21.135:5432
data_dir: /data/pgdata
bin_dir: /opt/pg13/bin
pgpass: /home/postgres/.pgpass
authentication:
replication:
username: replica
password: replica
superuser:
username: postgres
password: root
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
  • PG2:
mkdir /etc/patroni
vim /etc/patroni/partoni.conf
scope: etcd_patroni_pg
namespace: /data/
name: pg2
restapi:
listen: 192.168.21.136:8008
connect_address: 192.168.21.136:8008
etcd:
host: 192.168.21.136:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_address: "*"
port: 5432
max_connections: 2000
hot_standby: "on"
max_locks_per_transactions: 128
max_prepared_transactions: 2000
max_replication_slots: 10
max_wal_sender: 10
max_worker_precesses: 256
track_commit_timestamp: "on"
wal_keep_size: 0
wal_level: replica
wal_log_hints: "on"
log_directory: "log"
log_destination: "stderr"
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.21.136:5432
data_dir: /data/pgdata
bin_dir: /opt/pg13/bin
pgpass: /home/postgres/.pgpass
authentication:
replication:
username: replica
password: replica
superuser:
username: postgres
password: root
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
PG3:
mkdir /etc/patroni
vim /etc/patroni/patroni.conf
scope: etcd_patroni_pg
namespace: /data/
name: pg3
restapi:
listen: 192.168.21.137:8008
connect_address: 192.168.21.137:8008
etcd:
host: 192.168.21.137:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_address: "*"
port: 5432
max_connections: 2000
hot_standby: "on"
max_locks_per_transactions: 128
max_prepared_transactions: 2000
max_replication_slots: 10
max_wal_sender: 10
max_worker_precesses: 256
track_commit_timestamp: "on"
wal_keep_size: 0
wal_level: replica
wal_log_hints: "on"
log_directory: "log"
log_destination: "stderr"
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.21.137:5432
data_dir: /data/pgdata
bin_dir: /opt/pg13/bin
pgpass: /home/postgres/.pgpass
authentication:
replication:
username: replica
password: replica
superuser:
username: postgres
password: root
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false

3.5 將patroni加入服務開機啟動

vi /etc/systemd/system/patroni.service
[Unit]
Description=patroni - a high-availability PostgreSQL
Documentation=https://patroni.readthedocs.io/en/latest/index.html
After=syslog.target network.target etcd.target
Wants=network-online.target
[Service]
Type=simple
User=postgres
Group=postgres
PermissionsStartOnly=true
ExecStart=/usr/local/bin/patroni /etc/patroni/patroni.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65536
KillMode=process
KillSignal=SIGINT
Restart=on-abnormal
RestartSec=30s
TimeoutSec=0
[Install]
WantedBy=multi-user.target

3.6 啟動集群

  • 啟動數據庫:

    Pg_ctl start $PGDATA

  • 啟動etcd:

    Sudo systemctl start etcd

  • 啟動patroni:

    Sudo systemctl start patroni

操作演示

1. 查看節點狀態

  • Role:顯示當前節點所屬狀態;
  • TL:顯示當前集群的時間線;
  • Lag in MB:顯示當前集群主備延遲大小。

2. 手工觸發主備切換

切換后,新主變為pg2,在進行一次當前集群狀態查看:
原始舊主庫,自動切換為新主的備庫,TL時間線變化。切換后,舊主庫會自動跟隨新主庫。

3. 手工停止主節點Patroni

在次觸發主備切換。
重新啟動patroni組件后,集群狀態:
Pg2自動跟隨新主庫pg3.

4. 手工停止主節點PG實例

停止主庫的后,patroni組件很快就檢測到主庫宕機,然后嘗試將主庫重新啟動。如果啟動不成功,則觸發主備切換。

綁定VIP

Patroni集群,在應用連接時,可以連接多個IP,在使用時,先判斷當前實例是否為MASTER,如果是,則業務繼續進行,否則需要嘗試其他IP。PATRONI可以將VIP綁定在MASTER節點,當主備切換時,VIP漂移到新主節點。

VIP綁定實現:

1)修改patroni配置文件,每個節點都需要。
scope: etcd_patroni_pg1
namespace: /data/
name: pg1
restapi:
listen: 192.168.21.135:8008
connect_address: 192.168.21.135:8008
etcd:
host: 192.168.21.135:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_address: "*"
port: 5432
max_connections: 2000
hot_standby: "on"
max_locks_per_transaction: 128
max_prepared_transactions: 2000
max_replication_slots: 10
max_wal_sender: 10
max_worker_precesses: 256
track_commit_timestamp: "on"
wal_keep_size: 0
wal_level: replica
wal_log_hints: "on"
log_directory: "log"
log_destination: "stderr"
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.21.135:5432
data_dir: /data/pgdata
bin_dir: /opt/pg13/bin
authentication:
replication:
username: replica
password: replica
superuser:
username: postgres
password: root
pgpass: /home/postgresql/.pgpass
callbacks:
on_start: /etc/patroni/patroni_callback.sh
on_stop: /etc/patroni/patroni_callback.sh
on_role_change: /etc/patroni/patroni_callback.sh

tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
注意:紅色部分,為綁定VIP需要的shell腳本。
2)Shell腳本:
#!/bin/bash

readonly cb_name=$1
readonly role=$2
readonly scope=$3

function usage() {
echo "Usage: $0  ";
exit 1;
}

echo "this is patroni callback $cb_name $role $scope"

case $cb_name in
on_stop)
sudo ip addr del 192.168.21.250/24 dev ens33 label ens33:1
sudo arping -q -A -c 1 -I ens33 192.168.21.250

#sudo iptables -F
;;
on_start)
;;
on_role_change)
if [[ $role == master ]]; then
sudo ip addr add 192.168.21.250/24 brd 192.168.21.255 dev ens33 label ens33:1
sudo arping -q -A -c 1 -I ens33 192.168.21.250

#sudo iptables -F
elif [[ $role == slave ]]||[[ $role == replica ]]||[[ $role == logical ]]; then
sudo ip addr del 192.168.21.250/24 dev ens33 label ens33:1
sudo arping -q -A -c 1 -I enp0s8 192.168.21.250

#sudo iptables -F
fi
;;
*)
usage
;;
esac



本文作者:魏 強(上海新炬王翦團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129212.html

相關文章

  • 新書推薦 |《PostgreSQL實戰》出版(提供樣章下載)

    摘要:作者譚峰張文升出版日期年月頁數頁定價元本書特色中國開源軟件推進聯盟分會特聘專家撰寫,國內多位開源數據庫專家鼎力推薦。張文升中國開源軟件推進聯盟分會核心成員之一。 很高興《PostgreSQL實戰》一書終于出版,本書大體上系統總結了筆者 PostgreSQL DBA 職業生涯的經驗總結,本書的另一位作者張文升擁有豐富的PostgreSQL運維經驗,目前就職于探探科技任首席PostgreS...

    Martin91 評論0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服務架構分析

    摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...

    cikenerd 評論0 收藏0
  • PowerDotNet平臺化軟件架構設計與實現系列(04):服務治理平臺

    摘要:的服務治理平臺發源于早期的個人項目??蛻舳税l現模式要求客戶端負責查詢注冊中心,獲取服務提供者的列表信息,使用負載均衡算法選擇一個合適的服務提供者,發起接口調用請求。系統和系統之間,少不了數據的互聯互通。隨著微服務的流行,一個系統內的不同應用進行互聯互通也是常態。 PowerDotNet的服務治理平臺發源于早期的個人項目Power.Apix。這個項目借鑒了工作過的公司的服務治理方案,站在...

    reclay 評論0 收藏0
  • PostgreSQL UDB,讓31會議數據管理更效可靠

    摘要:相比自建,其可靠性更高,方便運維維護。宋體經過審慎考慮,用戶同時選用三種數據庫,針對性的滿足不同目標。宋體宋體其中,相比于在上的快速高效是其優勢,也是用戶選型的重要砝碼。PostgreSQL UDB用在大數據分析上,查詢效率更高。相比自建,其可靠性更高,方便運維維護。 — 31會議運維經理 湯雷 如何用好PostgreSQL? PostgreSQL是業內一款十分流行的開源數...

    vspiders 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<