Ubuntu : Patroni ile Yüksek Erişilebilirlikli (HA) PostgreSQL Cluster (Küme) Kurulumu
Veritabanı sistemleri, modern bilişim altyapılarının temelini oluşturur ve iş sürekliliği için kritik öneme sahiptir. Tek bir veritabanı sunucusunda meydana gelebilecek donanım arızaları, yazılım hataları veya ağ kesintileri gibi durumlar, hizmet kesintilerine ve veri kaybına yol açabilir. Bu nedenle, yüksek erişilebilirlik (HA) çözümleri, veritabanı sistemlerinin kesintisiz çalışmasını sağlamak ve olası arızaların etkilerini en aza indirmek için vazgeçilmezdir. Yüksek erişilebilirlik, sadece beklenmedik arızalara karşı bir önlem olmakla kalmaz, aynı zamanda planlı bakım çalışmaları sırasında da sistemlerin sürekli olarak erişilebilir kalmasına olanak tanıyarak operasyonel esnekliği artırır. Tek bir sunucunun çökmesi doğrudan hizmet kesintisine neden olurken, yüksek erişilebilirlik mimarileri, birden fazla yedek sunucu sayesinde bu riski önemli ölçüde azaltır. Planlı bakımlar sırasında sunucular sırayla devre dışı bırakılabilir, bu da kullanıcıların hizmete kesintisiz erişimini garanti eder.
Patroni, Python programlama dili kullanılarak geliştirilmiş, açık kaynaklı bir PostgreSQL yüksek erişilebilirlik çözümüdür. Patroni, dağıtık konfigürasyon depolama sistemleri (Distributed Configuration Store – DCS) olarak bilinen teknolojilerle entegre bir şekilde çalışır. Şu anda ZooKeeper, etcd, Consul ve Kubernetes gibi popüler DCS platformlarını desteklemektedir. Patroni’nin temel işlevleri arasında otomatik failover (arıza durumunda otomatik olarak yedek sunucuya geçiş), lider seçimi (kümedeki hangi sunucunun birincil olacağını belirleme) ve konfigürasyon yönetimi (küme genelinde tutarlı yapılandırmayı sağlama) yer alır. Patroni’nin bu esnekliği, farklı altyapı ihtiyaçlarına kolayca uyum sağlamasına olanak tanır. Bu doküman boyunca, Patroni’nin etcd ile birlikte nasıl yapılandırılacağını ve kullanılacağını detaylı bir şekilde ele alacağız.
Bu doküman, üç adet Ubuntu sunucusu üzerinde Patroni kullanarak yüksek erişilebilirlikli bir PostgreSQL kümesinin nasıl kurulacağını adım adım anlatmaktadır. Bu kurulum sürecinde, etcd’nin dağıtık konfigürasyon deposu olarak nasıl yapılandırılacağı ve isteğe bağlı olarak HAProxy’nin yük dengeleyici olarak nasıl entegre edileceği de açıklanacaktır. Ayrıca, bu kurulum sırasında en sık karşılaşılan hatalar ve bu hataların çözümleri de sunulacak, böylece kullanıcıların olası sorunları kolayca gidermesi sağlanacaktır. Son olarak, kurulan PostgreSQL kümesinin temel yönetimini gerçekleştirmek için kullanılan patronictl komutlarına dair basitleştirilmiş kullanım örnekleri de bu dokümanda yer alacaktır.
Ön Gereksinimler
Yüksek erişilebilirlikli PostgreSQL kümesini Patroni ile kurmaya başlamadan önce, aşağıdaki ön gereksinimlerin karşılandığından emin olunmalıdır:
- Üç Adet Ubuntu Sunucusu: Bu kurulum için en az üç adet Ubuntu sunucusuna ihtiyaç duyulmaktadır. Sunucuların donanım gereksinimleri, beklenen iş yüküne göre değişiklik gösterebilir. Ancak genel olarak, her sunucu için minimum 2 GB RAM önerilir. Önerilen Ubuntu sürümü olarak, güncel ve uzun süreli destek (LTS) sağlayan sürümlerden birinin (örneğin Ubuntu 20.04 LTS veya 22.04 LTS) kullanılması tavsiye edilir. Her sunucuya statik bir IP adresi atanmış olmalıdır. Sunucu kaynaklarının, beklenen veritabanı iş yüküne göre doğru bir şekilde ayarlanması kritik öneme sahiptir. Yetersiz kaynaklar, performans sorunlarına ve sistem kararsızlığına yol açabilir. Uygulamanın veritabanına olan talepleri performansı doğrudan etkiler; bu nedenle, yüksek talep durumlarında daha fazla işlemci, bellek ve disk alanı gerekebilir. Aksi takdirde, yetersiz kaynaklar nedeniyle gecikmeler ve hatta sistem kilitlenmeleri yaşanabilir.
- Temel Sistem Yönetimi Bilgisi: Bu kurulum kılavuzunu takip edebilmek için, kullanıcıların temel Linux komut satırı kullanımına, paket yönetimine (apt), servis yönetimine (systemctl) ve ağ yapılandırması temellerine hakim olması gerekmektedir.
- Ağ Yapılandırması: Sunucular arasında sorunsuz bir ağ iletişiminin kurulmuş olması gerekmektedir. Bunu doğrulamak için, sunucular arasında ping komutu kullanılarak bağlantı testi yapılabilir. Ayrıca, PostgreSQL (5432), Patroni REST API (8008), etcd client (2379), etcd peer (2380) ve HAProxy (eğer kullanılacaksa 5000, 7000 vb.) gibi gerekli portların firewall (güvenlik duvarı) üzerinde açık olduğundan emin olunmalıdır. Firewall yapılandırması, sistemin farklı bileşenleri arasındaki iletişimi doğrudan etkilediği için kritik bir öneme sahiptir. Yanlış yapılandırılmış bir firewall, bu bileşenlerin birbirleriyle iletişim kurmasını engelleyerek kurulumun başarısız olmasına neden olabilir. PostgreSQL, Patroni ve etcd gibi bileşenler, belirli portlar üzerinden veri alışverişi yaparlar. Eğer bu portlara erişim firewall tarafından kısıtlanırsa, bileşenler arasındaki iletişim sağlanamaz ve sonuç olarak sistem düzgün bir şekilde çalışamaz.
PostgreSQL Kurulumu
Yüksek erişilebilirlikli PostgreSQL kümesinin her bir node’unda PostgreSQL’in kurulu olması gerekmektedir. Aşağıdaki adımlar, her üç Ubuntu sunucusunda da aynı şekilde uygulanmalıdır:
- Paket Listesinin Güncellenmesi: İlk adım olarak, sistemdeki paket listesini en son sürümlerle güncellemek için aşağıdaki komut çalıştırılır:
Bash
sudo apt update
Bu komut, sistemin mevcut paket depolarındaki en güncel bilgileri almasını sağlar. - PostgreSQL ve Contrib Paketlerinin Yüklenmesi: Ardından, PostgreSQL veritabanı sunucusunu ve ek araçları içeren postgresql-contrib paketini yüklemek için aşağıdaki komut kullanılır:
Bash
sudo apt install postgresql postgresql-contrib -y
Bu komut, PostgreSQL sunucusunun ve postgresql-contrib paketinin otomatik olarak kurulmasını sağlar. postgresql-contrib paketi, veritabanı yönetimi ve geliştirme süreçlerinde faydalı olabilecek ek araçlar ve fonksiyonlar içerir. - PostgreSQL Servisinin Durdurulması: Patroni’nin PostgreSQL’i yüksek erişilebilirlik için yönetebilmesi için, PostgreSQL servisinin kurulumdan sonra durdurulması gerekmektedir. Aşağıdaki komut ile PostgreSQL servisi durdurulabilir:
Bash
sudo systemctl stop postgresql
Patroni, PostgreSQL servisinin yaşam döngüsünü kendisi yönetecektir. Bu nedenle, kurulumdan sonra PostgreSQL’in otomatik olarak başlamasını engellemek önemlidir. Eğer PostgreSQL servisi bağımsız olarak çalışmaya devam ederse, Patroni ile çakışabilir ve bu durum, yüksek erişilebilirlik mekanizmalarının düzgün çalışmasını engelleyebilir. Patroni’nin kontrolü devralabilmesi için PostgreSQL servisinin durdurulması gereklidir.
etcd Kurulumu ve Yapılandırması
etcd, Patroni tarafından yönetilen yüksek erişilebilirlikli PostgreSQL kümesi için kritik bir bileşendir. Dağıtık bir anahtar-değer deposu olarak etcd, küme üyeleri arasında lider seçimi, konfigürasyon depolama, sağlık kontrolü ve veri tutarlılığı gibi önemli işlevleri yerine getirir. Kararlı ve güvenilir bir etcd kümesi, PostgreSQL HA’nın temelini oluşturur. Patroni, lider seçimi ve konfigürasyon bilgileri gibi kritik verileri depolamak ve yönetmek için merkezi bir sisteme ihtiyaç duyar ve etcd bu ihtiyacı karşılar. Eğer etcd arızalanırsa, Patroni kümesi düzgün bir şekilde çalışamaz.
Aşağıdaki adımlar, üç node’lu bir etcd kümesinin Ubuntu sunucuları üzerine nasıl kurulacağını ve yapılandırılacağını açıklamaktadır:
- Paket Listesinin Güncellenmesi: Her sunucuda paket listesini güncellemek için aşağıdaki komut çalıştırılır:
Bash
sudo apt update - etcd Paketinin Yüklenmesi: Ubuntu 24.04 ve sonrası sürümlerde etcd’yi yüklemek için aşağıdaki komut kullanılabilir:
Bash
sudo apt install etcd-server
Daha eski Ubuntu sürümlerinde ise paket adı sadece etcd olabilir. Ubuntu sürümüne göre etcd paket adının değişmesi, kurulum sırasında dikkat edilmesi gereken bir husustur. Alternatif olarak, etcd’nin en son sürümünü veya belirli bir sürümünü kurmak için prebuilt binaries (önceden derlenmiş ikili dosyalar) yöntemi de kullanılabilir. Bu yöntem genellikle daha güncel bir sürüm sunar ve daha fazla kontrol imkanı tanır. Prebuilt binaries ile kurulum için, etcd’nin resmi GitHub sayfasından uygun sürüm indirilip, sistemin PATH ortam değişkenine eklenmesi gerekmektedir. - Yapılandırma Dosyasının Düzenlenmesi: etcd’nin yapılandırma dosyası genellikle /etc/etcd/etcd.conf veya Debian/Ubuntu sistemlerinde /etc/default/etcd konumunda bulunur. Bu dosya, etcd kümesinin nasıl çalışacağını belirleyen çeşitli parametreleri içerir. Her bir sunucu için bu dosyanın aşağıdaki gibi düzenlenmesi gerekmektedir:
- ETCD_NAME: Bu parametre, etcd node’unun benzersiz adını belirtir (örneğin etcd1, etcd2, etcd3). Her node için farklı bir ad kullanılmalıdır.
- ETCD_INITIAL_CLUSTER: Bu parametre, etcd kümesindeki tüm node’ların adreslerini ve isimlerini tanımlar. Tüm node’larda aynı değeri içermelidir. Örneğin:
ETCD_INITIAL_CLUSTER=”etcd1=http://<sunucu1_ip>:2380,etcd2=http://<sunucu2_ip>:2380,etcd3=http://<sunucu3_ip>:2380″
<sunucu1_ip>, <sunucu2_ip> ve <sunucu3_ip> yerlerine sunucularınızın gerçek IP adresleri yazılmalıdır. ETCD_INITIAL_CLUSTER parametresindeki IP adreslerinin doğru ve tutarlı olması, kümenin sağlıklı çalışması için hayati önem taşır. Küme başlangıçta hangi node’ların birbirini tanıyacağını bu bilgi sayesinde öğrenir. Yanlış IP adresleri, node’ların birbirini bulamamasına ve kümenin oluşmamasına neden olabilir. - ETCD_LISTEN_CLIENT_URLS: Bu parametre, etcd’nin istemci isteklerini dinleyeceği URL’leri belirtir. Genellikle http://localhost:2379,<sunucu_ip>:2379 şeklinde ayarlanır.
- ETCD_ADVERTISE_CLIENT_URLS: Bu parametre, diğer küme üyelerine ve istemcilere duyurulacak istemci URL’lerini belirtir. Genellikle <sunucu_ip>:2379 şeklinde ayarlanır.
- ETCD_LISTEN_PEER_URLS: Bu parametre, etcd’nin diğer küme üyelerinden gelen eş trafiğini dinleyeceği URL’leri belirtir. Genellikle <sunucu_ip>:2380 şeklinde ayarlanır.
- ETCD_INITIAL_ADVERTISE_PEER_URLS: Bu parametre, diğer küme üyelerine duyurulacak eş URL’lerini belirtir. Genellikle <sunucu_ip>:2380 şeklinde ayarlanır.
- ETCD_INITIAL_CLUSTER_STATE: Bu parametre, kümenin ilk kez mi oluşturulduğunu yoksa mevcut bir kümeye mi katılmaya çalışıldığını belirtir. İlk kurulum için new olarak ayarlanmalıdır.
- ETCD_DATA_DIR: Bu parametre, etcd’nin verilerini saklayacağı dizini belirtir (genellikle /var/lib/etcd).
- etcd Servisinin Başlatılması ve Durumunun Kontrol Edilmesi: Yapılandırma dosyaları düzenlendikten sonra, etcd servisinin başlatılması ve durumunun kontrol edilmesi gerekmektedir. Aşağıdaki komutlar her sunucuda sırayla çalıştırılabilir:
- Servisin sistem açılışında otomatik olarak başlaması için etkinleştirilmesi:
Bash
sudo systemctl enable etcd - Servisin başlatılması:
Bash
sudo systemctl start etcd - Servisin durumunun kontrol edilmesi:
Bash
sudo systemctl status etcd - Küme sağlığının kontrol edilmesi için, herhangi bir sunucudan aşağıdaki komut çalıştırılabilir:
Bash
etcdctl endpoint health
Bu komut, kümedeki tüm etcd node’larının sağlıklı olup olmadığını gösterir. Tüm endpoint’lerin “healthy” olarak görünmesi beklenir. etcd servisinin tüm node’larda hatasız bir şekilde çalıştığından ve kümenin sağlıklı olduğundan emin olmak, Patroni kurulumuna geçmeden önceki önemli bir adımdır. Patroni, etcd’ye bağımlı olduğu için, etcd düzgün çalışmıyorsa Patroni de çalışamaz.
Patroni Kurulumu
etcd kümesi başarıyla kurulduktan sonra, her üç PostgreSQL sunucusuna da Patroni’nin kurulması gerekmektedir. Aşağıdaki adımlar, her sunucuda aynı şekilde uygulanmalıdır:
- Python ve Pip’in Kontrol Edilmesi: Patroni Python ile yazıldığı için, sistemde Python ve Python paket yönetim aracı olan Pip’in kurulu olup olmadığı kontrol edilmelidir. Çoğu modern Ubuntu sisteminde Python zaten kurulu olarak gelir. Pip’in kurulu olup olmadığını kontrol etmek için aşağıdaki komut çalıştırılabilir:
Bash
pip3 –version
Eğer Pip kurulu değilse, aşağıdaki komut ile kurulabilir:
Bash
sudo apt install python3-pip - Gerekli Bağımlılıkların Kurulumu: Patroni ve PostgreSQL arasındaki etkileşimi sağlamak için bazı Python bağımlılıklarının yüklenmesi gerekmektedir. Aşağıdaki komut ile bu bağımlılıklar kurulabilir:
Bash
sudo apt install python3-dev libpq-dev -y - Pip’in Güncellenmesi: Yükleme sırasında olası sorunları önlemek için Pip’in en son sürümüne güncellenmesi tavsiye edilir:
Bash
pip3 install –upgrade pip - Patroni Paketinin Yüklenmesi: Patroni’yi ve etcd ile PostgreSQL için gerekli Python kütüphanelerini yüklemek için aşağıdaki komut kullanılabilir:
Bash
pip install patroni python-etcd psycopg2-binary
Alternatif olarak, psycopg2 de kullanılabilir, ancak psycopg2-binary genellikle daha kolay kurulduğu ve daha az bağımlılık sorunu yaşattığı için tercih edilmesi önerilir. Bazı durumlarda, Ubuntu’nun kendi paket yöneticisi aracılığıyla da Patroni kurulabilir:
Bash
sudo apt install patroni - Patroni için Sembolik Link Oluşturma: PostgreSQL ile gelen bazı araçlara Patroni’nin ihtiyaç duyabileceği için, bu araçların bulunduğu dizine sembolik bir link oluşturmak faydalı olabilir. Aşağıdaki komut, PostgreSQL’in kurulu olduğu sürüm numarasına göre uyarlanarak çalıştırılabilir (örneğin PostgreSQL 14 için):
Bash
sudo ln -s /usr/lib/postgresql/14/bin/* /usr/sbin/
Bu adım, patronictl gibi komutların sistem genelinde kolayca kullanılabilmesini sağlar. PostgreSQL araçları genellikle /usr/lib/postgresql/<sürüm>/bin/ dizininde bulunur ve bu dizin sistemin PATH ortam değişkeninde varsayılan olarak yer almayabilir. Sembolik link oluşturmak, bu araçlara PATH üzerinden kolayca erişimi mümkün kılar.
Patroni Yapılandırması
Patroni’nin davranışını ve PostgreSQL kümesiyle nasıl etkileşim kuracağını belirleyen ana yapılandırma dosyası patroni.yml’dir. Bu dosya genellikle /etc/patroni/ dizininde bulunur. Aşağıda, bu yapılandırma dosyasının temel bölümleri ve önemli parametreleri açıklanmaktadır:
- scope: Bu parametre, Patroni tarafından yönetilecek PostgreSQL kümesinin adını tanımlar. Kümedeki tüm node’larda aynı değere sahip olmalıdır. Bu, Patroni’nin hangi node’ların aynı kümeye ait olduğunu anlamasını sağlar.
- namespace: Bu parametre, Patroni’nin etcd üzerinde kullanacağı namespace’i belirtir. İsteğe bağlıdır, ancak farklı kümeleri aynı etcd kümesi üzerinde yönetmek için faydalı olabilir.
- name: Bu parametre, her bir PostgreSQL node’unun benzersiz adını tanımlar. Kümedeki her node için farklı bir ad kullanılmalıdır. Bu, Patroni’nin her bir node’u ayırt etmesini sağlar.
- restapi: Bu bölüm, Patroni’nin REST API’sinin yapılandırmasını içerir.
- listen: Patroni’nin API isteklerini dinleyeceği adres ve portu belirtir (örneğin <sunucu_ip>:8008).
- connect_address: Diğer küme üyelerinin bu Patroni API’sine bağlanmak için kullanacağı adres ve portu belirtir (genellikle listen ile aynıdır).
- etcd: Bu bölüm, etcd kümesine bağlantı bilgilerini içerir.
- host: etcd kümesindeki node’ların adreslerini ve portlarını belirtir (örneğin <etcd_ip1>:2379,<etcd_ip2>:2379,<etcd_ip3>:2379).
- bootstrap: Bu bölüm, yeni bir kümenin ilk kez başlatılması (bootstrapping) sırasında kullanılacak ayarları içerir. Mevcut bir kümeye yeni bir node eklenirken bu bölüm atlanır.
- dcs: Dağıtık konfigürasyon sistemi (etcd) ile ilgili ayarları içerir (ttl, loop_wait, retry_timeout).
- postgresql: PostgreSQL’e özgü bootstrapping ayarlarını içerir (use_pg_rewind, use_slots).
- initdb: Yeni bir veritabanı örneği başlatılırken initdb komutuna geçirilecek parametreleri içerir (- encoding, – data-checksums).
- pg_hba: Yeni oluşturulan veritabanının pg_hba.conf dosyasına eklenecek girdileri tanımlar. Bu, host tabanlı kimlik doğrulama ayarlarını kontrol eder.
- users: Başlangıçta oluşturulacak PostgreSQL kullanıcılarını tanımlar (admin, replicator gibi).
- postgresql: Bu bölüm, Patroni tarafından yönetilecek PostgreSQL örneğine özgü ayarları içerir.
- listen: PostgreSQL’in bağlantıları dinleyeceği adres ve portu belirtir (genellikle <sunucu_ip>:5432).
- connect_address: Diğer node’ların ve istemcilerin bu PostgreSQL örneğine bağlanmak için kullanacağı adres ve portu belirtir (genellikle listen ile aynıdır).
- data_dir: PostgreSQL’in veri dosyalarını saklayacağı dizini belirtir (örneğin /var/lib/postgresql/data).
- authentication: PostgreSQL kimlik doğrulama ayarlarını içerir (replication, superuser için kullanıcı adı ve şifreler).
- parameters: Ek PostgreSQL parametrelerini ayarlamak için kullanılır.
Aşağıda, 3-node’lu bir küme için örnek patroni.yml dosyaları sunulmaktadır. Bu örneklerde, her sunucu için farklı IP adresleri ve node isimleri kullanılmıştır. <ip1>, <ip2>, <ip3> ve <etcd_ip> yerlerine kendi ortamınıza uygun IP adreslerini yazmanız gerekmektedir.
Tablo 1: Örnek patroni.yml Yapılandırma Dosyaları
| Parametre | Sunucu 1 (data-node1) | Sunucu 2 (data-node2) | Sunucu 3 (data-node3) |
| scope | postgres-cluster | postgres-cluster | postgres-cluster |
| namespace | /postgres-ha | /postgres-ha | /postgres-ha |
| name | data-node1 | data-node2 | data-node3 |
| restapi.listen | <ip1>:8008 | <ip2>:8008 | <ip3>:8008 |
| restapi.connect_address | <ip1>:8008 | <ip2>:8008 | <ip3>:8008 |
| etcd.host | <etcd_ip1>:2379,<etcd_ip2>:2379,<etcd_ip3>:2379 | <etcd_ip1>:2379,<etcd_ip2>:2379,<etcd_ip3>:2379 | <etcd_ip1>:2379,<etcd_ip2>:2379,<etcd_ip3>:2379 |
| bootstrap.dcs.ttl | 30 | 30 | 30 |
| bootstrap.dcs.loop_wait | 10 | 10 | 10 |
| bootstrap.dcs.retry_timeout | 10 | 10 | 10 |
| bootstrap.postgresql.use_pg_rewind | true | true | true |
| bootstrap.postgresql.use_slots | true | true | true |
| bootstrap.initdb.- encoding | UTF8 | UTF8 | UTF8 |
| bootstrap.initdb.- data-checksums | true | true | true |
| bootstrap.pg_hba.- host all replicator <ip1>/32 md5 | (Diğer nodelar için de benzer girdiler) | (Diğer nodelar için de benzer girdiler) | (Diğer nodelar için de benzer girdiler) |
| bootstrap.pg_hba.- host all all 0.0.0.0/0 md5 | (Gerekirse güvenlik önlemlerini göz önünde bulundurun) | (Gerekirse güvenlik önlemlerini göz önünde bulundurun) | (Gerekirse güvenlik önlemlerini göz önünde bulundurun) |
| bootstrap.users.admin.password | admin_password | admin_password | admin_password |
| bootstrap.users.replicator.password | repl_password | repl_password | repl_password |
| postgresql.listen | <ip1>:5432 | <ip2>:5432 | <ip3>:5432 |
| postgresql.connect_address | <ip1>:5432 | <ip2>:5432 | <ip3>:5432 |
| postgresql.data_dir | /var/lib/postgresql/data | /var/lib/postgresql/data | /var/lib/postgresql/data |
| postgresql.authentication.replication.username | replicator | replicator | replicator |
| postgresql.authentication.replication.password | repl_password | repl_password | repl_password |
| postgresql.authentication.superuser.username | postgres | postgres | postgres |
| postgresql.authentication.superuser.password | postgres_password | postgres_password | postgres_password |
Bu örnek yapılandırma dosyaları, temel bir 3-node’lu Patroni kümesi için bir başlangıç noktası sunmaktadır. Kullanıcılar, kendi ortamlarına ve güvenlik gereksinimlerine göre bu parametreleri özelleştirebilirler. scope parametresinin tüm node’larda aynı olması, Patroni’nin bu node’ları aynı kümeye ait olarak tanımasını sağlar. name parametresinin her node’da benzersiz olması ise, her bir node’u ayırt etmek için gereklidir. bootstrap bölümü sadece ilk kurulum sırasında kullanılır. Mevcut bir kümeye yeni bir node eklenirken bu bölüm atlanır ve yeni eklenen node, mevcut liderden replikasyon yoluyla otomatik olarak senkronize olur.
Patroni Kümesini Başlatma
Patroni yapılandırması tamamlandıktan sonra, kümenin başlatılması gerekmektedir. Aşağıdaki adımlar, her üç sunucuda da uygulanmalıdır:
- Patroni Servis Dosyasının Oluşturulması: Patroni’nin bir sistem servisi olarak yönetilebilmesi için bir systemd servis dosyası oluşturulmalıdır. Aşağıdaki içerik, /etc/systemd/system/patroni.service dosyasına yazılabilir:
Ini, TOML
[Unit]
Description=Patroni High Availability PostgreSQL Cluster
After=network.target
Type=forking
User=postgres
Group=postgres
ExecStart=/usr/local/bin/patroni /etc/patroni/patroni.yml
Restart=on-failure
WorkingDirectory=/var/lib/postgresql
[Install]
WantedBy=multi-user.target
ExecStart satırındaki Patroni’nin ve yapılandırma dosyasının yollarının doğru olduğundan emin olunmalıdır. Systemd servis dosyası, Patroni’nin sistem açılışında otomatik olarak başlamasını ve herhangi bir arıza durumunda yeniden başlatılmasını sağlar, bu da sistemin güvenilirliğini artırır. - Servisin Etkinleştirilmesi ve Başlatılması: Oluşturulan servis dosyasının etkinleştirilmesi ve başlatılması için aşağıdaki komutlar sırayla çalıştırılır:
Bash
sudo systemctl enable patroni.service
sudo systemctl start patroni.service - Servis Durumunun Kontrol Edilmesi: Patroni servisinin başarıyla başlatıldığını doğrulamak için aşağıdaki komut kullanılabilir:
Bash
sudo systemctl status patroni.service - Küme Oluşumunun Doğrulanması: Kümenin doğru bir şekilde oluştuğunu doğrulamak için, log dosyaları kontrol edilebilir:
Bash
sudo journalctl -fu patroni
Ayrıca, patronictl aracı kullanılarak küme durumu da kontrol edilebilir:
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml list
Bu komut, kümedeki tüm node’ları, rollerini (lider veya replika) ve durumlarını gösterir. İlk node genellikle lider olarak seçilirken, diğer node’lar replika olarak kümeye katılır. patronictl list çıktısı, kümenin sağlıklı bir şekilde oluşup oluşmadığını ve hangi node’un lider olduğunu net bir şekilde gösterir.
HAProxy Entegrasyonu (İsteğe Bağlı ama Önerilir)
HAProxy, Patroni ile yönetilen PostgreSQL kümesi için isteğe bağlı ancak şiddetle önerilen bir bileşendir. HAProxy, yük dengeleme, yüksek erişilebilirlik, okuma/yazma ayrımı ve bağlantı yönetimi gibi çeşitli faydalar sağlar. İstemci uygulamalarının veritabanına kesintisiz erişimini garanti eder ve performansı artırır. Uygulamalar veritabanına doğrudan bağlanmak yerine HAProxy üzerinden bağlanır, bu da yükün birden fazla sunucuya dağıtılmasına ve tek bir arıza noktasının ortadan kalkmasına yardımcı olur.
Aşağıdaki adımlar, HAProxy’nin bir Ubuntu sunucusuna nasıl kurulacağını ve PostgreSQL kümesiyle nasıl entegre edileceğini açıklamaktadır:
- HAProxy’nin Yüklenmesi: HAProxy’yi kurmak için aşağıdaki komutlar çalıştırılır:
Bash
sudo apt update
sudo apt install haproxy - HAProxy Yapılandırması (haproxy.cfg): HAProxy’nin ana yapılandırma dosyası /etc/haproxy/haproxy.cfg’dir. Bu dosyanın PostgreSQL kümesini yönetecek şekilde yapılandırılması gerekmektedir. Aşağıda, temel bir HAProxy yapılandırma örneği sunulmuştur:
Kod snippet’i
global
log /dev/log local0
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
timeout client 30m
timeout connect 5s
timeout server 30m
retries 3
option redispatch
listen stats
bind *:7000
mode http
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:password
listen postgres
bind *:5000
mode tcp
option tcp-check
server data-node1 <ip1>:5432 check port 8008 inter 1000 fall 3 rise 2
server data-node2 <ip2>:5432 check port 8008 inter 1000 fall 3 rise 2
server data-node3 <ip3>:5432 check port 8008 inter 1000 fall 3 rise 2
Bu yapılandırmada:
- listen stats bölümü, HAProxy istatistiklerinin görüntülenebileceği bir HTTP arayüzünü 7000 numaralı portta açar.
- listen postgres bölümü, PostgreSQL bağlantılarını 5000 numaralı portta dinler.
- server satırları, PostgreSQL kümesindeki her bir node’u tanımlar. <ip1>, <ip2> ve <ip3> yerlerine PostgreSQL sunucularının IP adresleri yazılmalıdır.
- check port 8008 ifadesi, HAProxy’nin her bir PostgreSQL node’unun 8008 numaralı portundaki Patroni REST API’si üzerinden sağlık kontrolü yapacağını belirtir. HAProxy, Patroni’nin REST API’sini kullanarak hangi node’un lider olduğunu belirler ve bağlantıları doğru node’a yönlendirir.
- inter 1000, sağlık kontrolünün her 1000 milisaniyede bir yapılacağını, fall 3 bir sunucunun sağlıksız olarak işaretlenmesi için 3 başarısız kontrol gerektiğini, rise 2 ise bir sunucunun sağlıklı olarak işaretlenmesi için 2 başarılı kontrol gerektiğini belirtir.
Tablo 2: Örnek haproxy.cfg Dosyasının Temel Bölümleri
| Bölüm/Direktif | Açıklama | Örnek Değer |
| global | Genel HAProxy ayarları | log /dev/log local0, daemon |
| defaults | Varsayılan ayarlar | mode tcp, timeout client 30m |
| listen stats | İstatistik arayüzü yapılandırması | bind *:7000, mode http, stats enable, stats uri /stats |
| listen postgres | PostgreSQL bağlantılarını dinleyen bölüm | bind *:5000, mode tcp |
| server data-node1 | İlk PostgreSQL sunucusunun tanımı | <ip1>:5432 check port 8008 inter 1000 fall 3 rise 2 |
| server data-node2 | İkinci PostgreSQL sunucusunun tanımı | <ip2>:5432 check port 8008 inter 1000 fall 3 rise 2 |
| server data-node3 | Üçüncü PostgreSQL sunucusunun tanımı | <ip3>:5432 check port 8008 inter 1000 fall 3 rise 2 |
- HAProxy Servisinin Başlatılması ve Durumunun Kontrol Edilmesi: Yapılandırma dosyası düzenlendikten sonra, HAProxy servisinin başlatılması ve durumunun kontrol edilmesi gerekmektedir:
Bash
sudo systemctl start haproxy
sudo systemctl status haproxy
Herhangi bir yapılandırma hatası olup olmadığını kontrol etmek için aşağıdaki komut kullanılabilir:
Bash
sudo haproxy -c -V -f /etc/haproxy/haproxy.cfg
Bu komut, yapılandırma dosyasındaki olası syntax hatalarını tespit etmeye yardımcı olur.
Sık Karşılaşılan Hatalar ve Çözümleri
Patroni ile yüksek erişilebilirlikli PostgreSQL kümesi kurulumu sırasında bazı yaygın hatalarla karşılaşılabilir. Aşağıda, bu hatalardan bazıları ve olası çözümleri sunulmaktadır:
- Ağ Bağlantı Sorunları: Sunucular arasında ping atılamaması veya firewall’ın gerekli portları engellemesi gibi ağ bağlantı sorunları, küme üyelerinin birbirleriyle iletişim kurmasını engelleyebilir. Çözüm: Tüm sunucular arasında ağ bağlantısının doğru bir şekilde yapılandırıldığından emin olun. Firewall ayarlarını kontrol ederek PostgreSQL (5432), Patroni REST API (8008), etcd client (2379), etcd peer (2380) ve HAProxy (eğer kullanılıyorsa 5000, 7000 vb.) portlarının açık olduğundan emin olun.
- Yapılandırma Hataları: patroni.yml, etcd.conf veya haproxy.cfg dosyalarındaki yanlış IP adresleri, node isimleri, syntax hataları veya uyumsuz parametreler kurulumun başarısız olmasına neden olabilir. Çözüm: Yapılandırma dosyalarını dikkatlice kontrol edin. Örnek yapılandırmalarla karşılaştırın ve log dosyalarını (journalctl -fu patroni, /var/log/postgresql/postgresql-<sürüm>-main.log, /var/log/patroni/patroni.log) inceleyerek hataları tespit etmeye çalışın.
- pg_hba.conf Yapılandırma Sorunları: PostgreSQL’in host tabanlı kimlik doğrulama ayarlarını kontrol eden /etc/postgresql/<sürüm>/main/pg_hba.conf dosyasındaki hatalı yapılandırmalar, replikasyon bağlantılarının engellenmesine yol açabilir. Çözüm: Bu dosyayı düzenleyerek replikasyon kullanıcısına (genellikle replicator) gerekli izinleri verin. Değişikliklerin etkili olması için PostgreSQL servisini yeniden başlatın (sudo systemctl restart postgresql). Patroni servisini yeniden başlatmayın.
- PostgreSQL Başlatma Hataları: Veri dizini sorunları (izinler, bozulma vb.) veya postgresql.conf dosyasındaki yanlış yapılandırma parametreleri nedeniyle PostgreSQL başlatılamayabilir. Çözüm: PostgreSQL loglarını (/var/log/postgresql/postgresql-<sürüm>-main.log) inceleyerek hatanın nedenini belirleyin. Veri dizini izinlerini kontrol edin (sudo chown -R postgres:postgres /var/lib/postgresql/data), gerekirse yapılandırma dosyalarını gözden geçirin.
- Patroni Lider Seçimi Sorunları: etcd kümesindeki sorunlar (quorum kaybı, node’ların birbirini görememesi), yanlış Patroni yapılandırması veya ağ gecikmesi gibi faktörler lider seçiminin başarısız olmasına neden olabilir. Çözüm: etcdctl endpoint health komutu ile etcd kümesinin sağlıklı olduğundan emin olun. Patroni yapılandırmasını (patroni.yml) kontrol edin ve ağ bağlantısını inceleyin.
- Replikasyon Sorunları: Yanlış pg_hba.conf ayarları, ağ sorunları veya lider ile replikalar arasındaki yüksek lag (gecikme) replikasyonun düzgün çalışmasını engelleyebilir. Çözüm: pg_hba.conf dosyasını kontrol edin, ağ bağlantısını inceleyin. Gerekirse patroni.yml dosyasındaki maximum_lag_on_failover parametresini gözden geçirin.
Karşılaşılan sorunların çözümü için aşağıdaki genel adımlar ve örnek komutlar faydalı olabilir:
- Log Dosyalarını İnceleme: Servislerin log dosyaları, hataların nedenini anlamak için en önemli kaynaktır.
- Patroni logları: sudo journalctl -fu patroni veya /var/log/patroni/patroni.log
- PostgreSQL logları: /var/log/postgresql/postgresql-<sürüm>-main.log
- etcd logları: Genellikle systemd journal’ı üzerinden (sudo journalctl -fu etcd) veya yapılandırmada belirtilen dosya üzerinden incelenebilir.
- HAProxy logları: sudo journalctl -fu haproxy veya yapılandırmada belirtilen dosya üzerinden incelenebilir.
- Durum Kontrolü: Servislerin ve kümenin mevcut durumunu kontrol etmek için aşağıdaki komutlar kullanılabilir:
- Servis durumu: sudo systemctl status <servis_adı> (örneğin sudo systemctl status patroni)
- Patroni küme durumu: sudo -u postgres patronictl -c /etc/patroni/patroni.yml list
- etcd küme sağlığı: etcdctl endpoint health
- Yeniden Başlatma: Bazı durumlarda, servisleri yeniden başlatmak sorunları çözebilir.
- Servis yeniden başlatma: sudo systemctl restart <servis_adı>
- Patroni node’unu yeniden başlatma: sudo -u postgres patronictl -c /etc/patroni/patroni.yml restart <küme_adı> <node_adı>
Temel Patroni Kullanım Örnekleri (patronictl Komutları)
patronictl, Patroni tarafından yönetilen PostgreSQL kümesini yönetmek için kullanılan komut satırı aracıdır. İşte temel patronictl komutlarının bazı kullanım örnekleri:
- Küme Durumunu Kontrol Etme (patronictl list): Bu komut, kümedeki tüm node’ların durumunu, rollerini (lider veya replika) ve diğer bilgileri gösterir.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml list
Çıktıda, her bir node’un adı, IP adresi, rolü (Leader, Replica), durumu (running, streaming vb.), zaman çizelgesi (TL) ve replikasyon gecikmesi (Lag in MB) gibi bilgiler yer alır. - Yapılandırmayı Düzenleme (patronictl edit-config): Bu komut, Patroni’nin yapılandırma dosyasını bir metin düzenleyicide açar ve PostgreSQL parametrelerini düzenlemenize olanak tanır. Yapılan değişiklikler Patroni tarafından doğrulanır ve kaydedilir.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml edit-config - Yapılandırmayı Yeniden Yükleme (patronictl reload): patronictl edit-config ile yapılan değişikliklerden sonra, bu komut yapılandırmayı yeniden yükler ve kümedeki node’lara uygular.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml reload <küme_adı> - Manuel Failover (Switchover) Yapma (patronictl switchover): Bu komut, mevcut lider node’u düşürerek seçilen bir replika node’u lider yapar. Planlı bakım durumlarında kullanışlıdır.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml switchover
Komut, hangi node’un lider yapılacağını ve ne zaman yapılacağını soracaktır. - Bir Node’u Yeniden Başlatma (patronictl restart): Bu komut, kümedeki belirli bir node’u veya tüm kümeyi yeniden başlatır. Tüm kümeyi yeniden başlatırken, Patroni kesintiyi önlemek için rolling restart (sırayla yeniden başlatma) işlemi yapar.
Bash
# Belirli bir node’u yeniden başlatma
sudo -u postgres patronictl -c /etc/patroni/patroni.yml restart <küme_adı> <node_adı>
# Tüm kümeyi yeniden başlatma
sudo -u postgres patronictl -c /etc/patroni/patroni.yml restart <küme_adı> - Bir Node’u Yeniden Başlatma (patronictl reinit): Bu komut, kümedeki belirli bir node’u yeniden başlatır. Genellikle bir node başlatılamadığında veya bilinmeyen bir durumda olduğunda kullanılır. Veri bozulması gibi durumlarda faydalı olabilir.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml reinit <küme_adı> <node_adı> - Bakım Modu (patronictl pause ve patronictl resume): patronictl pause komutu, Patroni’nin kümeyi yönetmeyi durdurmasını sağlar ve kümeyi bakım moduna alır. patronictl resume komutu ise bu modu kapatır ve Patroni’nin kümeyi yönetmeye devam etmesini sağlar.
Bash
sudo -u postgres patronictl -c /etc/patroni/patroni.yml pause
sudo -u postgres patronictl -c /etc/patroni/patroni.yml resume
Bu patronictl komutları, Patroni kümesinin günlük yönetimi için temel araçlardır. Bu komutların doğru kullanımı, kümenin sağlıklı ve istikrarlı kalmasını sağlar.
Gelişmiş Patroni Yapılandırması (İsteğe Bağlı)
Temel kurulumun ötesinde, Patroni’nin davranışını daha da özelleştirmek için çeşitli gelişmiş yapılandırma seçenekleri mevcuttur.
- Senkron Replikasyon: Veri tutarlılığını artırmak için senkron replikasyon etkinleştirilebilir. Bu, birincil sunucudaki bir işlemin, yedek sunucular tarafından da onaylanmasını gerektirir. Ancak bu, performansı olumsuz etkileyebilir. Yapılandırma için synchronous_mode ve synchronous_standby_names parametreleri patroni.yml dosyasında ayarlanabilir.
- Failover Önceliği: Birden fazla replika olduğunda, failover durumunda hangi replikanın öncelikle lider olarak seçileceğini belirlemek için failover_priority etiketi kullanılabilir. Bu etiket, patroni.yml dosyasının tags bölümünde her bir node için farklı değerlerle ayarlanabilir.
- Özel Yapılandırma Seçenekleri: PostgreSQL’e özgü gelişmiş yapılandırma parametreleri, patroni.yml dosyasının postgresql.parameters bölümü aracılığıyla ayarlanabilir. Bu, veritabanının performansını ve davranışını ince ayar yapma imkanı sunar.
Bu gelişmiş yapılandırma seçenekleri, kümenin davranışını özel ihtiyaçlara göre uyarlamaya olanak tanır. Ancak bu seçeneklerin dikkatli bir şekilde yapılandırılması ve etkilerinin anlaşılması önemlidir.
Patroni Kümesini İzleme
Patroni kümesinin sağlığını ve performansını sürekli olarak izlemek, olası sorunları erken tespit etmek ve sistem kesintilerini önlemek için kritik öneme sahiptir.
- Log Dosyalarının İzlenmesi: Patroni ve PostgreSQL log dosyaları, sistemdeki olayları ve olası hataları anlamak için temel kaynaktır. Log dosyalarının düzenli olarak incelenmesi, sorunların kaynağını belirlemede ve gelecekteki sorunları önlemede yardımcı olur.
- Patroni REST API Kullanımı: Patroni, /metrics ve /patroni gibi endpoint’ler aracılığıyla küme durumu ve performans metrikleri hakkında bilgi sağlayan bir REST API sunar. Bu endpoint’ler, izleme araçları tarafından kullanılabilir.
- İzleme Araçları: Percona Monitoring and Management (PMM), Prometheus ve Grafana gibi özel izleme araçları, Patroni kümesinin sağlığını ve performansını görselleştirmek ve analiz etmek için kullanılabilir. Bu araçlar, metrikleri toplar, saklar ve anlamlı grafikler ve alarmlar aracılığıyla kullanıcılara sunar.
Proaktif izleme, potansiyel sorunları erken tespit etmeye ve sistem kesintilerini önlemeye yardımcı olur. Anormallikler erken tespit edilirse, büyük sorunlar ortaya çıkmadan müdahale edilebilir. İzleme araçları bu süreci otomatikleştirerek sistem yöneticilerinin iş yükünü azaltır ve sistemin kararlılığını artırır.
Sonuç
Bu doküman, üç adet Ubuntu sunucusu üzerinde Patroni kullanarak yüksek erişilebilirlikli bir PostgreSQL kümesinin nasıl kurulacağını adım adım açıklamıştır. Yüksek erişilebilirlik, veritabanı sistemlerinin kesintisiz çalışmasını sağlamak ve veri kaybını önlemek için hayati öneme sahiptir. Patroni, otomatik failover, lider seçimi ve kolay yönetim imkanları sunarak PostgreSQL HA çözümlerini basitleştirir. Bu kılavuzda ele alınan adımları takip ederek, kararlı ve güvenilir bir PostgreSQL kümesi oluşturabilir ve iş sürekliliğinizi güvence altına alabilirsiniz.
İleri Okuma ve Kaynaklar:
- Patroni Dokümantasyonu: https://patroni.readthedocs.io/
- etcd Dokümantasyonu: https://etcd.io/docs/
- HAProxy Dokümantasyonu: https://www.haproxy.org/documentation/
