Ubuntu 14.04 Üzerinde Redis Kümesi (Redis Cluster) Yapılandırma Rehberi
Redis, açık kaynaklı, bellek içi bir veri yapısı deposudur. Genellikle bir veritabanı, önbellek ve mesaj aracısı olarak kullanılır. Hız, esneklik ve zengin veri yapıları sunar. Ancak, tek bir Redis örneği, belirli bir noktada performans ve depolama limitlerine ulaşabilir. İşte bu noktada Redis Kümesi (Redis Cluster) devreye girer. Bu makalede, Ubuntu 14.04 işletim sistemi üzerinde yüksek erişilebilirlik ve ölçeklenebilirlik sağlamak amacıyla Redis Kümesi’nin nasıl yapılandırılacağını adım adım inceleyeceğiz.
Redis Kümesi Nedir ve Neden İhtiyaç Duyarız?
Redis Kümesi, Redis’in verileri birden çok Redis örneğine otomatik olarak bölerek (sharding) yatay ölçeklenebilirlik sağlayan dağıtık bir uygulamasıdır. Ayrıca, kümedeki bir ana düğüm (master node) veya onun bir kopyası (replica) başarısız olduğunda sistemin çalışmaya devam etmesini sağlayan yüksek erişilebilirlik (high availability) özellikleri sunar.
Redis Kümesi’ne ihtiyaç duymamızın başlıca nedenleri şunlardır:
* Yüksek Erişilebilirlik: Bir ana düğümün çökmesi durumunda, küme otomatik olarak o ana düğümün bir kopyasını yeni ana düğüm olarak atar, böylece veri kaybını ve hizmet kesintisini önler.
* Yatay Ölçeklenebilirlik: Verileri birden çok düğüme dağıtarak, tek bir Redis örneğinin depolama ve performans sınırlarını aşar. Daha fazla veri depolayabilir ve daha yüksek bir işlem hacmini (throughput) kaldırabilir.
* Veri Bölümleme (Data Partitioning): Küme, verileri otomatik olarak 16384 “hash slot”una böler ve bu slotları kümedeki ana düğümler arasında dağıtır. Bu sayede, her ana düğüm veri setinin bir alt kümesini işler.
Ubuntu 14.04, güncel bir işletim sistemi olmasa da, Redis Cluster konseptleri ve yapılandırma adımları temel olarak aynı kalır. Bu rehber, Redis’in 3.0 ve üzeri sürümlerini hedeflemektedir, çünkü küme özelliği bu sürümlerle birlikte gelmiştir.
Redis Kümesi Mimarisi
Redis Kümesi, düğümlerin (nodes) birbirleriyle iletişim kurduğu, veri setinin 16384 hash slot’una bölündüğü ve her slotun bir ana düğüme atandığı bir mimariye sahiptir.
* Hash Slotlar: Redis Kümesi, veri setini 16384 adet mantıksal hash slot’una böler. Bir anahtarın hangi slota ait olduğu, anahtarın CRC16 algoritmasından geçirilip 16384’e göre modunun alınmasıyla belirlenir. Bu slotlar, kümedeki ana düğümler arasında dengeli bir şekilde dağıtılır.
* Ana ve Kopya Düğümler (Master and Replica Nodes): Her slot aralığı için bir ana düğüm bulunur. Yüksek erişilebilirlik sağlamak amacıyla, her ana düğümün bir veya daha fazla kopyası (replica) olabilir. Bir ana düğüm başarısız olduğunda, onun kopyalarından biri otomatik olarak yeni ana düğüm olarak atanır.
* Gossip Protokolü: Kümedeki düğümler, birbirlerinin durumunu ve kümenin genel yapılandırmasını Gossip protokolü aracılığıyla öğrenir ve günceller. Bu, merkezi bir koordinasyon mekanizmasına ihtiyaç duyulmadan dağıtık bir yapı sağlar.
* İstemci Yönlendirmesi (Client Redirection): Bir istemci, yanlış anahtarı sorguladığında (yani, anahtarın ait olduğu slot başka bir düğümdeyse), Redis sunucusu istemciye MOVED veya ASK yönlendirme hataları gönderir. Küme farkında olan istemciler (cluster-aware clients), bu yönlendirmeleri işleyerek doğru düğüme otomatik olarak bağlanır.
Üretim ortamı için minimum önerilen küme yapılandırması, her ana düğüm için en az bir kopya olmak üzere 3 ana düğüm ve 3 kopya düğümü, yani toplam 6 düğümdür. Bu, kümenin iki ana düğümün veya bir ana düğüm ve onun kopyasının aynı anda başarısız olmasına dayanabilmesini sağlar.
Gereksinimler ve Ön Hazırlıklar
Redis Kümesi yapılandırmasına başlamadan önce bazı gereksinimleri karşılamamız ve ön hazırlıkları yapmamız gerekmektedir.
Sistem Gereksinimleri
* Ubuntu 14.04 Sunucular: En az 6 adet Ubuntu 14.04 işletim sistemine sahip sunucu veya sanal makine (3 ana düğüm, 3 kopya düğüm için). Her sunucunun yeterli RAM, CPU ve depolama alanına sahip olduğundan emin olun.
* Ağ Bağlantısı: Tüm düğümlerin birbirleriyle sorunsuz bir şekilde iletişim kurabilmesi gerekir. Her düğümün statik bir IP adresine sahip olması önerilir.
* SSH Erişimi: Tüm sunuculara SSH üzerinden root veya sudo yetkilerine sahip bir kullanıcı ile erişiminiz olmalıdır.
Yazılım Gereksinimleri
Redis Kümesi için Redis 3.0 veya üzeri bir sürüm gereklidir. Ubuntu 14.04’ün varsayılan depolarında bulunan Redis sürümü genellikle eski olabilir. Bu nedenle, Redis’i kaynak koddan derlemek en güvenli yaklaşımdır.
* Redis 3.0+: Kaynak koddan derlenecek.
* ruby ve rubygems: Redis’in küme yönetim aracı olan redis-trib.rb‘yi çalıştırmak için gereklidir.
* gcc, make ve diğer derleme araçları: Redis’i kaynak koddan derlemek için.
Güvenlik Duvarı Ayarları
Her düğümde, Redis’in istemci bağlantıları ve küme içi iletişim için kullandığı portların açık olması gerekir.
* İstemci Portu (Default: 6379): Redis istemcilerinin ve diğer Redis düğümlerinin veri alışverişi için kullandığı port.
* Küme İletişim Portu (Default: 16379): Redis Kümesi düğümlerinin Gossip protokolü ve diğer küme içi iletişim için kullandığı port. Bu port, istemci portunun 10000 fazlasıdır.
Örnek olarak, her düğümde güvenlik duvarını yapılandırmak için (UFW kullanılıyorsa):
sudo ufw allow 6379/tcp
sudo ufw allow 16379/tcp
sudo ufw enable
sudo ufw status
Redis Kurulumu (Kaynak Koddan Derleme)
Ubuntu 14.04’ün varsayılan depoları genellikle Redis 2.8 gibi eski sürümleri içerir. Redis Cluster özelliği Redis 3.0 ile geldiği için, Redis’i kaynak koddan derlemek en iyi yöntemdir. Bu, istediğimiz Redis sürümünü kullanmamızı sağlar.
Her bir sunucuda aşağıdaki adımları tekrarlayın:
1. Gerekli Derleme Araçlarını Yükleme:
sudo apt-get update
sudo apt-get install build-essential tcl
2. Redis Kaynak Kodunu İndirme:
En güncel kararlı Redis sürümünü Redis resmi web sitesinden kontrol edin (örneğin, 6.2.6 veya daha yeni bir sürüm).
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
3. Redis’i Derleme ve Kurma:
make
sudo make install
make test komutunu çalıştırarak derlemenin başarılı olduğunu doğrulayabilirsiniz.
4. Redis Çalıştırılabilir Dosyalarını Kontrol Etme:
redis-cli --version
redis-server --version
Bu komutlar, doğru Redis sürümünün yüklendiğini göstermelidir.
Redis Küme Düğümlerini Yapılandırma
Her bir sunucuda, bir veya daha fazla Redis örneğini küme düğümü olarak yapılandırmamız gerekiyor. Üretim ortamında her sunucuda tek bir Redis örneği çalıştırmak en yaygın yaklaşımdır. Ancak test ortamları için aynı sunucuda farklı portlarda birden fazla Redis örneği çalıştırabilirsiniz. Bu rehber, her sunucuda tek bir Redis örneği çalıştırıyormuş gibi yapılandırma adımlarını gösterecektir.
Her sunucuda, Redis için ayrı bir yapılandırma dizini ve veri dizini oluşturacağız. Örneğin, 6379 portunu kullanan bir Redis örneği için:
1. Dizin Yapısı Oluşturma:
sudo mkdir -p /etc/redis-cluster/6379
sudo mkdir -p /var/lib/redis/6379
sudo chown redis:redis /var/lib/redis/6379 # Eğer redis kullanıcısı varsa
# Yoksa, uygun bir kullanıcıya veya root'a yetki verin
2. Redis Yapılandırma Dosyası Oluşturma (redis.conf):
Her düğüm için /etc/redis-cluster/6379/redis.conf dosyasını oluşturun ve aşağıdaki ayarları ekleyin. yerine sunucunuzun gerçek IP adresini yazmayı unutmayın.
port 6379
bind
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/lib/redis/6379
dbfilename dump_6379.rdb
# Redis Cluster Ayarları
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
appendonly yes # Veri kalıcılığı için AOF'u etkinleştirin
appendfilename "appendonly_6379.aof"
# Diğer önerilen ayarlar
# maxmemory # Bellek limitini ayarlayın, örneğin 2gb
# maxmemory-policy allkeys-lru # Bellek dolduğunda hangi anahtarların atılacağını belirtin
# requirepass your_password # İstemci kimlik doğrulaması için şifre belirleyin
# masterauth your_password # Küme içindeki master-replica kimlik doğrulaması
Önemli Notlar:
* bind : 127.0.0.1 yerine sunucunun dışarıdan erişilebilir IP adresini kullanın. Aksi takdirde diğer düğümler bağlanamaz.
* cluster-enabled yes: Bu, Redis örneğini bir küme düğümü olarak etkinleştirir.
* cluster-config-file nodes-6379.conf: Bu dosya, küme durumunu (hangi düğümler var, hangi slotlar kime ait vb.) Redis tarafından otomatik olarak yönetilir. Elle düzenlemeyin.
* appendonly yes: Veri kalıcılığı için önemlidir. Redis yeniden başlatıldığında verilerinizi kaybetmemek için AOF (Append Only File) dosyasını kullanır.
* requirepass ve masterauth: Üretim ortamlarında güvenlik için bu şifreleri ayarlamanız şiddetle tavsiye edilir.
3. Redis Servislerini Başlatma:
Her düğümde, yapılandırdığınız Redis örneğini başlatın.
sudo redis-server /etc/redis-cluster/6379/redis.conf
Tüm 6 sunucuda bu adımları tekrarlayın. Her sunucunun kendi IP adresi ve 6379 portu ile çalıştığından emin olun.
4. Redis Servislerinin Çalıştığını Doğrulama:
ps aux | grep redis-server
redis-cli -p 6379 ping
ping komutu PONG yanıtı vermeli ve ps aux çıktısı Redis sunucusunun çalıştığını göstermelidir. Ayrıca, her sunucuda cluster info komutunu çalıştırarak küme modunun etkin olup olmadığını kontrol edebilirsiniz:
redis-cli -p 6379 cluster info
Bu aşamada cluster_state:fail veya benzeri bir durum görmeniz normaldir, çünkü küme henüz oluşturulmamıştır.
Redis Kümesini Oluşturma
Tüm Redis düğümleri başlatıldıktan sonra, redis-trib.rb aracı ile kümemizi oluşturabiliriz. redis-trib.rb aracı, Redis’in kaynak kod dizininde (src klasöründe) bulunur.
1. Ruby ve Redis Gem’ini Yükleme:
redis-trib.rb bir Ruby betiği olduğu için, Ruby ve Redis gem’ine ihtiyacımız var. Herhangi bir sunucuda (tercihen küme oluşturma komutunu çalıştıracağınız sunucuda) aşağıdaki komutları çalıştırın:
sudo apt-get install ruby rubygems
sudo gem install redis
2. Küme Oluşturma Komutunu Çalıştırma:
Redis kaynak kod dizininize gidin (örneğin, cd redis-6.2.6/src). Ardından, aşağıdaki komutu kullanarak kümenizi oluşturun. Bu örnekte 3 ana düğüm ve her ana düğüm için 1 kopya (toplam 3 kopya) oluşturacağız, yani toplam 6 düğüm kullanacağız.
Kümenizdeki tüm sunucuların IP adreslerini ve portlarını (genellikle 6379) listeleyin.
./redis-trib.rb create --replicas 1 192.168.1.101:6379 192.168.1.102:6379 192.168.1.103:6379 192.168.1.104:6379 192.168.1.105:6379 192.168.1.106:6379
* --replicas 1: Her ana düğüm için bir kopya oluşturulacağını belirtir.
* Ardından, kümedeki tüm Redis düğümlerinin IP:Port adreslerini sıralarsınız. redis-trib.rb otomatik olarak ana düğümleri ve kopyalarını atar ve hash slotlarını dağıtır.
Komutu çalıştırdıktan sonra, redis-trib.rb size küme planını gösterecek ve onay isteyecektir. yes yazarak onaylayın.
Başarılı bir kurulumun ardından, aşağıdaki gibi bir çıktı görmelisiniz:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
...
[OK] All 16384 slots covered.
3. Küme Durumunu Kontrol Etme:
Herhangi bir küme düğümüne bağlanarak kümenin durumunu kontrol edebilirsiniz:
redis-cli -c -p 6379 cluster info
redis-cli -c -p 6379 cluster nodes
cluster info çıktısında cluster_state:ok görmelisiniz. cluster nodes çıktısı ise kümedeki tüm düğümleri, onların rollerini (master/slave), IP adreslerini ve slot dağılımlarını gösterecektir.
Tebrikler! Redis Kümeniz başarıyla yapılandırıldı.
Küme Yönetimi ve Bakım
Redis Kümesi oluşturulduktan sonra, zaman zaman düğüm ekleme, çıkarma veya slotları yeniden dağıtma gibi yönetim görevlerini yerine getirmeniz gerekebilir.
Düğüm Ekleme (Adding a Node)
Kümenize yeni bir ana düğüm veya kopya düğüm eklemek için redis-trib.rb add-node komutunu kullanırız.
1. Yeni Redis Düğümünü Hazırlama:
Yeni bir sunucuda Redis’i kurun ve yukarıdaki adımları takip ederek bir Redis örneğini yapılandırın ve başlatın. Örneğin, 192.168.1.107:6379.
2. Yeni Bir Ana Düğüm Ekleme:
Yeni düğümü mevcut kümeye ana düğüm olarak eklemek için:
./redis-trib.rb add-node 192.168.1.107:6379 192.168.1.101:6379
Bu komut, 192.168.1.107:6379 düğümünü kümeye ekler. Ancak henüz slot atanmadığı için boş bir ana düğüm olacaktır. Slotları bu yeni düğüme taşımak için yeniden dağıtım (resharding) yapmanız gerekir.
3. Yeni Bir Kopya Düğüm Ekleme:
Yeni düğümü mevcut bir ana düğümün kopyası olarak eklemek için --slave ve --master-id parametrelerini kullanın. Ana düğüm ID’sini cluster nodes çıktısından alabilirsiniz.
./redis-trib.rb add-node --slave --master-id 192.168.1.107:6379 192.168.1.101:6379
Eğer --master-id belirtmezseniz, redis-trib.rb rastgele bir ana düğüme kopya olarak atayacaktır.
Slotları Yeniden Dağıtma (Resharding)
Yeni bir ana düğüm eklediğinizde veya slot dağılımını değiştirmek istediğinizde yeniden dağıtım yapmanız gerekir.
./redis-trib.rb reshard 192.168.1.101:6379
Bu komut etkileşimli olacaktır:
* Kaç slot taşımak istediğinizi sorar.
* Hedef düğümün ID’sini (slotların taşınacağı düğüm) sorar.
* Kaynak düğümlerin ID’lerini (slotların alınacağı düğümler) sorar. all yazarak tüm ana düğümlerden slotları alabilirsiniz.
* Onay ister.
Düğüm Silme (Removing a Node)
Bir düğümü kümeden çıkarmak için redis-trib.rb del-node komutunu kullanırız.
1. Ana Düğüm Silme:
Eğer silmek istediğiniz düğüm bir ana düğümse ve slotları varsa, önce bu slotları başka bir ana düğüme taşımanız gerekir.
./redis-trib.rb reshard --from --to --slots 192.168.1.101:6379
Slotlar taşındıktan sonra düğümü silebilirsiniz:
./redis-trib.rb del-node 192.168.1.101:6379
2. Kopya Düğüm Silme:
Bir kopya düğümü silmek daha basittir, çünkü slotları yoktur.
./redis-trib.rb del-node 192.168.1.101:6379
Düğüm kümeden silindikten sonra, o sunucudaki Redis servisini durdurmayı unutmayın: sudo service redis_6379 stop veya sudo kill .
Hata Durumları ve Kurtarma (Failovers and Recovery)
Redis Kümesi otomatik failover yeteneğine sahiptir. Bir ana düğüm erişilemez hale geldiğinde, küme onun kopyalarından birini otomatik olarak yeni ana düğüm olarak seçer.
* Otomatik Failover: Bir ana düğümün cluster-node-timeout süresince erişilemez olması durumunda, diğer düğümler tarafından “fail” olarak işaretlenir. Eğer bu durum kümedeki ana düğümlerin çoğunluğu tarafından onaylanırsa, ana düğümün kopyalarından biri yeni ana düğüm olarak seçilir ve küme çalışmaya devam eder.
* Manuel Failover: Bir kopya düğümün isteğe bağlı olarak ana düğüm rolünü üstlenmesini sağlamak için:
redis-cli -c -p cluster failover
* Küme Tutarsızlıklarını Giderme: Nadiren de olsa küme yapılandırmasında tutarsızlıklar oluşabilir (örneğin, iki ana düğüm aynı slot aralığına sahipse). Bu durumları düzeltmek için redis-trib.rb fix komutunu kullanabilirsiniz:
./redis-trib.rb fix 192.168.1.101:6379
İstemci Bağlantısı
Redis Kümesi’ne bağlanırken, küme farkında (cluster-aware) olan bir Redis istemcisi kullanmanız önemlidir. Bu tür istemciler, MOVED veya ASK yönlendirme komutlarını işleyebilir ve anahtarların doğru düğümlere yönlendirilmesini sağlar.
* redis-cli ile Bağlantı: Redis’in kendi CLI aracı olan redis-cli, -c (cluster mode) parametresi ile küme farkında çalışabilir:
redis-cli -c -p 6379
Bu modda, bir anahtarın yanlış düğümde olması durumunda redis-cli otomatik olarak doğru düğüme yönlendirilir.
* Programatik İstemciler: Çoğu programlama dilinin Redis kütüphaneleri, Redis Cluster desteği sunar. Örneğin, Python için redis-py-cluster, Node.js için ioredis, Java için Jedis gibi kütüphaneler mevcuttur. Bu kütüphaneleri kullanırken, kümedeki bir veya daha fazla düğümün IP:Port bilgisini sağlayarak istemcinin kümeyi keşfetmesini sağlarsınız.
# Python örneği (redis-py-cluster)
from rediscluster import RedisCluster
startup_nodes = [{"host": "192.168.1.101", "port": "6379"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
rc.set("mykey", "myvalue")
print(rc.get("mykey"))
Performans ve Güvenlik İpuçları
Redis Kümesi’nin performansını ve güvenliğini artırmak için bazı önemli ipuçları:
* Ayrı Sunucular: Üretim ortamında her Redis örneğini ayrı bir fiziksel veya sanal sunucuda çalıştırmak en iyisidir. Bu, donanım arızalarının etkisini sınırlar.
* Ağ Gecikmesi: Redis Kümesi düğümleri arasında düşük ağ gecikmesi çok önemlidir. Düğümlerin coğrafi olarak yakın olmasını sağlayın.
* Güvenlik Duvarı: Sadece gerekli portları (6379 ve 16379) açın ve erişimi güvenilir IP adresleriyle sınırlayın.
* Kimlik Doğrulama: requirepass ve masterauth ayarlarını kullanarak Redis’e erişimi şifreyle koruyun.
* Bellek Yönetimi: maxmemory ayarını yaparak her Redis örneğinin kullanabileceği bellek miktarını sınırlayın ve maxmemory-policy ile bellek dolduğunda hangi anahtarların atılacağını belirleyin.
* Veri Kalıcılığı: appendonly yes (AOF) ve/veya RDB snapshot’ları kullanarak veri kaybını önleyin. AOF, veri kaybını minimize etmek için genellikle tercih edilir.
* Yedekleme: AOF ve RDB dosyalarını düzenli olarak yedekleyin.
* İzleme: Redis düğümlerini ve küme durumunu sürekli izlemek için Prometheus, Grafana veya Redis’in kendi INFO komutlarını kullanın.
Sıkça Sorulan Sorular ve Sorun Giderme
* redis-trib.rb bulunamıyor hatası: redis-trib.rb betiği genellikle Redis kaynak kodunun src dizininde bulunur. Komutu çalıştırdığınız dizinden doğru yolu belirttiğinizden veya PATH değişkeninize eklediğinizden emin olun.
* “All nodes are not in the same cluster” veya “Waiting for the cluster to join” hatası:
* Tüm Redis düğümlerinin başlatıldığından emin olun.
* redis.conf dosyasındaki bind ayarının doğru IP adresini gösterdiğinden ve 127.0.0.1 olmadığından emin olun.
* Güvenlik duvarı ayarlarını kontrol edin. 6379 ve 16379 portlarının tüm düğümler arasında açık olduğundan emin olun.
* Her düğümün cluster-enabled yes olarak ayarlandığından emin olun.
* redis-cli -c ile bağlanamıyorum:
* Redis sunucusunun çalıştığından emin olun.
* Doğru port numarasını kullandığınızdan emin olun.
* redis-cli -c -h -p şeklinde deneyin.
* Verilerim kümede görünmüyor:
* Küme farkında bir istemci kullanıyor musunuz? redis-cli -c gibi.
* cluster nodes çıktısında tüm slotların ana düğümlere dağıtıldığından ve cluster_state:ok olduğundan emin olun.
Sonuç
Redis Kümesi, yüksek performanslı ve ölçeklenebilir uygulamalar geliştirmek için güçlü bir çözümdür. Bu rehberde, Ubuntu 14.04 üzerinde Redis Kümesi’nin temel yapılandırma adımlarını, mimarisini, kurulumunu, yönetimini ve bakımını ayrıntılı bir şekilde ele aldık. Doğru yapılandırma ve düzenli bakım ile Redis Kümesi, uygulamanızın veri depolama ihtiyaçlarını güvenilir ve verimli bir şekilde karşılayacaktır.
Her ne kadar Ubuntu 14.04 artık uzun süreli destek almasa da, bu adımlar Redis Kümesi’nin temel prensiplerini ve yapılandırma mantığını anlamak için geçerliliğini korumaktadır. Modern işletim sistemlerinde de benzer adımlar izlenecektir, ancak paket yönetimi ve sistem hizmeti yapılandırmaları (systemd gibi) farklılık gösterebilir. Küme ortamınızı izlemeyi, düzenli yedeklemeler almayı ve performans optimizasyonlarını uygulamayı unutmayın.
