แƒฃแƒแƒฆแƒ แƒ”แƒกแƒแƒ“ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ PostgreSQL แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ Patroni, etcd, HAProxy-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ˜แƒกแƒ” แƒ›แƒแƒฎแƒ“แƒ, แƒ แƒแƒ› แƒ˜แƒ› แƒ“แƒ แƒแƒก, แƒ แƒแƒชแƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒฌแƒแƒ›แƒแƒ˜แƒญแƒ แƒ, แƒ›แƒ” แƒแƒ  แƒ›แƒฅแƒแƒœแƒ“แƒ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒ แƒแƒ› แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒ แƒขแƒ แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ” แƒ’แƒฃแƒ’แƒšแƒ˜แƒœแƒ’แƒ˜.

แƒแƒ  แƒ•แƒ˜แƒชแƒ˜, แƒ แƒ แƒแƒ แƒ˜แƒก แƒ“แƒแƒญแƒ”แƒ แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒ™แƒ•แƒ” แƒแƒ›แƒ“แƒ”แƒœแƒฏแƒ”แƒ  แƒ•แƒแƒฌแƒงแƒ“แƒ”แƒ‘แƒ˜ แƒ˜แƒ› แƒคแƒแƒฅแƒขแƒก, แƒ แƒแƒ› แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ”แƒขแƒแƒžแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ•แƒแƒ™แƒ”แƒ—แƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒฎแƒ”แƒšแƒ›แƒซแƒฆแƒ•แƒแƒœแƒ”แƒšแƒแƒจแƒ˜, แƒ›แƒแƒ•แƒแƒ›แƒ–แƒแƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ’แƒแƒ แƒ”แƒ›แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ•แƒขแƒแƒ แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ“แƒ’แƒ”แƒ‘แƒ. แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ แƒแƒ  แƒ›แƒแƒฅแƒ•แƒก, แƒ แƒแƒจแƒ˜แƒ แƒกแƒแƒฅแƒ›แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒชแƒ แƒแƒ›แƒแƒก แƒ˜แƒกแƒ”แƒ• แƒจแƒ”แƒ•แƒฎแƒ•แƒ“แƒ˜, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”, แƒ แƒแƒ› แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ แƒฉแƒ”แƒ›แƒ˜ แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ˜, แƒ แƒแƒชแƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ. แƒ”แƒ แƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก.

แƒ’แƒ˜แƒ“แƒ”แƒ‘แƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒจแƒ˜

แƒ˜แƒกแƒ” แƒฎแƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜ แƒแƒ  แƒ’แƒแƒœแƒ˜แƒชแƒ“แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒแƒฎแƒ”แƒšแƒ›แƒซแƒฆแƒ•แƒแƒœแƒ”แƒšแƒแƒ”แƒ‘แƒ˜แƒก, แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก, แƒœแƒแƒ‘แƒ˜แƒฏ-แƒœแƒแƒ‘แƒ˜แƒฏ แƒ“แƒ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜แƒก แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ‘แƒแƒก. แƒ˜แƒกแƒ” แƒ›แƒแƒฎแƒ“แƒ, แƒ แƒแƒ› แƒ›แƒ” แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒฅแƒแƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ PostgreSQL แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ แƒ˜แƒงแƒ Master แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒ–แƒ” แƒ“แƒ แƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ Master แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒฌแƒแƒ แƒฃแƒ›แƒแƒขแƒ”แƒ‘แƒšแƒแƒ‘แƒ.

แƒแƒ› แƒ”แƒขแƒแƒžแƒ–แƒ” แƒ’แƒแƒœแƒ˜แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜:

  • PostgreSQL แƒ แƒแƒ’แƒแƒ แƒช DBMS
  • แƒžแƒแƒขแƒ แƒแƒœแƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒฃแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ
  • etcd แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜ แƒžแƒแƒขแƒ แƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
  • HAproxy แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜ แƒจแƒ”แƒกแƒ•แƒšแƒ˜แƒก แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒก แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก

แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒฃแƒแƒฆแƒ แƒ”แƒกแƒแƒ“ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ PostgreSQL แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ Patroni, etcd, HAProxy แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒงแƒ•แƒ”แƒšแƒ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ Debian 10 OS-แƒ˜แƒ—.

แƒ.แƒจ.แƒจ

แƒแƒ  แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— 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, Client แƒ“แƒ แƒ.แƒจ. แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒกแƒžแƒ˜แƒœแƒซแƒšแƒ˜แƒก IP แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ–แƒ”

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=ยปdatanode1=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 + แƒ›แƒคแƒแƒ แƒ•แƒ”แƒšแƒ˜

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ แƒแƒช แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ—, แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒ˜ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒแƒžแƒแƒ แƒแƒขแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒ–แƒ” แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“. แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ—แƒฃ แƒ›แƒ˜แƒฐแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ”แƒ›แƒก แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— แƒ”แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช (แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก) แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก. แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒช 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 แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒก แƒ˜แƒ› แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ—.
แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ แƒ›แƒ˜แƒแƒฅแƒชแƒ˜แƒ”แƒ— แƒแƒ› แƒ˜แƒแƒ›แƒšแƒ˜แƒก แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒก. แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒ— แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ”.

/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.

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› HAproxy-แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒแƒ  แƒ’แƒแƒฎแƒ“แƒ”แƒก แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒ แƒชแƒฎแƒ˜แƒก แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒก แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒ˜แƒ— Docker-แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒจแƒ˜; แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ 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-แƒก.

แƒฐแƒแƒžแƒ แƒแƒฅแƒกแƒ˜.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 แƒฃแƒขแƒ˜แƒšแƒ˜แƒขแƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒš แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒแƒ–แƒ”.

แƒ’แƒ˜แƒšแƒแƒชแƒแƒ•แƒ—!

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ