ʻO ia wale nō i ka manawa i hoʻopuka ʻia ai ka pilikia, ʻaʻole lawa kaʻu ʻike e hoʻomohala a hoʻomaka i kēia hoʻonā wale nō. A laila hoʻomaka wau iā Google.
ʻAʻole wau i ʻike i ke ʻano o ka hopu ʻana, akā no ka manawa ʻumi ʻumi ke kū nei au i ka ʻoiaʻiʻo inā hana wau i nā mea āpau i kēlā me kēia pae e like me ke aʻo ʻana, e hoʻomākaukau i kahi ʻano like me ka mea kākau, a laila ʻaʻohe mea e hana. ʻAʻohe oʻu manaʻo he aha ia mea, akā i koʻu hālāwai ʻana me kēia, ua hoʻoholo wau e kākau wau i kaʻu kumu aʻo ponoʻī ke holo nā mea āpau. ʻO kekahi e hana maoli.
Nā alakaʻi ma ka Pūnaewele
ʻAʻole pilikia ka Pūnaewele i ka nele o nā alakaʻi like ʻole, nā aʻoaʻo, nā ʻanuʻu a me nā mea like. ʻO ia wale nō ka mea i hana ʻia iaʻu e hoʻomohala i kahi hopena no ka hoʻonohonoho pono ʻana a me ke kūkulu ʻana i kahi puʻupuʻu failover PostgreSQL, nā koi nui no ka hoʻoheheʻe ʻana mai ka server Master i nā replicas a me ka hoʻolako ʻana i kahi mālama i ka wā o kahi kikowaena Master. hāʻule.
I kēia pae, ua hoʻoholo ʻia ka pūʻulu o nā ʻenehana i hoʻohana ʻia:
- ʻO PostgreSQL ma ke ʻano he DBMS
- ma ke ʻano he hāʻina huikau
- etcd ma ke ʻano he waihona puʻupuʻu no Patroni
- HAproxy no ka hoʻonohonoho ʻana i kahi helu komo hoʻokahi no nā noi e hoʻohana ana i ka waihona
Kāu Mau Koho Paʻamau
No kou nānā - kūkulu ʻana i kahi puʻupuʻu PostgreSQL i loaʻa me ka hoʻohana ʻana iā Patroni, etcd, HAProxy.
Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.
a pēlā aku
ʻAʻole wau e manaʻo e hoʻokomo i ka etcd ma nā mīkini like kahi e loaʻa ai ka patroni a me ka postgresql, no ka mea he mea nui ka hoʻouka disk no etcd. Akā no nā kumu hoʻonaʻauao, e hana mākou i kēlā.
E hoʻouka etcd.
#!/bin/bash
apt-get update
apt-get install etcdE hoʻohui i ka ʻike i /etc/default/etcd file
[lālā]
ETCD_NAME=datanode1 # inoa inoa o kāu mīkini
ETCD_DATA_DIR = "/var/lib/etcd/default.etcd"
PONO KA PALAPALA IP A PAU. LISTER PEER, CLIENT etc Pono e hoʻonoho i IP ADDRESS O HOST
ETCD_LISTEN_PEER_URLS="» # helu wahi o kāu kaʻa
ETCD_LISTEN_CLIENT_URLS="» # helu wahi o kāu kaʻa
[hui]
ETCD_INITIAL_ADVERTISE_PEER_URLS="» # helu wahi o kāu kaʻa
ETCD_INITIAL_CLUSTER=»datanode1=» # helu wahi o nā mīkini a pau i ka hui etcd
ETCD_INITIAL_CLUSTER_STATE="hou"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="» # helu wahi o kāu kaʻa
Holo i ke kauoha
systemctl restart etcdʻO PostgreSQL 9.6 + patroni
ʻO ka mea mua āu e hana ai, ʻo ia ka hoʻonohonoho ʻana i ʻekolu mīkini virtual e hoʻokomo i ka polokalamu pono ma luna o lākou. Ma hope o ka hoʻokomo ʻana i nā mīkini, inā ʻoe e hahai i kaʻu kumu aʻo, hiki iā ʻoe ke holo i kēia palapala maʻalahi e (kokoke) e hana i nā mea āpau no ʻoe. Holo e like me ke kumu.
E ʻoluʻolu e hoʻohana ka palapala i ka PostgreSQL version 9.6, ma muli o nā koi kūloko o kā mākou hui. ʻAʻole i hoʻāʻo ʻia ka hopena ma nā mana ʻē aʻe o 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.ymlA laila, i loko o ka faila /etc/patroni.yml āu i hana ai, pono ʻoe e kau i kēia mau ʻike, ʻoiaʻiʻo e hoʻololi i nā IP address ma nā wahi āpau i nā helu āu e hoʻohana ai.
E nānā i nā manaʻo ma kēia yaml. E hoʻololi i nā helu wahi i kāu iho ma kēlā me kēia mīkini i ka pūʻulu.
/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: falsePono e holo ka palapala ma nā mīkini ʻekolu o ka pūʻulu, a pono e hoʻokomo ʻia ka hoʻonohonoho i luna ma ka faila /etc/patroni.yml ma nā mīkini āpau.
Ke hoʻopau ʻoe i kēia mau hana ma nā mīkini āpau i ka hui, e holo i kēia kauoha ma luna o kekahi o lākou
systemctl start patroni
systemctl start postgresqlE kali ma kahi o 30 kekona, a laila e holo i kēia kauoha ma nā mīkini i koe o ka hui.
HAproxy
Hoʻohana mākou i ka HAproxy maikaʻi e hāʻawi i kahi helu komo. E loaʻa mau ka haku kikowaena ma ka helu wahi o ka mīkini kahi i kau ʻia ai ʻo HAproxy.
I ʻole e hoʻolilo i ka mīkini me HAproxy i hoʻokahi wahi o ka hāʻule ʻole, e hoʻokuʻu mākou iā ia i loko o kahi pahu Docker; i ka wā e hiki mai ana hiki ke hoʻokuʻu ʻia i loko o ka pūʻulu K8 a hoʻolilo i kā mākou failover cluster i ʻoi aku ka hilinaʻi.
E hana i papa kuhikuhi kahi e mālama ai ʻoe i ʻelua faila - Dockerfile a me haproxy.cfg. E hele i laila.
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.logE akahele, ʻo nā laina hope ʻekolu o ka faila haproxy.cfg e helu i nā helu wahi o kāu mau mīkini. E hoʻokaʻaʻike ʻo HAproxy iā Pattroni, ma nā poʻomanaʻo HTTP e hoʻihoʻi mau ka server master i 200, a e hoʻihoʻi mau ka replica i 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
Aia i loko o ka papa kuhikuhi kahi o kā mākou mau faila ʻelua e "wahaheʻe," e hoʻokō pono i nā kauoha no ka hoʻopili ʻana i ka ipu, a me ka hoʻokuʻu ʻana me ka hoʻouna ʻana i nā awa kūpono:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy I kēia manawa, ma ka wehe ʻana i ka helu wahi o kāu mīkini me HAproxy i ka polokalamu kele pūnaewele a me ka wehewehe ʻana i ke awa 7000, e ʻike ʻoe i nā helu ma kāu hui.
Aia ke kikowaena ʻo ia ka haku ma ka mokuʻāina ʻo UP, a aia nā kope i ka mokuʻāina DOWN. He mea maʻamau kēia, ʻoiaʻiʻo, hana lākou, akā ʻike ʻia lākou ma kēia ʻano no ka mea hoʻihoʻi lākou i 503 no nā noi mai HAproxy. ʻAe kēia iā mākou e ʻike mau i ka mea o nā kikowaena ʻekolu ka haku o kēia manawa.
hopena
Nani ʻoe! I loko o nā minuke 30 wale nō, ua hoʻonoho ʻoe i kahi pūʻulu waihona waihona hoʻomanawanui maikaʻi loa me ka hoʻopiʻi kahe ʻana a me ka hāʻule ʻakomi. Inā hoʻolālā ʻoe e hoʻohana i kēia hoʻonā, e nānā , a me kāna ʻāpana e pili ana i ka pono patronictl, e hāʻawi ana i ke ala kūpono i ka hoʻokele ʻana i kāu hui.
Hoʻomaikaʻi!
Source: www.habr.com
