Soa ihany fa tamin'ny fotoana nipoiran'ny olana dia tsy nanana traikefa ampy hamolavolana sy hamoahana io vahaolana io irery aho. Ary avy eo dia nanomboka Googling aho.
Tsy fantatro hoe inona no tratra, fa fanintelony aho dia miatrika ny zava-misy fa na dia manao ny zava-drehetra tsikelikely toy ny ao amin'ny lesona aza aho, manomana tontolo mitovy amin'ny mpanoratra, dia tsy misy na inona na inona mandeha. Tsy fantatro hoe inona no olana, fa rehefa nifanena tamin'izany indray aho dia nanapa-kevitra fa hanoratra ny torolalako manokana aho rehefa mandeha ny zava-drehetra. Iray azo antoka fa hahomby.
Torolàlana amin'ny Internet
Sendra ny Internet dia tsy mijaly noho ny tsy fahampian'ny mpitari-dalana isan-karazany, fampianarana, dingana-by-dingana sy ny toy izany. Nitranga izany fa nasaina namolavola vahaolana aho mba handaminana sy hananganana kluster PostgreSQL failover, ny fepetra lehibe indrindra dia ny fandefasana kopia avy amin'ny mpizara Master mankany amin'ny kopia rehetra sy ny fanomezana automatique ny tahiry raha misy mpizara Master. tsy fahombiazana.
Amin'ity dingana ity, nofaritana ny fitambaran'ny teknolojia ampiasaina:
- PostgreSQL ho DBMS
- ho toy ny vahaolana clustering
- etcd ho tahiry zaraina ho an'ny Patroni
- HAproxy amin'ny fandaminana teboka fidirana tokana ho an'ny fampiharana mampiasa ny angon-drakitra
fametrahana
Ho an'ny sainao - manangana cluster PostgreSQL tena azo ampiasaina amin'ny fampiasana Patroni, etcd, HAProxy.
Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.
sns
Tsy manoro hevitra ny fametrahana etcd amin'ny milina iray izay misy ny patroni sy postgresql aho, satria ny enta-mavesatra dia tena zava-dehibe amin'ny etcd. Fa ho an'ny tanjona fanabeazana dia hanao izany izahay.
Andao hametraka sns.
#!/bin/bash
apt-get update
apt-get install etcdAmpio votoaty amin'ny rakitra /etc/default/etcd
[mpikambana]
ETCD_NAME=datanode1 # anarana mpampiantrano ny milinanao
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
TOKONY HO VALIO NY ADDRESS IP REHETRA. LISTER PEER, CLIENT sns TOKONY Apetraka amin'ny adiresy IP an'ny mpampiantrano
ETCD_LISTEN_PEER_URLS="»# adiresin'ny fiaranao
ETCD_LISTEN_CLIENT_URLS="»# adiresin'ny fiaranao
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="»# adiresin'ny fiaranao
ETCD_INITIAL_CLUSTER=»datanode1=» adiresin'ny milina rehetra ao amin'ny cluster etcd
ETCD_INITIAL_CLUSTER_STATE="vaovao"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="»# adiresin'ny fiaranao
Alefaso ny baiko
systemctl restart etcdPostgreSQL 9.6 + patroni
Ny zavatra voalohany tokony hataonao dia manangana milina virtoaly telo hametrahana ny rindrambaiko ilaina amin'izy ireo. Aorian'ny fametrahana ny milina, raha manaraka ny torolalako ianao, dia azonao atao ny mampandeha ity script tsotra ity izay (saika) hanao ny zava-drehetra ho anao. Mihazakazaka toy ny faka.
Mariho fa ny script dia mampiasa PostgreSQL version 9.6, izany dia noho ny fepetra takian'ny orinasanay. Ny vahaolana dia tsy nosedraina tamin'ny dikan-teny hafa amin'ny 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.ymlManaraka izany, ao amin'ny rakitra /etc/patroni.yml vao noforoninao dia mila mametraka ireto atiny manaraka ireto ianao, mazava ho azy fa manova ny adiresy IP amin'ny toerana rehetra amin'ny adiresy ampiasainao.
Tandremo ny fanehoan-kevitra amin'ity yaml ity. Hanova ny adiresy ho anao manokana amin'ny milina tsirairay ao amin'ny cluster.
/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: falseNy script dia tsy maintsy atao amin'ny milina telo ao amin'ny cluster, ary tsy maintsy apetraka ao amin'ny rakitra /etc/patroni.yml amin'ny milina rehetra ihany koa ny fanitsiana etsy ambony.
Rehefa vitanao ireo asa ireo amin'ny milina rehetra ao amin'ny cluster dia araho ity baiko manaraka ity amin'ny iray amin'izy ireo
systemctl start patroni
systemctl start postgresqlAndraso eo amin'ny 30 segondra eo ho eo, ary ampiharo ity baiko ity amin'ireo milina sisa ao amin'ny cluster.
HAproxy
Mampiasa ny HAproxy mahafinaritra izahay mba hanomezana toerana fidirana tokana. Ny mpizara master dia ho hita foana amin'ny adiresin'ny milina izay ametrahana HAproxy.
Mba tsy hahatonga ny milina miaraka amin'ny HAproxy ho teboka iray tsy fahombiazana, dia halefantsika ao anaty container Docker izy io; amin'ny ho avy dia azo apetraka ao amin'ny cluster K8 izy io ary hahatonga ny cluster failover ho azo antoka kokoa.
Mamorona lahatahiry ahafahanao mitahiry rakitra roa - Dockerfile sy haproxy.cfg. Mandehana any.
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.logTandremo fa ny andalana telo farany amin'ny rakitra haproxy.cfg dia tokony mitanisa ny adiresin'ny milinanao. Hifandray amin'i Patroni ny HAproxy, ao amin'ny lohatenin'ny HTTP dia hiverina 200 foana ny mpizara master, ary hiverina 503 foana ny kopia.
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
Ao amin'ny lahatahiry misy ny rakitra roa "mandainga", andao hanatanteraka ny baiko amin'ny famenoana ny kaontenera, ary koa ny fandefasana azy amin'ny fandefasana ireo seranana ilaina:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Ankehitriny, amin'ny fanokafana ny adiresin'ny masininao miaraka amin'ny HAproxy ao amin'ny navigateur ary mamaritra ny seranan-tsambo 7000 dia hahita antontan'isa amin'ny cluster ianao.
Ny mpizara izay tompony dia ho ao amin'ny fanjakana UP, ary ny kopia dia ho any amin'ny fanjakana DOWN. Ara-dalàna izany, raha ny marina dia miasa izy ireo, saingy miseho toy izao izy ireo satria mamerina ny 503 ho an'ny fangatahana avy amin'ny HAproxy. Izany dia ahafahantsika mahafantatra tsara hoe iza amin'ireo mpizara telo no tompony ankehitriny.
famaranana
Tsara tarehy ianao! Tao anatin'ny 30 minitra monja dia nametraka kluster angon-drakitra mahazaka lesoka tsara sy mahomby ianao miaraka amin'ny replication streaming sy fiverenana mandeha ho azy. Raha mikasa ny hampiasa ity vahaolana ity ianao dia jereo , ary indrindra amin'ny anjarany momba ny utility patronictl, izay manome fidirana mora amin'ny fitantanana ny cluster anao.
Arahabaina!
Source: www.habr.com
