Postgresql repmgr
Repmgr,Postgresql high availibilty çözümlerinden biri olan açık kaynaklı bir yönetim aracıdır.
Repmgr streaming replication mimarisi üzerine kurulmuş ve bunu yönetmeye ve streaming işlemlerinde bazı işlemleri kısaltarak daha kolay ve pratik şekilde yapmamız için hazırlanmış araçtır.
Repmgr da kullanılan bazı kavramlar
Node: Repmgr da bulunan sunucular.
Upstream Node : Primay sunucu
Fencing : Failover sonrası eski Primary nin geri geldiğinde Primary olması için gereken çalışma.(fenced off)
Witnes Server : Standby sunucusunun fazla olması durumunda hangisine failover olması gerektiğini belirleyen sunucu.
192.168.202.137 |
Primary |
192.168.202.140 |
Secondary |
Yukarıda sunucularımız ve sunucularımız iplerini belirttim konfigürasyonlar da karışıklık olmaması için.
İlk olarak iki sunucuya da aşağıdaki paketleri yüklememiz gerekiyor.
yum -y install epel-release yum-utils vim
Postgresql repolarını aşağıdaki şekilde yüklememiz gerekiyor.
yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Postgresql12 aşağıdaki komutlar yardımı ile yükleyelim.
yum-config-manager --enable pgdg12
yum -y install postgresql12-server postgresql12
Yükledikten sonra default initdb yapıyoruz farklı lokasyona yüklemek isterseniz -D parametresi ile belirtebilirsiniz.
/usr/pgsql-12/bin/postgresql-12-setup initdb
İnitdb yaptıktan sonra servisimizi başlatıyoruz.
systemctl enable postgresql-12
systemctl start postgresql-12
Postgresql kurulumları bittikten sonra repmgr kurulumuna geçiyoruz ve aşağıdaki komutu iki sunucuda da çalıştıyoruz.
yum -y install repmgr12*
Postgresql.conf da aşağıdaki gibi değişiklikler yapıyoruz.
max_wal_senders = 10
max_replication_slots = 10
wal_level = 'hot_standby' or 'replica' or 'logical'
hot_standby = on
archive_mode = on
archive_command = '/bin/true'
shared_preload_libraries = 'repmgr'
Pg_hba.conf da aşağıdaki gibi değişiklikler yapıyoruz.
vim /var/lib/pgsql/12/data/pg_hba.conf
# “local” is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all 0.0.0.0/32 trust
host replication all ::1/128 trust
Yukarıdaki pg_hba.conf değişikliklerini gerçek ortamlarda sadece ilgili sunuculara yetki verecek şekilde düzeltmenizi öneririm.
Değişiklikleri yaptıktan sonra aşağıdaki linkteki gibi iki sunucu arasında ssh key oluşturmanız gerekiyor.
Postgresql.conf ve pg_hba.conf’u değiştirdikten sonra repmgr.conf’u primary sunucuda aşağıdaki gibi postgresql de kullanıcı ve database oluşturuyoruz.
create user repmgr;
create database repmgr with owner repmgr;
alter user repmgr with superuser;
psql -c 'ALTER ROLE repmgr SET search_path TO repmgr, "$user", public;'
Primary sunucuda vi /etc/repmgr/12/repmgr.conf üzerinde aşağıdakini komutları ekliyoruz.
cluster='frkcluster'
node_id=1
node_name=node1
conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/12/data/'
failover=automatic
promote_command='/usr/pgsql-12/bin/repmgr standby promote -f /var/lib/pgsql/repmgr.conf --log-to-file'
follow_command='/usr/pgsql-12/bin/repmgr standby follow -f /var/lib/pgsql/repmgr.conf --log-to-file --upstream-node-id=%n'
service_start_command = 'systemctl start postgresql-12'
service_stop_command = 'systemctl stop postgresql-12'
service_restart_command = 'systemctl restart postgresql-12'
service_reload_command = 'systemctl reload postgresql-12'
log_file='/var/log/repmgr/repmgr.log'
/etc/sudoers.d/postgres dosyasına aşağıdaki komutları iki sunucuda da ekliyoruz.
Defaults:postgres !requiretty
postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-12, /usr/bin/systemctl start postgresql-12, /usr/bin/systemctl restart postgresql-12, /usr/bin/systemctl reload postgresql-12
Primary sunucuda konfigurasyonlarımız bitti ve sunucumuzu repmgr aşağıdaki komut yardımı ile ekliyoruz.
/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf primary register
Eklenmiş mi kontrol edelim.
/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show
Secondary sunucuda aşağıdaki gibi değişiklikler yapıyoruz.
Secondary sunucuda vi /etc/repmgr/12/repmgr.conf üzerinde aşağıdakini komutları ekliyoruz.
cluster='frkcluster'
node_id=2
node_name=node2
conninfo='host=node2 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/12/data/'
failover=automatic
promote_command='/usr/pgsql-12/bin/repmgr standby promote -f /var/lib/pgsql/repmgr.conf --log-to-file'
follow_command='/usr/pgsql-12/bin/repmgr standby follow -f /var/lib/pgsql/repmgr.conf --log-to-file --upstream-node-id=%n'
service_start_command = 'systemctl start postgresql-12'
service_stop_command = 'systemctl stop postgresql-12'
service_restart_command = 'systemctl restart postgresql-12'
service_reload_command = 'systemctl reload postgresql-12'
log_file='/var/log/repmgr/repmgr.log'
/etc/sudoers.d/postgres dosyasına aşağıdaki komutları iki sunucuda da ekliyoruz.
Defaults:postgres !requiretty
postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-12, /usr/bin/systemctl start postgresql-12, /usr/bin/systemctl restart postgresql-12, /usr/bin/systemctl reload postgresql-12
Secondary sunucuya geçerek aşağıdaki komut yardımı ile primary’i klonluyoruz.
/usr/pgsql-12/bin/repmgr -h 192.168.202.137 -U repmgr -d repmgr -f /etc/repmgr/12/repmgr.conf standby clone --dry-run
Klonlama işlemi tamamlandıktan sonra aşağıdaki komut yardımı ile stanby’ı repmgr a ekliyoruz.
/usr/pgsql-12/bin/repmgr -h 192.168.202.137 -U repmgr -d repmgr -f /etc/repmgr/12/repmgr.conf standby register -F
/usr/pgsql-12/bin/repmgr -f /var/lib/pgsql/12/repmgr.conf cluster show komut yardımı ile clusterımızı kontrol ediyoruz.
Repmgr clusterımız kuruldu ve sağlıklı bir şekilde çalışıyor.