Doküman

Patroni ve HAProxy Kullanarak Yüksek Derecede Kullanılabilir PostgreSQL Kümesi Oluşturun

PostgreSQL nedir?

PostgreSQL (Postgres), tüm büyük işletim sistemlerinde çalışan, açık kaynaklı, tamamen ACID uyumlu bir ilişkisel veritabanıdır. Postgres çok yönlü, zengin özelliklere sahip ve güçlü bir veritabanı olsa da, yüksek kullanılabilirlik için yerleşik bir çözüme sahip değildir.

Bu yazı, Patroni kullanarak yüksek oranda kullanılabilir üç sunucudan oluşan bir Postgres kümesinin nasıl oluşturulacağını gösterir.

Başlamadan önce

  • Bu yazı içerisinde, mümkün olan her yerde sudo kullanılacaktır.
  • Sisteminizi güncelleyin:sudo apt update && sudo apt upgrade komutlarını kullanın (Debian ve türevleri için)
  • 5 ayrı sunucu oluşturun ve IP adreslerini not edin.

Not

Bu kılavuz, root olmayan bir kullanıcı için yazılmıştır. Yükseltilmiş ayrıcalıklar gerektiren komutların önüne sudo eklenir. sudo komutuna aşina değilseniz, bu konu hakkında bilgi edinin.

PostgreSQL’i yükleyin

Kurulumunuzdaki üç sunucuya Postgres yükleyin.

Bu kılavuzdaki örnekler, üç Postgres sunucuya 192.0.2.11, 192.0.2.12 ve 192.0.2.13’ün yerel IP adreslerini atar.

  • Postgres’i kurmak istediğiniz üç sunucu’da paket listelerini güncelleyin:
    sudo apt update (Debian ve türevleri)
  • Postgres’i yükleyin:
    sudo apt install postgresql-9.5 -y (Debian ve türevleri)
  • Kurulumun ardından Postgres otomatik olarak bir hizmet olarak çalışır. Patroni’nin bu noktadan itibaren yönetebilmesi için Postgres hizmetini durdurun:
    sudo systemctl stop postgresql
  • Patroni, Ubuntu 16.04’te varsayılan olarak /usr/lib/postgresql/9.5/bin dizininde bulunan Postgres ile birlikte gelen yardımcı programları kullanır. Patroni’nin yardımcı programları bulabilmesini sağlamak için PATH’de sembolik bağlantılar oluşturun:
    sudo ln -s /usr/lib/postgresql/9.5/bin/* /usr/sbin/
  • Bu adımları üç sunucunun her birinde tekrarlayın.

Patroni ‘yi yükleyin

Patroni, Postgres yapılandırmasını yöneten açık kaynaklı bir Python paketidir. Çoğaltma, yedekleme ve geri yükleme gibi görevleri yerine getirecek şekilde yapılandırılabilir.

Bu yazıda Patroni’yi şu amaçlarla kullanacaksınız:

  • Aynı sunucuda çalışan Postgres örneğini yapılandırma
  • Replikasyonu aktiftden pasife doğru yapılandırma
  • Birincil devrenin çökmesi durumunda otomatik olarak en iyi durumdakine geçiş.
  • Python ve pip’i kurun:
    sudo apt install python python-pip -y
  • setuptools python paketinin en son sürümüne sahip olduğunuzdan emin olun:
    sudo pip install –upgrade setuptools
  • Patroni’yi yüklemek için pip kullanın:
    sudo pip install patroni
  • Bu adımları üç sunucunun her birinde tekrarlayın.

Install etcd

Etcd, Postgres kümesinin durumunu depolamak için kullanılan, hataya dayanıklı, dağıtılmış bir anahtar/değer deposudur. Patroni aracılığıyla, tüm Postgres düğümleri, Postgres kümesini çalışır durumda tutmak için etcd’yi kullanır.

Bu yazıda tek sunuculu bir etcd kümesi kullanacaksınız. Bununla birlikte, bir etcd düğümünün başarısız olması için daha büyük bir etcd kümesi kullanmak en iyisi olabilir, bu Postgres sunucularınızı etkilemez.

  • etcd’nin yüklenmesini istediğiniz sunucuda paket listelerini güncelleyin:
    sudo apt update
  • etcd’yi kurun:
    sudo apt install etcd -y

Bu yazıda etcd kurulu olan sunucunun ip adresi  192.0.2.21 olacaktır.

HAProxy’yi yükleyin

Veritabanı kullanan bir uygulama geliştirirken, sürekli değişiyorlarsa veritabanı uç noktalarını takip etmek zahmetli olabilir. HAProxy’yi kullanmak, uygulamayı bağlayabileceğiniz tek bir uç nokta vererek bunu basitleştirir.

HAProxy, bağlantıyı şu anda birincil olan düğüme iletir. Bunu, Patroni’nin sağladığı bir REST bitiş noktası kullanarak yapar. Patroni, herhangi bir zamanda, yalnızca birincil Postgres düğümünün çevrimiçi olarak görünmesini sağlayarak HAProxy’yi doğru düğüme bağlanmaya zorlar.

  • HAProxy’nin yüklenmesini istediğiniz sunucuda paket listelerini güncelleyin:
    sudo apt update
  • HAProxy’yi yükleyin:
    sudo apt install haproxy -y

Bu yazıda HaProxy ‘nin yerel ip adresi 192.0.2.31 ve dış ip adresi 203.0.113.1 olacaktır.

Şu anki durum

Bu aşamada toplam beş adet sunucunuz olmalıdır:

Örnek Yerel IP AdresiYüklü YazılımÖrnek Dış IP Adresi
192.0.2.11Postgres, Patroni
192.0.2.12Postgres, Patroni
192.0.2.13Postgres, Patroni
192.0.2.21etcd
192.0.2.31HAProxy203.0.113.1

Configure etcd

  • Aşağıdaki yapılandırmayı eklemek için /etc/default/etcd dosyasını düzenleyin:

    ETCD_LISTEN_PEER_URLS="http://192.0.2.21:2380" ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.0.2.21:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.0.2.21:2380" ETCD_INITIAL_CLUSTER="etcd0=http://192.0.2.21:2380," ETCD_ADVERTISE_CLIENT_URLS="http://192.0.2.21:2379" ETCD_INITIAL_CLUSTER_TOKEN="cluster1" ETCD_INITIAL_CLUSTER_STATE="new"
  • Dosyayı kaydedin, ardından etcd hizmetini yeniden başlatın:
    sudo systemctl restart etcd

Kalıpları Yapılandırma

Patroni, herhangi bir yere yerleştirilebilen bir YAML dosyası kullanılarak yapılandırılabilir. Bu yazıda, bu dosyayı /etc/patroni.yml dizinine yerleştireceksiniz.

Postgres ve Patroni’nin kurulu olduğu üç sunucunun hepsinde ( 192.0.2.11, 192.0.2.12 ve 192.0.2.13) bir patroni.yml dosyası oluşturun. Adı benzersiz bir şeyle değiştirin ve listen ve connect_address’i (postgresql ve restapi altında) her sunucudaki uygun değerlerle değiştirin.

  • Aşağıdaki içeriğe sahip olmak için bu dosyayı düzenleyin:
scope: postgres
namespace: /db/
name: postgresql0

restapi:
    listen: 192.0.2.11:8008
    connect_address: 192.0.2.11:8008

etcd:
    host: 192.0.2.21:2379

bootstrap:
    dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true

    initdb:
    - encoding: UTF8
    - data-checksums

    pg_hba:
    - host replication replicator 127.0.0.1/32 md5
    - host replication replicator 192.0.2.11/0 md5
    - host replication replicator 192.0.2.12/0 md5
    - host replication replicator 192.0.2.13/0 md5
    - host all all 0.0.0.0/0 md5

    users:
        admin:
            password: admin
            options:
                - createrole
                - createdb

postgresql:
    listen: 192.0.2.11:5432
    connect_address: 192.0.2.11:5432
    data_dir: /data/patroni
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: rep-pass
        superuser:
            username: postgres
            password: secretpassword
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
  • Yukarıdaki dosyadaki data_dir değerini not edin. Postgres kullanıcısının bu dizine yazma yeteneğine ihtiyacı vardır. Bu dizin yoksa, oluşturun:
    sudo mkdir /data/patroni -p
  • Postgresleri /data/patroni’nin sahibi yapın:
    sudo chown postgres:postgres /data/patroni
  • Yalnızca postgres kullanıcısı tarafından erişilebilir hale getirmek için bu dizindeki izinleri değiştirin:
    sudo chmod 700 /data/patroni
  • Patroni’yi başlatmanıza, durdurmanıza ve izlemenize izin verecek bir sistem betiği oluşturun. /etc/systemd/system/patroni.service adresinde aşağıdaki içeriğe sahip bir dosya oluşturun:
[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
  • Patroni, makinenizde /usr/local/bin/patroni dışında bir konuma kuruluysa, yukarıdaki dosyayı uygun şekilde güncelleyin.
  • Patroni ve Postgres’i başlatın:
    sudo systemctl start patroni
  • Patroni’nin durumunu kontrol edin:
    sudo systemctl status patroni
    Her şey doğru ayarlanmışsa, ilk düğümden (lider) gelen çıktı şuna benzer:
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
Loaded: loaded (/etc/systemd/system/patroni.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2017-07-29 16:49:18 UTC; 8min ago
Main PID: 13097 (patroni)

.
.
.

... INFO: Lock owner: postgresql0; I am postgresql0
... INFO: no action.  i am the leader with the lock
  • Bir birincil ve iki yedek ile yüksek oranda kullanılabilir bir Postgres kümesi oluşturmak için Postgres yüklü üç sunucunun her birinde bu adımları tekrarlayın.

HAProxy’yi yapılandırın

Postgres kümesi kurulduğunda, kümedeki sunuculardan hangisinin birincil olduğuna bakılmaksızın birincil sunucuya bağlanmak için bir yola ihtiyacınız vardır. İşte burada HAProxy devreye girer. Tüm Postgres istemcileri (uygulamalarınız, psql, vb.) kümedeki birincil sunucuya bağlanmanızı sağlayacak olan HAProxy’ye bağlanacaktır.

  • HAProxy’nin kurulu olduğu Linode’da, /etc/haproxy/haproxy.cfg adresindeki yapılandırma dosyasını aşağıdakileri içerecek şekilde düzenleyin:
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 postgresql_192.0.2.11_5432 192.0.2.11:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.12_5432 192.0.2.12:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.13_5432 192.0.2.13:5432 maxconn 100 check port 8008
  • Bu yapılandırma, genel bir URL’de HAProxy istatistiklerini gösterir. Bir üretim kurulumunda, bunu bir dahili ağ/yerel ana bilgisayarla sınırlamak ve ona bir SSH tüneli üzerinden erişmek daha iyi olabilir.
  • Yeni ayarları kullanmak için HAProxy’yi yeniden başlatın:
    sudo systemctl restart haproxy
    HAProxy başlatılamazsa, sözdizimi hatalarını kontrol edin:
    /usr/sbin/haproxy -c -V -f /etc/haproxy/haproxy.cfg

Kurulumu Test Edin

  • Postgres istemcilerini, HAProxy’yi kurduğunuz sunucunun (bu kılavuzda, 203.0.113.1) dışl IP adresine bağlantı noktası 5000’e bağlayın.
  • Ayrıca HaProxy’nin arayüz paneline sunucunun 7000 portu üzerinden bağlanabilirsiniz.HAProxy dashboard - all servers running
    Postgres bölümünde postgresql_192.0.2.11_5432 satırı yeşil renkle vurgulanır. Bu, 192.0.2.11’in şu anda birincil olarak hareket ettiğini gösterir.
  • Birincil sunucuyu durdurursanız (sudo systemctl stop patroni kullanarak veya sunucuyu kapatarak), gösterge tablosu şuna benzer:HAProxy dashboard - when primary fails
    Postgres bölümünde, postgresql_192.0.2.11_5432 satırı artık kırmızı ve postgresql_192.0.2.13_5432 satırı yeşil renkle vurgulanmıştır. Bu, 192.0.2.13’ün şu anda birincil olarak hareket ettiğini gösterir.

Şimdi ilk sunucuyu açtığınızda, kümeye bekleme olarak yeniden katılacak ve birincil sunucuyla eşitlenecektir.

Artık kullanıma hazır, sağlam, yüksek düzeyde kullanılabilir bir Postgres kümeniz var.

Yazının orijinalini buradan okuyabilirsiniz