Случи се така, че в момента, когато беше поставена задачата, нямах достатъчно опит, за да разработя и стартирам това решение самостоятелно. И тогава започнах да търся информация в интернет.
Не знам в какво е проблемът, но вече за пореден път се сблъсквам с това, че дори когато следвам стъпка по стъпка ръководството, подготвяйки същата среда, каквато е у автора, пак нищо не работи. Нямам представа какво не е наред, но когато отново се срещнах с това, реших — ами ще напиша собствено ръководство, когато всичко проработи. Такова, което наистина ще работи.
Ръководства в интернет
Случи се така, че интернет не страда от липса на различни ръководства, туториали, стъпка по стъпка и подобни неща. Случи се така, че ми беше поставена задачата да създам решение за удобна организация и изграждане на отказоустойчив кластер PostgreSQL, основните изисквания към който бяха поточно репликиране от Master-сървъра към всички реплики и автоматично включване на резерв при отказ на Master-сървъра.
На този етап беше определен стекът на използваните технологии:
- PostgreSQL като СУБД
- като решение за клъстеризация
- etcd като разпределено хранилище за Patroni
- HAproxy за организиране на единна точка за вход за приложенията, използващи базата
Инсталиране на
На вашето внимание — изграждане на кластер PostgreSQL с висока достъпност, използващ Patroni, etcd и HAProxy.
Всички операции се извършваха на виртуални машини с инсталиран ОС Debian 10.
etcd
Не препоръчвам да инсталирате etcd на същите машини, на които ще се намират patroni и postgresql, тъй като за etcd е много важна натовареността на дисковете. Но с цел обучение, ще постъпим точно така.
Ще инсталираме etcd.
#!/bin/bash
apt-get update
apt-get install etcdДобавете съдържанието в файла /etc/default/etcd
[member]
ETCD_NAME=datanode1 # име на вашата машина
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ВСИЧКИ IP АДРЕСИ ТРЯБВА ДА СА ВАЛИДНИ. LISTER PEER, CLIENT и т.н. ТРЯБВА ДА СА НАСТРОЕНИ НА IP АДРЕСА НА ХОСТА
ETCD_LISTEN_PEER_URLS="" # адрес на вашата машина
ETCD_LISTEN_CLIENT_URLS="" # адрес на вашата машина
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # адрес на вашата машина
ETCD_INITIAL_CLUSTER="datanode1=" # адресите на всички машини в кластера etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # адрес на вашата машина
Изпълнете командата
systemctl restart etcdPostgreSQL 9.6 + patroni
Първото нещо, което трябва да направите, е да инсталирате три виртуални машини за инсталиране на необходимото софтуер. След инсталирането на машините, ако следвате моето ръководство, можете да стартирате този прост скрипт, който (почти) всичко ще направи вместо вас. Стартира се с root.
Обърнете внимание, че скриптът използва версия 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
обхват: pgsql # трябва да бъде одинаково на всички нодове
пространство: \/cluster\/ # трябва да бъде одинаково на всички нодове
име: postgres1 # трябва да бъде различно на всички нодове
restapi:
слушам: 192.168.0.143:8008 # адрес на нода, на който се намира този файл
адрес за свързване: 192.168.0.143:8008 # адрес на нода, на който се намира този файл
etcd:
хостове: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # изброете тук всички ваши нодове, в случай че инсталирате etcd и на тях
# този раздел (bootstrap) ще бъде записан в Etcd:\/\/\/config след инициализиране на новия клъстер
# и всички останали членове на клъстера ще го използват като `глобална конфигурация`
bootstrap:
dcs:
ttl: 100
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
параметри:
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:
- хост replication postgres ::1\/128 md5
- хост replication postgres 127.0.0.1\/8 md5
- хост replication postgres 192.168.0.143\/24 md5
- хост replication postgres 192.168.0.144\/24 md5
- хост replication postgres 192.168.0.145\/24 md5
- хост всички всички 0.0.0.0\/0 md5
потребители:
администратор:
парола: admin
опции:
- createrole
- createdb
postgresql:
слушам: 192.168.0.143:5432 # адрес на нода, на който се намира този файл
адрес за свързване: 192.168.0.143:5432 # адрес на нода, на който се намира този файл
data_dir: \/data\/patroni # тази директория ще бъде създадена от скрипта, описан по-горе и ще установи необходимите права
bin_dir: \/usr\/lib\/postgresql\/9.6\/bin # задайте пътя до вашата директория с postgresql
pgpass: \/tmp\/pgpass
удостоверяване:
replication:
username: postgres
password: postgres
суперпотребител:
username: postgres
password: postgres
create_replica_methods:
basebackup:
checkpoint: 'fast'
параметри:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: falseСкриптът трябва да бъде стартиран на всички три машини на клъстера, също така е необходимо да бъде поставена предоставената конфигурация в файла \/etc\/patroni.yml на всичките машини.
Когато изпълните тези операции на всички машини в клъстера, изпълнете следната команда на която и да е от тях
systemctl start patroni
systemctl start postgresqlИзчакайте около 30 секунди, след това изпълнете тази команда на останалите машини в клъстера.
HAproxy
Използваме чудесния HAproxy, за да предоставим единна точка за достъп. Master-сървърът винаги ще бъде достъпен на адреса на машината, на която е разположен HAproxy.
За да избегнем превръщането на машината с HAproxy в единствена точка на отказ, ще го стартираме в контейнер Docker. По-късно може да бъде стартиран в кластер K8’s и да направим нашия отказоустойчив кластер още по-надежден.
Създайте директория, в която да съхранявате двата файла – 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 заглавията master сървърът винаги ще връща 200, а replica – 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 минути разгръщате отличен отказоустойчив и производителен кластер от бази данни с потокова репликация и автоматично въвеждане на резерв. Ако планирате да използвате това решение, запознайте се , особено с частта, касаеща инструмента patronictl, който предоставя удобен достъп за управление на вашия кластер.
Поздравления!
Източник: habr.com
