Patroni، etcd، HAProxy استعمال ڪندي هڪ انتهائي دستياب PostgreSQL ڪلستر ٺاهڻ

بس ائين ئي ٿيو ته جنهن وقت مسئلو پيش آيو، مون وٽ ايترو تجربو نه هو ته هن حل کي ترقي ۽ لانچ ڪري سگهان. ۽ پوءِ مون گوگلنگ شروع ڪئي.

مون کي خبر ناهي ته ڪيچ ڇا آهي، پر پوءِ به مون کي ان حقيقت سان منهن ڏيڻو پئجي رهيو آهي ته جيڪڏهن مان هر ڪم قدم قدم تي ڪريان ٿو جيئن سبق ۾، ليکڪ جهڙو ماحول تيار ڪيو وڃي ته پوءِ ڪجهه به ڪم نه ايندو. مون کي ڪا به خبر ناهي ته معاملو ڇا آهي، پر جڏهن مون کي اهو ٻيهر سامهون آيو، مون فيصلو ڪيو ته آئون پنهنجو سبق لکندس جڏهن سڀ ڪجهه ڪم ڪري ٿو. جيڪو ضرور ڪم ڪندو.

انٽرنيٽ تي ھدايتون

اهو صرف ائين ٿئي ٿو ته انٽرنيٽ مختلف رهنمائي، سبق، قدم قدم ۽ ٻين جي گهٽتائي کان متاثر نه ٿئي. اهو ائين ئي ٿيو آهي ته مون کي آسانيءَ سان ترتيب ڏيڻ ۽ هڪ ناڪامي PostgreSQL ڪلستر جي تعمير لاءِ حل تيار ڪرڻ جو ڪم سونپيو ويو، جنهن لاءِ مکيه گهرجون آهن جن لاءِ ماسٽر سرور کان نقل ڪرڻ کي اسٽريمنگ ڪرڻ سڀني ريپليڪس ۽ ماسٽر سرور جي صورت ۾ رزرو جي خودڪار فراهمي. ناڪامي

هن مرحلي تي، استعمال ٿيل ٽيڪنالاجي جو اسٽيڪ مقرر ڪيو ويو آهي:

  • PostgreSQL هڪ DBMS طور
  • پتروني هڪ ڪلستر حل جي طور تي
  • Patroni لاء ورهايل اسٽوريج جي طور تي وغيره
  • HAproxy ڊيٽابيس استعمال ڪندي ايپليڪيشنن لاءِ هڪ واحد داخلا پوائنٽ کي ترتيب ڏيڻ لاءِ

تنصيب

توهان جي توجه لاءِ - Patroni, etcd, HAProxy استعمال ڪندي هڪ انتهائي دستياب PostgreSQL ڪلسٽر ٺاهڻ.

سڀئي آپريشن ورچوئل مشينن تي ڪيا ويا ڊيبين 10 او ايس انسٽال ٿيل.

وغيره

مان ساڳي مشينن تي 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=»ڊيٽانوڊ1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380»# اي ڊي ڊي ڪلستر ۾ سڀني مشينن جا ايڊريس
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 استعمال ڪري ٿو، اهو اسان جي ڪمپني جي اندروني گهرجن جي ڪري آهي. حل پوسٽگري ايس ايس ايل جي ٻين نسخن تي آزمائشي نه ڪيو ويو آهي.

#!/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 سان مشين کي ناڪامي جو هڪ واحد نقطو نه بڻائڻ لاءِ، اسان ان کي ڊاڪر ڪنٽينر ۾ لانچ ڪنداسين؛ مستقبل ۾ ان کي K8 جي ڪلستر ۾ لانچ ڪري سگھجي ٿو ۽ اسان جي ناڪامي ڪلستر کي اڃا به وڌيڪ قابل اعتماد بڻائي سگھون ٿا.

هڪ ڊاريڪٽري ٺاهيو جتي توهان ٻه فائلون ذخيرو ڪري سگهو ٿا - Dockerfile ۽ haproxy.cfg. ان ڏانهن وڃو.

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

محتاط رھو، 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 منٽن ۾ توهان هڪ بهترين فالٽ برداشت ڪندڙ ۽ اعليٰ ڪارڪردگي وارو ڊيٽابيس ڪلسٽر جوڙيو آهي اسٽريمنگ ريپليڪشن ۽ خودڪار فال بيڪ سان. جيڪڏهن توهان هن حل کي استعمال ڪرڻ جي منصوبابندي ڪري رهيا آهيو، چيڪ ڪريو سرڪاري Patroni دستاويزن سان, ۽ خاص طور تي ان جي حصي سان patronictl افاديت بابت، جيڪو توهان جي ڪلستر کي منظم ڪرڻ لاء آسان رسائي فراهم ڪري ٿو.

مبارڪون هجن!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو