Merhaba arkadaşlar, bugün sizlere Redis Cluster ortamlarında büyüme veya düğüm değişikliği yaparken mutlaka ihtiyaç duyacağınız bir işlemi, veri yeniden dengeleme yani resharding'i ve kritik öneme sahip slot yönetimini adım adım anlatacağım. Bu işlem, cluster'ınıza yeni bir master node eklediğinizde veya bir node'u çıkardığınızda verilerinizin düzgün dağıtılması ve cluster bütünlüğünün korunması için şarttır.
Redis Cluster Slotlarına Hızlı Bakış
Öncelikle temel bir bilgiyi tazeleyelim. Redis Cluster, verileri 16384 adet "hash slot"a böler. Her bir master node, bu slot aralıklarından bir kısmını yönetmekten sorumludur. Cluster'ın sağlıklı çalışması için tüm slotların (0-16383) bir master tarafından kapsanıyor olması gerekir. İşlem yapmadan önce mevcut durumu görmek için herhangi bir node'a bağlanıp cluster bilgisini alalım.
Bu komutun çıktısında her master node'un sahip olduğu slot aralıklarını (örn: 0-5460) göreceksiniz. İşte resharding, bu slotların node'lar arasında taşınması işlemidir.
Yeniden Dengeleme (Resharding) Adımları
Diyelim ki cluster'ınıza yeni bir master node eklediniz ve ona mevcut node'lardan slot aktarımı yapmak istiyorsunuz. İlk adım, resharding işlemini başlatmaktır. Bu işlem için `redis-cli` yardımcı programını kullanacağız.
Komutu çalıştırdığınızda size bir dizi soru soracaktır. Bu soruları dikkatlice yanıtlamanız çok önemli.
1. Kaç slot taşımak istiyorsunuz? Burada yeni node'a vermek istediğiniz toplam slot sayısını girin. Örneğin, 4 node'lu bir cluster'da her node 4096 slot yönetiyorsa, 5. node eklerken 16384/5 ≈ 3277 slot gibi bir sayı girebilirsiniz veya daha kontrollü bir miktar (örn: 1000) seçebilirsiniz.
2. Slotları hangi node'dan alacaksınız? Burada kaynak node'ların ID'lerini girmeniz gerekiyor. Tüm node'lardan eşit miktarda almak için `all` yazabilirsiniz. `all` dediğinizde, sistem her bir mevcut master'dan eşit sayıda slot seçerek taşıyacaktır. Spesifik bir node'dan almak isterseniz, o node'un `CLUSTER NODES` komutunda görünen ID'sini girmelisiniz.
3. Slotları hangi node'a (alıcı) vereceksiniz? Buraya yeni eklediğiniz master node'unuzun ID'sini gireceksiniz.
Bu bilgileri girdikten sonra, sistem size taşınacak slotların bir listesini ve onayınızı isteyecek. Listeyi kontrol ettikten sonra `yes` diyerek işlemi başlatabilirsiniz. İşlem sırasında her bir slot için veriler kaynak node'dan alıcı node'a taşınacaktır. Bu süre, taşınan veri miktarına bağlı olarak uzayabilir.
Kritik Uyarılar ve Dikkat Edilmesi Gerekenler
İşlem Öncesi Yedek: Her ne kadar Redis bu işlemi güvenli yapmaya çalışsa da, büyük ve kritik veri setlerinde mutlaka işlem öncesi yedek alın. Bir şeyler ters giderse geri dönüş yolunuz olsun.
Trafik Yoğunluğu: Resharding, ağ ve CPU kullanımını artırır. Trafiğin nispeten düşük olduğu bir bakım penceresinde yapmanız şiddetle tavsiye edilir.
Slot Kontrolü: İşlem bittikten sonra, tüm slotların hala bir sahibi olduğundan ve cluster'ın `ok` durumuna döndüğünden emin olun.
Çıktının `cluster_state
k` olduğunu görmelisiniz.
Manuel Slot Yönetimi (İleri Seviye)
Bazen belirli bir slotu veya slot aralığını belirli bir node'a elle atamak isteyebilirsiniz. Örneğin, bir node'u devre dışı bırakırken slotlarını diğerlerine dağıtmak gerekebilir. Bu durumda iki komut kullanırız: `CLUSTER SETSLOT <slot> IMPORTING` ve `CLUSTER SETSLOT <slot> MIGRATING`.
Ancak bunlar düşük seviyeli komutlardır ve genellikle `reshard` veya `rebalance` komutları tercih edilir. Yine de bilmekte fayda var. Daha pratik bir yöntem, `redis-cli --cluster rebalance` komutudur. Bu komut, node'lardaki anahtar dağılımına bakar ve otomatik olarak slot taşıma önerisi sunar, hatta sizin onayınızla uygular.
Sonuç ve Tavsiyeler
Redis Cluster'daki resharding işlemi, sistemin esnekliğinin ve ölçeklenebilirliğinin temel taşıdır. Benim sunucularda genelde yeni donanım eklerken veya kapasite planlaması yaparken sıklıkla başvurduğum bir yöntemdir. İşlemi yavaş yavaş, küçük gruplar halinde yapmak ve her adımda cluster sağlığını kontrol etmek, olası sorunları en aza indirir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yaklaşımınız veya bu işlem sırasında karşılaştığınız ilginç bir sorun oldu mu? Aşağıya yorumlarınızı bekliyorum. Sorularınız için çekinmeden yazın, elimden geldiğince yardımcı olmaya çalışırım.
Öncelikle temel bir bilgiyi tazeleyelim. Redis Cluster, verileri 16384 adet "hash slot"a böler. Her bir master node, bu slot aralıklarından bir kısmını yönetmekten sorumludur. Cluster'ın sağlıklı çalışması için tüm slotların (0-16383) bir master tarafından kapsanıyor olması gerekir. İşlem yapmadan önce mevcut durumu görmek için herhangi bir node'a bağlanıp cluster bilgisini alalım.
Bash:
redis-cli -c -h <node_ip> -p <node_port> CLUSTER NODES
Bu komutun çıktısında her master node'un sahip olduğu slot aralıklarını (örn: 0-5460) göreceksiniz. İşte resharding, bu slotların node'lar arasında taşınması işlemidir.
Diyelim ki cluster'ınıza yeni bir master node eklediniz ve ona mevcut node'lardan slot aktarımı yapmak istiyorsunuz. İlk adım, resharding işlemini başlatmaktır. Bu işlem için `redis-cli` yardımcı programını kullanacağız.
Bash:
redis-cli --cluster reshard <herhangi_bir_node_ip>:<port>
Komutu çalıştırdığınızda size bir dizi soru soracaktır. Bu soruları dikkatlice yanıtlamanız çok önemli.
1. Kaç slot taşımak istiyorsunuz? Burada yeni node'a vermek istediğiniz toplam slot sayısını girin. Örneğin, 4 node'lu bir cluster'da her node 4096 slot yönetiyorsa, 5. node eklerken 16384/5 ≈ 3277 slot gibi bir sayı girebilirsiniz veya daha kontrollü bir miktar (örn: 1000) seçebilirsiniz.
2. Slotları hangi node'dan alacaksınız? Burada kaynak node'ların ID'lerini girmeniz gerekiyor. Tüm node'lardan eşit miktarda almak için `all` yazabilirsiniz. `all` dediğinizde, sistem her bir mevcut master'dan eşit sayıda slot seçerek taşıyacaktır. Spesifik bir node'dan almak isterseniz, o node'un `CLUSTER NODES` komutunda görünen ID'sini girmelisiniz.
3. Slotları hangi node'a (alıcı) vereceksiniz? Buraya yeni eklediğiniz master node'unuzun ID'sini gireceksiniz.
Bu bilgileri girdikten sonra, sistem size taşınacak slotların bir listesini ve onayınızı isteyecek. Listeyi kontrol ettikten sonra `yes` diyerek işlemi başlatabilirsiniz. İşlem sırasında her bir slot için veriler kaynak node'dan alıcı node'a taşınacaktır. Bu süre, taşınan veri miktarına bağlı olarak uzayabilir.
İşlem Öncesi Yedek: Her ne kadar Redis bu işlemi güvenli yapmaya çalışsa da, büyük ve kritik veri setlerinde mutlaka işlem öncesi yedek alın. Bir şeyler ters giderse geri dönüş yolunuz olsun.
Trafik Yoğunluğu: Resharding, ağ ve CPU kullanımını artırır. Trafiğin nispeten düşük olduğu bir bakım penceresinde yapmanız şiddetle tavsiye edilir.
Slot Kontrolü: İşlem bittikten sonra, tüm slotların hala bir sahibi olduğundan ve cluster'ın `ok` durumuna döndüğünden emin olun.
Bash:
redis-cli -c -h <node_ip> -p <node_port> CLUSTER INFO | grep cluster_state
Bazen belirli bir slotu veya slot aralığını belirli bir node'a elle atamak isteyebilirsiniz. Örneğin, bir node'u devre dışı bırakırken slotlarını diğerlerine dağıtmak gerekebilir. Bu durumda iki komut kullanırız: `CLUSTER SETSLOT <slot> IMPORTING` ve `CLUSTER SETSLOT <slot> MIGRATING`.
Ancak bunlar düşük seviyeli komutlardır ve genellikle `reshard` veya `rebalance` komutları tercih edilir. Yine de bilmekte fayda var. Daha pratik bir yöntem, `redis-cli --cluster rebalance` komutudur. Bu komut, node'lardaki anahtar dağılımına bakar ve otomatik olarak slot taşıma önerisi sunar, hatta sizin onayınızla uygular.
Redis Cluster'daki resharding işlemi, sistemin esnekliğinin ve ölçeklenebilirliğinin temel taşıdır. Benim sunucularda genelde yeni donanım eklerken veya kapasite planlaması yaparken sıklıkla başvurduğum bir yöntemdir. İşlemi yavaş yavaş, küçük gruplar halinde yapmak ve her adımda cluster sağlığını kontrol etmek, olası sorunları en aza indirir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yaklaşımınız veya bu işlem sırasında karşılaştığınız ilginç bir sorun oldu mu? Aşağıya yorumlarınızı bekliyorum. Sorularınız için çekinmeden yazın, elimden geldiğince yardımcı olmaya çalışırım.