Resmi web sitesine göre Redis (Remote Dictionary Server), veritabanı, önbellek, mesaj aracısı ve akış motoru olarak kullanılan açık kaynaklı bir in-memory veri yapısı deposudur.
Saniyede 120.000’den fazla isteği işlediği için, öncelikle yüksek yükler altında performansı iyileştirmek için diğer veritabanı sistemleriyle birlikte önbelleğe alma amacıyla kullanılır. Parçalama teknikleriyle birlikte ana/köle modellerini kullanarak yüksek kullanılabilirlik ve eş zamanlı okuma/yazma işlemleri sağlar. Tüm bunlar Redis’i basit anahtar-değer kayıtlarından tam sayfa önbelleklere kadar çok çeşitli veri türlerini depolamak için harika bir seçim haline getirir.
Bu yazıda, client ve node’dan node’a iletişimler için TLS kullanan bir Redis kümesinin nasıl kurulacağını açıklayacağım.
Redis Nedir ?
Redis, açık kaynaklı, in-memory bir veritabanı yönetim sistemidir. Başlıca hedeflerinden biri yüksek performanslı ve ölçeklenebilir veritabanları sağlamaktır. Redis, key-value deposu olarak çalışır ve hızlı erişim için verileri bellekte tutar. Ayrıca verileri diske depolamak için de kullanılabilir. Redis, özellikle önbelleğe alma, oturum yönetimi, sıralama ve gerçek zamanlı uygulamalar gibi alanlarda popüler bir veritabanı çözümüdür.
Avantajları
- Redis, 512 MB kadar büyük key ve value çiftlerinin depolanmasına izin verir. 512 MB kadar büyük nesnelerin büyük key’lerine ve value’lerine sahip olabilirsiniz, bu da Redis’in tek bir giriş için 1 GB’a kadar veriyi destekleyeceği anlamına gelir.
- Redis, Redis Karma adlı kendi karma mekanizmasını kullanır. Redis, verileri bir key ve bir harita biçiminde, yani dize alanları ve dize değerleri şeklinde depolar.
- Redis data replication sunar. Replication, master-slave önbellek node’larını ayarlama sürecidir. Slave node’lar her zaman ana node dinler, bu da ana node güncellendiğinde slave’lerin de otomatik olarak güncelleneceği anlamına gelir. Redis ayrıca slave’leri eşzamansız olarak güncelleyebilir.
- Redis önbelleği arızalara dayanabilir ve kesintisiz hizmet sağlayabilir. Redis, verimli replication ayarlamak için kullanılabildiğinden, herhangi bir zamanda önbellek hizmeti çalışır durumda olacaktır; slave node’lardan herhangi biri kapalı olsa bile. Ancak node’lar dayanıklıdır ve arızanın üstesinden gelip hizmet vermeye devam edecektir.
- Redis’in tüm popüler programlama dillerinde client’ları vardır. Redis’in C, Ruby, Java, JavaScript ve Python gibi tüm popüler dillerde geliştirilmiş client API’leri vardır. Redis’in desteklediği dillerin tam listesi Redis Wikipedia sayfasında bulunabilir.
- Redis bir pub/sub mesajlaşma sistemi sunar. Redis pub/sub mekanizmasını kullanarak istediğiniz herhangi bir dili kullanarak yüksek performanslı bir mesajlaşma uygulaması geliştirebilirsiniz.
- Redis, büyük miktarda veriyi önbelleğine çok kolay bir şekilde eklemenize olanak tanır. Bazen, kısa bir süre içinde milyonlarca veri parçasını önbelleğe yüklemek gerekir. Bu, Redis tarafından desteklenen bir özellik olan toplu ekleme kullanılarak kolayca yapılabilir.
- Redis, Raspberry Pi ve ARM cihazlarına kurulabilir. Redis’in küçük bir bellek alanı vardır ve IoT tabanlı uygulamaları etkinleştirmek için Raspberry Pi’ye kurulabilir.
- Redis protokolü bir istemcinin uygulanmasını kolaylaştırır. Bir Redis istemcisi, RESP (Redis Serileştirme Protokolü) kullanarak sunucusuyla iletişim kurar. Bu protokol uygulanması kolaydır ve insan tarafından okunabilir.
- Redis işlemleri destekler, bu da komutların tek tek yürütülmesi yerine bir queue olarak yürütülebileceği anlamına gelir. Genellikle, MULTI’den sonraki komutlar bir kuyruğa eklenir ve EXEC verildiğinde, kuyrukta kaydedilen tüm komutlar aynı anda yürütülür.
Terminoloji
- Key (Anahtar): Redis’teki veriler anahtar-değer (key-value) şeklinde saklanır. Anahtar, bir değeri temsil eden benzersiz bir tanımlayıcıdır.
- Value (Değer): Anahtara karşılık gelen verilerdir. String, liste, set, hash, sorted set gibi farklı türlerde olabilir.
- Persistence (Kalıcılık): Redis, verileri diske kaydetmek için iki farklı yöntem kullanır:
- RDB (Redis Database File): Periyodik olarak bellekteki veriyi dosyaya yazar.
- AOF (Append Only File): Yapılan tüm işlemleri sırasıyla bir dosyaya kaydeder.
- Replication (Çoğaltma): Redis, master-slave replikasyonu destekler. Master sunucu, verileri slave sunuculara kopyalayabilir.
- Sharding (Bölme): Büyük veri kümelerini birden fazla Redis sunucusuna bölerek dağıtma yöntemidir.
- Eviction (Silme Politikaları): Bellek sınırına ulaşıldığında eski veya en az kullanılan verileri silmeye yönelik algoritmalardır.
- Pub/Sub (Publish/Subscribe): Redis’in mesajlaşma mekanizmasıdır. Kanallar aracılığıyla mesaj yayınlanabilir ve dinleyiciler bu mesajları alabilir.
Redis High Availability Kullanımı
İki yöntemi vardır.
Redis Cluster: Redis Cluster high availability ve horizontal scaling sağlar. Verileri birden fazla node’a dağıtılmış parçalara böler. Her parçanın birincil bir node’u ve hata toleransı için replikaları vardır. Bu, Redis Cluster’ının daha büyük veri clusterlar’ını ve daha yüksek yazma verimini işlemesini sağlar.
Redis Sentinel: Redis Sentinel, Redis instance’larını izleyen ve birincil replika mimarisi için otomatik failover sağlayan high availability bir araçtır. Birincil node kullanılamaz hale geldiğinde, Sentinel replikalardan birini birincil olarak yükseltir ve kalan replikaları yeni birincil ile senkronize olacak şekilde günceller.

Bu yazıda redis cluster kullanılacaktır.
Redis Persistence Kullanımı
3 yöntemi vardır.
RDB (Redis Database File – Anlık Yedekleme): Belirli aralıklarla tüm veriyi disk dosyasına (dump.rdb) yazar.
AOF (Append Only File – Günlük Kaydı): Yapılan tüm işlemleri (set, del, vb.) sırayla bir dosyaya (appendonly.aof) ekler.
Hybrid (RDB + AOF Birlikte Kullanımı): Hem RDB hem de AOF aynı anda çalıştırılır. Redis, hızlı başlatma için RDB’yi kullanır, veri kaybını önlemek için AOF’yi takip eder.

Bu yazıda AOF+RDB kullanılacaktır.
Redis Nasıl Kurulur ?
Bu yazıda Redis cluster olarak Linux bir makineye nasıl kurulur ondan bahsedilecektir. Linux olarak Ubuntu 20.04.6 LTS tercih edilmiştir. Cluster 3 sanal sunucuya 6 node olarak kurulacaktır.
Örnek topoloji:

Bütün sunucularda öncelikle gerekli repository ve key eklemelerini yapıyoruz.
sudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg –dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo “deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main” | sudo tee /etc/apt/sources.list.d/redis.list
Sonra bütün sunucularda redis server kurulumu yapabiliriz.
sudo apt-get update
sudo apt-get install redis
Cluster TLS kurulacağı için öncelikli bütün sunucularda sertifika path’leri ve sertifikalar sadece bir sunucuda oluşturulur.
mkdir -p /etc/redis/tls
cd /etc/redis/tls
Root CA Sertifikası:
openssl genrsa -out REDISCA.key 4096
openssl req -x509 -new -nodes -key REDISCA.key -sha256 -days 3650 -out REDISCA.crt -subj “/CN=REDISCA”
Server Sertifikası:
openssl genrsa -out REDIS.key 2048
openssl req -new -key REDIS.key -out REDIS.csr -subj “/CN=REDIS”
openssl x509 -req -in REDIS.csr -CA REDISCA.crt -CAkey REDISCA.key -CAcreateserial -out REDIS.crt -days 3650 -sha256
Client Sertifikası:
openssl genrsa -out REDISCLIENT.key 2048
openssl req -new -key REDISCLIENT.key -out REDISCLIENT.csr -subj “/CN=REDIS”
openssl x509 -req -in REDISCLIENT.csr -CA REDISCA.crt -CAkey REDISCA.key -CAcreateserial -out REDISCLIENT.crt -days 3650 -sha256
Sertifikalar her sunucu ‘/etc/redis/tls’ path’ine kopyalanır.
Sertifika dosya izinleri ayarlanır.
chmod 600 REDIS*.key
chmod 644 REDIS*.crt REDISCA.crt
chmod -R redis:redis /etc/redis/tls
Bütün sunucularda run dosyası oluşturup izinleri veriyoruz.
mkdir /var/run/redis
chown -R redis:redis /var/run/redis
Redis cluster configleri aşağıdaki gibi olacaktır.
Redis Server 1: Konfigürasyon Dosyası
Master Port 7000: Konfigürasyon Dosyası
vi /etc/redis/redis-7000.conf
port 0
tls-port 7000
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7000.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7000.log
pidfile /var/run/redis/redis_7000.pid
loglevel warning
bind 192.168.1.1
Slave Port 7001: Konfigürasyon Dosyası
vi /etc/redis/redis-7001.conf
port 0
tls-port 7001
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7001.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7001.log
pidfile /var/run/redis/redis_7001.pid
loglevel warning
bind 192.168.1.1
Redis Server 2: Konfigürasyon Dosyası
Master Port 7002: Konfigürasyon Dosyası
vi /etc/redis/redis-7002.conf
port 0
tls-port 7002
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7002.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7002.log
pidfile /var/run/redis/redis_7002.pid
loglevel warning
bind 192.168.1.2
Slave Port 7003: Konfigürasyon Dosyası
vi /etc/redis/redis-7003.conf
port 0
tls-port 7003
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7003.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7003.log
pidfile /var/run/redis/redis_7003.pid
loglevel warning
bind 192.168.1.2
Redis Server 3: Konfigürasyon Dosyası
Master Port 7004: Konfigürasyon Dosyası
vi /etc/redis/redis-7004.conf
port 0
tls-port 7004
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7004.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7004.log
pidfile /var/run/redis/redis_7004.pid
loglevel warning
bind 192.168.1.3
Slave Port 7005: Konfigürasyon Dosyası
vi /etc/redis/redis-7005.conf
port 0
tls-port 7005
tls-cert-file /etc/redis/tls/REDIS.crt
tls-key-file /etc/redis/tls/REDIS.key
tls-ca-cert-file /etc/redis/tls/REDISCA.crt
tls-auth-clients yes
tls-cluster yes
tls-replication yes
cluster-enabled yes
cluster-config-file redis-7005.conf
cluster-node-timeout 5000
dir /var/lib/redis
appendonly yes
protected-mode no
daemonize yes
supervised systemd
tcp-keepalive 60
appendfilename “appendonly.aof”
save 900 1
dbfilename dump.rdb
logfile /var/log/redis/redis_7005.log
pidfile /var/run/redis/redis_7005.pid
loglevel warning
bind 192.168.1.3
Portları servis olarak konfigüre ediyoruz.
Redis Server 1: Servis Dosyası
Master Port 7000: Servis Dosyası
vi /etc/systemd/system/redis-7000.service
[Unit]
Description=Redis 7000
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7000.conf
ExecStop=/usr/bin/redis-cli -p 7000 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Slave Port 7001: Servis Dosyası
vi /etc/systemd/system/redis-7001.service
[Unit]
Description=Redis 7001
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7001.conf
ExecStop=/usr/bin/redis-cli -p 7001 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Redis Server 2: Servis Dosyası
Master Port 7002: Servis Dosyası
vi /etc/systemd/system/redis-7002.service
[Unit]
Description=Redis 7002
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7002.conf
ExecStop=/usr/bin/redis-cli -p 7002 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Slave Port 7003: Servis Dosyası
vi /etc/systemd/system/redis-7003.service
[Unit]
Description=Redis 7003
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7003.conf
ExecStop=/usr/bin/redis-cli -p 7003 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Redis Server 3: Servis Dosyası
Master Port 7004: Servis Dosyası
vi /etc/systemd/system/redis-7004.service
[Unit]
Description=Redis 7004
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7004.conf
ExecStop=/usr/bin/redis-cli -p 7004 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Slave Port 7003: Servis Dosyası
vi /etc/systemd/system/redis-7005.service
[Unit]
Description=Redis 7005
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis-7005.conf
ExecStop=/usr/bin/redis-cli -p 7005 shutdown
Restart=always
Type=notify
NotifyAccess=all
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Yeni bir servis oluşturduğumuz systemd reload ediyoruz. Bütün sunucularda servislerin otomatik up olması için enable ediyoruz ve servisleri başlatıyoruz.
Redis Server 1: Servis Ayarları
sudo systemctl daemon-reload
sudo systemctl start redis-7000 redis-7001
sudo systemctl enable redis-7000 redis-7001
Redis Server 2: Servis Ayarları
sudo systemctl daemon-reload
sudo systemctl start redis-7002 redis-7003
sudo systemctl enable redis-7003 redis-7003
Redis Server 3: Servis Ayarları
sudo systemctl daemon-reload
sudo systemctl start redis-7004 redis-7005
sudo systemctl enable redis-7004 redis-7005
Herhangi bir sunucuda cluster aşağıdaki komutla oluşturuyoruz.
redis-cli –tls –cert /etc/redis/tls/REDIS.crt –key /etc/redis/tls/REDIS.key –cacert /etc/redis/tls/REDISCA.crt \
–cluster create 192.168.1.1:7000 192.168.1.2:7002 192.168.1.3:7004 \
192.168.1.1:7001 192.168.1.2:7003 192.168.1.3:7005 \
–cluster-replicas 1
Redisin önerdiği memory ayarlarını aşağıdaki şekilde yapabiliriz.
vi /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -w net.core.somaxconn=65535
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -w net.core.somaxconn=65535
exit 0
chmod +x /etc/rc.local
sudo vi /etc/sysctl.conf
vm.overcommit_memory=1
Bağlantıyı aşağıdaki şekilde test edebiliriz.
redis-cli -c –tls –cert /etc/redis/tls/REDISCLIENT.crt –key /etc/redis/tls/REDISCLIENT.key –cacert /etc/redis/tls/REDISCA.crt -h 192.168.1.1 -p 7000 ping
Cluster’a bağlanıp komutları çalıştrabiliriz.
redis-cli -c –tls –cert /etc/redis/tls/REDISCLIENT.crt –key /etc/redis/tls/REDISCLIENT.key –cacert /etc/redis/tls/REDISCA.crt -h 192.168.1.1 -p 7000
>set test_key “Hello, Redis!”
>get test_key
>cluster nodes
07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master – 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master – 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master – 0 0 1 connected 0-5460
0 yorum