PostgreSQL 來自歐羅巴Patroni Patroni 安裝 3
作為一個系列,下面在介紹完什麼要使用 patroni 以及為什麼選擇 etcd後, 今天就開始需要安裝patroni , 由於patroni 是一個基於python 的程式,這就與patroni的版本和python有關.
目前使用patroni 就需要考慮使用python 3了,centos 上需要去單獨安裝python3
yum -y install libffi-devel
wgethttps://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
xz -d Python-3.9.2.tgz
tar xvf Python-3.8.2.tar
pip3 install patroni[etcd] -i https://mirrors.aliyun.com/pypi/simple/
pip3 install psycopg2-binary -i https://mirrors.aliyun.com/pypi/simple/
pip3 install patroni -i https://mirrors.aliyun.com/pypi/simple/
安裝是完畢了,但比較困難和難以理解的問題
既然是使用了ETCD的分散式資料庫,那就會牽扯到一個問題,資料庫的配置,這在之前的 repmgr 以及其他的高可用沒有遇到這樣的問題, 因為repmgr 在操作的過程中,整體的配置(如果你的配置檔案在製作repmgr standby 節點的時候就複製過了了,前提是你的配置檔案一同通過備份過來)
有一個點是我們的postgresql的配置,是存在在Distributed Configuration Store,資料,主要分三類
1 動態配置檔案
2本地配置檔案
3環境配置
首先Dynamic configuration主要是在DCS 分散式系統的設定,這些選項在系統的啟動的時候被應用,同時如果在系統啟動時並未被使用,在下一個執行的週期會將這些配置進行應用. 如果有不能被立即應用的配置,則會在相關位置新增pendingrestart 的標識.
其次, local configuration 的優先順序要大於 dynamic configuration,在啟動時將這些配置通過sighup 訊號的方式傳送給patroni.
另外還有Environment configuration,有些配置是需要本地的一些引數的配置.
etcd --config-file /etc/etcd.conf &
首先需要確認ETCD 是否正常工作,ETCD 不正常工作則後續的工作很難完成.
安裝方面ETCD 在上期已經完成這裡就不在說明了.
在本篇中的安裝完成後,需要配置patroni 的配置檔案, 在patroni 啟動之前,需要將 POSTGRESQL 的三臺機器進行相關的複製,
當然之前需要對postgresql 的pg_hba 和 postgresql.conf的初始化進行配置,
pg_basebackup -h 192.168.198.66 -U repuser -p 5432 -D /pgdata/data/ -P -Xs -R
這裡就不多說如何進行相關的複製的連線的建立,這屬於前期需要知曉的問題.
scope: pg_patroni
namespace: /service/
name: pg_patroni1
restapi:
listen: 192.168.198.66:8008
connect_address: 192.168.198.66:8008
etcd:
#Provide host to do the initial discovery of the cluster topology:
host: 192.168.198.66:2379
bootstrap:
# this p will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
restapi:
listen: 192.168.198.66:8008
connect_address: 192.168.198.66:8008
etcd:
#Provide host to do the initial discovery of the cluster topology:
host: 192.168.198.66:2379
bootstrap:
# this p will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1038571
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: locical
hot_standby: "on"
wal_keep_segments: 12
max_wal_senders: 10
max_replication_slots: 10
wal_log_hints: "on"
archive_mode: "on"
hot_standby: on
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.198.66:5432
data_dir: /pgdata/data
bin_dir: /usr/local/postgres/bin
config_dir: /pgdata/data/
pgpass: /home/postgres/patroni/.pgpass
authentication:
replication:
username: repuser
password: repuser
superuser:
username: postgres
password: postgres
rewind: # Has no effect on postgres 10 and lower
username: pgrewind
password: pgrewind
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
啟動patroni 一個
patroni /etc/patroni.yml > /pgdata/patroni.log 2>&1 &
patronictl -c /etc/patroni.yml list
基本上patroni 的安裝就完畢了, 但實際上一個軟體的安裝緊緊是開始使用這個軟體的開始,並不是終結.
到底一個軟體的設計思路和構造是需要弄明白的,首先patroni 的使用的原理以及前置條件是什麼.
Patroni 主要是基於postgresql 的streaming Replication,基本上軟體的分發是通過pip的方式來進行安裝的,對於Centos , RHEL 的 RPM 包一般有 CYBERTEC 來進行提供.
Patroni 建立叢集, 初始化流複製,包括同步需求,監控複製的狀態,另外patroni也負責改變叢集成員的配置,或者重新reload設定,同時會負責計劃中的primary standby 的手動交換,以及意外情況的failover ,通過rewind 將一個失敗的 primary 節點重新拉上線,重新初始化複製的連線.
Patroni 在被設計的之初就考慮了穩定和容錯性,避免了Brain-Split的問題
Patroni收集的所有資料都映象在一個分散式鍵-值儲存中,並且基於儲存中提供的資訊,所有的Patroni例項在決策上達成一致,例如,如果主伺服器失敗,應該提升哪個副本,通過分散式鍵值儲存,達到叢集中的每臺機器的狀態的共享,通過這些元件來進行高可用方面的切換工作等.。同時postgresql 也提供相關的介面, 如果通過其他軟體獲知當前的系統的狀態也是可行的,例如進行讀寫分離.
那麼上一篇提到的patroni 在配置檔案上有三種, 那麼就涉及一個點,就是配置檔案中配置的是否需要一致.舉例下面的配置在patroni 管理的伺服器叢集中配置一定是要一致的, 因為在切換的過程中必須要求,這些都是動態值,不允許在單一伺服器上生效.
max_connections:
max_locks_per_transaction:
max_worker_processes:
max_prepared_transactions
wal_level:hot_standby
wal_log_hints: on
track_commit_timestamp: off
另外還有一些其他的設定如
max_wal_sender
max_replicaiton_slots:
wal_keep_segments:
listen_address
port
cluster_name
host_standby
以上的引數也需要在所有的叢集的機器中,要一致
目前待發布系列4 5 6 7