Patroni, etcd, HAProxy āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āωāĻĒāϞāĻŦā§āϧ PostgreSQL āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

āĻāϟāĻž āĻ āĻŋāĻ• āϤāĻžāχ āϘāĻŸā§‡āϛ⧇ āϝ⧇ āϏāĻŽāϝāĻŧ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āωāĻ¤ā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āφāĻŽāĻžāϰ āĻāĻ•āĻž āĻāχ āϏāĻŽāĻžāϧāĻžāύāϟāĻŋ āĻŦāĻŋāĻ•āĻžāĻļ āĻāĻŦāĻ‚ āϚāĻžāϞ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝāĻĨ⧇āĻˇā§āϟ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āĻ›āĻŋāϞ āύāĻžāĨ¤ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āφāĻŽāĻŋ āϗ⧁āĻ—āϞāĻŋāĻ‚ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋāĨ¤

āφāĻŽāĻŋ āϜāĻžāύāĻŋ āύāĻž āĻ•ā§āϝāĻžāϚāϟāĻŋ āϕ⧀, āϤāĻŦ⧇ āφāĻŽāĻŋ āĻāχ āϏāĻ¤ā§āϝ⧇āϰ āĻŽā§āĻ–ā§‹āĻŽā§āĻ–āĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋ āϝ⧇ āφāĻŽāĻŋ āϝāĻĻāĻŋ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ⧇āϰ āĻŽāϤ⧋ āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ•āϰāĻŋ, āϞ⧇āĻ–āϕ⧇āϰ āĻŽāϤ⧋ āĻāĻ•āχ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ, āϤāĻŦ⧇ āĻ•āĻŋāϛ⧁āχ āĻ•āĻ–āύāχ āĻ•āĻžāϜ āĻ•āϰ⧇ āύāĻžāĨ¤ āφāĻŽāĻžāϰ āϕ⧋āύ āϧāĻžāϰāĻŖāĻž āύ⧇āχ āĻŦā§āϝāĻžāĻĒāĻžāϰāϟāĻž āĻ•āĻŋ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻ–āύ āφāĻŽāĻŋ āφāĻŦāĻžāϰ āĻāϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāϞāĻžāĻŽ, āϤāĻ–āύ āφāĻŽāĻŋ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϞāĻžāĻŽ āϝ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ āĻŋāĻ• āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇ āφāĻŽāĻŋ āφāĻŽāĻžāϰ āύāĻŋāĻœā§‡āϰ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āϞāĻŋāĻ–āĻŦāĨ¤ āĻāĻ• āϝ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇.

āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āĻ—āĻžāχāĻĄ

āĻāϟāĻŋ āĻ āĻŋāĻ• āϤāĻžāχ āϘāĻŸā§‡ āϝ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ—āĻžāχāĻĄ, āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ, āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āĻāĻŦāĻ‚ āĻāϰ āĻŽāϤ⧋ āĻ…āĻ­āĻžāĻŦ⧇āϰ āĻ•āĻžāϰāϪ⧇ āĻ­ā§‹āϗ⧇ āύāĻžāĨ¤ āĻāϟāĻŋ āĻ āĻŋāĻ• āϤāĻžāχ āϘāĻŸā§‡āϛ⧇ āϝ⧇ āφāĻŽāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āĻāϏāĻ•āĻŋāωāĻāϞ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰāϕ⧇ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻ‚āĻ—āĻ āĻŋāϤ āĻāĻŦāĻ‚ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĻāĻžāϝāĻŧāĻŋāĻ¤ā§āĻŦ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϝāĻžāϰ āĻĒā§āϰāϧāĻžāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻžāϗ⧁āϞāĻŋ āĻ›āĻŋāϞ āĻŽāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋāϤ⧇ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻŽāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāĻ•āϟāĻŋ āϰāĻŋāϜāĻžāĻ°ā§āϭ⧇āϰ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻŦāĻŋāϧāĻžāύāĨ¤ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž.

āĻāχ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇, āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāϰ āĻ¸ā§āĻŸā§āϝāĻžāĻ• āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ:

  • āĻāĻ•āϟāĻŋ DBMS āĻšāĻŋāϏāĻžāĻŦ⧇ PostgreSQL
  • āĻĒ⧃āĻˇā§āĻ āĻĒā§‹āώāĻ• āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰāĻŋāĻ‚ āϏāĻŽāĻžāϧāĻžāύ āĻšāĻŋāϏāĻžāĻŦ⧇
  • Patroni āϜāĻ¨ā§āϝ āĻŦāĻŋāϤāϰāĻŖ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻšāĻŋāϏāĻžāĻŦ⧇ etcd
  • āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻ‚āĻ—āĻ āĻŋāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ HAproxy

āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āφāĻĒāύāĻžāϰ āĻŽāύ⧋āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ - Patroni, etcd, HAProxy āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āωāĻšā§āϚ āωāĻĒāϞāĻŦā§āϧ PostgreSQL āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤

āϏāĻŽāĻ¸ā§āϤ āĻ•āĻžāĻ°ā§āϝāĻ•ā§āϰāĻŽ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ Debian 10.

āχāĻ¤ā§āϝāĻžāĻĻāĻŋ

āφāĻŽāĻŋ āĻāĻ•āχ āĻŽā§‡āĻļāĻŋāύ⧇ 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"

āϏāĻŽāĻ¸ā§āϤ āφāχāĻĒāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āĻŦ⧈āϧ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤ āϞāĻŋāĻ¸ā§āϟāĻžāϰ āĻĒāĻŋāϝāĻŧāĻžāϰ, āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻšā§‹āĻ¸ā§āĻŸā§‡āϰ āφāχāĻĒāĻŋ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āϏ⧇āϟ āĻ•āϰāĻž āωāϚāĻŋāϤ

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380āφāĻĒāύāĻžāϰ āĻ—āĻžāĻĄāĻŧāĻŋāϰ # āĻ āĻŋāĻ•āĻžāύāĻž
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379āφāĻĒāύāĻžāϰ āĻ—āĻžāĻĄāĻŧāĻŋāϰ # āĻ āĻŋāĻ•āĻžāύāĻž

[āϗ⧁āĻšā§āĻ›]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380āφāĻĒāύāĻžāϰ āĻ—āĻžāĻĄāĻŧāĻŋāϰ # āĻ āĻŋāĻ•āĻžāύāĻž
ETCD_INITIAL_CLUSTER=ÂģāĻĄā§‡āϟāĻžāύ⧋āĻĄ1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380Âģ# etcd āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āϏāĻŽāĻ¸ā§āϤ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž
ETCD_INITIAL_CLUSTER_STATE="āύāϤ⧁āύ"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1â€ŗ
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379āφāĻĒāύāĻžāϰ āĻ—āĻžāĻĄāĻŧāĻŋāϰ # āĻ āĻŋāĻ•āĻžāύāĻž

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϚāĻžāϞāĻžāύ

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 āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞāĻŋāϤ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇⧎
āĻāχ āχāϝāĻŧāĻžāĻŽāϞ⧇āϰ āĻŽāĻ¨ā§āϤāĻŦā§āϝāϗ⧁āϞāĻŋāϤ⧇ āĻŽāύ⧋āϝ⧋āĻ— āĻĻāĻŋāύāĨ¤ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŽā§‡āĻļāĻŋāύ⧇ āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻŽāϤ⧋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύāĨ¤

/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 āϏāĻš āĻŽā§‡āĻļāĻŋāύāϟāĻŋāϕ⧇ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻāĻ•āĻ• āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ āϚāĻžāϞ⧁ āĻ•āϰāĻŦ; āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāϟāĻŋ K8 āĻāϰ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āϚāĻžāϞ⧁ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰāϕ⧇ āφāϰāĻ“ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ•āϰ⧇ āϤ⧁āϞāĻŦ⧇⧎

āĻāĻ•āϟāĻŋ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ āĻĻ⧁āϟāĻŋ āĻĢāĻžāχāϞ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ - 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 āĻļāĻŋāϰ⧋āύāĻžāĻŽā§‡ āĻŽāĻžāĻ¸ā§āϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻ°ā§āĻŦāĻĻāĻž 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 āϰāĻžāĻœā§āϝ⧇, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋāϗ⧁āϞāĻŋ āĻĄāĻžāωāύ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻŦ⧇⧎ āĻāϟāĻŋ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•, āφāϏāϞ⧇ āϤāĻžāϰāĻž āĻ•āĻžāϜ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻž āĻāχāĻ­āĻžāĻŦ⧇ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻšāϝāĻŧ āĻ•āĻžāϰāĻŖ āϤāĻžāϰāĻž HAproxy āĻĨ⧇āϕ⧇ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϜāĻ¨ā§āϝ 503 āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻ°ā§āĻŦāĻĻāĻž āϜāĻžāύāϤ⧇ āĻĻ⧇āϝāĻŧ āϝ⧇ āϤāĻŋāύāϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϕ⧋āύāϟāĻŋ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŽāĻžāĻ¸ā§āϟāĻžāϰāĨ¤

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āϤ⧁āĻŽāĻŋ āϚāĻŽā§ŽāĻ•āĻžāϰ! āĻŽāĻžāĻ¤ā§āϰ 30 āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āφāĻĒāύāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽāĻŋāĻ‚ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻĢāϞāĻŦā§āϝāĻžāĻ• āϏāĻš āĻāĻ•āϟāĻŋ āϚāĻŽā§ŽāĻ•āĻžāϰ āĻ¤ā§āϰ⧁āϟāĻŋ-āϏāĻšāύāĻļā§€āϞ āĻāĻŦāĻ‚ āωāĻšā§āϚ-āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāχ āϏāĻŽāĻžāϧāĻžāύāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāϛ⧇āύ āϤāĻŦ⧇ āĻšā§‡āĻ• āφāωāϟ āĻ•āϰ⧁āύ āϏāϰāĻ•āĻžāϰ⧀ Patroni āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āϏāĻš, āĻāĻŦāĻ‚ āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇ āĻĒā§āϝāĻžāĻŸā§āϰ⧋āύāĻŋāĻ•āϟāϞ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻāϰ āĻ…āĻ‚āĻļ⧇āϰ āϏāĻžāĻĨ⧇, āϝāĻž āφāĻĒāύāĻžāϰ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āĻ…āĻ­āĻŋāύāĻ¨ā§āĻĻāύ!

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster