Redis Master-Slave Modeli: Dağıtık Veri Depolamanın Temelleri
In a Redis database, slave servers, which perform synchronized data copying tasks with the master server, are a critical component that ensures high availability and data security.
İhtiyaçlara göre senaryolar ve senaryolara karşı uyguladığımız çözümler değişmektedir/değişecektir. Eğer redis veri tabanıyla çalışıyorsak, sunucudaki verilerin güvenliğini 🛡️ (sunucuyu parolayla korumak, ağ trafiğini şifrelemek (TLS/SSL), güvenli kimlik doğrulama kullanmak gibi önlemler bunlardan birkaçı) sağlayabilmek adına bazı önlemler alma ihtiyacı hissedebiliriz. Tam üzerine basmışken ayağımızı 🦶 kaldırmadan çözüm önerisinde bulunalım. İşte karşınızda REDIS REPLICATION! ⭐
Replication davranışını uygulayarak veri kaybı gibi durumlara karşı daha güvenli/dirençli bir alt yapı kurgulayabiliriz. Çünkü replication, bir redis sunucusundaki tüm verinin farklı redis sunucuları tarafından birebir modellenmesi/çoğaltılması/replike 🗄️ edilmesi davranışıdır.
Master (usta/sahip): Replication davranışındaki modellenecek/replikası alınacak olan sunucudur.
Slave (köle/esir): Master’ın replikasını alan sunucudur.
Replication mekanizması sayesinde veri güvencesi sağlanır. Ayrıca replication özelliği kullanılarak, master ve slave sunucular arasında kurulan bağlantı 📶 sayesinde, masterdaki tüm değişiklikler anlık olarak slave sunuculara aktarılır. Bu bağlantı herhangi bir nedenle koparsa, otomatik olarak yeniden bağlantı sağlanarak veri bütünlüğünün korunması hedeflenir. Böylece master sunucuda yaşanabilecek arıza/kesinti durumlarında sorumluluğu slave sunucuların otomatik olarak devr almasıyla kesintisiz hizmet sağlanabilir.
Master ve slave sunucular arasında tam bir veri eşitlemesi gerçekleşmediyse, redis eşitlemenin sağlanabilmesi için talepte bulunur ve master sunucudaki güncel verilerin slave sunucusuna aktarılması için kaynakları kullanmaya devam eder.
Bir master sunucunun birden fazla replikasyonu (slave sunucuları) olması da mümkündür. Birden fazla slave sunucunun bulunması,
✔️ Yüksek Kullanılabilirlik
✔️ Yedekleme
✔️ Veri Kurtarma
✔️ Veri Ölçeklendirme
✔️ Coğrafi Olarak Dağıtılmış Sistemler
vb. senaryolarda faydalı çalışmaların gerçekleştirilmesine olanak sağlar. İsterseniz (tavsiye edilmeyen bir durum 🔴) slave sunucunun da replikası olabilir ve derecelendirilmiş bir çoğaltma işlemi uygulayabilirsiniz. Yani, slave olarak davranan sunucu aynı zamanda master rolünü üstlenebilir.
Replication davranışında önemli olan nokta, slave sunucuların yalnızca master sunucusundaki verileri kopyalamasıdır. ⚡ Tersi olan durum söz konusu değildir. Slave sunucular master sunucusunda herhangi bir değişiklik yapamazlar. Dolayısıyla yazma işlemleri ✍️ master sunucusu üzerinde gerçekleştirilmeli ve slave sunucular tarafından bu değişikliklerin replikasyonu sağlanmalıdır.
Slave sunucular sadece okuma işlemleri 📗 için kullanılmalı, yazma işlemleri sadece master sunucusunda gerçekleştirilmelidir. Slave sunucular, okuma işlemlerinin master sunucusuna göre tercihen dağıtılması amacıyla kullanılır. Bu şekilde, master sunucusunun üzerindeki yük azaltılabilir.
Slave sunucuda yapılan bir değişikliğin master sunucusuna yansıtılması gerekiyorsa, Redis tarafından böyle bir senaryo desteklenmez. 👎
Docker 🐬 — Replication Davranış Modellemesi (Master-Slave)
Replication davranışını örneklendirebilmek adına 2 adet SLAVE, 1 adet Master sunucu olacak şekilde redis sunucularını oluşturalım. Daha sonra master ile slave sunucular arasındaki replication ilişkisini sağlayabilmek için master sunucunun IP adresini tespit etmemiz gerekmektedir.
Docker üzerinde bir container’ın ip adresini tespit edebilmek için aşağıdaki komut şemasını kullanabilirsiniz.
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id_or_name>
Adım 1: Master sunucusunu aşağıdaki komut ile birlikte oluşturunuz.
docker run -p 1000:6379 --name redis-medium-master -d redis
Adım 2: Master sunucuyu replicate edecek 2 adet slave sunucuyu aşağıdaki komutlar ile oluşturalım.
docker run -p 1001:6379 --name redis-medium-slave1 -d redis
docker run -p 1002:6379 --name redis-medium-slave2 -d redis
Adım 3: Master sunucun ip adresini öğrenelim.
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-medium-master
Adım 4: Slave sunucular ile master sunucu arasında replication ilişkisini kuralım.
docker exec -it redis-medium-slave1 redis-cli slaveof 172.17.0.2 6379
docker exec -it redis-medium-slave2 redis-cli slaveof 172.17.0.2 6379
Tüm bu adımlardan sonra karşılaşmanız gereken tablo aşağıdaki gibi olmalıdır.
Böylece üç sunucu (bir master iki slave) arasındaki master-slave ilişkisi yani replication davranışı gerçekleştirilmiştir. Dolayısıyla herhangi bir sunucunun replication bilgisi elde etmek istiyorsak aşağıdaki komutu kullanabiliriz.
info replication
redis-medium-slave1 sunucusunun son durumuna birlikte göz atalım. 👀 Bunun için aşağıdaki komutları çalıştırmalısınız.
docker exec -it redis-medium-slave1 redis-cli
info replication
Karşılaşacağımız görüntü aşağıdaki gibi olmalıdır. Görülen üzere redis-medium-slave1 sunucusu olması gerektiği gibi slave rolündedir ve master’ı replicate etmektedir. 🤩
Bu işlemler sonrası master sunucuda yaptığınız herhangi bir değişiklik slave sunucularına yansıyacaktır. Denemesi BEDAVA! 🆓
Slave sunucular varsayılan (default) olarak read-only’dir ve test süreçlerinde kullanılabilir. 🤘
🎁 Süpriz (Command Flags)
Command flags’ler, komutların davranışını değiştiren veya ek işlevselliği etkinleştiren seçeneklerdir. Komutların farklı kullanım senaryolarına uyum sağlamasını sağlar.
FireAndForget: Komutun hemen gönderilmesini ve yanıtı beklemeden işleme devam etmeyi ifade eder. Redis sunucusu, komutu alır ve hemen işlemeye başlar, yanıtı dikkate almaz veya geri dönmez. Bu bayrak, performansı artırmak için kullanılırken, yanıtın önemli olduğu durumlarda dikkatli kullanılmalıdır.
PreferMaster: Redis kümesindeki komutun master üzerinde çalıştırılmasını tercih ettiğini belirtir. Eğer master mevcutsa komut çalıştırılır. Bu komut, özellikle yazma işlemlerinde kullanılabilir. Böylece tüm yazma işlemleri master’da toplanabilir.
DemandMaster: Komutun kesinlikle masterda çalıştırılmasını gerektirdiğini belirtir. Eğer komut masterda çalıştırılamazsa, hata döner. Bu bayrak, masterda gerçekleştirilmesi kritik olan işlemlerde kullanılabilir.
PreferReplica: Redis kümesindeki komutun slave sunucuda çalıştırılmasını tercih ettiğini belirtir. Eğer slave sunucular mevcutsa, komut bu düğümlerden birinde çalıştırılabilir. Bu bayrak, yük dengelemesi veya yüksek kullanılabilirlik durumlarında kullanılabilir.
DemandReplica: Komutun kesinlikle slave sunucuda çalıştırılması gerektiğini belirtir. Eğer komut slave sunucuda çalıştırılamazsa, hata döner. Bu bayrak, yedek düğümde gerçekleştirilmesi kritik olan işlemlerde kullanılabilir.
NoRedirect: Redis sunucusunun komutu yeniden yönlendirmemesini sağlar. Redis, bazen komutu ilgili sunucuya (master veya replica) yönlendirebilir, ancak bu bayrakla bu yönlendirmeyi engelleyebilirsiniz.
NoScriptCache: Redis sunucusunun Lua komutlarını önbelleğe almamasını sağlar. Redis, Lua komutlarını önbelleğe alarak performansı artırabilir, ancak bu bayrakla önbelleğe almayı devre dışı bırakabilirsiniz. Özellikle, dinamik olarak değişen Lua komutlarında kullanılabilir.
Sayōnara 👋