แแกแ แแแฎแแ, แ แแ แแ แแ แแก, แ แแชแ แแ แแแแแแ แฌแแแแแญแ แ, แแ แแ แแฅแแแแ แกแแแแแ แแกแ แแแแแชแแแแแแ แแ แแแแแฌแงแแแขแแก แแแ แขแ แจแแแฃแจแแแแแแกแ แแ แแแจแแแแแกแแแแก. แจแแแแแ แแแแแฌแงแ แแฃแแแแแแ.
แแ แแแชแ, แ แ แแ แแก แแแญแแ แ, แแแแ แแ แฃแแแ แแแแแแฏแแ แแแฌแงแแแแ แแ แคแแฅแขแก, แ แแ แแฃแแแแช แแขแแแแแ แแแแ แแแแแแ แงแแแแแคแแ แ, แ แแแแ แช แกแแฎแแแแซแฆแแแแแแแจแ, แแแแแแแแแ แแแแแ แแแ แแแ, แ แแแแ แช แแแขแแ แ, แแแจแแ แแ แแคแแ แ แแแแแแแแแ. แฌแแ แแแแแแแ แแ แแแฅแแก, แ แแจแแ แกแแฅแแ, แแแแ แแ แ แแชแ แแแแก แแกแแ แจแแแฎแแแ, แแแแแแฌแงแแแขแ, แ แแ แแแแฌแแ แ แฉแแแ แแแแแแแแแ, แ แแชแ แงแแแแแคแแ แ แแแแแแ. แแ แแ, แ แแแแแแช แแฃแชแแแแแแแ แแแฃแจแแแแแก.
แแแแแแ แแแขแแ แแแขแจแ
แแกแ แฎแแแแ, แ แแ แแแขแแ แแแขแ แแ แแแแแชแแแก แกแฎแแแแแกแฎแแ แกแแฎแแแแซแฆแแแแแแแแแแก, แแแแแแแแแแแแก, แแแแแฏ-แแแแแฏ แแ แแกแแแแกแแก แแแแแแแแแแก. แแกแ แแแฎแแ, แ แแ แแ แแแแแแแแฃแแ แแฅแแแแ แแแแแฌแงแแแขแแแแแแก แจแแแฃแจแแแแแ PostgreSQL แแแแกแขแแ แแก แแแกแแฎแแ แฎแแแแแ แแ แแแแแแแแแกแ แแ แแจแแแแแแกแแแแก, แ แแแแแก แซแแ แแแแแ แแแแฎแแแแแแ แแงแ Master แกแแ แแแ แแแแ แ แแแแแแแชแแ แงแแแแ แ แแแแแแแแ แแ แ แแแแ แแแก แแแขแแแแขแฃแ แ แฃแแ แฃแแแแแงแแคแ Master แกแแ แแแ แแก แจแแแแฎแแแแแจแ. แฌแแ แฃแแแขแแแแแแ.
แแ แแขแแแแ แแแแแกแแแฆแแ แ แแแแแงแแแแแฃแแ แขแแฅแแแแแแแแแแก แแแแ แแแ:
- PostgreSQL แ แแแแ แช DBMS
แแแขแ แแแ แ แแแแ แช แแแแกแขแแ แฃแแ แแแแแฌแงแแแขแ- etcd แ แแแแ แช แแแแแฌแแแแแฃแแ แกแแชแแแ แแแขแ แแแแกแแแแก
- HAproxy แแแแแแแชแแแแแกแแแแก แแ แแ แจแแกแแแแก แฌแแ แขแแแแก แแ แแแแแแแแแกแแแแก แแแแแชแแแแ แแแแแก แแแแแงแแแแแแ
แแแงแแแแแแก
แแฅแแแแ แงแฃแ แแแฆแแแแกแแแแก - แจแแฅแแแแแ แฃแแฆแ แแกแแ แฎแแแแแกแแฌแแแแแ PostgreSQL แแแแกแขแแ แ Patroni, etcd, HAProxy แแแแแงแแแแแแ.
แงแแแแ แแแแ แแชแแ แจแแกแ แฃแแแ แแแ แขแฃแแแฃแ แแแแฅแแแแแแ แแแแแกแขแแแแ แแแฃแแ Debian 10 OS-แแ.
แ.แจ.แจ
แแ แแแ แฉแแแ etcd-แแก แแแงแแแแแแก แแแแแ แแแแฅแแแแแแ, แกแแแแช patroni แแ postgresql แแฅแแแแ แแแแแแแกแแแฃแแ, แแแแแแแแ แแแกแแแก แแแขแแแ แแแ etcd-แกแแแแก แซแแแแแ แแแแจแแแแแแแแแแ. แแแแ แแ แกแแแแแแแแแแแแแแ แแแแแแแแกแแแแก แฉแแแ แแแแก แแแแแแแแแแ.
แแแแแ แแแแแแแกแขแแแแ แแ etcd.
#!/bin/bash
apt-get update
apt-get install etcd
แแแแแแขแแ แจแแแแแ แกแ /etc/default/etcd แคแแแแจแ
[แฌแแแ แ]
ETCD_NAME=datanode1 แแฅแแแแ แแแแ แแขแแก # แฐแแกแขแแก แกแแฎแแแ
ETCD_DATA_DIR=โ/var/lib/etcd/default.etcdโ
แงแแแแ IP แแแกแแแแ แแ แฃแแแ แแงแแก แแแฅแแแแ. LISTER PEER, Client แแ แ.แจ. แฃแแแ แแงแแก แแแงแแแแแฃแแ แแแกแแแแซแแแก 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="
แแแฃแจแแแ แแ แซแแแแแ
systemctl restart etcd
PostgreSQL 9.6 + แแคแแ แแแแ
แแแ แแแแ, แ แแช แฃแแแ แแแแแแแแ, แแ แแก แกแแแ แแแ แขแฃแแแฃแ แ แแแแ แแขแแก แแแงแแแแแ แแแแแ แกแแญแแ แ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แแแกแแงแแแแแแแ. แแแแฅแแแแแแก แแแงแแแแแแก แจแแแแแ, แแฃ แแแฐแงแแแแแ แฉแแแก แแแแแแแแแก, แจแแแแซแแแแ แแแฃแจแแแ แแก แแแ แขแแแ แกแแ แแแขแ, แ แแแแแแช (แแแแฅแแแก) แงแแแแแคแแ แก แแแแแแแแแก แแฅแแแแแแแก. แแฃแจแแแแก แ แแแแ แช root.
แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ แกแแ แแแขแ แแงแแแแแก 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 แแแกแแแแ แแแแ แงแแแแ แแแแแแแก แแ แแแกแแแแ แแแแแ, แ แแแแแแกแแช แแงแแแแแ.
แงแฃแ แแแฆแแแ แแแแฅแชแแแ แแ แแแแแแก แแแแแแขแแ แแแก. แจแแชแแแแแ แแแกแแแแ แแแแ แแแแกแขแแ แจแ แแแแแแฃแ แแแแฅแแแแแ.
/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 แคแแแแจแ แงแแแแ แแแแฅแแแแแ.
แแแก แจแแแแแ แ แแช แแแแกแ แฃแแแแ แแ แแแแ แแชแแแแก แแแแกแขแแ แแก แงแแแแ แแแแฅแแแแแ, แแแฃแจแแแ แจแแแแแแ แแ แซแแแแแ แ แแแแแแแ แแแแแแแแ
systemctl start patroni
systemctl start postgresql
แแแแแแแแ แแแแฎแแแแแแ 30 แฌแแแก, แจแแแแแ แแแฃแจแแแ แแก แแ แซแแแแแ แแแแกแขแแ แจแ แแแ แฉแแแแ แแแแฅแแแแแแ.
HAproxy
แฉแแแ แแแงแแแแแ แจแแกแแแแจแแแ HAproxy-แก แแ แแ แจแแกแแแแก แฌแแ แขแแแแก แฃแแ แฃแแแแแกแแงแแคแแ. แกแแแแแแกแขแ แ แกแแ แแแ แ แงแแแแแแแแก แฎแแแแแกแแฌแแแแแ แแฅแแแแ แแ แแแแ แแขแแก แแแกแแแแ แแแ, แ แแแแแแแช แแแแแแแแแฃแแแ HAproxy.
แแแแกแแแแแก, แ แแ HAproxy-แแก แแฅแแแ แแแแฅแแแ แแ แแแฎแแแก แแ แแ แแแ แชแฎแแก แฌแแ แขแแแ, แฉแแแ แแแก แแแแฃแจแแแ Docker-แแก แแแแขแแแแแ แจแ; แแแแแแแแจแ แแแกแ แแแจแแแแ แจแแกแแซแแแแแแแ K8-แแก แแแแกแขแแ แจแ แแ แแแแแ แฃแคแ แ แกแแแแ แแแแฎแแแแ แฉแแแแ แคแแแแแแ แแก แแแแกแขแแ แ.
แจแแฅแแแแแ แแแ แแฅแขแแ แแ, แกแแแแช แจแแแแซแแแแ แจแแแแแฎแแ แแ แ แคแแแแ - 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-แก.
แฐแแแ แแฅแกแ.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
แแ แแแ แแฅแขแแ แแแจแ แงแแคแแแกแแก, แ แแแแแจแแช แฉแแแแ แแ แแแ แคแแแแ "แแแแก", แแแแแ, แแแแแแแแแแ แฃแแแ แจแแแแกแ แฃแแแ แแ แซแแแแแแแ แแแแขแแแแแ แแก แจแแคแฃแแแแแ, แแกแแแ แ แแแแ แช แแแกแ แแแจแแแแ แกแแญแแ แ แแแ แขแแแแก แแแแแแแแแ:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy
แแฎแแ, แแ แแฃแแแ แจแ HAproxy-แแ แแฅแแแแ แแแแ แแขแแก แแแกแแแแ แแแก แแแฎแกแแแ แแ 7000 แแแ แขแแก แแแแแแแแแ, แแฅแแแ แแฎแแแแแ แกแขแแขแแกแขแแแแก แแฅแแแแก แแแแกแขแแ แแ.
แกแแ แแแ แ, แ แแแแแแช แแ แแก แแแกแขแแ แ, แแฅแแแแ UP แแแแแแแ แแแแแจแ, แฎแแแ แแกแแแแ แแฅแแแแ DOWN แแแแแแแ แแแแแจแ. แแก แแแ แแแแฃแ แแ, แกแแแแแแแแแแจแ แแกแแแ แแฃแจแแแแแ, แแแแ แแ แแแฉแแแแแแแ แแ แแแแ แแแแก แแแแ, แ แแ แแกแแแ แแแ แฃแแแแแ 503-แก HAproxy-แแก แแแแฎแแแแแกแแแแก. แแก แแแแซแแแแก แกแแจแฃแแแแแแก แงแแแแแแแแก แแฃแกแขแแ แแแชแแแแ แกแแแ แกแแ แแแ แแแแ แ แแแแแแ แแแแแแแแแแแ แแแกแขแแ แ.
แแแกแแแแ
แฒจแแ แจแแกแแแแจแแแแ แฎแแ ! แกแฃแ แ แแฆแแช 30 แฌแฃแแจแ แแฅแแแ แแแแแแแแกแแ แจแแกแแแแจแแแแ แฎแแ แแแแแแแกแแแแ แขแแแแ แแแขแฃแแ แแ แแแฆแแแ แฎแแ แแกแฎแแก แแแแแชแแแแ แแแแแก แแแแกแขแแ แ แแแแแแแก แ แแแแแแแชแแแ แแ แแแขแแแแขแฃแ แ แฉแแแแชแแแแแแ. แแฃ แแฅแแแ แแแแแแแ แแ แแแแแฌแงแแแขแแก แแแแแงแแแแแแก, แจแแแแแฌแแแ
แแแแแชแแแ!
แฌแงแแ แ: www.habr.com