Skip to main content

PostgreSQL High Availability - Patroni 3


Patroni ile PostgreSQL entegrasyonuna ait yazı serisinin dördüncüsünde, mevcut PostgreSQL veritabanının Patroni tarafına nasıl geçirilebileceği ile ilgili bir şeyler paylaşmak isterim.

Üç node'lu PostgreSQL cluster'imiz var, tüm Postgres servisleri ayakta ve replikasyonda da sorun yok diyelim.

Bu aşamada bizim Postgres sunucularını Patroni geçişine hazırlamamız gerekir. Üç node'lu ETCD Cluster'ini kurduğumuzu ve PostgreSQL'in Patroni ile bootstap edilmesine kadar tüm aşamalara geldiğimizi varsayalım. Artık PostgreSQL instance'inin başlatılmasına gelsin iş.

Patroni ile Postgres'in bootstrap edilmesinden önce Patroni konfigürasyonundaki değişkenlerin yeni sunucu için de geçerli olmasına dikkat etmeliyiz. Örneğin replikasyon için replicator kullanıcısının parolası. Bunu ya Postgres servisini kapatmadan doğru kullanıcıları postgresql.yml içindeki parolayla ve doğru yetkilerle oluşturarak verebiliriz ya da eğer böyle bir kullanıcı varsa da postgresql.yml içindeki replicator kullanıcısının parolasını doğru vererek halledebiliriz. Bu tamamen size kalmış.

Stabil ve sağlıklı bir PostgreSQL veritabanının Patroni tarafına geçirilmesi için öncelikle tüm PostgreSQL servislerini kapatalım. Replikasyonların yeniden kurulması işini Patroni yapacağı için bizim açımızda artık replikalarında bir önemi yok.

Service postgresql-11 stop

Tüm Postgres sunucuları üzerinde Patroni'nin kullanacağı data dizinimiz /var/lib/pgsql/patroni olsun ve Patroni konfigürasyonunda da aynı dizini data_dir parametresinin karşısına için ekleyelim. Hatırlamak için Patroni kurulumu yazısına buradan ulaşabilirsiniz.

Patroni'ye ait data dizini içine, mevcut Primary Postgres data dizini altındaki tüm verileri kopyalayalım.

[root@guncek03 ~]# cp /var/lib/pgsql/11/data/* /var/lib/pgsql/patroni -R

Verilerin kopyalanması sonrası Patroni servisini ayağa kaldıralım.

service patroni start

Patronictl ile cluster node’ları kontrol edilir.

[root@guncek03 pgsql]# patronictl -c /usr/src/app/patroni/etc/postgresql.yml list batman_3 +----------+-------------+---------------+--------+---------+----+-----------+ | Cluster | Member | Host | Role | State | TL | Lag in MB | +----------+-------------+---------------+--------+---------+----+-----------+ | batman_3 | postgresql1 | DB_IP1 | Leader | running | 2 | 0 | +----------+-------------+---------------+--------+---------+----+-----------+

postgresql.yml içinde verilen scope adının Primary sunucudaki postgresql.yml içindekiyle aynı olması gerekir. Patroni ikinci Postgres node'unu standby olarak ayağa kaldıracağı ve bunu da aslında pg_basebackup ile yapacağı için Standby cluster dizini altındaki tüm veriler silinir ve Patroni servisi başlatılır. Patroni servisini başlattıktan sonra servis status ile bakalım. Burada Patroni'nin pg_basebackup ile bir komut çalıştırdığını göreceksiniz. Bunu Patroni log dosyasından da yakalayabilirsiniz.

[root@guncek02 patroni]# service patroni status Redirecting to /bin/systemctl status patroni.service ● patroni.service - PostgreSQL high-availability manager Loaded: loaded (/usr/lib/systemd/system/patroni.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2019-12-31 11:21:33 +03; 2s ago Main PID: 119858 (python3.6) CGroup: /system.slice/patroni.service ├─119858 python3.6 /usr/src/app/patroni/bin/patroni /usr/src/app/patroni/etc/postgresql.yml ├─119871 /usr/pgsql-11/bin/pg_basebackup --pgdata=/var/lib/pgsql/patroni -X stream --dbname=postgres://replicator@DB_IP1:5432/postgres └─119872 /usr/pgsql-11/bin/pg_basebackup --pgdata=/var/lib/pgsql/patroni -X stream --dbname=postgres://replicator@DB_IP1:5432/postgres Dec 31 11:21:33 guncek02 systemd[1]: Started PostgreSQL high-availability manager.

Şu an elimizde bir Primary ve bir stanby olmak üzere iki node'lu bir Postgres cluster'i bulunmakta. İkinci node'un kurulumuyla aynı şekilde üçüncü Postgres node'unu da kurabilirsiniz.

Peki yeni PostgreSQL node'unu Patroni cluster'ina nasıl ekleyeceğiz?

Patroni Cluster’ina yeni node eklemek
Diyelim ki iki node'lu Postgres cluster'i kurdunuz ve üçüncü node'u da eklemek istiyorsunuz ama Patroni konfigürasyonunda pg_hba kuralında sadece iki Postgres'in IP adresi bulunuyor. Bu durumda Primary-standby yapıyı, 1 primary ve 2 standby olarak yeniden düzenlemek istersek yapacağımız şey sırasıyla;
- Yeni node’a Patroni ve PostgreSQL veritabanı kurulumu yapmak.
- Mevcut Patroni node’larından postgresql.yml dosyasını yeni node’a kopyalamak.
- Eski node’lara yeni Postgres sunucusunun IP’sini pg_hba.conf içine Patroni yardımıyla eklemek gerekiyor.

Patroni cluster'larının birinde aşağıdaki değişiklik yapılır.

patronictl -c /usr/src/app/patroni/etc/postgresql.yml edit-config loop_wait: 10 maximum_lag_on_failover: 1048576 postgresql: parameters: archive_mode: 'off' archive_timeout: 1800s hot_standby: 'on' log_line_prefix: ' time:%m pid=%p host=%h db=%d app=%a ' max_replication_slots: 5 max_wal_senders: 5 wal_keep_segments: 8 wal_level: hot_standby wal_log_hints: 'on' pg_hba: - local all all trust - host all all 127.0.0.1/32 trust - host all all DB_IP1/32 md5 - host all all DB_IP2/32 md5 - host all all DB_IP_new/32 md5 - host replication replicator DB_IP1/32 md5 - host replication replicator DB_IP2/32 md5 - host replication replicator DB_IP_new/32 md5 - host all all 0.0.0.0/0 md5 use_pg_rewind: true use_slots: true retry_timeout: 10 ttl: 30

Pg_hba dosyasına eklenecek yeni bir satırlık kural diğer tüm kuralları ezeceğinden tüm authentication kuralları edit-config ile düzenlenmelidir. Yani yeni bir kural ekliyormuş gibi tek satır eklersek pg_hba altına diğer mevcut tüm kurallar silinecektir.

Tek başına konfigürasyon değişikliği yetersizdir. Yapılan değişikliğin geçerli olması için Patroni Scope’unun ismi kullanılarak reload edilir.
patronictl -c /usr/src/app/patroni/etc/postgresql.yml reload batman_3


Yeni node üzerinde /usr/src/app/patroni/etc/postgresql.yml dosyası güncellendikten sonra patroni servisi başlatılır.

[root@guncek04 src]# systemctl status patroni

Eklediğimiz üçüncü node’un Patroni loguna bakalım.

2020-01-06 11:18:25,546 INFO: Lock owner: postgresql0; I am postgresql2 2020-01-06 11:18:25,546 INFO: does not have lock 2020-01-06 11:18:25,551 INFO: no action. i am a secondary and i am following a leader

Konfigürasyon değişikliği DCS ile diğer sunuculara yansıyacaktır. Yeniden Patroni Cluster içinde yer alan node’ların durumuna bakalım.

[root@guncek03 ~]# patronictl -c /usr/src/app/patroni/etc/postgresql.yml list batman_3 +----------+-------------+---------------+--------+---------+----+-----------+ | Cluster | Member | Host | Role | State | TL | Lag in MB | +----------+-------------+---------------+--------+---------+----+-----------+ | batman_3 | postgresql0 | DB_IP1 | Leader | running | 5 | 0 | | batman_3 | postgresql1 | DB_IP2 | | running | 5 | 0 | | batman_3 | postgresql2 | DB_IP_new | | running | 5 | 0 | +----------+-------------+---------------+--------+---------+----+-----------+
PostgreSQL Autofailover yazı serisinin diğerlerine aşağıdan ulaşabilirsiniz.

PostgreSQL ve Autofailover
PostgreSQL'de Autofailover ve Patroni 1 (Giriş)
PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim)
PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi)

Comments

Popular posts from this blog

pg_ctl: command not found

Hi, If you can not reach pg_ctl command in bash also you are sure this command exists in your server, check $PATH. -bash-4.2$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin So, the directory of pg_ctl is not seem in PATH. Input directory of pg_ctl and check it then run it.

PostgreSQL Foreign Data Wrappers

Hi all, I would like to mention about generating Foreign Data Wrappers(FDW) on PostgreSQL 9.6. FDW is used for remote access to tables from external data storage. If needed to use remote table in a query, you can use FDW tables. For instance you can get a table from remote database, but there is a condition. The condition is that user should have proper privileges on FDW table. There is two extension for FDW on PostgreSQL. First one is used for accessing PostgreSQL database to PostgreSQL database, called postgres_fdw . Second one is used for accessing PostgreSQL database to different databases (SQL Server, Sysbase) called tds_fdw .  Foreign Data Wrappers feature lets you to cross-query between remote database tables. Postgres_fdw and tds_fdw has different structure. Tds_fdw usign Tabular Data Stream application layer protocol to transfer data between database server and client. Generating Tds_fdw and Postgres_fdw is similar. I share an example for generating FDW between tw...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...