ááŒá¿áá¬ááŒá áºá á¥áºá¡áá»áááºá áá®ááŒá±ááŸááºážáá»ááºááᯠáá®ááœááºáááºáá®ážááá¯á· áá áºáá±á¬ááºáááºáž á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯á· áá¯á¶áá±á¬ááºáá²á· á¡ááœá±á·á¡ááŒá¯á¶áááŸáááá¯á· ááŒá áºááœá¬ážáá¬áá«á ááŒá®ážáá±á¬á· áá»áœááºáá±á¬áº Googling áá¯ááºáááºá
áá¬áááºážáááŸááºážááááá±ááá·áº áá»á°ááá¯áá®áááºááŸá¬ á¡ááá·áºááá·áºáá¯ááºááá»áŸááᯠá á¬áá±ážááá¬ááᯠáá°áá®áá²á·áááºáááºážáá»ááºááᯠááŒááºáááºáá¬ážáááºáá±á¬ááºá០áá¬ááŸáááŒá áºáá°ážááá¯áá²á·á¡áá»ááºáá²á· ááŒá¯á¶áá¬ááá¬áá«á áá¬ááá á¹á ááŸáááá¯á·áá² ááááá±ááá·áº á¡á²áá«ááᯠáááºááœá±á·áá²á·á¡áá«ááŸá¬áá±á¬á· á¡á¬ážáá¯á¶ážá¡áááºááŒá±ááœá¬ážáá²á·á¡áá« ááá¯ááºááá¯ááºáááºáááºážá á¬áá±ážááá¯á· áá¯á¶ážááŒááºáá²á·áá«áááºá áá±áá»á¬áá±á«áẠá¡áá¯ááºááŒá áºááá·áº áá áºáá¯áá«á
á¡ááºáá¬áááºáá±á«áºááŸááááºážááœáŸááºáá»á¬áž
á¡ááºáá¬áááºááẠáááºážááœáŸááºáá»ááºáá»á¬ážá áá»á°ááá¯áá®áááºáá»á¬ážá áá áºááá·áºááŒá®ážáá áºááá·áº ááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬áž áá»áá¯á·áá²á·ááŒááºážá០ááá¶á á¬ážááá± á Master server á០áá¯á¶áá°ááœá¬ážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠstreaming ááŸáá·áº Master server ááœáẠá¡áá¶áá¬ážááŸáááŒááºážá¡ááœáẠá¡ááá ááá¯á¡ááºáá»ááºááŒá áºáá±á¬ áá»ááŸá¯á¶ážáá±á¬ PostgreSQL á¡á á¯á¡áá±ážááᯠá¡áááºááŒá±á áœá¬ á á¯á ááºážááŒááºážááŸáá·áº áááºáá±á¬ááºááŒááºážá¡ááœáẠááŒá±ááŸááºážáá»ááºáá áºáááºááᯠáá±á¬áºáá±á¬ááºááẠáá¬áááºáá±ážá¡ááºááŒááºážáá¶ááááºááŸá¬ á€áá»áŸáá±á¬ááºááẠááŒá áºáá²á·áá«áááºá ááŸá¯á¶ážáááá·áºááŒááºážá
á€á¡ááá·áºááœááºá á¡áá¯á¶ážááŒá¯ááá·áºáááºážááá¬á¡á á¯á¡áá±ážááᯠáá¯á¶ážááŒááºáá²á·áááº-
- DBMS á¡ááŒá ẠPostgreSQL
Patroni á¡á á¯ááá¯ááºá¡ááŒá¯á¶ááá¯ááºááŒá±ááŸááºážáá»ááºá¡ááŒá áº- Patroni á¡ááœáẠááŒáá·áºáá±ááá¯ááŸá±á¬ááºááŸá¯á¡ááŒá Ạetcd
- áá±áá¬áá±á·á áºááᯠá¡áá¯á¶ážááŒá¯á á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠáá áºáá¯áááºážáá±á¬áááºááœáá·áºá¡ááŸááºááᯠá á¯á ááºážáááºá¡ááœáẠHAproxy
ustanovka
ááá·áºá¡á¬áá¯á¶á á°ážá áá¯ááºááŸá¯á¡ááœáẠ- Patroni, etcd, HAProxy ááᯠá¡áá¯á¶ážááŒá¯á á¡ááœááºáááŸáááá¯ááºáá±á¬ PostgreSQL á¡á á¯á¡áá±ážáá áºáá¯ááᯠáááºáá±á¬ááºááŒááºážá
áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááᯠDebian 10 OS ááá·áºááœááºážáá¬ážááá·áº virtual machines áá»á¬ážááœáẠáá¯ááºáá±á¬ááºáá²á·áááºá
á áááºááá¯á·
patroni ááŸáá·áº postgresql áááºááŸááᬠáá°áá®áá±á¬á
ááºáá»á¬ážááœáẠetcd ááᯠááá·áºááœááºážááẠá¡ááŒá¶ááŒá¯ááá¯áááºááá¯ááºáá«á á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº disk load ááẠetcd á¡ááœáẠá¡ááœááºá¡áá±ážááŒá®ážáá±á¬ááŒá±á¬áá·áº ááŒá
áºáááºá áá«áá±ááá·áº ááá¬áá±áž áááºááœááºáá»ááºá¡ááœáẠáá»áœááºáá±á¬áºááá¯á· áá¯ááºáááºá
etcd ááᯠinstall áá¯ááºáá¡á±á¬ááºá
#!/bin/bash
apt-get update
apt-get install etcd
á¡ááŒá±á¬ááºážá¡áá¬ááᯠ/etc/default/etcd ááá¯ááºááá¯á· ááá·áºáá«á
[á¡ááœá²á·áááº]
ETCD_NAME=datanode1 # ááá·áºá
ááºá hostname
ETCD_DATA_DIR=â/var/lib/etcd/default.etcdâ
IP ááááºá á¬áá»á¬ážá¡á¬ážáá¯á¶áž ááá¬ážáááºááŒá áºááá·áºáááºá LISTER PEERá Client á áááºááá¯á·ááᯠHost á IP ááááºá á¬ááœáẠáááºááŸááºááá·áºáááº
ETCD_LISTEN_PEER_URLS="
ETCD_LISTEN_CLIENT_URLS="
[á¡á á¯á¡áá±áž]
ETCD_INITIAL_ADVERTISE_PEER_URLS="
ETCD_INITIAL_CLUSTER=»datanode1=
ETCD_INITIAL_CLUSTER_STATE="á¡áá
áº"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="
á¡áááá·áºááᯠrun
systemctl restart etcd
PostgreSQL 9.6 + patroni
ááẠááááá¯á¶ážáá¯ááºáááŸá¬á áá°ááá¯á·á¡ááœáẠááá¯á¡ááºáá²á·áá±á¬á·ááºáá²ááᯠááá·áºááœááºážááá¯á·á¡ááœáẠvirtual machine áá¯á¶ážáá¯ááᯠáááºáááºáá«á á ááºáá»á¬ážááᯠáááºáááºááŒá®ážáá±á¬ááºá áááºááẠáá»áœááºá¯ááºá áááºáááºážá á¬ááᯠááá¯ááºáá¬áá«áá ááá·áºá¡ááœáẠ(á¡á¬ážáá¯á¶ážáá®ážáá«áž) áá¯ááºáá±á¬ááºáá±ážááá·áº á€ááá¯ážááŸááºážáá±á¬ script ááᯠááẠrun ááá¯ááºáá«áááºá root á¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºáááºá
script ááẠPostgreSQL áá¬ážááŸááºáž 9.6 ááᯠá¡áá¯á¶ážááŒá¯áá¬ážááŒá±á¬ááºáž áá»á±ážáá°ážááŒá¯á áááááŒá¯áá«á áááºážááẠáá»áœááºá¯ááºááá¯á·á áá¯áá¹ááá®á á¡ááœááºážááá¯ááºážááá¯á¡ááºáá»ááºáá»á¬ážááŒá±á¬áá·áº ááŒá áºáá«áááºá á¡ááŒá±ááᯠPostgreSQL á á¡ááŒá¬ážáá¬ážááŸááºážáá»á¬ážááœáẠá ááºážáááºááá¬ážáá«á
#!/bin/bash
apt-get install gnupg -y
echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y
systemctl stop postgresql
pip3 install --upgrade pip
pip install psycopg2
pip install patroni[etcd]
echo "
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target
[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/local/bin/patroni /etc/patroni.yml
KillMode=process
TimeoutSec=30
Restart=no
[Install]
WantedBy=multi-user.targ
" > /etc/systemd/system/patroni.service
mkdir -p /data/patroni
chown postgres:postgres /data/patroni
chmod 700 /data/patroniпП
touch /etc/patroni.yml
ááá¯á·áá±á¬ááºá áááºáááºáá®ážááá¯ááºáá±á¬ /etc/patroni.yml ááá¯ááºááœááºá áááºááẠá¡á±á¬ááºáá«á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠáá±áá¬áá»ááẠááá¯á¡ááºááŒá®áž áá±áá¬á¡á¬ážáá¯á¶ážááœáẠIP ááááºá
á¬áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯ááá·áºááááºá
á¬áá»á¬ážááá¯á· ááŒá±á¬ááºážáá±ážááááºááŒá
áºáááºá
ဠyaml ááœááºááŸááºáá»ááºáá»á¬ážááá¯á¡á¬áá¯á¶á
áá¯ááºáá«á á¡á
á¯á¡áá±ážááŸá á
ááºáá
áºáá¯á
á®ááœáẠááá·áºááá¯ááºááá¯ááºááááºá
á¬áá»á¬ážááᯠááŒá±á¬ááºážáá²áá«á
/etc/patroni.yml
scope: pgsql # ЎПлжМП бÑÑÑ ÐŸÐŽÐžÐœÐ°ÐºÐŸÐ²ÑÐŒ Ма вÑеÑ
МПЎаÑ
namespace: /cluster/ # ЎПлжМП бÑÑÑ ÐŸÐŽÐžÐœÐ°ÐºÐŸÐ²ÑÐŒ Ма вÑеÑ
МПЎаÑ
name: postgres1 # ЎПлжМП бÑÑÑ ÑазМÑÐŒ Ма вÑеÑ
МПЎаÑ
restapi:
listen: 192.168.0.143:8008 # аЎÑÐµÑ ÑПй МПЎÑ, в кПÑПÑПй МаÑ
ПЎОÑÑÑ ÑÑÐŸÑ Ñайл
connect_address: 192.168.0.143:8008 # аЎÑÐµÑ ÑПй МПЎÑ, в кПÑПÑПй МаÑ
ПЎОÑÑÑ ÑÑÐŸÑ Ñайл
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # пеÑеÑОÑлОÑе зЎеÑÑ Ð²Ñе ваÑО МПЎÑ, в ÑлÑÑае еÑлО Ð²Ñ ÑÑÑаМавлОваеÑе etcd Ма МОÑ
же
# this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
bootstrap:
dcs:
ttl: 100
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
hot_standby: "on"
wal_keep_segments: 5120
max_wal_senders: 5
max_replication_slots: 5
checkpoint_timeout: 30
initdb:
- encoding: UTF8
- data-checksums
- locale: en_US.UTF8
# init pg_hba.conf ЎПлжеМ ÑПЎеÑжаÑÑ Ð°ÐŽÑеÑа ÐСÐÐ¥ ЌаÑОМ, ОÑпПлÑзÑеЌÑÑ
в клаÑÑеÑе
pg_hba:
- host replication postgres ::1/128 md5
- host replication postgres 127.0.0.1/8 md5
- host replication postgres 192.168.0.143/24 md5
- host replication postgres 192.168.0.144/24 md5
- host replication postgres 192.168.0.145/24 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 192.168.0.143:5432 # аЎÑÐµÑ ÑПй МПЎÑ, в кПÑПÑПй МаÑ
ПЎОÑÑÑ ÑÑÐŸÑ Ñайл
connect_address: 192.168.0.143:5432 # аЎÑÐµÑ ÑПй МПЎÑ, в кПÑПÑПй МаÑ
ПЎОÑÑÑ ÑÑÐŸÑ Ñайл
data_dir: /data/patroni # ÑÑÑ ÐŽÐžÑекÑПÑÐžÑ ÑПзЎаÑÑ ÑкÑОпÑ, ПпОÑаММÑй вÑÑе О ÑÑÑÐ°ÐœÐŸÐ²ÐžÑ ÐœÑжМÑе пÑава
bin_dir: /usr/lib/postgresql/9.6/bin # ÑкажОÑе пÑÑÑ ÐŽÐŸ ваÑей ЎОÑекÑПÑОО Ñ postgresql
pgpass: /tmp/pgpass
authentication:
replication:
username: postgres
password: postgres
superuser:
username: postgres
password: postgres
create_replica_methods:
basebackup:
checkpoint: 'fast'
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
áá¬ááºááœáŸááºážááᯠá¡á á¯á¡áá±ážá á ááºáá¯á¶ážáá»áá¯ážáá¯á¶ážááœáẠáá¯ááºáá±á¬ááºááááºááŒá áºááŒá®áž á¡áááºáá±á¬áºááŒáá«ááœá²á·á ááºážáá¯á¶ááᯠá ááºá¡á¬ážáá¯á¶ážááœáẠ/etc/patroni.yml ááá¯ááºááœáẠááá·áºááœááºážáá¬ážááá«áááºá
á¡á á¯á¡áá±ážááŸá á ááºáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠá€áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠááŒá®ážááŒá±á¬ááºááŒá®ážáááºááŸáá·áº áááºážááá¯á·á¡áááºá០á¡á±á¬ááºáá« command ááᯠrun áá«á
systemctl start patroni
systemctl start postgresql
á áá¹ááá·áº 30 ááá·áºá á±á¬áá·áºáá«á ááá¯á·áá±á¬áẠá¡á á¯á¡áá±ážááŸá áá»ááºá ááºáá»á¬ážááœáẠá€á¡áááá·áºááᯠáá¯ááºáá±á¬ááºáá«á
HAproxy
áááºáá±á«ááºáá áºáá¯á¡ááœáẠá¡á¶á·ááœááºáá±á¬ááºážáá±á¬ HAproxy ááᯠáá»áœááºá¯ááºááá¯á· á¡áá¯á¶ážááŒá¯áá«áááºá áá¬á áá¬áá¬áá¬ááẠHAproxy ááá¯á¡áá¯á¶ážááŒá¯áá¬ážááá·áº á ááºáááááºá á¬ááœáẠá¡ááŒá²áááºážáááŸáááá¯ááºáááºááŒá áºáááºá
HAproxy ááŒáá·áº á ááºááᯠáá»áá¯á·ááœááºážáá»ááºáá áºáá¯áááºážá¡ááŒá ẠáááŒá áºá á±áááºá¡ááœááºá áááºážááᯠDocker ááœááºááááºáá¬ááœáẠáá»áœááºá¯ááºááá¯á· á áááºáá¯ááºáá±á¬ááºáááºááŒá áºááŒá®ážá á¡áá¬áááºááœáẠáááºážááᯠK8 á á¡á á¯á¡áá±ážááá¯á· ááœáŸáá·áºáááºááá¯ááºááŒá®áž áá»áœááºá¯ááºááá¯á·á failover á¡á á¯á¡áá±ážááᯠááá¯ááá¯áá¯á¶ááŒááºá áááºáá»áá á±áááºá
Dockerfile ááŸáá·áº haproxy.cfg ááá¯ááºááŸá áºáá¯ááᯠááááºážáááºážááá¯ááºááá·áº áááºážááœáŸááºáá áºáᯠáááºáá®ážáá«á ááœá¬ážááá¯ááºáá«á
dockerfile
FROM ubuntu:latest
RUN apt-get update
&& apt-get install -y haproxy rsyslog
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /run/haproxy
COPY haproxy.cfg /etc/haproxy/haproxy.cfg
CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log
ááááá¬ážáá«á haproxy.cfg ááá¯ááºá áá±á¬ááºáá¯á¶ážá á¬ááŒá±á¬ááºážáá¯á¶ážááŒá±á¬ááºážááẠááá·áºá ááºáá»á¬ážá ááááºá á¬áá»á¬ážááᯠá á¬áááºážááŒá¯á á¯áá¬ážááá·áºáááºá HAproxy ááẠPatroni ááᯠáááºááœááºáááºááŒá áºááŒá®ážá HTTP áá±á«ááºážá á®ážáá»á¬ážááœáẠáá¬á áá¬áá¬áá¬ááẠá¡ááŒá²áááºáž 200 ááŒááºáá¬áááºááŒá áºááŒá®áž áá¯á¶á á¶áá°ááẠá¡ááŒá²áááºáž 503 ááá¯á· ááŒááºááœá¬ážáááºááŒá áºáááºá
haproxy.cfg
global
maxconn 100
defaults
log global
mode tcp
retries 2
timeout client 30m
timeout connect 4s
timeout server 30m
timeout check 5s
listen stats
mode http
bind *:7000
stats enable
stats uri /
listen postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008
server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008
server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008
áá»áœááºá¯ááºááá¯á·áááá¯ááºááŸá áºáá¯áá¯á¶ážááẠâááááºáááºáá±áááºâ áá°áá±á¬ áááºážááœáŸááºááœááºááŸááá±ááŒááºážááŒáá·áº ááœááºááááºáá¬áá¯ááºááá¯ážááŒááºážá¡ááœáẠá¡áááá·áºáá±ážáá»ááºáá»á¬ážááᯠáááºááá¯ááºáá¯ááºáá±á¬ááºááŒá®áž ááá¯á¡ááºáá±á¬ port áá»á¬ážááᯠáááºááá·áºáá±ážááá¯á·ááŒááºážááŒáá·áº áááºážááᯠá áááºááá¯ááºáááº-
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy
ááá¯á browser ááœáẠHAproxy ááŒáá·áº ááá·áºá ááºáááááºá á¬ááá¯ááœáá·áºááŒá®áž port 7000 ááá¯áááºááŸááºááŒááºážááŒáá·áºá áááºáá¡á á¯á¡áá±ážáá±á«áºááœáẠá á¬áááºážááá¬ážáá»á¬ážááᯠáááºááœá±á·áááá·áºáááºá
áá¬á áá¬ááŒá áºááá·áº áá¬áá¬ááẠUP á¡ááŒá±á¡áá±ááœááºááŸááááºááŒá áºááŒá®áž áá¯á¶áá°áá»á¬ážááẠDOWN á¡ááŒá±á¡áá±ááœáẠááŸááá±áááºááŒá áºáááºá áááºážááẠáá¯á¶ááŸááºááŒá áºáááºá á¡ááŸááºááœáẠáááºážááá¯á·ááẠá¡áá¯ááºáá¯ááºáá±á¬áºáááºáž HAproxy á០áá±á¬ááºážááá¯áá»ááºáá»á¬ážá¡ááœáẠ503 ááᯠááŒááºáá±ážáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááẠá€áá¯á¶á á¶á¡ááá¯ááºáž áá±á«áºáá¬áááºá áááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áá¬áá¬áá¯á¶ážáá¯á¡áááºá០áááºááŸááá¬á áá¬ááŒá áºááŒá±á¬ááºáž á¡ááŒá²áááŒááºááááŸáááá¯ááºá á±áá«áááºá
áá±á¬ááºáá»ááº
áááºážá á¡áááºážááŸáááºá áááá
Ạ30 á¡ááœááºážááŸá¬áá² streaming replication áá²á· á¡ááá¯á¡áá»áŸá±á¬áẠáá¯á¶á·ááŒááºááŸá¯ááá¯á·áá²á·á¡áá° áá±á¬ááºážááœááºáá²á· á¡ááŸá¬ážá¡ááœááºážáá¶ááá¯ááºáááºááŸáááŒá®áž á
áœááºážáá±á¬ááºáááºááŒáá·áº áá±áá¬áá±á·á
áºá¡á
á¯á¡áá±ážááᯠááŒáá·áºáá»ááºááŒá®ážáá«ááŒá®á á€ááŒá±ááŸááºážáá»ááºááᯠá¡áá¯á¶ážááŒá¯ááẠá
á®á
ááºáá±áá«á á
á
áºáá±ážááŒáá·áºáá«á
áá¯ááºáá°áá«áááºá
source: www.habr.com