Nws tsuas yog tshwm sim thaum lub sijhawm teeb meem tshwm sim, kuv tsis muaj kev paub txaus los tsim thiab tso tawm qhov kev daws teeb meem no ib leeg. Thiab ces kuv pib Googling.
Kuv tsis paub tias qhov ntes yog dab tsi, tab sis rau lub sijhawm umpteenth kuv tau ntsib nrog qhov tseeb tias txawm tias kuv ua txhua kauj ruam los ntawm kauj ruam raws li hauv kev qhia, npaj ib puag ncig zoo li tus sau, ces tsis muaj dab tsi ua haujlwm. Kuv tsis paub dab tsi yog qhov teeb meem, tab sis thaum kuv ntsib qhov no dua, kuv txiav txim siab tias kuv yuav sau kuv tus kheej cov lus qhia thaum txhua yam ua haujlwm. Ib qho uas yuav twv yuav raug hu ua haujlwm.
Cov lus qhia hauv Internet
Nws tsuas yog tshwm sim tias Internet tsis raug kev txom nyem los ntawm qhov tsis muaj ntau yam kev qhia, kev qhia, ib kauj ruam dhau los thiab lwm yam. Nws tsuas yog tshwm sim uas kuv tau ua haujlwm los tsim cov kev daws teeb meem rau kev teeb tsa yooj yim thiab txhim kho qhov ua tsis tiav PostgreSQL pawg, cov kev cai tseem ceeb uas tau tshaj tawm cov ntawv luam tawm los ntawm Master server rau txhua qhov kev hloov pauv thiab tsis siv neeg muab kev khaws cia hauv qhov xwm txheej ntawm Master server. ua tsis tiav.
Nyob rau theem no, pawg ntawm technologies siv tau txiav txim siab:
- PostgreSQL ua DBMS
- raws li kev daws teeb meem
- etcd raws li faib cia rau Patroni
- HAproxy rau kev teeb tsa ib qho chaw nkag rau cov ntawv thov siv cov ntaub ntawv
chaw
Rau koj mloog - tsim kom muaj PostgreSQL pawg uas siv Patroni, thiab lwm yam, HAProxy.
Txhua yam haujlwm tau ua tiav ntawm cov tshuab virtual nrog lub OS ntsia. Debian 10.
lwm yam
Kuv tsis pom zoo kom txhim kho etcd ntawm tib lub tshuab uas patroni thiab postgresql yuav nyob, vim tias disk load tseem ceeb heev rau lwm yam. Tab sis rau lub hom phiaj kev kawm, peb yuav ua li ntawd xwb.
Cia peb nruab thiab lwm yam.
#!/bin/bash
apt-get update
apt-get install etcdNtxiv cov ntsiab lus rau /etc/default/etcd file
[tus tswv cuab]
ETCD_NAME=datanode1 # hostname ntawm koj lub tshuab
ETCD_DATA_DIR = "/var/lib/etcd/default.etcd"
Txhua tus IP chaw nyob yuav tsum muaj cai. LISTER PEER, Client thiab lwm yam yuav tsum tau teeb tsa rau IP chaw nyob ntawm tus tswv tsev
ETCD_LISTEN_PEER_URLS="» # chaw nyob ntawm koj lub tsheb
ETCD_LISTEN_CLIENT_URLS="» # chaw nyob ntawm koj lub tsheb
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="» # chaw nyob ntawm koj lub tsheb
ETCD_INITIAL_CLUSTER=»datanode1=» # chaw nyob ntawm txhua lub tshuab hauv pawg thiab lwm yam
ETCD_INITIAL_CLUSTER_STATE = "tshiab"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="» # chaw nyob ntawm koj lub tsheb
Khiav cov lus txib
systemctl restart etcdPostgreSQL 9.6 + txhawb nqa
Thawj qhov koj yuav tsum tau ua yog teeb tsa peb lub tshuab virtual los nruab cov software tsim nyog rau lawv. Tom qab txhim kho cov tshuab, yog tias koj ua raws li kuv cov lus qhia, koj tuaj yeem khiav cov ntawv yooj yim no uas yuav (yuav luag) ua txhua yam rau koj. Khiav li hauv paus.
Thov nco ntsoov tias tsab ntawv siv PostgreSQL version 9.6, qhov no yog vim qhov xav tau sab hauv ntawm peb lub tuam txhab. Cov kev daws teeb meem tsis tau raug sim rau lwm cov versions ntawm 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.ymlTom ntej no, hauv /etc/patroni.yml cov ntaub ntawv koj nyuam qhuav tsim, koj yuav tsum tso cov ntsiab lus hauv qab no, tau kawg hloov chaw nyob IP hauv txhua qhov chaw mus rau qhov chaw nyob uas koj siv.
Ua tib zoo mloog cov lus hauv no yaml. Hloov chaw nyob rau koj tus kheej ntawm txhua lub tshuab hauv pawg.
/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: falseTsab ntawv yuav tsum tau khiav ntawm tag nrho peb lub tshuab ntawm pawg, thiab cov kev teeb tsa saum toj no yuav tsum tau muab tso rau hauv cov ntaub ntawv /etc/patroni.yml ntawm txhua lub tshuab.
Thaum koj ua tiav cov haujlwm no ntawm txhua lub tshuab hauv pawg, khiav cov lus txib hauv qab no rau ib qho ntawm lawv
systemctl start patroni
systemctl start postgresqlTos li 30 vib nas this, ces khiav cov lus txib no ntawm cov tshuab seem hauv pawg.
HAproxy
Peb siv HAproxy zoo heev los muab ib qho chaw nkag. Tus tswv server yuav ib txwm muaj nyob ntawm qhov chaw nyob ntawm lub tshuab uas HAproxy raug xa mus.
Txhawm rau kom tsis txhob ua kom lub tshuab nrog HAproxy ib qho kev ua tsis tiav, peb yuav tso nws rau hauv lub thawv Docker; yav tom ntej nws tuaj yeem tso rau hauv K8 pawg thiab ua rau peb pawg tsis ua haujlwm ntau dua.
Tsim ib daim ntawv teev npe uas koj tuaj yeem khaws ob cov ntaub ntawv - Dockerfile thiab haproxy.cfg. Mus rau nws.
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.logCeev faj, peb kab kawg ntawm cov ntaub ntawv haproxy.cfg yuav tsum sau cov chaw nyob ntawm koj lub tshuab. HAproxy yuav hu rau Patroni, nyob rau hauv HTTP headers tus tswv server yuav ib txwm rov qab 200, thiab cov replica yeej ib txwm rov 503.
haproxy.cfg ua
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
Nyob rau hauv phau ntawv teev npe nyob rau hauv uas ob peb cov ntaub ntawv "dej," cia peb ua raws li cov lus txib rau ntim lub thawv, nrog rau kev xa tawm nrog xa mus rau cov chaw nres nkoj tsim nyog:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Tam sim no, los ntawm kev qhib qhov chaw nyob ntawm koj lub tshuab nrog HAproxy hauv qhov browser thiab qhia qhov chaw nres nkoj 7000, koj yuav pom cov txheeb cais ntawm koj pawg.
Tus neeg rau zaub mov uas yog tus tswv yuav nyob rau hauv lub xeev UP, thiab cov replicas yuav nyob rau hauv lub xeev DOWN. Qhov no yog qhov qub, qhov tseeb lawv ua haujlwm, tab sis lawv tshwm sim li no vim tias lawv rov qab 503 rau kev thov los ntawm HAproxy. Qhov no tso cai rau peb ib txwm paub qhov tseeb ntawm peb lub servers yog tus tswv tam sim no.
xaus
Koj zoo nkauj! Hauv 30 feeb xwb koj tau siv qhov kev ua txhaum zoo-hloov siab thiab ua haujlwm siab ntawm pawg database nrog streaming replication thiab tsis siv neeg poob. Yog tias koj tab tom npaj siv qhov kev daws teeb meem no, kos tawm , thiab tshwj xeeb tshaj yog nrog nws feem txog kev siv hluav taws xob patronictl, uas muab kev yooj yim rau kev tswj hwm koj pawg.
Nrog koj zoo siab!
Tau qhov twg los: www.hab.com
