Ilé iṣupọ PostgreSQL ti o wa ga julọ nipa lilo Patroni, etcd, HAProxy

O kan ṣẹlẹ pe ni akoko iṣoro naa, Emi ko ni iriri ti o to lati ṣe agbekalẹ ati ifilọlẹ ojutu yii nikan. Ati lẹhinna Mo bẹrẹ Googling.

Emi ko mọ kini apeja naa jẹ, ṣugbọn fun akoko umpteenth Mo dojuko pẹlu otitọ pe paapaa ti MO ba ṣe ohun gbogbo ni igbesẹ nipasẹ igbese bi ninu ikẹkọ, mura agbegbe kanna bi onkọwe, lẹhinna ko si nkankan ti o ṣiṣẹ. Emi ko ni imọran kini ọrọ naa, ṣugbọn nigbati Mo tun pade eyi lẹẹkansi, Mo pinnu pe Emi yoo kọ ikẹkọ ti ara mi nigbati ohun gbogbo ba ṣiṣẹ. Ọkan ti yoo pato ṣiṣẹ.

Awọn itọsọna lori Intanẹẹti

O kan ṣẹlẹ pe Intanẹẹti ko jiya lati aini ọpọlọpọ awọn itọsọna, awọn olukọni, ni igbese-nipasẹ-igbesẹ ati bii. O kan ṣẹlẹ pe Mo ni iṣẹ ṣiṣe pẹlu idagbasoke ojutu kan fun siseto irọrun ati kikọ iṣupọ PostgreSQL ikuna kan, awọn ibeere akọkọ fun eyiti o jẹ ṣiṣan ṣiṣanwọle lati ọdọ olupin Titunto si gbogbo awọn ẹda ati ipese aifọwọyi ti ifiṣura ni iṣẹlẹ ti olupin Titunto kan. ikuna.

Ni ipele yii, akopọ ti awọn imọ-ẹrọ ti a lo ti pinnu:

  • PostgreSQL bi DBMS kan
  • Patroni bi ojutu iṣupọ
  • etcd bi ibi ipamọ pinpin fun Patroni
  • HAproxy fun siseto aaye titẹsi ẹyọkan fun awọn ohun elo nipa lilo ibi ipamọ data

eto

Fun akiyesi rẹ - kikọ iṣupọ PostgreSQL ti o ga pupọ nipa lilo Patroni, ati bẹbẹ lọ, HAProxy.

Gbogbo awọn iṣẹ ṣiṣe ni a ṣe lori awọn ẹrọ foju pẹlu Debian 10 OS ti fi sori ẹrọ.

abbl

Emi ko ṣeduro fifi sori ẹrọ etcd lori awọn ẹrọ kanna nibiti patroni ati postgresql yoo wa, nitori fifuye disiki ṣe pataki pupọ fun bbl. Ṣugbọn fun awọn idi ẹkọ, a yoo ṣe iyẹn.
Jẹ ki a fi sori ẹrọ etcd.

#!/bin/bash
apt-get update
apt-get install etcd

Ṣafikun akoonu si faili /etc/default/etcd

[omo egbe]

ETCD_NAME=datanode1 # hostname ti ẹrọ rẹ
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

GBOGBO IP adiresi yẹ ki o wa ni wulo. LISTER PEER, CLIENT etc O yẹ ki o ṣeto si IP ADDRESS OF HOST

ETCD_LISTEN_PEER_URLS = "http://192.168.0.143:2380» # adirẹsi ọkọ ayọkẹlẹ rẹ
ETCD_LISTEN_CLIENT_URLS = "http://192.168.0.143:2379,http://127.0.0.1:2379» # adirẹsi ọkọ ayọkẹlẹ rẹ

[iṣupọ]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adirẹsi ọkọ ayọkẹlẹ rẹ
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380»# awọn adirẹsi ti gbogbo awọn ero inu iṣupọ etcd
ETCD_INITIAL_CLUSTER_STATE = "tuntun"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS = "http://192.168.0.143:2379» # adirẹsi ọkọ ayọkẹlẹ rẹ

Ṣiṣe aṣẹ naa

systemctl restart etcd

PostgreSQL 9.6 + patroni

Ohun akọkọ ti o nilo lati ṣe ni ṣeto awọn ẹrọ foju mẹta lati fi sọfitiwia pataki sori wọn. Lẹhin fifi sori ẹrọ awọn ẹrọ, ti o ba tẹle ikẹkọ mi, o le ṣiṣe iwe afọwọkọ ti o rọrun yii ti yoo (fere) ṣe ohun gbogbo fun ọ. Nṣiṣẹ bi root.

Jọwọ ṣe akiyesi pe iwe afọwọkọ naa nlo ẹya PostgreSQL 9.6, eyi jẹ nitori awọn ibeere inu ti ile-iṣẹ wa. Ojutu naa ko ti ni idanwo lori awọn ẹya miiran ti 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

Nigbamii, ninu faili /etc/patroni.yml ti o ṣẹṣẹ ṣẹda, o nilo lati gbe awọn akoonu wọnyi, dajudaju iyipada awọn adirẹsi IP ni gbogbo awọn aaye si awọn adirẹsi ti o lo.
San ifojusi si awọn asọye ni yaml yii. Yi awọn adirẹsi pada si tirẹ lori ẹrọ kọọkan ninu iṣupọ.

/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

Awọn iwe afọwọkọ gbọdọ wa ni ṣiṣe lori gbogbo awọn mẹta ero ti iṣupọ, ati awọn loke iṣeto ni gbọdọ tun ti wa ni gbe sinu /etc/patroni.yml faili lori gbogbo awọn ero.

Ni kete ti o ba ti pari awọn iṣẹ wọnyi lori gbogbo awọn ero inu iṣupọ, ṣiṣe aṣẹ wọnyi lori eyikeyi ninu wọn

systemctl start patroni
systemctl start postgresql

Duro nipa awọn aaya 30, lẹhinna ṣiṣẹ aṣẹ yii lori awọn ẹrọ ti o ku ninu iṣupọ.

HAproxy

A lo HAproxy iyanu lati pese aaye titẹsi kan. Olupin oluwa yoo wa nigbagbogbo ni adirẹsi ẹrọ ti o ti gbe HAproxy lọ.

Ni ibere ki o maṣe jẹ ki ẹrọ pẹlu HAproxy jẹ aaye ikuna kan, a yoo ṣe ifilọlẹ sinu apoti Docker kan; ni ọjọ iwaju o le ṣe ifilọlẹ sinu iṣupọ K8 ati jẹ ki iṣupọ ikuna wa paapaa ni igbẹkẹle diẹ sii.

Ṣẹda itọsọna kan nibiti o le fipamọ awọn faili meji - Dockerfile ati haproxy.cfg. Lọ si o.

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

Ṣọra, awọn laini mẹta ti o kẹhin ti faili haproxy.cfg yẹ ki o ṣe atokọ awọn adirẹsi ti awọn ẹrọ rẹ. HAproxy yoo kan si Patroni, ninu awọn akọle HTTP oluwa olupin yoo pada nigbagbogbo 200, ati pe ẹda naa yoo pada nigbagbogbo 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

Ti o wa ninu itọsọna eyiti awọn mejeeji ti awọn faili wa “parọ,” jẹ ki a ṣiṣẹ ni atẹlera awọn aṣẹ fun iṣakojọpọ eiyan naa, bakanna bi ifilọlẹ pẹlu fifiranṣẹ awọn ebute oko oju omi pataki:

docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy 

Bayi, nipa ṣiṣi adirẹsi ẹrọ rẹ pẹlu HAproxy ninu ẹrọ aṣawakiri ati sisọ ibudo 7000, iwọ yoo rii awọn iṣiro lori iṣupọ rẹ.

Olupin ti o jẹ oluwa yoo wa ni ipo UP, ati awọn ẹda yoo wa ni ipo isalẹ. Eyi jẹ deede, ni otitọ wọn ṣiṣẹ, ṣugbọn wọn han ni ọna yii nitori wọn pada 503 fun awọn ibeere lati HAproxy. Eyi n gba wa laaye nigbagbogbo lati mọ pato eyi ti awọn olupin mẹta jẹ oluwa lọwọlọwọ.

ipari

Ti o ba wa alayeye! Ni awọn iṣẹju 30 o ti gbe ifarada-aṣiṣe ti o dara julọ ati iṣupọ data iṣẹ ṣiṣe giga pẹlu ẹda ṣiṣanwọle ati ipadasẹhin aifọwọyi. Ti o ba n gbero lati lo ojutu yii, ṣayẹwo pẹlu iwe aṣẹ Patroni, ati ni pataki pẹlu apakan rẹ nipa ohun elo patronictl, eyiti o pese iraye si irọrun si ṣiṣakoso iṣupọ rẹ.

Oriire!

orisun: www.habr.com

Fi ọrọìwòye kun