Membina kluster PostgreSQL yang sangat tersedia menggunakan Patroni, dll, HAProxy

Kebetulan pada masa masalah itu ditimbulkan, saya tidak mempunyai cukup pengalaman untuk membangunkan dan melancarkan penyelesaian ini sahaja. Dan kemudian saya mula Googling.

Saya tidak tahu apa tangkapan itu, tetapi untuk kesekian kalinya saya berhadapan dengan hakikat bahawa walaupun saya melakukan segala-galanya langkah demi langkah seperti dalam tutorial, sediakan persekitaran yang sama seperti pengarang, maka tiada apa yang berjaya. Saya tidak tahu apa masalahnya, tetapi apabila saya menghadapi ini sekali lagi, saya memutuskan bahawa saya akan menulis tutorial saya sendiri apabila semuanya berjaya. Satu yang pasti akan berkesan.

Panduan di Internet

Kebetulan Internet tidak mengalami kekurangan pelbagai panduan, tutorial, langkah demi langkah dan seumpamanya. Kebetulan saya ditugaskan untuk membangunkan penyelesaian untuk mengatur dan membina kluster PostgreSQL failover dengan mudah, keperluan utamanya ialah penstriman replikasi daripada pelayan Master kepada semua replika dan peruntukan automatik rizab sekiranya pelayan Master kegagalan.

Pada peringkat ini, timbunan teknologi yang digunakan ditentukan:

  • PostgreSQL sebagai DBMS
  • Patroni sebagai penyelesaian pengelompokan
  • etcd sebagai storan teragih untuk Patroni
  • HAproxy untuk mengatur satu titik masuk untuk aplikasi menggunakan pangkalan data

Pemasangan

Untuk perhatian anda - bina kluster PostgreSQL yang sangat tersedia menggunakan Patroni, etcd, HAProxy.

Semua operasi dilakukan pada mesin maya dengan Debian 10 OS dipasang.

dll

Saya tidak mengesyorkan memasang etcd pada mesin yang sama di mana patroni dan postgresql akan ditempatkan, kerana beban cakera adalah sangat penting untuk etcd. Tetapi untuk tujuan pendidikan, kami akan melakukannya.
Jom pasang etcd.

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

Tambahkan kandungan pada fail /etc/default/etcd

[ahli]

ETCD_NAME=datanode1 # nama hos mesin anda
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

SEMUA ALAMAT IP HENDAKLAH SAH. LISTER PEER, KLIEN dan lain-lain PERLU DITETAPKAN KE ALAMAT IP HOS

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # alamat kereta anda
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # alamat kereta anda

[kluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # alamat kereta anda
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # alamat semua mesin dalam kluster etcd
ETCD_INITIAL_CLUSTER_STATE="baru"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # alamat kereta anda

Jalankan arahan

systemctl restart etcd

PostgreSQL 9.6 + patroni

Perkara pertama yang perlu anda lakukan ialah menyediakan tiga mesin maya untuk memasang perisian yang diperlukan padanya. Selepas memasang mesin, jika anda mengikuti tutorial saya, anda boleh menjalankan skrip mudah ini yang akan (hampir) melakukan segala-galanya untuk anda. Berjalan sebagai root.

Sila ambil perhatian bahawa skrip menggunakan PostgreSQL versi 9.6, ini disebabkan oleh keperluan dalaman syarikat kami. Penyelesaiannya belum diuji pada versi PostgreSQL yang lain.

#!/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

Seterusnya, dalam fail /etc/patroni.yml yang baru anda buat, anda perlu meletakkan kandungan berikut, sudah tentu menukar alamat IP di semua tempat kepada alamat yang anda gunakan.
Perhatikan komen dalam yaml ini. Tukar alamat kepada anda sendiri pada setiap mesin dalam kelompok.

/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

Skrip mesti dijalankan pada ketiga-tiga mesin kluster dan konfigurasi di atas juga mesti diletakkan dalam fail /etc/patroni.yml pada semua mesin.

Setelah anda menyelesaikan operasi ini pada semua mesin dalam kelompok, jalankan arahan berikut pada mana-mana daripadanya

systemctl start patroni
systemctl start postgresql

Tunggu kira-kira 30 saat, kemudian jalankan arahan ini pada mesin yang tinggal dalam kelompok.

HAproksi

Kami menggunakan HAproxy yang menarik untuk menyediakan satu titik kemasukan. Pelayan induk akan sentiasa tersedia di alamat mesin di mana HAproxy digunakan.

Untuk tidak menjadikan mesin dengan HAproxy sebagai satu titik kegagalan, kami akan melancarkannya dalam bekas Docker; pada masa hadapan ia boleh dilancarkan ke dalam kluster K8 dan menjadikan kluster failover kami lebih dipercayai.

Cipta direktori di mana anda boleh menyimpan dua fail - Dockerfile dan haproxy.cfg. Pergi ke sana.

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

Berhati-hati, tiga baris terakhir fail haproxy.cfg harus menyenaraikan alamat mesin anda. HAproxy akan menghubungi Patroni, dalam pengepala HTTP pelayan induk akan sentiasa mengembalikan 200, dan replika akan sentiasa mengembalikan 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

Berada dalam direktori di mana kedua-dua fail kami "berbohong," mari kita laksanakan secara berurutan arahan untuk membungkus bekas, serta melancarkannya dengan memajukan port yang diperlukan:

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

Sekarang, dengan membuka alamat mesin anda dengan HAproxy dalam penyemak imbas dan menentukan port 7000, anda akan melihat statistik pada kluster anda.

Pelayan yang menjadi tuan akan berada dalam keadaan UP, dan replika akan berada dalam keadaan DOWN. Ini adalah perkara biasa, sebenarnya ia berfungsi, tetapi ia kelihatan seperti ini kerana ia mengembalikan 503 untuk permintaan daripada HAproxy. Ini membolehkan kami sentiasa mengetahui dengan tepat yang mana antara tiga pelayan itu adalah induk semasa.

Kesimpulan

awak memang cantik! Dalam masa 30 minit sahaja anda telah menggunakan kluster pangkalan data tahan kesalahan dan berprestasi tinggi yang sangat baik dengan replikasi penstriman dan sandaran automatik. Jika anda merancang untuk menggunakan penyelesaian ini, lihat dengan dokumentasi rasmi Patroni, dan terutamanya dengan bahagiannya berkenaan utiliti patronictl, yang menyediakan akses mudah untuk mengurus kluster anda.

tahniah!

Sumber: www.habr.com

Tambah komen