มันบังเอิญว่าในขณะที่เกิดปัญหา ฉันไม่มีประสบการณ์เพียงพอที่จะพัฒนาและเปิดตัวโซลูชันนี้เพียงอย่างเดียว จากนั้นฉันก็เริ่มใช้ Google
ฉันไม่รู้ว่าสิ่งที่จับได้คืออะไร แต่เป็นครั้งที่เท่าไหร่ที่ฉันต้องเผชิญหน้ากับความจริงที่ว่าแม้ว่าฉันจะทำทุกอย่างทีละขั้นตอนเหมือนในบทช่วยสอน แต่ก็เตรียมสภาพแวดล้อมแบบเดียวกับผู้เขียน แต่ไม่มีอะไรทำงานเลย ฉันไม่รู้ว่าเกิดอะไรขึ้น แต่เมื่อฉันเจอสิ่งนี้อีกครั้ง ฉันตัดสินใจว่าจะเขียนบทช่วยสอนของตัวเองเมื่อทุกอย่างได้ผล สิ่งหนึ่งที่จะได้ผลอย่างแน่นอน
คำแนะนำบนอินเทอร์เน็ต
มันเกิดขึ้นจนอินเทอร์เน็ตไม่ต้องทนทุกข์ทรมานจากการขาดคำแนะนำ บทช่วยสอน ทีละขั้นตอนและสิ่งที่คล้ายกัน มันบังเอิญจนฉันได้รับมอบหมายให้พัฒนาโซลูชันเพื่อความสะดวกในการจัดระเบียบและสร้างคลัสเตอร์ PostgreSQL เมื่อเกิดข้อผิดพลาด ซึ่งเป็นข้อกำหนดหลักในการสตรีมการจำลองแบบจากเซิร์ฟเวอร์หลักไปยังแบบจำลองทั้งหมด และการจัดเตรียมการสำรองอัตโนมัติในกรณีของเซิร์ฟเวอร์หลัก ความล้มเหลว.
ในขั้นตอนนี้ มีการกำหนดสแต็คของเทคโนโลยีที่ใช้:
- PostgreSQL เป็น DBMS
ผู้มีพระคุณ เป็นโซลูชันการจัดกลุ่ม- ฯลฯ เป็นพื้นที่เก็บข้อมูลแบบกระจายสำหรับ Patroni
- HAproxy สำหรับจัดระเบียบจุดเริ่มต้นเดียวสำหรับแอปพลิเคชันที่ใช้ฐานข้อมูล
การติดตั้ง
โปรดทราบ - การสร้างคลัสเตอร์ PostgreSQL ที่พร้อมใช้งานสูงโดยใช้ Patroni, etcd, HAProxy
การดำเนินการทั้งหมดดำเนินการบนเครื่องเสมือนที่ติดตั้งระบบปฏิบัติการ Debian 10
ฯลฯ
ฉันไม่แนะนำให้ติดตั้ง etcd บนเครื่องเดียวกับที่จะมี Patroni และ PostgreSQL เนื่องจากการโหลดดิสก์มีความสำคัญมากสำหรับ etcd แต่เพื่อการศึกษาเราจะทำเช่นนั้น
มาติดตั้ง etcd กัน
#!/bin/bash
apt-get update
apt-get install etcd
เพิ่มเนื้อหาลงในไฟล์ /etc/default/etcd
[สมาชิก]
ETCD_NAME=datanode1 # ชื่อโฮสต์ของเครื่องของคุณ
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
ที่อยู่ IP ทั้งหมดควรจะถูกต้อง LISTER PEER, ลูกค้า ฯลฯ ควรตั้งค่าเป็นที่อยู่ IP ของโฮสต์
ETCD_LISTEN_PEER_URLS="
ETCD_LISTEN_CLIENT_URLS="
[กลุ่ม]
ETCD_INITIAL_ADVERTISE_PEER_URLS="
ETCD_INITIAL_CLUSTER=»ดาต้าโหนด1=
ETCD_INITIAL_CLUSTER_STATE="ใหม่"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-คลัสเตอร์-1"
ETCD_ADVERTISE_CLIENT_URLS="
ดำเนินการคำสั่ง
systemctl restart etcd
PostgreSQL 9.6 + ผู้สนับสนุน
สิ่งแรกที่คุณต้องทำคือตั้งค่าเครื่องเสมือนสามเครื่องเพื่อติดตั้งซอฟต์แวร์ที่จำเป็น หลังจากติดตั้งเครื่องแล้ว หากคุณปฏิบัติตามบทช่วยสอนของฉัน คุณสามารถเรียกใช้สคริปต์ง่ายๆ นี้ที่จะ (เกือบ) ทำทุกอย่างให้กับคุณ ทำงานเป็นรูท
โปรดทราบว่าสคริปต์ใช้ 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
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
สคริปต์จะต้องรันบนทั้งสามเครื่องของคลัสเตอร์ และต้องวางการกำหนดค่าข้างต้นไว้ในไฟล์ /etc/patroni.yml บนทุกเครื่องด้วย
เมื่อคุณดำเนินการเหล่านี้บนเครื่องทั้งหมดในคลัสเตอร์เสร็จแล้ว ให้รันคำสั่งต่อไปนี้กับเครื่องใดเครื่องหนึ่ง
systemctl start patroni
systemctl start postgresql
รอประมาณ 30 วินาที จากนั้นรันคำสั่งนี้บนเครื่องที่เหลืออยู่ในคลัสเตอร์
ฮพร็อกซี
เราใช้ HAproxy ที่ยอดเยี่ยมเพื่อให้เป็นจุดเข้าเพียงจุดเดียว เซิร์ฟเวอร์หลักจะพร้อมใช้งานตามที่อยู่ของเครื่องที่ใช้งาน HAproxy เสมอ
เพื่อไม่ให้เครื่องที่มี HAproxy เป็นจุดล้มเหลวเพียงจุดเดียว เราจะเปิดใช้มันในคอนเทนเนอร์ Docker ในอนาคต จะสามารถเปิดใช้งานในคลัสเตอร์ของ K8 และทำให้คลัสเตอร์ล้มเหลวของเราน่าเชื่อถือยิ่งขึ้น
สร้างไดเร็กทอรีที่คุณสามารถจัดเก็บสองไฟล์ - Dockerfile และ haproxy.cfg ไปที่มัน.
ไฟล์นักเทียบท่า
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 เซิร์ฟเวอร์หลักจะส่งกลับ 200 เสมอ และแบบจำลองจะส่งกลับ 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 นาที คุณได้ปรับใช้คลัสเตอร์ฐานข้อมูลประสิทธิภาพสูงที่ทนทานต่อข้อผิดพลาดและมีประสิทธิภาพสูง พร้อมการจำลองแบบสตรีมมิ่งและทางเลือกสำรองอัตโนมัติ หากคุณกำลังวางแผนที่จะใช้โซลูชันนี้ ลองดู
ขอแสดงความยินดี!
ที่มา: will.com