Xây dựng cụm PostgreSQL có tính sẵn sàng cao bằng Patroni, etcd, HAProxy

Tình cờ là vào thời điểm vấn đề được đặt ra, tôi không có đủ kinh nghiệm để một mình phát triển và đưa ra giải pháp này. Và sau đó tôi bắt đầu tìm kiếm trên Google.

Tôi không biết nhược điểm là gì, nhưng đã không biết bao nhiêu lần tôi phải đối mặt với thực tế là ngay cả khi tôi làm mọi thứ từng bước như trong hướng dẫn, chuẩn bị môi trường giống như tác giả, thì chẳng có gì hiệu quả cả. Tôi không biết vấn đề là gì, nhưng khi gặp lại vấn đề này, tôi quyết định rằng tôi sẽ viết hướng dẫn của riêng mình khi mọi việc ổn thỏa. Một trong đó chắc chắn sẽ làm việc.

Hướng dẫn trên Internet

Điều đó xảy ra là Internet không bị thiếu các hướng dẫn, hướng dẫn, từng bước và những thứ tương tự. Tình cờ là tôi được giao nhiệm vụ phát triển một giải pháp để tổ chức và xây dựng cụm PostgreSQL chuyển đổi dự phòng một cách thuận tiện, các yêu cầu chính cho việc này là sao chép trực tuyến từ máy chủ Master đến tất cả các bản sao và tự động cung cấp dự trữ trong trường hợp có máy chủ Master sự thất bại.

Ở giai đoạn này, nhóm công nghệ được sử dụng đã được xác định:

  • PostgreSQL dưới dạng DBMS
  • thần hộ mệnh như một giải pháp phân cụm
  • etcd làm bộ lưu trữ phân tán cho Patroni
  • HAproxy để tổ chức một điểm vào duy nhất cho các ứng dụng sử dụng cơ sở dữ liệu

Cài đặt

Để bạn chú ý - xây dựng cụm PostgreSQL có tính sẵn sàng cao bằng cách sử dụng Patroni, etcd, HAProxy.

Mọi thao tác được thực hiện trên các máy ảo có cài đặt hệ điều hành Debian 10.

vvd

Tôi không khuyên bạn nên cài đặt etcd trên cùng một máy nơi đặt Patoni và postgresql, vì tải đĩa rất quan trọng đối với etcd. Nhưng vì mục đích giáo dục, chúng tôi sẽ làm điều đó.
Hãy cài đặt etcd.

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

Thêm nội dung vào tệp /etc/default/etcd

[thành viên]

ETCD_NAME=datanode1 # tên máy chủ của máy của bạn
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

TẤT CẢ ĐỊA CHỈ IP PHẢI CÓ GIÁ TRỊ. LISTER PEER, CLIENT, v.v. NÊN ĐƯỢC THIẾT LẬP ĐỊA CHỈ IP CỦA HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # địa chỉ xe của bạn
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # địa chỉ xe của bạn

[cụm]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # địa chỉ xe của bạn
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # địa chỉ của tất cả các máy trong cụm etcd
ETCD_INITIAL_CLUSTER_STATE="mới"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # địa chỉ xe của bạn

Thực hiện lệnh

systemctl restart etcd

PostgreSQL 9.6 + bảo trợ

Điều đầu tiên bạn cần làm là thiết lập ba máy ảo để cài đặt phần mềm cần thiết trên chúng. Sau khi cài đặt máy, nếu làm theo hướng dẫn của tôi, bạn có thể chạy tập lệnh đơn giản này (gần như) sẽ thực hiện mọi thứ cho bạn. Chạy dưới dạng root.

Xin lưu ý rằng tập lệnh sử dụng PostgreSQL phiên bản 9.6, điều này là do yêu cầu nội bộ của công ty chúng tôi. Giải pháp này chưa được thử nghiệm trên các phiên bản PostgreSQL khác.

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

Tiếp theo, trong tệp /etc/patroni.yml bạn vừa tạo, bạn cần đặt các nội dung sau, tất nhiên là thay đổi địa chỉ IP ở tất cả các vị trí thành địa chỉ mà bạn sử dụng.
Hãy chú ý đến các bình luận trong yaml này. Thay đổi địa chỉ của riêng bạn trên mỗi máy trong cụm.

/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

Tập lệnh phải được chạy trên cả ba máy của cụm và cấu hình trên cũng phải được đặt trong tệp /etc/patroni.yml trên tất cả các máy.

Khi bạn đã hoàn thành các thao tác này trên tất cả các máy trong cụm, hãy chạy lệnh sau trên bất kỳ máy nào trong số đó

systemctl start patroni
systemctl start postgresql

Đợi khoảng 30 giây rồi chạy lệnh này trên các máy còn lại trong cụm.

HAproxy

Chúng tôi sử dụng HAproxy tuyệt vời để cung cấp một điểm truy cập duy nhất. Máy chủ chính sẽ luôn có sẵn tại địa chỉ của máy mà HAproxy được triển khai.

Để không biến máy có HAproxy thành một điểm lỗi duy nhất, chúng tôi sẽ khởi chạy nó trong vùng chứa Docker; trong tương lai nó có thể được khởi chạy vào cụm của K8 và làm cho cụm chuyển đổi dự phòng của chúng tôi trở nên đáng tin cậy hơn nữa.

Tạo một thư mục nơi bạn có thể lưu trữ hai tệp - Dockerfile và haproxy.cfg. Hãy đến đó.

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

Hãy cẩn thận, ba dòng cuối cùng của tệp haproxy.cfg sẽ liệt kê địa chỉ máy của bạn. HAproxy sẽ liên hệ với Patroni, trong tiêu đề HTTP, máy chủ chính sẽ luôn trả về 200 và bản sao sẽ luôn trả về 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

Nằm trong thư mục chứa cả hai tệp của chúng ta, hãy thực hiện tuần tự các lệnh đóng gói vùng chứa, cũng như khởi chạy nó bằng cách chuyển tiếp các cổng cần thiết:

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

Bây giờ, bằng cách mở địa chỉ máy của bạn bằng HAproxy trong trình duyệt và chỉ định cổng 7000, bạn sẽ thấy số liệu thống kê về cụm của mình.

Máy chủ chính sẽ ở trạng thái LÊN và các bản sao sẽ ở trạng thái XUỐNG. Điều này là bình thường, trên thực tế chúng hoạt động nhưng chúng xuất hiện theo cách này vì chúng trả về 503 cho các yêu cầu từ HAproxy. Điều này cho phép chúng tôi luôn biết chính xác máy chủ nào trong số ba máy chủ hiện tại là máy chủ chính.

Kết luận

Bạn thật lộng lẫy! Chỉ trong 30 phút, bạn đã triển khai một cụm cơ sở dữ liệu có hiệu suất cao và có khả năng chịu lỗi tuyệt vời với tính năng sao chép trực tuyến và dự phòng tự động. Nếu bạn đang có ý định sử dụng giải pháp này, hãy xem với tài liệu Patroni chính thứcvà đặc biệt là phần của nó liên quan đến tiện ích bảo trợ, cung cấp quyền truy cập thuận tiện để quản lý cụm của bạn.

Xin chúc mừng!

Nguồn: www.habr.com

Thêm một lời nhận xét