Merhaba arkadaşlar, bugün sizlere Redis Cluster mimarisinin bel kemiği olan slot kavramını, verilerin bu slotlar üzerinden nasıl dağıtıldığını ve sistemin can damarı sayılabilecek yeniden dengeleme (resharding) işlemlerini nasıl yöneteceğimizi anlatacağım. Özellikle büyüyen bir uygulamanız varsa veya donanımınızı güncellemeniz gerekiyorsa, bu işlemleri doğru yapmak cluster'ınızın sağlığı ve performansı için hayati önem taşıyor.
Redis Cluster ve Slot Mantığı Nedir?
Redis Cluster, veriyi 16384 adet "hash slot"a bölerek çalışır. Her anahtar, CRC16 algoritmasından geçirilip mod 16384 işlemine tabi tutularak bu slotlardan birine atanır. Cluster'daki her ana (master) düğüm, bu slot aralıklarından bir bölümünün sorumluluğunu üstlenir. Bu sayede veri otomatik olarak parçalanmış (sharded) olur.
Örneğin 3 master'lı bir cluster'da slot dağılımı şöyle olabilir:
- Node-1: 0 - 5500 arası slotlar
- Node-2: 5501 - 11000 arası slotlar
- Node-3: 11001 - 16383 arası slotlar
Hangi düğümün hangi slotlara sahip olduğunu görmek için herhangi bir Redis düğümüne bağlanıp CLUSTER SLOTS komutunu kullanabilirsiniz. Bu komut, yönetim sırasında elinizin altında olması gereken en temel araçlardan biridir.
Slotları Taşıma (Resharding) İşlemine Hazırlık
Resharding, slotları bir düğümden diğerine taşıma işlemidir. Yeni bir düğüm eklerken, bir düğümü kaldırırken veya yükü dengelemek için bu işlemi yaparsınız. İşleme başlamadan önce mutlaka bir yedeğinizi aldığınızdan ve işlemi trafiğin nispeten az olduğu bir zamanda planladığınızdan emin olun.
İlk adım, mevcut durumu kaydetmek. Aşağıdaki komutla cluster'ın mevcut yapılandırmasını bir dosyaya yazabilirsiniz. Bu, bir sorun olması durumunda geri dönüş yol haritanız olacaktır.
Dikkat Edilmesi Gerekenler
Resharding sırasında cluster "servis kesintisi olmadan" çalışmaya devam eder, ancak taşınan slotlardaki tek tek anahtarlar için çok kısa süreli bloklamalar yaşanabilir. Bu nedenle:
- Çok yüksek yazma işlemi olan slotları taşırken dikkatli olun.
- redis-trib.rb aracı artık kullanılmıyor. Tüm cluster yönetim işlemleri için redis-cli içindeki --cluster komutlarını kullanmalısınız.
- İşlem sırasında network bağlantısının kararlı olduğundan emin olun.
Redis-CLI ile Adım Adım Resharding
Diyelim ki IP'si 192.168.1.50 olan yeni bir master düğüm ekledik ve mevcut cluster'dan bu düğüme slot taşımak istiyoruz. İşlemleri cluster'daki herhangi bir düğümden başlatabilirsiniz.
Öncelikle yeni düğümü cluster'a master olarak ekliyoruz:
Bu komut, yeni düğümü (192.168.1.50:6379), mevcut bir düğümün (192.168.1.10:6379) adresini kullanarak cluster'a ekler. Ancak henüz hiç slot atanmamış durumdadır.
Şimdi asıl resharding işlemini başlatalım. Aşağıdaki komut interaktif bir sihirbaz başlatacak ve size adım adım ne yapmak istediğinizi soracaktır.
Sihirbaz sırayla şunları sorar:
1. Taşınacak slot sayısı: Kaç slot taşımak istediğinizi girin (örneğin 1000).
2. Alıcı düğümün ID'si: Slotları alacak olan yeni düğümümüzün (192.168.1.50) Node ID'sini girmelisiniz. Node ID'yi `CLUSTER NODES` komutu ile öğrenebilirsiniz.
3. Gönderici düğüm kaynağı: Slotları nereden almak istediğinizi belirtirsiniz. Burada 3 seçeneğiniz var:
- Belirli bir düğümün ID'sini yazarsanız, tüm slotlar o düğümden alınır.
- `all` yazarsanız, slotlar mevcut tüm master düğümlerden rastgele ve eşit şekilde alınır. Yük dengeleme için en ideal yöntem budur.
- `done` yazarsanız, daha önce belirttiğiniz gönderici düğümlerden slot alınır.
4. Son olarak, özeti gösterdikten sonra devam etmek için `yes` yazmanızı ister.
Taşıma Sonrası Kontroller ve Dengeleme
İşlem tamamlandığında, slot dağılımını tekrar kontrol etmek çok önemli. Aşağıdaki komut, cluster durumunu özetler ve her düğümdeki slot sayısını gösterir. Dağılımın dengeli olup olmadığını buradan rahatlıkla görebilirsiniz.
Eğer düğümler arasında ciddi bir dengesizlik (örneğin bir düğümde 6000 slot, diğerinde 2000 slot) görürseniz, aynı `reshard` komutunu kullanarak `all` seçeneği ile slotları yeniden dengeleyebilirsiniz. Bu, benim sunucularda periyodik bakım sonrası sıkça yaptığım bir işlemdir.
Sonuç ve Öneriler
Redis Cluster'ın bu esnek yapısı, sistemin büyümesine ve değişmesine izin verir. Ancak otomatik bir sihirbaz değildir, dikkatli bir şekilde planlama ve yönetim ister. Slot taşıma işlemini anlamak, cluster'ınızı geleceğe hazırlamanın ilk adımıdır.
Ben genellikle her büyük ölçekli değişiklik öncesi ve sonrası `CLUSTER CHECK` ve `CLUSTER INFO` komutlarını çalıştırıp durumu not alırım. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir tool veya izlediğiniz bir metodunuz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.
Redis Cluster, veriyi 16384 adet "hash slot"a bölerek çalışır. Her anahtar, CRC16 algoritmasından geçirilip mod 16384 işlemine tabi tutularak bu slotlardan birine atanır. Cluster'daki her ana (master) düğüm, bu slot aralıklarından bir bölümünün sorumluluğunu üstlenir. Bu sayede veri otomatik olarak parçalanmış (sharded) olur.
Örneğin 3 master'lı bir cluster'da slot dağılımı şöyle olabilir:
- Node-1: 0 - 5500 arası slotlar
- Node-2: 5501 - 11000 arası slotlar
- Node-3: 11001 - 16383 arası slotlar
Hangi düğümün hangi slotlara sahip olduğunu görmek için herhangi bir Redis düğümüne bağlanıp CLUSTER SLOTS komutunu kullanabilirsiniz. Bu komut, yönetim sırasında elinizin altında olması gereken en temel araçlardan biridir.
Resharding, slotları bir düğümden diğerine taşıma işlemidir. Yeni bir düğüm eklerken, bir düğümü kaldırırken veya yükü dengelemek için bu işlemi yaparsınız. İşleme başlamadan önce mutlaka bir yedeğinizi aldığınızdan ve işlemi trafiğin nispeten az olduğu bir zamanda planladığınızdan emin olun.
İlk adım, mevcut durumu kaydetmek. Aşağıdaki komutla cluster'ın mevcut yapılandırmasını bir dosyaya yazabilirsiniz. Bu, bir sorun olması durumunda geri dönüş yol haritanız olacaktır.
Bash:
redis-cli -c -p 6379 CLUSTER NODES > redis_cluster_backup_$(date +%F).txt
Resharding sırasında cluster "servis kesintisi olmadan" çalışmaya devam eder, ancak taşınan slotlardaki tek tek anahtarlar için çok kısa süreli bloklamalar yaşanabilir. Bu nedenle:
- Çok yüksek yazma işlemi olan slotları taşırken dikkatli olun.
- redis-trib.rb aracı artık kullanılmıyor. Tüm cluster yönetim işlemleri için redis-cli içindeki --cluster komutlarını kullanmalısınız.
- İşlem sırasında network bağlantısının kararlı olduğundan emin olun.
Diyelim ki IP'si 192.168.1.50 olan yeni bir master düğüm ekledik ve mevcut cluster'dan bu düğüme slot taşımak istiyoruz. İşlemleri cluster'daki herhangi bir düğümden başlatabilirsiniz.
Öncelikle yeni düğümü cluster'a master olarak ekliyoruz:
Bash:
redis-cli --cluster add-node 192.168.1.50:6379 192.168.1.10:6379
Bu komut, yeni düğümü (192.168.1.50:6379), mevcut bir düğümün (192.168.1.10:6379) adresini kullanarak cluster'a ekler. Ancak henüz hiç slot atanmamış durumdadır.
Şimdi asıl resharding işlemini başlatalım. Aşağıdaki komut interaktif bir sihirbaz başlatacak ve size adım adım ne yapmak istediğinizi soracaktır.
Bash:
redis-cli --cluster reshard 192.168.1.10:6379
Sihirbaz sırayla şunları sorar:
1. Taşınacak slot sayısı: Kaç slot taşımak istediğinizi girin (örneğin 1000).
2. Alıcı düğümün ID'si: Slotları alacak olan yeni düğümümüzün (192.168.1.50) Node ID'sini girmelisiniz. Node ID'yi `CLUSTER NODES` komutu ile öğrenebilirsiniz.
3. Gönderici düğüm kaynağı: Slotları nereden almak istediğinizi belirtirsiniz. Burada 3 seçeneğiniz var:
- Belirli bir düğümün ID'sini yazarsanız, tüm slotlar o düğümden alınır.
- `all` yazarsanız, slotlar mevcut tüm master düğümlerden rastgele ve eşit şekilde alınır. Yük dengeleme için en ideal yöntem budur.
- `done` yazarsanız, daha önce belirttiğiniz gönderici düğümlerden slot alınır.
4. Son olarak, özeti gösterdikten sonra devam etmek için `yes` yazmanızı ister.
İşlem tamamlandığında, slot dağılımını tekrar kontrol etmek çok önemli. Aşağıdaki komut, cluster durumunu özetler ve her düğümdeki slot sayısını gösterir. Dağılımın dengeli olup olmadığını buradan rahatlıkla görebilirsiniz.
Bash:
redis-cli --cluster check 192.168.1.10:6379
Eğer düğümler arasında ciddi bir dengesizlik (örneğin bir düğümde 6000 slot, diğerinde 2000 slot) görürseniz, aynı `reshard` komutunu kullanarak `all` seçeneği ile slotları yeniden dengeleyebilirsiniz. Bu, benim sunucularda periyodik bakım sonrası sıkça yaptığım bir işlemdir.
Redis Cluster'ın bu esnek yapısı, sistemin büyümesine ve değişmesine izin verir. Ancak otomatik bir sihirbaz değildir, dikkatli bir şekilde planlama ve yönetim ister. Slot taşıma işlemini anlamak, cluster'ınızı geleceğe hazırlamanın ilk adımıdır.
Ben genellikle her büyük ölçekli değişiklik öncesi ve sonrası `CLUSTER CHECK` ve `CLUSTER INFO` komutlarını çalıştırıp durumu not alırım. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir tool veya izlediğiniz bir metodunuz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.