Trendyol Tech
Published in

Trendyol Tech

PostgreSQL — Receiving Patroni Auto Failover Notification

Sending a simple notification for PostgreSQL Patroni cluster failovers.

Merhaba arkadaşlar,
PostgreSQL Patroni clusterlarımızda bir failover olduğunda nasıl haberimiz oluyor bundan bahsedeceğim.

Şirkette birçok database teknolojisi kullanıyoruz. Bunlardan biri de PostgreSQL.

Mimarimiz gereği tüm database ortamalarımızı clusterlar halinde kuruyor ve birbirileri arasında otomatik failover olabilsin istiyoruz.
PostgreSQL’in default kurulumunda failover’ı otomatik yapacak bir yapısı bulunmuyor. PostgreSQL clusterlarımızı yönetmek ve otonom hale getirebilmek için Patroni isimli açık kaynak kodlu bir ürün kullanıyoruz.

Patroni, Zalando tarafından Python ile yazılmış bir high availability template ürünüdür. Template diyorum çünkü kurduktan sonra bunu kendi yapınıza göre özelleştirmeniz gerekiyor. Temelde PostgreSQL makineleriniz arasında kurduğunuz replikasyonları master / slave ilişkisini koruyarak yönetiyor ve gerektiğinde slave sunucularından birini promote edip master yapıyor. Yani “auto failover” yapıyor.

İhtiyaç:
- Otomatik failover bildirimi (Email, slack vs.)
- Failover history (Geriye dönük analiz için)

Bu ihtiyaçları karşılayabilmek için basit ama işe yarar bir yapı kurduk. 10 saniyelik periyotlarla clusterlara bağlanıp ip bilgisini çekip bir tabloya yazıyoruz. Gelen ip adresi bir önceki kaydedilenden farklı ise “failover olmuştur” bildirimi yapıyoruz.

Uygulamlar Postgres sunucularımıza HAProxy üstünden bağlanıyor. HAProxy bir TCP yönlendirici görevi yapıyor. Bu sayede uygulamalar failover sırasında connection bilgisi değiştirmeye ihtiyaç duymuyor.

Kod kısmına geçelim :)
Bu yapıyı da #PowerShell ile geliştirdim. (PowerShell’i neden bu kadar çok kullandığımı ayrı bir makalede yazacağım)

Bu iş için Postgres sunuculara bağlanıp sorgu çalıştırabilmek için yazdığım başka bir PowerShell scriptini kullandım. Get-PgOdbcData.ps1
Bu script, PostgreSQL ODBC driverlarını kullanarak run time’da bir ODBC connection oluşturuyor ve işi bittikten sonra siliyor.

DBA ekibi olarak topladığımız metrikleri ve bazı envanter bilgilerini SQL Server’da tutuyoruz. Bu yüzden internal tablolar SQL Server’da olacak.

Başlayalım..
Failover history için kendimize FailoverHistory isminde bir tablo oluşturduk.

CREATE TABLE [dbo].[FailoverHistory](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[ProxyAddress] [varchar](250) NOT NULL,
[LastNode] [varchar](250) NOT NULL,
[CurrentNode] [varchar](250) NOT NULL,
[CheckDate] [datetime2](3) NOT NULL,
[InsertDate] [datetime2](3) NOT NULL,
[Note] [nvarchar](max) NULL
)

Proxy adreslerimizi de ProxyList isminde bir tabloda tutuyoruz.

CREATE TABLE [dbo].[ProxyList](
[ProxyAddress] [varchar](250) NOT NULL,
[Port] [smallint] NOT NULL
)

Şirket olarak iç yazışmalarımızı Slack üstünden yürütüyoruz. Slack entegrasyonu sayesinde tüm alarmlarımızı da yine Slack üstünden takip edebiliyoruz.
Paylaştığım kodda Slack mesajı ve snippet yollamak için de fonksiyonlar mevcut. Onları da ayrıca kullanabilirsiniz :)

Bu kodu kendi yapımıza göre yazdım. Siz de ortamınıza göre özelleştirmelisiniz. Esas amacım kodu değil yaşadığımız deneyimi paylaşmak :)

Tüm kod şu şekilde. Karışık ve uzun gelebilir, sormaktan çekinmeyin lütfen.

Olası bir failoverda şu şekilde bir mesaj düşüyor bize.

Okuduğunuz için teşekkürler,

Ahmet.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store