Mehdi Shavandi
Mehdi Shavandi
خواندن ۴ دقیقه·۱ سال پیش

Redis + Sentinel + Haproxy

ردیس چیست؟

کلمه Redis مخفف عبارت Remote Dictionary Server است. به بیان ساده‌تر پایگاه داده ردیس نوعی ساختمان داده است که اطلاعات را در RAM نگهداری می‌کند. این کار باعث می‌شود که سرعت دسترسی به اطلاعات بسیار بالاتر رود. بالا بودن سرعت بزرگترین مزیت و تفاوت اصلی دیتابیس redis با دیگر پایگاه های داده است. با توجه به اینکه اطلاعات در ردیس داخل RAM‌ نگهداری می‌شود، آن را In-Memory Database می‌نامند.

از محل ذخیره‌سازی اطلاعات در ردیس مشخص است که این پایگاه داده یک محل ذخیره‌سازی موقت است. این پایگاه داده مناسب برای اطلاعاتی است که بسیار پرکاربرد هستند و لازم است تا مدام از سرور فراخوانده شوند. در این حالت اطلاعات به طور موقت روی RAM ذخیره شده و به سرعت به کاربر منتقل می‌شود. این روش هم رضایت کاربر را بهتر حاصل می‌کند و هم مدیر سایت به منابع کمتری برای سرویس‌دهی احتیاج خواهد داشت.

Redis Sentinel

سیستمی است که برای کمک به مدیریت نمونه هایRedis طراحی شده است. چهار وظیفه زیر را انجام می دهد:

1- نظارت : Sentinel دائماً بررسی می‌کند که آیا نمونه‌های master و slave شما مطابق انتظار کار می‌کنند.

2- اعلان : Sentinel می‌تواند از طریق یک API به مدیر سیستم یا برنامه رایانه‌ای دیگر اطلاع دهد که مشکلی در یکی از نمونه‌های Redis، نظارت شده وجود دارد.

3- خرابی خودکار : اگر یک Master طبق انتظار کار نمی کند، Sentinel می تواند یک فرآیند Failover را شروع کند که در آن یک Slave به Master ارتقا می یابد، سایر Slave های اضافی برای استفاده از Master جدید مجددا پیکربندی می شوند و برنامه های کاربردی با استفاده از سرور Redis در مورد آدرس جدید برای استفاده در هنگام استفاده از آن مطلع می شوند.

4- ارائه دهنده پیکربندی : Sentinel به عنوان منبع قدرت برای کشف خدمات مشتری عمل می کند: مشتریان به Sentinels متصل می شوند تا آدرس Master فعلی Redisرا که مسئول یک سرویس معین است بپرسند. اگر یک شکست رخ دهد، Sentinelsآدرس جدید را گزارش می‌کند.

HAProxy

اچ ای پروکسی که مخفف High Availability Proxy است، یک نرم افزار منبع باز محبوبTCP/HTTP Load Balancer و راه حل پروکسی است که می تواند بر روی Linux ، macOS و FreeBSD اجرا شود. رایج ترین کاربرد آن بهبود عملکرد و قابلیت اطمینان یک محیط سرور با توزیع بار کاری در چندین سرور (مانند وب، برنامه کاربردی، پایگاه داده) است. در بسیاری از محیط‌های پرمخاطب از جمله: GitHub، Imgur، Instagram و Twitter استفاده می‌شود.

استفاده از فایل Docker Compose

کامپوز فایل زیر شامل 3 سرویس ردیس که 1 سرویس Master و 2 سرویس Slaveمیباشد.

3 سرویس Sentinel وجود دارد و 1 سرویس HAProxy

docker-compose.yaml

version: '2' networks: web_net: external: true app_net: external: false services: redis: image: 'bitnami/redis:latest' environment: - REDIS_REPLICATION_MODE=master - REDIS_PASSWORD=str0ng_passw0rd networks: - app_net redis-slave-1: image: 'bitnami/redis:latest' environment: - REDIS_REPLICATION_MODE=slave - REDIS_MASTER_HOST=redis - REDIS_MASTER_PASSWORD=str0ng_passw0rd - REDIS_PASSWORD=str0ng_passw0rd depends_on: - redis networks: - app_net redis-slave-2: image: 'bitnami/redis:latest' environment: - REDIS_REPLICATION_MODE=slave - REDIS_MASTER_HOST=redis - REDIS_MASTER_PASSWORD=str0ng_passw0rd - REDIS_PASSWORD=str0ng_passw0rd depends_on: - redis - redis-slave-1 networks: - app_net redis-sentinel-1: image: 'bitnami/redis-sentinel:latest' environment: - REDIS_MASTER_PASSWORD=str0ng_passw0rd depends_on: - redis - redis-slave-1 - redis-slave-2 networks: - app_net redis-sentinel-2: image: 'bitnami/redis-sentinel:latest' environment: - REDIS_MASTER_PASSWORD=str0ng_passw0rd depends_on: - redis - redis-slave-1 - redis-slave-2 networks: - app_net redis-sentinel-3: image: 'bitnami/redis-sentinel:latest' environment: - REDIS_MASTER_PASSWORD=str0ng_passw0rd depends_on: - redis - redis-slave-1 - redis-slave-2 networks: - app_net haproxy: image: haproxy:latest container_name: haproxy restart: always ports: - '3000:3000' #- '${REDIS_PRIV_IP}:6379:6379' depends_on: - redis - redis-slave-1 - redis-slave-2 - redis-sentinel-1 - redis-sentinel-2 - redis-sentinel-3 networks: - web_net - app_net volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg

haproxy.cfg

global daemon maxconn 256 defaults mode tcp timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http bind :3000 default_backend stats backend stats mode http stats enable stats enable stats uri / stats refresh 1s stats show-legends stats admin if TRUE frontend redis-read bind *:6380 default_backend redis-online frontend redis-write bind *:6379 default_backend redis-primary backend redis-online balance roundrobin server redis redis:6379  maxconn 1024 check inter 3s server redis-slave-1 redis-slave-1:6379 maxconn 1024 check inter 3s server redis-slave-2 redis-slave-2:6379 maxconn 1024 check inter 3s backend redis-primary mode tcp option tcp-check tcp-check send AUTH\ str0ng_passw0rd\r\n tcp-check expect string +OK tcp-check send PING\r\n tcp-check expect string +PONG tcp-check send info\ replication\r\n tcp-check expect string role:master tcp-check send QUIT\r\n tcp-check expect string +OK server redis redis:6379  maxconn 1024 check inter 3s server redis-slave-1 redis-slave-1:6379 maxconn 1024 check inter 3s server redis-slave-2 redis-slave-2:6379 maxconn 1024 check inter 3s

نکته: تمامی این فایل کانفیگ ها باید کنار هم باشه .

نکته: docker compose pull اول ایمج ها دانلود بشه بعد docker network create web_net و بعد docker compose up -d

نکته:احتمالا کانفیگ فایل عا رو از این جا کپی کرده باشید ایندنت ها رعایت نمیشه داخل گیت هاب ام میزارم.

https://github.com/MehdiShavandi/redis-cluster

امیدوارم تونسته باشم برای کلاستر دیتابیس ردیس کمکی کرده باشم.




redishaproxy
DevOps Engineer
شاید از این پست‌ها خوشتان بیاید