Membangun cluster PostgreSQL ketersediaan tinggi menggunakan Patroni, etcd, HAProxy

Kebetulan pada saat menetapkan masalah saya tidak memiliki tingkat pengalaman yang cukup untuk mengembangkan dan menjalankan solusi ini sendirian. Dan kemudian saya mulai googling.


Saya tidak tahu apa masalahnya, tetapi untuk kesekian kalinya saya dihadapkan pada kenyataan bahwa bahkan jika Anda melakukan semuanya langkah demi langkah seperti dalam tutorial, menyiapkan lingkungan yang sama seperti penulis, maka tidak ada yang berhasil. Saya tidak tahu tentang apa ini, tetapi ketika saya menemukan ini lagi, saya memutuskan - dan saya akan menulis tutorial saya ketika semuanya berhasil. Yang pasti akan berhasil.


Panduan Online


Kebetulan Internet tidak mengalami kekurangan berbagai panduan, tutorial, langkah-demi-langkah, dan sejenisnya. Kebetulan saya ditugasi mengembangkan solusi untuk organisasi yang nyaman dan pembangunan cluster PostgreSQL yang gagal-aman, persyaratan utama di antaranya adalah streaming replikasi dari server Master ke semua replika dan input otomatis cadangan ketika server Master gagal.


Pada tahap ini, tumpukan teknologi yang digunakan didefinisikan:


  • PostgreSQL sebagai DBMS
  • Patroni sebagai solusi pengelompokan
  • dll sebagai penyimpanan terdistribusi untuk Patroni
  • HAproxy untuk mengatur titik masuk tunggal untuk aplikasi yang menggunakan database

Instalasi


Perhatian Anda - pembangunan cluster PostgreSQL ketersediaan tinggi menggunakan Patroni, dll, HAProxy.


Semua operasi dilakukan pada mesin virtual dengan Debian 10 diinstal.


dll


Saya tidak merekomendasikan menginstal etcd pada mesin yang sama di mana patroni dan postgresql akan ditemukan, karena beban disk sangat penting untuk etcd. Tetapi untuk tujuan pelatihan, kami akan melakukan hal itu.
Instal dlld.


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

Tambahkan konten ke file / etc / default / etcd

[anggota]


ETCD_NAME = datanode1 # hostname mesin Anda
ETCD_DATA_DIR = "/ var / lib / etcd / default.etcd"


SEMUA ADRES IP AKAN HARUS BERLAKU. DAFTAR SISWA, KLIEN, dll. HARUS DIATUR KE ALAMAT IP HOST


ETCD_LISTEN_PEER_URLS = " http://192.168.0.143:2380 " # alamat mesin Anda
ETCD_LISTEN_CLIENT_URLS = " http://192.168.0.143:379,http://127.0.0.1:379 " # alamat mesin Anda


[cluster]


ETCD_INITIAL_ADVERTISE_PEER_URLS = " http://192.168.0.143:2380 " # alamat mesin Anda
ETCD_INITIAL_CLUSTER = "datanode1 = http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380 " # alamat semua mesin di cluster etcd
ETCD_INITIAL_CLUSTER_STATE = "baru"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS = " http://192.168.0.143:379 " # alamat mesin Anda


Jalankan perintah


 systemctl restart etcd 

PostgreSQL 9.6 + patroni


Hal pertama yang harus dilakukan adalah menginstal tiga mesin virtual untuk menginstal perangkat lunak yang diperlukan pada mereka. Setelah menginstal mesin, jika Anda mengikuti tutorial saya, Anda dapat menjalankan skrip sederhana ini yang (hampir) melakukan segalanya untuk Anda. Jalankan sebagai root.


Harap dicatat bahwa skrip menggunakan PostgreSQL versi 9.6, ini karena persyaratan internal perusahaan kami. Solusinya tidak diuji pada versi PostgreSQL lainnya.


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

Selanjutnya, dalam file /etc/patroni.yml yang baru saja dibuat, Anda harus meletakkan konten berikut, tentu saja mengubah alamat IP di semua tempat menjadi alamat yang Anda gunakan.
Perhatikan komentar di yaml ini. Ubah alamat menjadi milik Anda di setiap mesin di cluster.


/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 

Script harus dijalankan pada ketiga mesin cluster, sama seperti Anda harus meletakkan konfigurasi di file /etc/patroni.yml pada semua mesin.


Ketika Anda melakukan operasi ini pada semua mesin di cluster, jalankan perintah berikut di salah satu dari mereka


 systemctl start patroni systemctl start postgresql 

Tunggu sekitar 30 detik, kemudian jalankan perintah ini di seluruh mesin cluster.


HAproxy


Kami menggunakan HAproxy yang luar biasa untuk menyediakan satu titik masuk. Server master akan selalu tersedia di alamat mesin tempat HAproxy digunakan.


Agar tidak menjadikan mesin HAproxy titik kegagalan tunggal, jalankan di wadah Docker, nanti akan dimungkinkan untuk menjalankannya di kluster K8 dan membuat kluster failover kami bahkan lebih dapat diandalkan.


Buat direktori tempat Anda dapat menyimpan dua file - Dockerfile dan haproxy.cfg. Pergi ke sana.


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 

Hati-hati, tiga baris terakhir dari file haproxy.cfg harus mencantumkan alamat mesin Anda. HAproxy akan menghubungi Patroni, di header HTTP server master akan selalu mengembalikan 200, dan replika akan mengembalikan 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 

Berada di direktori di mana kedua file kami "terletak", kami akan menjalankan perintah pengemasan kontainer secara berurutan, serta peluncurannya dengan penerusan port yang diperlukan:


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

Sekarang, membuka alamat browser mesin Anda dengan HAproxy dan menentukan port 7000, Anda akan melihat statistik pada cluster Anda.


Dalam keadaan UP, server yang merupakan master akan ditemukan, dan replika dalam keadaan BAWAH. Ini normal, sebenarnya mereka berfungsi, tetapi ditampilkan dalam formulir ini karena fakta bahwa mereka mengembalikan 503 ke permintaan dari HAproxy. Hal ini memungkinkan kita untuk selalu tahu persis dari tiga server mana yang menjadi master saat ini.


Kesimpulan


Kamu luar biasa! Hanya dalam 30 menit, Anda telah menggunakan kluster database gagal-aman dan produktif yang sangat baik dengan replikasi streaming dan penyediaan otomatis. Jika Anda berencana untuk menggunakan solusi ini, lihat dokumentasi Patroni resmi , dan terutama bagiannya mengenai utilitas patronictl, yang menyediakan akses mudah untuk mengelola kluster Anda.


Selamat!

Source: https://habr.com/ru/post/id482314/


All Articles