Redis Sentinel: Güvenilir Dağıtık Veri Tabanları

Transitioning between Single and Multiserver Architecture with Redis Sentinel: Availability Strategies and Operational Details

Cihat Solak
Intertech
9 min readSep 21, 2023

--

Herhangi bir sistemin temel amacı, sürdürülebilirlik sağlamaktır. Redis sentinel sunucusu ise redis veri tabanının kesintisiz çalışmasını sağlayarak sürdürülebilirliği garanti altına alır. Sentinel yapılandırması sayesinde redis kaynaklı kesinti riskini minimize edebiliriz.

Diğer redis makalelerine linkler üzerinden erişebilirsiniz.

Redis Sentinel: Güvenilir Dağıtık Veri Tabanları

sentinel, redis veri tabanının yüksek kullanılabilirlik sağlamak amacıyla geliştirilmiş bir yönetim servisidir.

Yüksek trafikli sistemlerde kesintisiz hizmet sağlama gereksinimi için ölçeklendirme stratejileri devreye girebilir. Tek bir redis sunucusu yeterli olmayabilir. Bu tür durumlarda redis sunucu sayısını artırarak (5, 10, 15 vb.) yani ölçeklendirme yaparak sorunun üstesinden gelebiliriz.

Sistemin kesintisiz çalışabilmesi, yüksek kullanılabilirlik veya yüksek erişilebilirlik (high availability) olarak adlandırılır. Bu durum, sistemde sürdürülebilirlik sağlandığını ve kesintisiz bir şekilde çalışabilmek için ölçeklendirilmiş bir altyapının olduğunu gösterir.

Hangi Durumlarda Redis Sentinel’i Tercih Edebilirim?

  • Redis Sunucusunun Arızalanması Durumunda: Tek bir Redis sunucusunun kullanıldığı senaryolarda, redis sunucusunda bir arıza veya kesinti meydana geldiğinde sentinel devreye girebilir ve farklı bir redis sunucusu üzerinden hizmet vermeye devam edebilir. Bu sayede kesintisiz hizmet sağlanabilir.
  • Bakım ve Güncelleme Süreçlerinde: Redis sunucusunun bakım veya güncelleme süreçlerinde geçici olarak çalışamaz hale gelmesi durumunda sentinel, farklı bir sunucu üzerinden hizmet vermeye devam ederek kesintisizliği sağlar. Bu, bakım süreçlerinin daha sorunsuz bir şekilde yönetilmesine yardımcı olacaktır.
  • Yüksek Trafik: Tek bir redis sunucusunun performansı yetersiz kalabilir ve gecikmeli cevaplar verme riski olabilir. Sentinel ile redis sunucularını ölçeklendirerek performansı artırabilir ve yükü daha dengeli bir şekilde dağıtabilirsiniz. Bu, yüksek trafikli uygulamalarda daha iyi hız ve kararlılık sağlayacaktır.

Yedekleme ve Geri Yükleme

Sentinel servisi, yedekleme ve geri yükleme süreçlerini sorunsuz bir şekilde tamamlamaya yardımcı olur.

Redis Sentinel ile Tek ve Çok Sunuculu Mimari Arasındaki Geçiş: Kullanılabilirlik Stratejileri ve İşleyiş Detayları

Tek sunuculu redis yapılarında yaşanabilen sorunları önlemek için sentinel yapısını kullanmalıyız. Ölçeklendirme yapmanın ötesinde, sentinel davranışını uygulamayan mimarilerde de benzer sorunlar meydana gelebilir. Sentinel, redis tabanlı sistemlerin kesintisiz çalışmasını sağlamak için bilinçli bir tercihtir.

Redis Sentinel Yapısının Temel Kavramları

Sentinel, redis veri tabanlarının yüksek kullanılabilirlik ve kesintisiz hizmet sağlamak amacıyla izlenmesini ve yönetilmesini sağlayan bir sistemdir. Sentinel, ana (master) ve yedek (slave) sunucular arasında veri replikasyonunu destekler. Ana sunucuda bir sorun tespit edildiğinde otomatik olarak yedek sunucular arasından yeni bir ana sunucu seçer, bu işleme “failover” denir. Bu sayede redis tabanlı uygulamaların sorunsuz çalışmasını ve sürekli erişilebilir olmasını sağlar.

Redis Sentinel Dendiğinde Aklımızda Ne Canlanmalıdır?

Master, Slave, Sentinel, Failover olmak üzere dört ana kavram bulunmaktadır.

Master

Redis veri tabanının ana sunucusudur ve yazma/okuma işlemleri burada gerçekleşir. Sentinel ise bu ana sunucunun sağlığını izler ve sorun olursa otomatik olarak yedek sunucuyu yeni ana sunucu olarak belirler. Bu sayede kesintisiz hizmet sağlanır. Sentinel, uygulamaların doğru ana sunucuya bağlanabilmesi için en güncel ana sunucuyu bilir ve buna göre redis ile iletişim kurulur.

Slave

Redis veri tabanının yedek sunucusudur ve ana sunucunun verilerini kopyalar. Okuma işlemleri için kullanılır ve redis sentinel yapılarında birden fazla slave olabilir.

Sentinel

Redis veri tabanının sağlığını izler ve kesintisiz hizmet sağlamak için otomatik failover işlemlerini yönetir. Master sunucunun sorun yaşadığını tespit ederse, bir slave’i yeni ana sunucu olarak atar. Ayrıca eklenen slave sunucularıyla ilgili bilgi toplar ve yeni ana sunucunun ip adresini diğer sunuculara ileterek senkronize olmalarını sağlar.

Redis Sentinel Çalışma Prensibi

Redis, hızlı ve ölçeklenebilir veri depolama için popüler olsa da, tek bir sunucu üzerine dayalı yapısı bazı sınırlamalar getirebilir. Redis sentinel, bu sınırlamaları aşmak için kullanılır. Tek sunuculu ve çoklu sunuculu (çoklu master-slave) yapılar içinde çalışabilir. Sentinel, ana sunucunun (master) sağlığını izler ve olası bir sorun durumunda otomatik bir geçiş (failover) işlemi gerçekleştirir. Böylece Redis veritabanınızın kesintisiz çalışmasını sağlar.

Bu çözüm, redis’i daha güvenilir ve yüksek performanslı hale getirmenize yardımcı olur. Ayrıca, birden çok sentinel sunucusu kullanarak sisteminizin yedekliliğini artırabilirsiniz. Sentinel sunucuları, redis sunucularının durumunu izlemek için birlikte çalışır ve gerektiğinde otomatik müdahalede bulunur. Bu sayede redis tabanlı uygulamalarınızın sürdürülebilirliğini artırırken, veri bütünlüğünü koruma konusunda güvende olursunuz.

Tek Sentinel Sunuculu Mimari

Tek Sentinel sunuculu mimaride slave sunucular, master sunucunun replikasyonuyla çalışır ve ihtiyaç halinde master sunucu olabilir. Sentinel sunucusu, master ve slave sunucuların IP adreslerini bilir ve senkronizasyonu sağlar.

Master ve slave arasındaki ilişki her zaman veri replikasyonuna dayanır. Slave sunucular, master’ın verilerini tutarlı bir şekilde kopyalar. Bu sayede, master sunucu sorun yaşarsa bir slave sunucu yerine geçebilir ve verilerin tutarlılığı korunur.

Birden Fazla Sentinel Sunuculu Mimari

Birden fazla sentinel sunucusu olduğunda, lideri belirlemek için sentinel sunucuları kendi aralarında oylama yapar. Bu oylama sonucunda otomatik olarak bir lider seçilir. Leader’ı belirlemek için ekstra yapılandırmaya gerek yoktur, sentinel sunucularının iletişim halinde olmaları yeterlidir.

Bu mimari, sentinel sunucularının birbirleriyle iletişim kurduğu bir yapıyı yansıtır. Her sentinel sunucusu, master’da olası bir problem durumunda hangi slave sunucunun ana sunucu olacağına karar vermez. Bu kararı yalnızca bir sentinel sunucusu verir. Birden fazla sentinel sunucusuna sahipseniz, bu kararı vermek için bir lider seçilir. Ancak tek bir sentinel sunucusu olduğunda bu senaryo gereksizdir.

Lider Kim? Demokrasi Nerede?

Sentinel sunucuları, kendi aralarında bir lider belirlemek için oylama yaparlar. Bu lider, tek bir sentinel sunucusu gibi davranır, bağımsız olarak master ve slave sunucularını takip eder. Master sunucuda herhangi bir problem yaşandığında, Sentinel lideri yeni bir master sunucusunu seçer. Bu liderlik mekanizması, hem tek hem de çoklu sentinel sunucusu mimarilerinde aynı şekilde işler. Sentinel sunucusu, bütün master ve slave sunucularının IP adreslerini bilir ve bu bilgileri kullanarak çalışır. Bu sayede redis sunucularının sürdürülebilirliği sağlanır ve ekstra yapılandırmaya ihtiyaç duyulmaz. Sentinel yapılandırması tamamlandığında, Redis sunucularıyla ilgili yönetim ve organizasyon işlemleri sentinel tarafından otomatik olarak gerçekleştirilir. Bu nedenle ekstra DevOps veya yazılım geliştirme maliyeti ortaya çıkmaz. Sentinel, redis tabanlı uygulamaların daha güvenilir ve sürdürülebilir olmasını sağlar.

Docker — Çoklu Sentinel/Slave Sunuculu Mimari Nasıl Kurgulanabilir?

Tek sentinel sunuculu konfigürasyon ile çoklu sentinel sunucu konfigürasyonu arasında fark bulunmamaktadır.

Docker üzerinde 3 adet sentinel, 3 adet slave ve 1 adet master redis sunuculu cluster oluşturalım. Bunları benimle beraber yapabilmek adına adım adım takip ediniz.

Adım 1: Tüm bu cluster için docker üzerinde ortak bir ağ oluşturalım.

docker network create redis-network

Adım 2: Redis master sunucusunu oluşturalım.

docker run -d --name redis-master -p 6379:6379 --network redis-network redis redis-server

Adım 3: Üç adet slave sunucu oluşturalım.

docker run -d --name redis-slave1 -p 6380:6379 --network redis-network redis redis-server --slaveof redis-master 6379
docker run -d --name redis-slave2 -p 6381:6379 --network redis-network redis redis-server --slaveof redis-master 6379
docker run -d --name redis-slave3 -p 6382:6379 --network redis-network redis redis-server --slaveof redis-master 6379

Adım 4: Sentinel sunucularını ayağa kaldırmadan önce sentinel sunucunun yapılandırmasını sağlamalıyız. Bunun için bilgisayarın herhangi bir dizinine “sentinel.conf” adında dosya oluşturun ve aşağıdaki komutları dosya içerisine kaydedin.

.conf dosyası içerisinde yer alan mymaster isimlendirmesini takma bir isim olarak düşünebiliriz. İstediğiniz isimlendirmeyi sağlayabilirsiniz.

#sentinel tarafından izlenecek master sunucunun ip bilgisi
#mimarideki sentinel sunucu sayısı (burada 3 olarak belirttik)
sentinel monitor mymaster 172.19.0.2 6379 3

#master sunucusunun tepki vermemesi durumunda sentinel'in bekleme süresi
#bir problem meydana gelmesi durumunda sentinel'ın bekleme süresi
#master sunucuda problem olduğunda sorumluluğun slave sunuculardan birine aktarılması kararının belirlenmesi için ne kadar süre bekleneceğinin milisaniye cinsinden değeri (5 saniye)
sentinel down-after-milliseconds mymaster 5000

#master sunucusunun yeniden yapılandırılması için sentinel'in beklemesi gereken süresi
#sentinel failover sürecini gerçekleştirirken timeout süresi
sentinel failover-timeout mymaster 10000

#sentinel tarafından eşzamanlı olarak kullanılacak (senkronize edilecek) slave sunucu sayısı (3)
sentinel parallel-syncs mymaster 3

Docker üzerinde redis master sunucunun ip adresini bulmak için aşağıdaki komutu çalıştırabilirsiniz.

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-adı veya container-id>

3 adet sentinel sunucu ayağa kaldıralım. Sentinel default port 26379'dur.

docker run -d --name redis-sentinel-1 -p 6383:26379 --network redis-network -v C:\Users\cihat\OneDrive\Desktop\redis-sentinel\sentinel.conf:/usr/local/etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
docker run -d --name redis-sentinel-2 -p 6384:26379 --network redis-network -v C:\Users\cihat\OneDrive\Desktop\redis-sentinel\sentinel.conf:/usr/local/etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
docker run -d --name redis-sentinel-3 -p 6385:26379 --network redis-network -v C:\Users\cihat\OneDrive\Desktop\redis-sentinel\sentinel.conf:/usr/local/etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf

İşte! Hazırsınız.

Yukarıdaki adımları takip ederek mimariyi oluşturabilirsiniz. Sentinel sunucunun hangi master sunucuyu takip edeceğini Adım 4'de yer alan sentinel.conf dosyasında master ip adresini açıkça ifade ediyoruz. Hatta isimlendirme olarak mymaster ismini ver dedik. Kalan tüm yapılandırma işlemlerinde mymaster isimlendirmesini kullanacağız. Mymaster özel bir isimlendirme değildir, siz istediğiniz isimlendirmeyi sağlayabilirsiniz. (Örn: Ali, Ayşe, Fatma). Daha önce de bahsini geçirdiğimiz gibi sentinel sunucuya takip etmesi gereken master sunucu bilgisini sağladıktan sonra kalan işlemleri sentinel kendini yürütecektir.

Kurguladığınız senaryoda kaç adet sentinel sunucu olacaksa sentinel.conf dosyasında açık açık belirtmelisiniz. Aşağıdaki örnekten yola çıkabilirsiniz.

sentinel monitor mymaster 172.19.0.2 6379 3

Yukarıdaki 6379 redis’in varsayılan port numarasıdır. Yanında yer alan 3 ifadesi ise sistemde bulunacak sentinel sunucu sayısını belirtir.

Tüm bu işlemlerden sonra docker ortamında master redis ip adresi takip edilecek şekilde sentinel container’lar ayağa kaldırdık. Önce 1 adet master sunucu oluşturduk, bir yandan da master’in replikasını alacak 3 adet slave sunucu oluşturduk. Hepsinin dışında tüm bu yapılandırmanın sürdürülebilir olmasını sağlayacak 3 adet sentinel sunucularını ölçekledirilebilir şekilde oluşturduk. Çünkü bu sentinel yapılanmalarının her biri aynı sentinel.conf dosyası aynı yapılandırma üzerine yani aynı master sunucuyu izleyecek şekilde konfigüre edildiklerinden dolayı artık ölçeklenebilir bir alt yapıda hali hazırda oluşturulmuş oldu. Artık mimari sentinel davranışı sergileyecektir.

Sentinel Davranışı Derken? Nasıl Sergiliyor?

Mimaride bulunan master sunucu ilk etapta kullandığımız ana redis sunucusudur. Tabii olası problemlere karşı master sunucunun replikasını alacak üç adet slave sunucuya (slave1-slave2-slave3) ihtiyacımız var.

Bir redis sunucunun slave olabilmesi için ilgili sunucunun farklı bir redis sunucunun replikasını alabilmesi gerekmektedir.

Sentinel sunucu/sunucularını ayağı kaldırırken takip edeceği master sunucusunu bildirmemiz yeterlidir. Bu bildirimden sonra artık redisle ilgili uygulama tabanlı yapacağımız bütün işlemler bizzat redis sunucusu üzerinde değil, sentinel sunucusu üzerinden olacaktır. Yapacağımız işlemlerde sentinel sunucusundan güncel master sunucunun ip adresini talep edeceğiz. Sentinel sunucunun bize sağlayacağı master ip bilgisine göre hareket edeceğiz.

Test Etmeye Ne Dersin?

Önce sentinel sunucusuna güncel master kimdir? sorusunu soracağız. Daha sonra master sunucu container’ını kapatacağız ardından sentinel sunucuya tekrardan master’ın kim olduğunu soracağız.

Hadi başlayalım! İşte mevcut durum.

127.0.0.1:6380 (redis-slave1) sunucusunda pub/sub menüsünden subscribe olursanız, sentinel tarafından gönderilen mesajları gözlemleyebilirsiniz. İlk etapta 172.19.0.2:6379 (redis-master) container’ı master rolündeydi. Bu container test için durdurduktan sonra sentinel devreye girerek 172.19.0.5:6379 (redis-slave2) sunucusu master olarak görevlendirdi.

Master sunucunun 10 adet slave sunucusu olduğunu düşünelim. Eğer sentinel.conf dosyasında sentinel parallel-syncs mymaster 4 olarak ifade ettiysek, sentinel tarafından sadece 4 slave sunucu dikkate alınır. Bu da performans ve maliyet durumları hesaba katıldığında küçük optimizasyonlardır.

Sentinel yapılandırmasının da maliyet olacaktır. Sentinel, ne kadar çok slave sunucu takip ederse aynı oranda maliyeti, timeout süreleri de artacaktır. Dolayısıyla sentinel sunucularını yormak istemiyorsanız takip edeceği slave sunucu sayısını azaltmalısınız.

ASP.NET CORE İLE REDİS SENTİNEL KULLANIMI

static ConfigurationOptions SentinelConfigurationOptions => new()
{
EndPoints = //Mevcut sentinel sunucularının ip adresleri
{
{ "localhost", 6383 },
{ "localhost", 6384 },
{ "localhost", 6385 }
},
CommandMap = CommandMap.Sentinel,
AbortOnConnectFail = false
};

public static async Task<IDatabase> GetMasterDb()
{
ConnectionMultiplexer sentinelConnection = await ConnectionMultiplexer.SentinelConnectAsync(SentinelConfigurationOptions);
EndPoint masterEndPoint = null;
foreach (EndPoint endpoint in sentinelConnection.GetEndPoints())
{
IServer server = sentinelConnection.GetServer(endpoint); //İlgili sentinel sunucusuna bağlantı var mı?
if (!server.IsConnected)
continue;
//mymaster isimlendirmesi, sentinel.conf dosyasından gelmektedir.
masterEndPoint = await server.SentinelGetMasterAddressByNameAsync("mymaster");
break;
}
//docker üzerinde çalıştığımız için docker ip adresini local adrese çeviriyorum. Normal şartlarda buna ihtiyaç bulunmayacaktır.
var localMasterIP = masterEndPoint?.ToString() switch
{
"172.18.0.2:6379" => "localhost:6379",
"172.18.0.3:6379" => "localhost:6380",
"172.18.0.4:6379" => "localhost:6381",
"172.18.0.5:6379" => "localhost:6382",
};
ConnectionMultiplexer masterConnection = await ConnectionMultiplexer.ConnectAsync(localMasterIP);
IDatabase database = masterConnection.GetDatabase();
return database;
}

--

--