Skip to content

Redis asoslari - Arxitektura, O'rnatish, Konfiguratsiya, Monitoring

Kirish

Redis(REmote DIctionary Service) — bu open-source, in-memory key-value ma'lumotlar bazasi(database) bo'lib, u yuqori tezlikda(high-speed) ma'lumotlarni saqlash va olish imkonini beradi. U asosan keshlash(caching), message-queuing va real-time data streamlarini boshqarish uchun ishlatiladi. Redis turli xil data structurelarini qo'llab-quvvatlaydi, jumladan, strings,lists, sets,hashes va sorted sets

Redis — 2009-yilda italiyalik dasturchi Salvatore Sanfilippo tomonidan ishlab chiqilgan. Dastlab, u o'zining shaxsiy loyihasi uchun Redisni yaratgan, ammo keyinchalik uni open source loyiha sifatida ommaga taqdim etgan. 2015-yildan 2020-yilgacha Sanfilippo Redis Labs (hozirgi nomi Redis) homiyligida loyiha jamoasini boshqargan. 2020-yilda u loyiha rahbarligidan chetlangan. 2021-yilda Redis Labs kompaniyasi nomidan "Labs" so'zini olib tashlab, "Redis" deb atala boshlandi. Hozirda Redis open source loyiha bo'lib, uning rivojlanishi va qo'llab-quvvatlanishi global dasturchilar hamjamiyati tomonidan amalga oshiriladi.

Redisning asosiy afzalliklari quyidagilardan iborat:

  • Yuqori tezlik-> Ma'lumotlarning in memory saqlanishi tufayli Redis juda tezkor ishlashni ta'minlaydi.
  • Oson foydalanish-> Redisning sodda va intuitiv interfeysi dasturchilar uchun qulaylik yaratadi.
  • Turli Data Structurelar bilan ishlash-> Redis bir nechta data structurelarini qo'llab-quvvatlaydi, bu esa uni moslashuvchan qiladi.

Redis quyidagi holatlarda keng qo'llaniladi:

  • Keshlash(Caching)-> Veb-saytlar va applicationlarda tezkor ma'lumotlarni saqlash uchun.
  • Sessiyalarni boshqarish-> Foydalanuvchi sessiyalarini samarali boshqarish va saqlashda.
  • Real-time Data Streaming-> Message queue va real-time tahlillar uchun.
  • Leaderboardlar-> O'yinlar va boshqa applicationlarda reytinglarni saqlash va boshqarish uchun.
  • Geoma'lumotlar(Geospatial Data)-> Geografik joylashuv ma'lumotlarini saqlash va qayta ishlashda.

Bugungi amaliyotda biz Redis nimaligini o'rganamiz keyin nima uchun ishlatilishini va Arxitekturasini o'rganmiz unda keyin o'rnatishga o'tamiz va bu amaliyotda yagona redis instance uchun production ready konfiguratsiya qilamiz va oxirida Redisni monitoring qilish uchun redis_exporter'dan foydalanib Grafana/Prometheus orqali Redisni monitoring qilamiz.

Arxitektura

Redis eng ko'p qo'laniladigan amaliyot bu keshlashdir. Masalan Redis PostgreSQl/MySQL va boshqa databaselar oldida turadi va client yuborgan requestlar birinchi redis cachega boradi aagr redisda bo'lsa tezda responseni o'zini redis qaytaradi ya'ni ko'p bir xil requestlarni redis keshda ushlab turadi va keshdan response qaytaradi bunda databasega load(yuklama) tushmaydi.

Redis in-memory(RAM) bo'lgani uchun juda tez ishlaydi yani traditional databaselar HDD/SSD larga qaraganda juda tezkor buni quyidagi rasmda ko'rishingiz mumkin.

Bu qismda quyidagialrni ko'rib chiqamiz.

  • yagona Redis
  • Redis HA
  • Redis Sentinel
  • Redis Cluster

Yagona Redis

Yagona Redis instance Redisning eng oddiy foydalanishidir ya'ni bitta vm serverga Redis o'rnatiladi va ishlatiladi. Bun yechim kichik loyihalar va development/testing environmentlar uchundir, bu tanlov katta production uchun mos kelmaydi chunki agar redis ishlab turgan vmda muammoi bo'lsa yoki ishlamay qolsa muammolar keltirib chiqaradi.

Redis ma'lumotlarni doimiy saqlash uchun ikkita asosiy mexanizmdan foydalanadi: RDB (Redis Database) va AOF (Append-Only File). Ularning har biri o'ziga xos xususiyatlarga ega bo'lib, turli holatlar uchun moslashgan.

RDB — bu snapshot-based ishlaydigan persistence mexanizmi. Redis ma'lumotlarining aniq bir vaqt oralig'idagi snapshotini diskka yozadi. Ushbu snapshot ma'lumotlarni Redisni qayta ishga tushirganda tiklash imkonini beradi. Redis belgilangan vaqt oralig'ida yoki ma'lum miqdordagi o'zgarishlardan so'ng snapshot yaratadi. Snapshot .rdb fayl formatida saqlanadi. RDB procssesi main processdan ajralgan fork procsessda ishlaydi.

RBD qulayliklari: Snapshot processi diskka yozilganligi uchun juda samarali va RDB fayllari compress(siqilgan) qilingan shaklda saqlanadi va kam joy egallaydi.

Kamchiliklari: Snapshotlar ma'lum vaqt oralig'ida yaratilganligi sababli Redis to'satdan to'xtab qolsa, so'nggi o'zgarishlar yo'qolishi mumkin va fork processllari ko'p memory ishlatishi mumkin.

AOF — bu logga yozish (write-ahead log) usuli bilan ishlaydigan saqlash mexanizmi. Redisdagi har bir yozish (write) amali ketma-ket append usulida faylga yoziladi. Redis qayta ishga tushirilganida datasetni tiklash uchun ushbu operatsiyalarni ketma-ket takrorlab chiqadi.Har bir yozish amali diskdagi appendonly.aof fayliga qo'shiladi.Redis qayta ishga tushganda, AOF faylidagi yozuvlar ketma-ket bajarilib, ma'lumotlar tiklanadi.

AOF qulayliklari: Ma'lumot yo'qotish xavfi minimal, chunki har bir amal yozib boriladi va AOF fayli inson o'qiy oladigan formatda bo'ladi.Restore(tiklash) jarayoni RDB ga qaraganda aniqroq va ancha ishonchli.

AOF kamchiliklari: Har bir amal yozilganligi sababli AOF fayli kattalashishi mumkin va sizga ko'proq storage kerak bo'lishi mumkin va Restore qilish RBD ga qaraganda sekin bo'ladi.

Redisda RBD va AOFni ham birgalikda ishlatish mumkin.

HA Redis

Redis replication — bu ma'lumotlarni master serverdan replica serverlarga nusxalash jarayoni. Bu jarayon Redisning xavfsizlik, ma'lumotlarni ko'paytirish, va balanslash imkoniyatlarini yaxshilaydi. Redis replication bir yo'nalishli (masterdan replicaga) bo'lib, master node writelarni qabul qiladi va uni replica nodelarga tarqatadi.

Redis replication quyidagicha ishlaydi: Bir master bir nechta replica (slave) nodelarini boshqaradi va master server barcha writelarni qabul qiladi va ma'lumotlarni replicalarga yuboradi, replica nodelar esa readga javob beradi va read querilarini slave nodelar orasida taqsimlab read loadni kamaytirish mumkin.

Replica node masterga ulanish so'rovi yuboradi (PSYNC buyruği yordamida) va master RDB snapshotini yaratadi va uni replicaga yuboradi.Snapshot yuklab bo'lingach, masterdagi yangi o'zgarishlar replicaga yuborila boshlaydi, keyin hamma writelarni replicalarga yuboradi replica serverlar esa bu o'zgarishlarni qayta ishlaydi va o'zlarini yangilaydi.

Keling endi buni Afzalliklari/Kamchiliklarini ko'rib chiqsak.

Afzalliklari: Read so'rovlarini replica nodelar orasida taqsimlash mumkin bu katta hajmdagi read so'rovlarida tizimni tezkor va samarador qiladi. Agar master server ishdan chiqsa, replicalar ishlashni davom ettiradi Redis Sentinel yordamida avto-failover amalga oshiriladi. Replicalarni backup nusxalari sifatida ishlatish mumkin.

Kamchiliklarini: Masterdagi o'zgarishlar replicaga darhol o'tmasligi mumkin shu sababli, muayyan vaqtda ma'lumotlar farqi (lag) bo'lishi mumkin. Faqat read uchun so'rovlar replicaga yo'naltiriladi. Barcha write amallari faqat masterda bajariladi va bu master serverga load oshishini bildiradi.

Redis Sentinel

Redis Sentinel — bu high availability va avtomatik failoverni ta'minlash uchun mo'ljallangan komponentdir. Sentinel Redis serverlarini monitoring qiladi, avariyalar aniqlanganda avtomatik ravishda yangi master nodeni tanlaydi va replicalarni unga ulaydi. Redis sentinel master va replica nodelarning holatini doimiy kuzatib boradi va nodelar ishlamay qolganda xabar beradi. Agar master server ishdan chiqqanda avtomatik ravishda yangi master tayinlaydi va replicalarni yangi master bilan bog'laydi va sozlamalarni boshqaradi.

Sentinel doimiy ravishda master va replica nodelarga so'rov(request) yuborib, ularning holatini tekshiradi, nodelar PING va PONG javoblari(response) orqali tekshiriladi. Agar master 5 soniya davomida javob bermasa, Sentinel nodeni subjectively down, ko'pchilik Sentinel jarayonlari bu holatni tasdiqlasa, node objectively down deb e'lon qilinadi.Agar master server ishlamay qolsa (fail holat), Sentinel avtomatik ravishda eng yangi ma'lumotlarga ega bo'lgan replica nodeni yangi master sifatida tanlaydi va qolgan replica nodelarni yangi master bilan ulaydi. Sentinel barcha replicalar uchun yangi master nodening IP-manzilini va portini yangilaydi. Failover uchun kamida 3 ta Sentinel kerak bo'ladi.

Redis Cluster

Redis Cluster — bu sharding va disturbuted data uchun mo'ljallangan disturbuted systemdir. Redis Cluster yordamida katta hajmdagi ma'lumotlarni bir nechta nodelar o'rtasida taqsimlab ishlatish mumkin.

Redis Cluster ma'lumotlarni hash-slotlar orqali bo'lib saqlaydi. Umumiy 16384 ta hash-slot mavjud, har bir node bu slotlarning ma'lum qismini boshqaradi va shu bilan katta malumotlarni sharding qilib bir nechta bo'lkalarga bo'lib samarali boshqarish mumkin.

Redis clusterda har bir master ma'lumotlarning bir qismini boshqaradi (hash-slotlarni). Master nodelar write va read operatsiyalarini bajaradi. Har bir master uchun kamida bitta replica bo'lishi kerak, replica master ishlamay qolganda uning o'rnini egallaydi (failover). Redis Cluster ma'lumotlarni 16384 ta hash-slotga bo'ladi. Kalitlarning hash qiymati (CRC16) bu slotlardan biriga moslanadi. Nodelar hash-slotlarning muayyan qismini boshqaradi, masalan:

  • master1: 0-5000
  • master2: 5001-10000
  • master3: 10001-16384

Gossip — bu disturbuted systemlarda nodelarning o'zaro aloqa qilish va tizimning umumiy holatini bilish uchun ishlatiladigan protokol. PING va PONG paketlari yordamida nodelar bir-birining holatini tekshiradi: Har bir node o'zining qo'shni nodelariga PING paketlarini yuboradi.Qo'shni tugunlar PONG javobi qaytaradi. Agar PONG javobi kelmasa, nodening ishlamayotgani deb hisoblanadi. Agar bir node boshqa nodening ishlamay qolganini aniqlasa, bu ma'lumotni klaster bo'ylab Gossip orqali tarqatadi.

Redis o'rnatish

Yuqorida biz Redis nima? nima uchun ishlatiladi? qanday ishlaydi? va qanday arxitektura degan savollarni o'rganib chiqdik endi esa yagona instanceli Redis o'rnatishni ko'rib chiqsak bo'ladi.

Ushbu amaliyotni amalga oshirish uchun bizga quyidagi minimum server talablaridagi server kerak bo'ladi.

Minimum Server talabi

Eslatma: Server Linux OS ning qaysi distroligi muhim emas bu qo'llanmada Red Hat based va Debian based serverlarda ko'rsatiladi

HostOSRAMCPUXotira
redis-serverUbuntu 20.04 yoki Rocky Linux 84GB2vCPU50GB

1-> Tizimni yangilab kerakli toollarni install qilib oling.

sudo apt update && sudo apt upgrade -y
sudo apt-get install lsb-release curl gpg

2-> Redisni o'rnatamiz.

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
sudo apt-get update
sudo apt-get install redis -y

3-> Redisni ishga tushiramiz.

sudo systemctl enable redis-server
sudo systemctl start redis-server

4-> Statusini tekshiramiz.

sudo systemctl status redis-server

Redis o'rnatganimizdan keyin uni statusini ham tekshirib keling unning to'gri ishlayotganini redis-cli dan foydalanib tekshiramiz.

redis-cli
127.0.0.1:6379> ping
PONG

Redis konfiguratsiya

Keling endi Redis o'rnatganimizdan keyin uni production ready config qilamiz.

Red Hat based serverlarda redis.conf quyidagi papkalarda bo'ladi /etc/redis/redis.conf yoki /etc/redis.conf Debin based serverlarda esa /etc/redis/redis.conf papkada joylashgan bo'ladi.

1-> Boshlanishiga asosiy sozlanishlardan boshlaylik.

redis.conf
bind 127.0.0.1 # yoki 0.0.0.0
port 6379

Bu config orqali default portni o'zgartishingiz mumkin va bind orqali kerakli IP range yoki 0.0.0.0 qilib global qilib ochishingiz mumkin(xavfsizlik yuzasidan maslahat berilmaydi!).

2-> Xavfsizlik yuzasidan Redisga parol qo'yamiz.

redis.conf
requirepass mening-p@r@Lim

Redisga ulanishda Redis addres port va parol yozib ulanadi user yozish shart emas.

3-> Performance uchun config qilamiz.

redis.conf
maxclients 10000
maxmemory 2gb
maxmemory-policy allkeys-lru

maxclients Bir vaqtning o'zida qancha client ulanishi mumkinligini belgilaydi maxmemory esa Redis faqat ma'lum hajmdagi memorydan foydalanadi bu serverni yuqori load bermaslikga yordam beradi.

maxmemory-policy Xotira to'lsa, Redis eski ma'lumotlarni qanday o'chirishini belgilaydi.

  • noeviction Yangi ma'lumotlarni qabul qilmaydi.
  • allkeys-lru Barcha keylar ichida kam ishlatilganini o'chirib tashlaydi.
  • volatile-lru Faqat muddati o'tayotgan keylarni o'chirib tashlaydi.

4-> Persistence (Ma'lumotlarni Saqlash) Redisda ma'lumotlarni saqlash uchun RDB va AOF mexanizmlari mavjud buni yuqorida aytib o'tganmiz. Production uchun odatda AOF ishlatiladi.

RDB config

redis.conf
save 900 1     # 15 daqiqada kamida 1 o'zgarish bo'lsa
save 300 10    # 5 daqiqada kamida 10 o'zgarish bo'lsa
save 60 10000  # 1 daqiqada kamida 10,000 o'zgarish bo'lsa

AOF config

redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
  • always Har bir writedan so'ng diskka yozadi (xavfsiz, lekin sekin).
  • everysec Har soniyada yozadi (balanslash).
  • no Diskga yozishni operatsion tizimga qoldiradi (tez, lekin xavfsiz emas).

Xoxlasangiz RDB yoki AOF ishlatishingiz mumkin yoki RDB va AOFni birgalikda ishlatishingiz mumkin.

5-> Monitoring

Bu config orqali loglarni yozib borish va slow query(sekin so'rovlar)ni kuzatishingiz mumkin.

redis.conf
logfile /var/log/redis/redis.log
slowlog-log-slower-than 10000
slowlog-max-len 128

6-> Redisga restart beramiz va tekshiramiz.

# Red Hat based serverlar uchun
sudo systemctl restart redis
# Debian based serverlar uchun
sudo systemctl restart redis-server

Login qilib tekshirib ko'ramiz.

redis-cli
127.0.0.1:6379> auth mening-p@r@Lim

Monitoring

Redisni o'rganib uni ishga tushirib oldik endi navbat monitoringga. Redis monitoring uchun Grafana/Prometheusdan foydalanamiz va Redis metrikalarni olish uchun redis_exporter (opens in a new tab) dan foydalanamiz.

Monitoring bo'limni boshlashdan oldin sizda Grafana/Prometheus haqida bilimga ega bo'lsihingiz va sizda Grafana/Prometheus o'rnatib/sozlangan bo'lishi kerak.

Prometheus-> HTTP endpointlarini o'lchash orqali nazorat qilinadigan targetlardan metrikalarni to'playdigan open-source monitoring tool. Prometheus haqida malumot va o'rnatish uchun quyidagi qo'llanmani ko'rib chiqishingiz mumkin. To'liq qo'llanma (opens in a new tab). Prometheus nima? (opens in a new tab), Prometheus o'ratish va sozlash (opens in a new tab), Prometheusni service sifatida sozlash (opens in a new tab)

Grafana-> Monitoring va vizualizatsiya uchun mashhur open-source platformasi. Grafana bir nechta manbalardan, jumladan Prometheusdan olingan boy vizualizatsiyani (grafiklar, jadvallar va heatmaplar kabi) taqdim etadi. Uning moslashtirilgan dashboardi barcha muhim ko'rsatkichlarning(metrics) jamlangan ko'rinishini taqdim etadi. Grafana haqida malumot va o'rnatish uchun quyidagi qo'llanmani o'qib chiqing. Grafana nima? (opens in a new tab), Grafana serverini qanday o'rnatish va sozlash (opens in a new tab), Grafana va Prometheusni integratsiya qilish (opens in a new tab), Grafana Dashboardni import qilish (opens in a new tab)

1-> redis_exporterni Github Releases (opens in a new tab)'dan kerakli versiyani topib yuklab olamiz. Biz v1.67.0 verisyasini ishlatamiz

wget https://github.com/oliver006/redis_exporter/releases/download/v1.67.0/redis_exporter-v1.67.0.linux-amd64.tar.gz

2-> Yuklab olingan arxiv faylni arxivdan chiqarib redis_exporter binary faylni /usr/local/bin/ papkasiga chiqaramiz.

tar -xvzf redis_exporter-v1.67.0.linux-amd64.tar.gz
cd redis_exporter-v1.67.0.linux-amd64
sudo mv redis_exporter /usr/local/bin/

3-> redis_exporter uchun systemd .service file yaratib uni systemd orqali ishga tushiramiz.

sudo nano /etc/systemd/system/redis_exporter.service
/etc/systemd/system/redis_exporter.service
[Unit]
Description=Redis Exporter for Prometheus
After=network.target
 
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis_exporter \
    --redis.addr=redis://127.0.0.1:6379 \
    --redis.password="mening-p@r@Lim"
Restart=always
 
[Install]
WantedBy=multi-user.target

redis_exporterni ishga tushiramiz va statusini tekshiramiz

sudo systemctl daemon-reload
sudo systemctl enable redis_exporter
sudo systemctl start redis_exporter

redis_exporter to'gri ishlayotganini bilish uchun unga curl request yuborib ko'ramiz bizda metrikalar chiqishi kerak.

curl http://localhost:9121/metrics

4-> Redis exporterni prometheusga ulaymiz.

/etc/prometheus/prometheus.yml konfigga quyidagicha redis exporter configini qo'shamiz.

  - job_name: 'redis_exporter'
    static_configs:
      - targets: ['localhost:9121']

prometheusga restart beramiz.

sudo systemctl restart prometheus

6-> Redis exporter uchun yozilgan Grafana dashoarni import qilib olamiz JSON formatda. Dashboard JSON kodlari quyidagi havolada https://github.com/oliver006/redis_exporter/blob/master/contrib/grafana_prometheus_redis_dashboard.json (opens in a new tab)

Dashboardni import qilganimizdan keyin dashboard bizda ochilishi kerak.

Qo'shimcha

Sana: 2024.12.19(2024-yil 19-dekabr)

Oxirgi yangilanish: 2025.01.07(2025-yil 7-yanvar)

Muallif: Otabek Ismoilov

Telegram (opens in a new tab)Github (opens in a new tab)LinkedIn (opens in a new tab)