Merhaba, bugün ki yazımızda Merkezi Consul Kümesi Kurulumu hakkında çalışma yapıyor olacağız. Günümüzde, veri tabanları kurum ve kuruluşların en kritik iş süreçlerinin merkezinde yer almaktadır. Kamu kurumları ve kuruluşlar bir çok hizmeti internet ortamında hizmete sunmaktadır. Sunulan hizmetlerde oluşabilecek aksaklıklar ise maddi ve manevi zararlara sebebiyet vermektedir. Uygulama sahipleri hizmet sürekliliğini sağlamak ve kalitesini arttırmak için sistemlerinde yüksek erişilebilirlik mimarileri geliştirmektedir. Bu yazı serimizin konusu PostgreSQL veri tabanlarında yüksek erişilebilirlik mimarilerinin oluşturulmasıdır.
PostgreSQL HA Mimarisi Bileşenleri
PostgreSQL Veri Tabanı Yüksek Kullanılabilirlik mimarileri oluşturulurken; Patroni, HaProxy, KeepAlived, Pgbouncer gibi araçlar sıklıkla kullanılmaktadır. Bu araçların görevleri aşağıda açıklanmıştır.
HAProxy: Yüksek kullanılabilirliğe sahip sistemlerde yük dengeleme özelliği ile TCP ve HTTP tabanlı uygulamalar için Proxy sunucusu hizmeti veren açık kaynak kodlu bir yazılımdır. Uygulamadan gelen SELECT sorgularının Standby Veri Tabanları arasında dağıtılarak Primary Veri Tabanı yükünün azaltılmasında kullanılmaktadır.
KeepAlived: IP Failover özelliğini ikiden fazla sunucu için sağlayacak yeteneğe sahip açık kaynak kodlu bir yazılımdır. PostgreSQL Yüksek Erişilebilirlik Mimarilerinde yük dengeleme ve connection pool katmanları yedekli yapıda çalışmaktadır. Yük Dengeleme veya connection pool katmanında çalışan aktif sunucunun beklenmedik bir şekilde servis dışı kalması durumunda yedek sunucunun yükü devralmasında görev almaktadır.
PgBouncer: PgBouncer, PostgreSQL veri tabanları için tasarlanmış bir bağlantı havuzu yönetim yazılımıdır. Veri tabanlarında açılan her bağlantının bir maliyeti bulunmaktadır. Veri tabanının kaldırabileceği kadar bağlantıyı efektif olarak kullanmak için bağlantı havuzu kullanılmaktadır. Ayrıca bağlantı havuzu TCP bağlantı maliyeti, kimlik doğrulama maliyetinin önüne geçtiği gibi bellek tasarrufu da sağlar.
Patroni: Primay Veri Tabanı sunucusunda; bakım, yazılım ve donanım arızası durumlarında Primary görevinin otomatik olarak Standby Veri Tabanı Sunucusuna devretmesini sağlayan ve yüksek kullanılabilirliği sağlayan PostgreSQL Cluster Yönetim modülüdür. Patroninin tek başına kurulumu PostgreSQL kümesine yük devretme ve yüksek kullanılabilirlik niteliği kazandırmaya yeterli değildir. Patroni ile birlikte Dağıtık Konfigürasyon Depolama araçlarından birine ihtiyaç vardır. Dağıtık Konfigürasyon Depolama Araçlarına örnek olarak ETCD ve Consul verilebilir.
Biz kurmayı planladığımız PostgreSQL Yüksek Erişilebilirlik mimarisinde Dağıtık Konfigürasyon Depolama Aracı olarak Consul teknolojisini kullanıyor olacağız.
Consul Nedir?
Consul; hizmet keşfi, sağlık denetimleri, yük dengeleme ve yapılandırma denetimi anahtar/değer deposu hizmetleri sağlayan açık kaynak kodlu bir uygulamadır. Daha detaylı bilgiye buradan ulaşabilirsiniz.
PostgreSQL Yüksek Erişilebilirlik Mimarilerinde PostgreSQL kümesinin durumunu saklar. Herhangi bir PostgreSQL düğümünün durumunda herhangi bir değişiklik bulunduğunda, Patroni Consul anahtar/değer deposundaki durum değişikliğini günceller. Consul, bu bilgiyi ana düğümü seçmek için kullanır ve kümeyi ayakta tutmayı sağlar. Consul servisi fail olursa veri tabanı kümesi de servis hizmet veremez hale gelir. Bu sebepten dolayı Consul servisi için de bir küme oluşturulması tavsiye edilmektedir.
Consul kümesi; PostgreSQL ve Patroni Servislerinin bulunduğu sunucularda kurulabileceği gibi birde fazla PostgreSQL kümesine sahip sistemler için merkezi Consul kümesi de oluşturulabilir.
Şimdi yazımızın asıl konusu olan merkezi consul kümesi kurulumuna geçelim.
Merkezi Consul Kümesi Kurulumu
Merkezi Consul Kümesini kurmak için 3 adet sunucuya ihtiyacımız vardır sunuculara ait IP ve OS bilgileri aşağıdaki gibidir.
OS IP HOSTNAME
Ubuntu 22.04.2 LTS 192.168.222.11 consulsrv1
Ubuntu 22.04.2 LTS 192.168.222.12 consulsrv2
Ubuntu 22.04.2 LTS 192.168.222.13 consulsrv3
Consul Sunucuları üzerinde ilk olarak hosts dosyasını düzenleyerek çalışmaya başlıyoruz.
root@consulSrv-1# vi /etc/hosts
127.0.0.1 consulSrv-1
192.168.222.11 consulSrv-1
192.168.222.12 consulSrv-2
192.168.222.13 consulSrv-3
root@consulSrv-2# vi /etc/hosts
127.0.0.1 consulSrv-2
192.168.222.11 consulSrv-1
192.168.222.12 consulSrv-2
192.168.222.13 consulSrv-3
root@consulSrv-3# vi /etc/hosts
127.0.0.1 consulSrv-3
192.168.222.11 consulSrv-1
192.168.222.12 consulSrv-2
192.168.222.13 consulSrv-3
Hosts dosyasını ayarladıktan sonra bütün sunucularda Consul 1.11.4 sürümünü kuruyoruz.
root@consulSrv-1# echo "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/consul.list
root@consulSrv-1# wget --quiet -O - https://apt.releases.hashicorp.com/gpg | apt-key add -
root@consulSrv-1# apt update
root@consulSrv-1# apt install consul=1.11.4
root@consulSrv-2# echo "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/consul.list
root@consulSrv-2# wget --quiet -O - https://apt.releases.hashicorp.com/gpg | apt-key add -
root@consulSrv-2# apt update
root@consulSrv-2# apt install consul=1.11.4
root@consulSrv-3# echo "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/consul.list
root@consulSrv-3# wget --quiet -O - https://apt.releases.hashicorp.com/gpg | apt-key add -
root@consulSrv-3# apt update
root@consulSrv-3# apt install consul=1.11.4
Consul’un ihtiyaç duyduğu dosya dizinleri bütün sunucularda oluşturarak yetkilerini düzenleyelim.
root@consulSrv-1# mkdir /var/lib/consul
root@consulSrv-1# chown consul: /var/lib/consul
root@consulSrv-1# chmod 700 /var/lib/consul
root@consulSrv-1# mkdir /var/log/consul/
root@consulSrv-1# chown consul:consul /var/log/consul
root@consulSrv-1# chmod 755 /var/log/consul
root@consulSrv-2# mkdir /var/lib/consul
root@consulSrv-2# chown consul: /var/lib/consul
root@consulSrv-2# chmod 700 /var/lib/consul
root@consulSrv-2# mkdir /var/log/consul/
root@consulSrv-2# chown consul:consul /var/log/consul
root@consulSrv-2# chmod 755 /var/log/consul
root@consulSrv-3# mkdir /var/lib/consul
root@consulSrv-3# chown consul: /var/lib/consul
root@consulSrv-3# chmod 700 /var/lib/consul
root@consulSrv-3# mkdir /var/log/consul/
root@consulSrv-3# chown consul:consul /var/log/consul
root@consulSrv-3# chmod 755 /var/log/consul
Consul konfigürasyon dosyasını düzenlemeye başlamadan önce, consul.json dosyası içerisinde kullanacağımız encrypt keyi herhangi bir sunucu üzerinde oluşturuyoruz.
root@consulSrv-1# consul keygen
DB33KuBUlvskRnD8c7RyxFhn8qUqEmgOHYf8xMs+H/E=
Encrypt key elde ettiğimize göre consul.json dosyasını aşağıdaki gibi düzenleyebiliriz.
root@consulSrv-1# vi /etc/consul.d/consul.json
{
"domain": "dbaops",
"datacenter": "sysdbaops",
"node_name": "consulSrv-1",
"bind_addr": "192.168.222.11",
"client_addr": "127.0.0.1 192.168.222.11",
"data_dir": "/var/lib/consul",
"encrypt": "DB33KuBUlvskRnD8c7RyxFhn8qUqEmgOHYf8xMs+H/E=",
"log_level": "INFO",
"log_file": "/var/log/consul/consul",
"server": true,
"bootstrap_expect": 3,
"ui_config": {
"enabled": true
},
"leave_on_terminate": true,
"rejoin_after_leave": true,
"enable_local_script_checks": true,
"disable_update_check" : true,
"retry_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"start_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"telemetry": {
"disable_compat_1.9": true
},
"cert_file": "/etc/ssl/certs/ssl-cert-snakeoil.pem",
"key_file": "/etc/ssl/private/ssl-cert-snakeoil.key",
"ports": {
"http": -1,
"https": 8501
},
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
root@consulSrv-2# vi /etc/consul.d/consul.json
{
"domain": "dbaops",
"datacenter": "sysdbaops",
"node_name": "consulSrv-2",
"bind_addr": "192.168.222.12",
"client_addr": "127.0.0.1 192.168.222.12",
"data_dir": "/var/lib/consul",
"encrypt": "DB33KuBUlvskRnD8c7RyxFhn8qUqEmgOHYf8xMs+H/E=",
"log_level": "INFO",
"log_file": "/var/log/consul/consul",
"server": true,
"bootstrap_expect": 3,
"ui_config": {
"enabled": true
},
"leave_on_terminate": true,
"rejoin_after_leave": true,
"enable_local_script_checks": true,
"disable_update_check" : true,
"retry_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"start_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"telemetry": {
"disable_compat_1.9": true
},
"cert_file": "/etc/ssl/certs/ssl-cert-snakeoil.pem",
"key_file": "/etc/ssl/private/ssl-cert-snakeoil.key",
"ports": {
"http": -1,
"https": 8501
},
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
root@consulSrv-3# vi /etc/consul.d/consul.json
{
"domain": "dbaops",
"datacenter": "sysdbaops",
"node_name": "consulSrv-3",
"bind_addr": "192.168.222.13",
"client_addr": "127.0.0.1 192.168.222.13",
"data_dir": "/var/lib/consul",
"encrypt": "DB33KuBUlvskRnD8c7RyxFhn8qUqEmgOHYf8xMs+H/E=",
"log_level": "INFO",
"log_file": "/var/log/consul/consul",
"server": true,
"bootstrap_expect": 3,
"ui_config": {
"enabled": true
},
"leave_on_terminate": true,
"rejoin_after_leave": true,
"enable_local_script_checks": true,
"disable_update_check" : true,
"retry_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"start_join": ["192.168.222.11","192.168.222.12","192.168.222.13"],
"telemetry": {
"disable_compat_1.9": true
},
"cert_file": "/etc/ssl/certs/ssl-cert-snakeoil.pem",
"key_file": "/etc/ssl/private/ssl-cert-snakeoil.key",
"ports": {
"http": -1,
"https": 8501
},
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
Consul dashboardının HTTPS Protokolü üzerinden çalışabilmesi için, sunucularda ssl-cert paketini kurduktan sonra default sertifika oluşturuyoruz. Daha sonra consulun bu sertifikaya erişebilmesi için gerekli izinlerin verilmesi gerekmektedir.
root@consulSrv-1# apt install ssl-cert
root@consulSrv-1# sudo make-ssl-cert generate-default-snakeoil --force-overwrite
root@consulSrv-1# chmod -R 777 /etc/ssl/private
root@consulSrv-2# apt install ssl-cert
root@consulSrv-2# sudo make-ssl-cert generate-default-snakeoil --force-overwrite
root@consulSrv-2# chmod -R 777 /etc/ssl/private
root@consulSrv-3# apt install ssl-cert
root@consulSrv-3# sudo make-ssl-cert generate-default-snakeoil --force-overwrite
root@consulSrv-3# chmod -R 777 /etc/ssl/private
Consul kurulumunu tamamlamak için gerekli profile dosyalarını oluşturalım.
root@consulSrv-1# vi /etc/profile.d/consul-env-tls.sh
export CONSUL_HTTP_SSL=true
export CONSUL_HTTP_ADDR=consulSrv-1:8501
root@consulSrv-1# vi /etc/profile.d/consul-autocomplete.sh
complete -C /usr/bin/consul consul
root@consulSrv-1# exit
root@consulSrv-2# vi /etc/profile.d/consul-env-tls.sh
export CONSUL_HTTP_SSL=true
export CONSUL_HTTP_ADDR=consulSrv-2:8501
root@consulSrv-1# vi /etc/profile.d/consul-autocomplete.sh
complete -C /usr/bin/consul consul
root@consulSrv-2# exit
root@consulSrv-3# vi /etc/profile.d/consul-env-tls.sh
export CONSUL_HTTP_SSL=true
export CONSUL_HTTP_ADDR=consulSrv-3:8501
root@consulSrv-1# vi /etc/profile.d/consul-autocomplete.sh
complete -C /usr/bin/consul consul
root@consulSrv-3# exit
Bütün sunucularda consul servisini başlatabiliriz.
root@consulSrv-1# systemctl start consul
root@consulSrv-2# systemctl start consul
root@consulSrv-3# systemctl start consul
Servisi ayağa kaldırdıktan sonra yapmamız Consul Policy oluşturmamız gerekmektedir. Policy, hangi hizmetlerin ve aracıların ağdaki kaynaklarla etkileşime girmeye yetkili olduğunu tanımlar. Merkezi Consul Kümesi için policy oluşturmadan önce leader consul sunucusunu tespit etmemiz gerekmektedir. Bunun için herhangi bir sunucu üzerinde aşağıdaki scripti çalıştırarak leader consul instance bulunur.
root@consulSrv-1# curl https://consulSrv-1:8501/v1/status/leader
"192.168.222.11:8300"
ConsulSrv-1 Sunucusunun leader durumda olduğunu anlıyoruz. Bu sunucu üzerinde police üretiyoruz.
root@consulSrv-1:~# consul acl bootstrap
AccessorID: 31fe5790-fec0-00bf-d1ff-4826293c1086
SecretID: 759618f7-0690-6f62-b201-67160ff4c700
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2023-04-18 11:02:28.681815843 +0000 UTC
Policies:
00000000-0000-0000-0000-000000000001 - global-management
Ürettiğimiz police’de yer alan SecretID yetkili token olarak kullanılacaktır. Bunun için consul.json dosyasında yer alan acl bölümünü aşağıdaki gibi güncelliyoruz. İşlem bütün sunucularda uygulanacaktır.
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true,
"tokens": {
"default": "anonymous",
"agent": "759618f7-0690-6f62-b201-67160ff4c700",
"initial_management": "759618f7-0690-6f62-b201-67160ff4c700"
}
Bütün sunucularda consul.json dosyasını tekrar düzenledikten sonra consul servisini restart ediyoruz.
root@consulSrv-1# systemctl restart consul.service
root@consulSrv-2# systemctl restart consul.service
root@consulSrv-3# systemctl restart consul.service
Merkezi Consul kümesinin kurulumu tamamlanmıştır. Consul kümesinde bulunan üyeleri görüntüleyebilmek için consul members komutu ile birlikte yetkili token kullanılması gerekmektedir.
root@consulSrv-1# consul members --token 759618f7-0690-6f62-b201-67160ff4c700
Node Address Status Type Build Protocol DC Partition Segment
consulSrv-1 192.168.222.11:8301 alive server 1.11.4 2 sysdbaops default <all>
consulSrv-2 192.168.222.12:8301 alive server 1.11.4 2 sysdbaops default <all>
consulSrv-3 192.168.222.13:8301 alive server 1.11.4 2 sysdbaops default <all>
Consul kümesinin durumunu Consul Dashboard üzerinden de görüntüleyebiliriz. Bunun için web tarayıcı üzerinden https://IP:8501 adresine gidebiliriz.
Karşımıza gelen ekranda Log in Seçeneğine tıkladıktan sonra yetkili tokeni kullanarak giriş yapıyoruz.
Merkezi Consul Kümesi kurulumu başarı ile tamamlamış olduk. Bir sonraki yazımızda Patroni Kümesi kurulumundan bahsedeceğiz. Bununla birlikte Patroni Sunucuları üzerinde Consul Client kurulumlarını gerçekleştireceğiz.