Patroni، etcd، HAProxy کا استعمال کرتے ہوئے ایک انتہائی دستیاب PostgreSQL کلسٹر بنانا

بس ایسا ہی ہوا کہ جس وقت یہ مسئلہ پیش آیا، میرے پاس اتنا تجربہ نہیں تھا کہ میں اکیلے اس حل کو تیار کر سکوں۔ اور پھر میں نے گوگلنگ شروع کی۔

میں نہیں جانتا کہ کیچ کیا ہے، لیکن مجھے اس حقیقت کا سامنا کرنا پڑا ہے کہ اگر میں ٹیوٹوریل کی طرح قدم بہ قدم سب کچھ کرتا ہوں، مصنف جیسا ماحول تیار کرتا ہوں، تب بھی کچھ کام نہیں ہوتا۔ مجھے نہیں معلوم کہ معاملہ کیا ہے، لیکن جب مجھے دوبارہ اس کا سامنا ہوا، تو میں نے فیصلہ کیا کہ جب سب کچھ ٹھیک ہو جائے گا تو میں اپنا ٹیوٹوریل لکھوں گا۔ ایک جو یقینی طور پر کام کرے گا۔

انٹرنیٹ پر گائیڈز

ایسا ہوتا ہے کہ انٹرنیٹ مختلف گائیڈز، ٹیوٹوریلز، قدم بہ قدم اور اس طرح کی کمی کا شکار نہیں ہوتا ہے۔ ایسا ہی ہوا کہ مجھے فیل اوور پوسٹگری ایس کیو ایل کلسٹر کو آسانی سے ترتیب دینے اور بنانے کے لیے ایک حل تیار کرنے کا کام سونپا گیا، جس کے لیے بنیادی تقاضے ماسٹر سرور سے تمام نقلوں تک نقل تیار کرنا اور ماسٹر سرور کی صورت میں ریزرو کی خودکار فراہمی تھی۔ ناکامی

اس مرحلے پر، استعمال شدہ ٹیکنالوجیز کے اسٹیک کا تعین کیا گیا تھا:

  • پوسٹگری ایس کیو ایل بطور ڈی بی ایم ایس
  • پیٹرونی کلسٹرنگ حل کے طور پر
  • پیٹرونی کے لیے تقسیم شدہ اسٹوریج کے طور پر etcd
  • ڈیٹا بیس کا استعمال کرتے ہوئے ایپلی کیشنز کے لیے ایک ہی انٹری پوائنٹ کو منظم کرنے کے لیے HAproxy

تنصیب

آپ کی توجہ کے لیے - Patroni, etcd, HAProxy کا استعمال کرتے ہوئے ایک انتہائی دستیاب PostgreSQL کلسٹر بنانا۔

تمام کارروائیاں ورچوئل مشینوں پر انجام دی گئیں جن میں ڈیبیان 10 OS نصب تھا۔

وغیرہ

میں ایک ہی مشینوں پر 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"

تمام آئی پی ایڈریسز درست ہونے چاہئیں۔ لسٹر پیر، کلائنٹ وغیرہ کو میزبان کے آئی پی ایڈریس پر سیٹ کیا جانا چاہیے

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 کلسٹر میں تمام مشینوں کے پتے
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 تعینات ہے۔

HAproxy والی مشین کو ناکامی کا واحد نقطہ نہ بنانے کے لیے، ہم اسے ایک Docker کنٹینر میں لانچ کریں گے؛ مستقبل میں اسے 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 بتانے سے، آپ کو اپنے کلسٹر پر اعداد و شمار نظر آئیں گے۔

سرور جو ماسٹر ہے وہ یوپی ریاست میں ہوگا، اور نقلیں نیچے کی حالت میں ہوں گی۔ یہ عام بات ہے، درحقیقت وہ کام کرتے ہیں، لیکن وہ اس طرح ظاہر ہوتے ہیں کیونکہ وہ HAproxy سے درخواستوں کے لیے 503 واپس کرتے ہیں۔ یہ ہمیں ہمیشہ یہ جاننے کی اجازت دیتا ہے کہ تین سرورز میں سے کون سا موجودہ ماسٹر ہے۔

حاصل يہ ہوا

آپ بہت خوبصورت ہیں! صرف 30 منٹ میں آپ نے سٹریمنگ کی نقل اور خودکار فال بیک کے ساتھ ایک بہترین غلطی برداشت کرنے والا اور اعلیٰ کارکردگی والا ڈیٹا بیس کلسٹر تعینات کر دیا ہے۔ اگر آپ اس حل کو استعمال کرنے کی منصوبہ بندی کر رہے ہیں، تو چیک کریں۔ سرکاری پیٹرونی دستاویزات کے ساتھاور خاص طور پر patronictl افادیت سے متعلق اس کے حصے کے ساتھ، جو آپ کے کلسٹر کو منظم کرنے کے لیے آسان رسائی فراہم کرتا ہے۔

مبارک ہو!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں