Pagtukod og taas nga magamit nga PostgreSQL cluster gamit ang Patroni, etcd, HAProxy

Nahitabo lang nga sa panahon sa paghimo sa buluhaton, wala ako'y igo nga lebel sa kasinatian sa pagpalambo ug pagpadagan niini nga solusyon nga nag-inusara. Ug dayon nagsugod ko sa pag-goog.

Wala ko mahibal-an kung unsa ang makuha, apan sa ika-XNUMX nga higayon nakit-an nako ang kamatuoran nga bisan kung buhaton nimo ang tanan nga lakang sa lakang sama sa panudlo, pag-andam sa parehas nga palibot sama sa tagsulat, wala gihapon kini molihok. Wala ko'y ideya kung unsa ang problema, apan sa dihang nasugatan nako kini pag-usab, nakahukom ko - ug akong isulat ang akong tutorial kung maayo na ang tanan. Usa nga siguradong molihok.

Mga giya sa Internet

Nahitabo lang nga ang Internet wala mag-antos sa kakulang sa lainlaing mga giya, mga panudlo, mga lakang sa lakang ug uban pa. Nahitabo lang nga gihatagan ako sa tahas sa paghimo og solusyon alang sa dali nga pag-organisar ug pagtukod sa usa ka cluster sa PostgreSQL failover, ang mga nag-unang kinahanglanon nga mao ang streaming nga replikasyon gikan sa Master server hangtod sa tanan nga mga replika ug awtomatikong fallback kung mapakyas ang Master server.

Niini nga yugto, ang stack sa mga teknolohiya nga gigamit gitino:

  • PostgreSQL isip DBMS
  • Patroni isip usa ka clustering solution
  • etcd ingon nga giapod-apod nga pagtipig alang sa Patroni
  • HAproxy alang sa pag-organisar sa usa ka entry point para sa mga aplikasyon gamit ang database

Pag-instalar

Ang imong atensyon nagtukod usa ka taas nga magamit nga cluster sa PostgreSQL gamit ang Patroni, etcd, HAProxy.

Ang tanan nga mga operasyon gihimo sa mga virtual nga makina nga na-install ang Debian 10 OS.

ug uban pa

Dili ko girekomendar ang pag-install ug etcd sa parehas nga mga makina diin mahimutang ang patroni ug postgresql, tungod kay ang disk load hinungdanon kaayo alang sa etcd. Apan alang sa mga katuyoan sa edukasyon, buhaton naton kana.
Pag-instalar ug uban pa.

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

Idugang ang sulod sa /etc/default/etcd file

[miyembro]

ETCD_NAME=datanode1 # hostname sa imong makina
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

TANANG IP ADDRESS KINAHANGLANG VALID. ANG LISTER PEER, CLIENT etc KINAHANGLANG I-SET SA IP ADDRESS SA HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380»# adres sa imong makina
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379»# adres sa imong makina

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380»# adres sa imong makina
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380»# mga adres sa tanang makina sa etcd cluster
ETCD_INITIAL_CLUSTER_STATE="bag-o"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379»# adres sa imong makina

Ipatuman ang sugo

systemctl restart etcd

PostgreSQL 9.6 + patroni

Ang unang butang nga buhaton mao ang pag-set up sa tulo ka virtual machine aron ma-install ang gikinahanglan nga software niini. Pagkahuman sa pag-install sa mga makina, kung sundon nimo ang akong panudlo, mahimo nimong ipadagan kining yano nga script nga (halos) buhaton ang tanan alang kanimo. Nagdagan ingon nga gamut.

Palihug timan-i nga ang script naggamit sa PostgreSQL 9.6 nga bersyon, kini tungod sa internal nga mga kinahanglanon sa among kompanya. Ang solusyon wala masulayan sa ubang mga bersyon sa 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

Sunod, sa /etc/patroni.yml file nga bag-o lang nimo gibuhat, kinahanglan nimo nga ibutang ang mosunod nga sulud, siyempre usbon ang mga ip address sa tanan nga mga lugar sa mga adres nga imong gigamit.
Hatagi'g pagtagad ang mga komento niini nga yaml. Usba ang mga adres sa imong kaugalingon, sa matag makina sa 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: false

Kinahanglang ipadagan ang script sa tanang tulo ka makina sa cluster, sama nga ang configuration sa ibabaw kinahanglang ibutang sa /etc/patroni.yml file sa tanang makina.

Kung nahuman na nimo kini nga mga operasyon sa tanan nga mga cluster machine, padagana ang mosunud nga mando sa bisan kinsa niini

systemctl start patroni
systemctl start postgresql

Paghulat mga 30 segundos, dayon ipadagan kini nga mando sa ubang mga makina sa cluster.

HAproxy

Gigamit namo ang nindot nga HAproxy sa paghatag og usa ka punto sa pagsulod. Ang master server kanunay nga magamit sa adres sa makina diin ang HAproxy gi-deploy.

Aron dili mahimo ang makina nga adunay HAproxy nga usa ka punto sa kapakyasan, ipadagan namon kini sa usa ka sudlanan sa Docker, sa umaabot posible nga ipadagan kini sa usa ka cluster sa K8 ug himuon nga labi ka kasaligan ang among failover cluster.

Paghimo og direktoryo diin mahimo nimong tipigan ang duha ka mga file - Dockerfile ug haproxy.cfg. Lakaw ngadto niini.

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

Pag-amping, ang katapusang tulo ka linya sa haproxy.cfg file kinahanglan nga maglista sa mga adres sa imong mga makina. Makontak sa HAproxy si Patroni, sa mga header sa HTTP ang master server kanunay nga ibalik ang 200, ug ang replika kanunay nga ibalik ang 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

Naa sa direktoryo diin ang duha sa among mga file "bakak", sunud-sunod namon nga ipatuman ang mga mando alang sa pag-pack sa sudlanan, ingon usab paglansad kini sa kinahanglan nga mga pantalan nga gipasa:

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

Karon, kung imong ablihan ang adres sa imong makina gamit ang HAproxy sa browser ug ipiho ang port 7000, imong makita ang mga istatistika para sa imong cluster.

Ang server nga mao ang agalon naa sa UP state, ug ang mga replicas naa sa DOWN state. Normal kini, sa pagkatinuod sila nagtrabaho, apan kini gipakita sa kini nga porma tungod sa kamatuoran nga ilang gibalik ang 503 sa mga hangyo gikan sa HAproxy. Kini nagtugot kanamo nga mahibal-an kanunay kung kinsa sa tulo nga mga server ang karon nga agalon.

konklusyon

Gwapa ka! Sa 30 ka minuto lang, naka-deploy ka usa ka maayo nga failover ug performance database cluster nga adunay streaming replication ug automatic failover. Kung nagplano ka nga gamiton kini nga solusyon, palihug tan-awa uban ang opisyal nga dokumentasyon sa Patroni, ug ilabina sa bahin niini mahitungod sa patronictl utility, nga naghatag ug sayon ​​nga pag-access sa pagdumala sa imong cluster.

Mga pahalipay!

Source: www.habr.com

Idugang sa usa ka comment