د Patroni، etcd، HAProxy په کارولو سره د خورا شتون لرونکي PostgreSQL کلستر جوړول

دا یوازې داسې پیښ شوي چې په هغه وخت کې چې ستونزه راپورته شوې وه ، ما دومره تجربه نه درلوده چې یوازې دا حل رامینځته کړم او پیل کړم. او بیا ما ګوګل کول پیل کړل.

زه نه پوهیږم چې کیچ څه شی دی، مګر زه د لسم ځل لپاره له دې حقیقت سره مخ شوی یم چې حتی که زه هر څه ګام په ګام د لارښود په څیر ترسره کړم، د لیکوال په څیر ورته چاپیریال چمتو کړم، بیا هیڅ شی کار نه کوي. زه نه پوهیږم چې مسله څه ده ، مګر کله چې زه بیا له دې سره مخ شوم ، ما پریکړه وکړه چې زه به خپل ټیوټوریل ولیکم کله چې هرڅه کار وکړي. یو چې یقینا به کار وکړي.

په انټرنیټ کې لارښوونې

دا یوازې داسې پیښیږي چې انټرنیټ د مختلف لارښودونو ، لارښودونو ، ګام په ګام او ورته نورو نشتوالي سره مخ نه وي. دا یوازې داسې پیښ شوي چې ما ته دنده ورکړل شوې وه چې په اسانۍ سره د ناکام پوسټګری ایس کیو ایل کلسټر تنظیم او رامینځته کولو لپاره د حل رامینځته کړم ، اصلي اړتیاوې چې د ماسټر سرور څخه ټولو نقلونو ته نقل کول او د ماسټر سرور په صورت کې د ریزرو اتوماتیک چمتو کول وو. ناکامي

پدې مرحله کې، د کارول شویو ټیکنالوژیو سټیک ټاکل شوی و:

  • PostgreSQL د DBMS په توګه
  • پټروني د کلستر کولو حل په توګه
  • etcd د پټروني لپاره د توزیع شوي ذخیره په توګه
  • HAproxy د ډیټابیس کارولو غوښتنلیکونو لپاره د ننوتلو یو واحد ځای تنظیم کولو لپاره

د جوړولو

ستاسو د پاملرنې لپاره - د Patroni, etcd, HAProxy په کارولو سره د خورا شتون لرونکي PostgreSQL کلستر جوړول.

ټول عملیات په مجازی ماشینونو کې د Debian 10 OS نصب سره ترسره شوي.

etcd

زه په ورته ماشینونو کې د 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 پتې باید د اعتبار وړ وي. د لیستر ملګری، پیرودونکي او نور باید د کوربه IP پتې لپاره تنظیم شي

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # ستاسو د موټر پته
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # ستاسو د موټر پته

[کلستر]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # ستاسو د موټر پته
ETCD_INITIAL_CLUSTER=»Datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380»# په etcd کلستر کې د ټولو ماشینونو پته
ETCD_INITIAL_CLUSTER_STATE="نوی"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # ستاسو د موټر پته

کمانډ چل کړئ

systemctl restart etcd

PostgreSQL 9.6 + patroni

لومړی شی چې تاسو یې کولو ته اړتیا لرئ په دوی کې د اړین سافټویر نصبولو لپاره درې مجازی ماشینونه تنظیم کړئ. د ماشینونو نصبولو وروسته، که تاسو زما ټیوټوریل تعقیب کړئ، تاسو کولی شئ دا ساده سکریپټ چل کړئ چې (تقریبا) به ستاسو لپاره هرڅه وکړي. د ریښې په توګه چلیږي.

مهرباني وکړئ په یاد ولرئ چې سکریپټ د 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 سره د ناکامۍ یو واحد نقطه نه کړي، موږ به دا په ډاکر کانټینر کې پیل کړو؛ په راتلونکي کې دا د K8 کلستر ته لیږدول کیدی شي او زموږ د ناکامۍ کلستر نور هم باوري کړي.

یو لارښود جوړ کړئ چیرې چې تاسو دوه فایلونه ذخیره کولی شئ - Dockerfile او haproxy.cfg. هغه ته لاړ شه.

ډکولر

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 بیرته راولي.

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

په لارښود کې پاتې کیدل چیرې چې زموږ دواړه فایلونه "دروغ" دي ، راځئ چې په ترتیب سره د کانټینر بسته کولو امرونه اجرا کړو ، او همدارنګه د اړین بندرونو لیږلو سره یې پیل کړو:

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

اوس، په براوزر کې د HAproxy سره ستاسو د ماشین پته خلاصولو او د 7000 پورټ مشخص کولو سره، تاسو به په خپل کلستر کې احصایې وګورئ.

هغه سرور چې ماسټر دی به په UP ریاست کې وي، او نقلونه به په لاندې حالت کې وي. دا عادي خبره ده، په حقیقت کې دوی کار کوي، مګر دوی دا ډول ښکاري ځکه چې دوی د HAproxy څخه د غوښتنو لپاره 503 بیرته راګرځوي. دا موږ ته اجازه راکوي چې تل په سمه توګه پوه شو چې د دریو سرورونو څخه کوم یو اوسنی ماسټر دی.

پایلې

تاسو ښکلی یاست! یوازې په 30 دقیقو کې تاسو د سټریمینګ نقل او اتوماتیک فال بیک سره عالي غلطۍ زغمونکی او د لوړ فعالیت ډیټابیس کلسټر ځای په ځای کړی دی. که تاسو د دې حل کارولو پلان لرئ، وګورئ د پټروني رسمي اسنادو سره، او په ځانګړي توګه د هغې برخې سره چې د سرپرست کارونې په اړه دي ، کوم چې ستاسو د کلستر اداره کولو لپاره اسانه لاسرسی چمتو کوي.

مبارک شه!

سرچینه: www.habr.com

Add a comment