Belajar Redis

qomarullah
4 min readJan 13, 2020

PoC Redis Cluster

Photo by Juan Gomez on Unsplash

Apa sih penggunaan external cache (diluar aplikasi) yang paling gampang, menurut saya adalah Memcached. Memcached sangat cepat dan mudah dipakai. Ada beberapa poin terkait memcached yang penulis pahami:

  • Scalling, kita bisa menjalankan beberapa instance memcached dengan key menggunakan consistence hashing, artinya setiap key-value yang dicache punya fix instance memcached yang dituju. Sehingga bisa dilakukan sharding dan scalling horizontal bisa terjadi.
  • Tidak ada replikasi, kelemahan memcached adalah tidak ada replikasi bawaan, kalau mau kita bisa manual replikasi antara memcached, sehingga ketika ada node restart/maintenance masih bisa lookup ke instance replikasinya. Tetepi ketika ini manual dilakukan, kemungkinan masih akan ada gap yang besar (inkonsisten data).
  • Tidak persistent, memcache hanya menyimpan di level memmory tidak di disk, sehingga ketika terjadi restart/maintenance data akan hilang dan harus dilakukan load ulang sehingga dibutuhkan doubel traffic (get-set)

Ketika kebutuhannya high available, konsistensi data, dan persistence maka memcached sebaiknya ditinggalkan dan beralih menggunakan redis. Disini penulis mencoba belajar dan memahami redis cluster dengan pertanyaan berikut :

  • Bagaimana mekanisme scallingnya ?
  • Bagaimana resiliensi terhadap instance yang down (fault tolerance)?

Setup Redis Cluster

1. Install Redis

brew install redis

2. Buat node Redis

Buat file script bash misal “cluster.sh” seperti dibawah. File ini akan membuat directory dengan nama “{port}/nodes.conf” yang nanti digunakan untuk menjalankan redis dengan masing-masing konfigurasi yang support cluster.

#!/usr/bin/env bash

for port in 7000 7001 7002 7003 7004 7005
do
mkdir ${port}
cd ${port}
cat >redis.conf << EOF
port ${port}
cluster-enabled yes
cluster-config-file ${port}/nodes.conf
cluster-node-timeout 5000
appendonly yes

dir ./
loglevel notice
logfile ${port}.log

save 900 1
save 300 10
save 60 10000
EOF
cd ..
done

jalankan script diatas

./cluster.sh

jalankan masing-masing port

redis-server 7000/redis.conf &
redis-server 7001/redis.conf &
redis-server 7002/redis.conf &
redis-server 7003/redis.conf &
redis-server 7004/redis.conf &
redis-server 7005/redis.conf &

jalankan cli untuk setup cluster dengan 1 replikasi

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
Running cluster 6 nodes di local

Dari gambar diatas terlihat redis cluster akan otomatis membagi rata master dan slave. Masing-masing master akan memiliki partition (sharding) dan slave merupakan replikasi dari master.

Testing Availability

  1. Node down di master => ekspektasi dapat ke slave (replicanya)
$ redis-cli -c -p 7000
127.0.0.1:7000> set foo bar EX 10
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK

kita coba set key “foo” dan mendapatkan node port 7002. Selanjutnya kita kill node port 7002, dan mencoba kembali get key “foo”, disini value didapatkan dari port 7003. Artinya Success sesuai ekspekstasi

$ ps -ef | grep redis
501 84432 81356 0 6:43AM ttys000 0:01.37 redis-server *:7000 [cluster]
501 84492 81356 0 6:51AM ttys000 0:01.19 redis-server *:7001 [cluster]
501 84620 81356 0 6:58AM ttys000 0:00.86 redis-server *:7002 [cluster]
501 84623 81356 0 6:58AM ttys000 0:00.83 redis-server *:7003 [cluster]
501 84624 81356 0 6:58AM ttys000 0:00.82 redis-server *:7004 [cluster]
501 84627 81356 0 6:58AM ttys000 0:00.82 redis-server *:7005 [cluster]
501 84739 81356 0 7:04AM ttys000 0:00.01 redis-cli -c -p 7000
501 84843 84757 0 7:09AM ttys002 0:00.00 grep redis
$ kill -9 84620
$ redis-cli -c -p 7000
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7003
"bar"

2. Node down master dan slave dengan sharding yang sama, misal 7002 dan 7003 kita kill.

127.0.0.1:7001> get foo
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7001> get test
(error) CLUSTERDOWN The cluster is down

Case diatas ini yang menimbulkan problem cluster, yakni ketika salah satu master dan semua slavenya mati berdampak komunikasi client akan gagal. Hal ini juga positif karena juga menjaga konsistensi data satu cluster. Karenanya jumlah slave dan penempatan master-slave di beda server harus diperhitungkan, supaya case diatas sangat kecil kemungkinannya terjadi.

Summary

  1. Dengan cluster, redis bisa scalling horizontal menggunakan active-standby mekanisme master-slave. redis menggunakan gossip protocol (saling komunikasi antar nodes) sehingga ketika ada nodes master yang down akan ada mekanime pemilihan master.
  2. Redis tidak mencopy full data ke masing-masing node. Replikasi data yang sama hanya antara master dan slave-nya. Untuk scalling menggunakan sharding masing-masing key-value bisa disimpan di node redis (master-slave) yang berbeda. Cara mendapatkan address sharding adalah modulo CRC16 dengan total slot 16383. Ketika terjadi perubahan total node server akan terjadi
  3. Ketika group slot yang sama baik master dan slave mengalami down, artinya cluster dianggap bermasalah dan semua data tidak bisa diakses meskipun di group slot node lain yang tidak down.
  4. semakin banyak replikas/slave dan independent dengan server master akan semakin bagus untuk resiliensi (ketahanan)

--

--