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

資訊專欄INFORMATION COLUMN

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

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

點擊上方“IT那活兒”公眾號,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!!!

Patroni方案簡介

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

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

部署環(huán)境

  • 操作系統(tǒng):CentOS Linux 7.8
  • 數(shù)據(jù)庫版本:PostgreSQL 13.1
  • Python版本:Python3.8
  • ETCD版本:3.3
  • Patroni版本:2.0.1

部署規(guī)劃:

主機名
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


環(huán)境準備

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

本節(jié)內(nèi)容不在此文展示。

2. 所有節(jié)點安裝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. 所有節(jié)點安裝patroni

3.1 依賴包安裝

注意:所有節(jié)點都需要安裝:
Yum install -y libffi-devel libuuid libuuid-devel
3.2 安裝python
注意:所有節(jié)點都需要安裝。
Tar -xzvf python-3.8.7.tgz
Cd python-3.8.7
./configure
Make -j 7
Make -j 7 install
設(shè)置系統(tǒng)默認的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 創(chuàng)建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加入服務(wù)開機啟動

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 啟動集群

  • 啟動數(shù)據(jù)庫:

    Pg_ctl start $PGDATA

  • 啟動etcd:

    Sudo systemctl start etcd

  • 啟動patroni:

    Sudo systemctl start patroni

操作演示

1. 查看節(jié)點狀態(tài)

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

2. 手工觸發(fā)主備切換

切換后,新主變?yōu)閜g2,在進行一次當前集群狀態(tài)查看:
原始舊主庫,自動切換為新主的備庫,TL時間線變化。切換后,舊主庫會自動跟隨新主庫。

3. 手工停止主節(jié)點Patroni

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

4. 手工停止主節(jié)點PG實例

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

綁定VIP

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

VIP綁定實現(xiàn):

1)修改patroni配置文件,每個節(jié)點都需要。
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那活兒”公眾號

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/129212.html

相關(guān)文章

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

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

    Martin91 評論0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服務(wù)架構(gòu)分析

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

    cikenerd 評論0 收藏0
  • PowerDotNet平臺化軟件架構(gòu)設(shè)計與實現(xiàn)系列(04):服務(wù)治理平臺

    摘要:的服務(wù)治理平臺發(fā)源于早期的個人項目。客戶端發(fā)現(xiàn)模式要求客戶端負責查詢注冊中心,獲取服務(wù)提供者的列表信息,使用負載均衡算法選擇一個合適的服務(wù)提供者,發(fā)起接口調(diào)用請求。系統(tǒng)和系統(tǒng)之間,少不了數(shù)據(jù)的互聯(lián)互通。隨著微服務(wù)的流行,一個系統(tǒng)內(nèi)的不同應(yīng)用進行互聯(lián)互通也是常態(tài)。 PowerDotNet的服務(wù)治理平臺發(fā)源于早期的個人項目Power.Apix。這個項目借鑒了工作過的公司的服務(wù)治理方案,站在...

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

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

    vspiders 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

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