การสร้างคลัสเตอร์ PostgreSQL ที่พร้อมใช้งานสูงโดยใช้ Patroni, etcd, HAProxy

มันบังเอิญว่าในขณะที่เกิดปัญหา ฉันไม่มีประสบการณ์เพียงพอที่จะพัฒนาและเปิดตัวโซลูชันนี้เพียงอย่างเดียว จากนั้นฉันก็เริ่มใช้ Google

ฉันไม่รู้ว่าสิ่งที่จับได้คืออะไร แต่เป็นครั้งที่เท่าไหร่ที่ฉันต้องเผชิญหน้ากับความจริงที่ว่าแม้ว่าฉันจะทำทุกอย่างทีละขั้นตอนเหมือนในบทช่วยสอน แต่ก็เตรียมสภาพแวดล้อมแบบเดียวกับผู้เขียน แต่ไม่มีอะไรทำงานเลย ฉันไม่รู้ว่าเกิดอะไรขึ้น แต่เมื่อฉันเจอสิ่งนี้อีกครั้ง ฉันตัดสินใจว่าจะเขียนบทช่วยสอนของตัวเองเมื่อทุกอย่างได้ผล สิ่งหนึ่งที่จะได้ผลอย่างแน่นอน

คำแนะนำบนอินเทอร์เน็ต

มันเกิดขึ้นจนอินเทอร์เน็ตไม่ต้องทนทุกข์ทรมานจากการขาดคำแนะนำ บทช่วยสอน ทีละขั้นตอนและสิ่งที่คล้ายกัน มันบังเอิญจนฉันได้รับมอบหมายให้พัฒนาโซลูชันเพื่อความสะดวกในการจัดระเบียบและสร้างคลัสเตอร์ PostgreSQL เมื่อเกิดข้อผิดพลาด ซึ่งเป็นข้อกำหนดหลักในการสตรีมการจำลองแบบจากเซิร์ฟเวอร์หลักไปยังแบบจำลองทั้งหมด และการจัดเตรียมการสำรองอัตโนมัติในกรณีของเซิร์ฟเวอร์หลัก ความล้มเหลว.

ในขั้นตอนนี้ มีการกำหนดสแต็คของเทคโนโลยีที่ใช้:

  • PostgreSQL เป็น DBMS
  • ผู้มีพระคุณ เป็นโซลูชันการจัดกลุ่ม
  • ฯลฯ เป็นพื้นที่เก็บข้อมูลแบบกระจายสำหรับ Patroni
  • HAproxy สำหรับจัดระเบียบจุดเริ่มต้นเดียวสำหรับแอปพลิเคชันที่ใช้ฐานข้อมูล

การติดตั้ง

โปรดทราบ - การสร้างคลัสเตอร์ PostgreSQL ที่พร้อมใช้งานสูงโดยใช้ Patroni, etcd, HAProxy

การดำเนินการทั้งหมดดำเนินการบนเครื่องเสมือนที่ติดตั้งระบบปฏิบัติการ Debian 10

ฯลฯ

ฉันไม่แนะนำให้ติดตั้ง 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 ทั้งหมดควรจะถูกต้อง LISTER PEER, ลูกค้า ฯลฯ ควรตั้งค่าเป็นที่อยู่ 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
ETCD_INITIAL_CLUSTER_STATE="ใหม่"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-คลัสเตอร์-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # ที่อยู่รถของคุณ

ดำเนินการคำสั่ง

systemctl restart etcd

PostgreSQL 9.6 + ผู้สนับสนุน

สิ่งแรกที่คุณต้องทำคือตั้งค่าเครื่องเสมือนสามเครื่องเพื่อติดตั้งซอฟต์แวร์ที่จำเป็น หลังจากติดตั้งเครื่องแล้ว หากคุณปฏิบัติตามบทช่วยสอนของฉัน คุณสามารถเรียกใช้สคริปต์ง่ายๆ นี้ที่จะ (เกือบ) ทำทุกอย่างให้กับคุณ ทำงานเป็นรูท

โปรดทราบว่าสคริปต์ใช้ 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 ในทุกตำแหน่งให้เป็นที่อยู่ที่คุณใช้
ให้ความสนใจกับความคิดเห็นใน yaml นี้ เปลี่ยนที่อยู่เป็นของคุณเองในแต่ละเครื่องในคลัสเตอร์

/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 เป็นจุดล้มเหลวเพียงจุดเดียว เราจะเปิดใช้มันในคอนเทนเนอร์ 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 คุณจะเห็นสถิติบนคลัสเตอร์ของคุณ

เซิร์ฟเวอร์ที่เป็นเซิร์ฟเวอร์หลักจะอยู่ในสถานะ UP และแบบจำลองจะอยู่ในสถานะ DOWN นี่เป็นเรื่องปกติ ที่จริงแล้วมันใช้งานได้ แต่ปรากฏในลักษณะนี้เพราะมันส่งคืน 503 สำหรับคำขอจาก HAproxy สิ่งนี้ช่วยให้เรารู้อยู่เสมอว่าเซิร์ฟเวอร์ใดในสามเครื่องที่เป็นเซิร์ฟเวอร์หลักในปัจจุบัน

ข้อสรุป

คุณเป็นคนสง่างาม! ในเวลาเพียง 30 นาที คุณได้ปรับใช้คลัสเตอร์ฐานข้อมูลประสิทธิภาพสูงที่ทนทานต่อข้อผิดพลาดและมีประสิทธิภาพสูง พร้อมการจำลองแบบสตรีมมิ่งและทางเลือกสำรองอัตโนมัติ หากคุณกำลังวางแผนที่จะใช้โซลูชันนี้ ลองดู พร้อมเอกสาร Patroni อย่างเป็นทางการและโดยเฉพาะอย่างยิ่งในส่วนของยูทิลิตี้ Patronictl ซึ่งให้การเข้าถึงที่สะดวกในการจัดการคลัสเตอร์ของคุณ

ขอแสดงความยินดี!

ที่มา: will.com

เพิ่มความคิดเห็น