
اگر تا حالا با Redis کار کردید، احتمالاً میدونید که این دیتابیس سریع و دوستداشتنی چقدر توی کش کردن و مدیریت دادههای موقتی محبوبه. اما چالش از اونجایی شروع میشه که قراره High Availability رو پیاده کنیم. خب، بیاید ببینیم چه گزینههایی داریم و چرا Redis Sentinel یه انتخاب هوشمندانهست!
۱. مدل Standalone (تکنفره! 🤷♂️)
۲. مدل Master-Slave (سلطنت دو نفره! 👑)
۳. مدل Cluster Mode (جمع باحال! 🎉)
۴. مدل Sentinel (ناظر وفادار! 👀)
جناب Redis Sentinel از سه مؤلفه اصلی تشکیل شده است:
مکانیزم Failover در Sentinel به این شکل است:
این یعنی نیازی به مداخله دستی نیست و همهچیز خودکار مدیریت میشود!
حالا Quorum چیست و چرا مهم است؟
در سیستم Sentinel، چندین نود وظیفه بررسی Master را دارند. برای اینکه Failover اتفاق بیافتد، حداقل n/2+1 از Sentinelها باید تأیید کنند که Master واقعاً از کار افتاده است. این مکانیزم که Quorum نام دارد، جلوی Failoverهای اشتباه را میگیرد و باعث ثبات در سیستم میشود.
✅ Failover اتوماتیک: اگه Master بمیره، خودش یه Slave رو ارتقا میده.
✅ Load Balancing برای Read: کلاینت میتونه به چند تا Replica متصل بشه و فشار کم بشه.
✅ Monitoring & Notification: اگه Redis یه مشکلی پیدا کنه، بهت اطلاع میده.
✅ بدون نیاز به کلاینت خاص: همون کلاینت Redis معمولی کار میکنه.
✅ Self-healing: بهصورت خودکار شبکه رو تنظیم میکنه.
🚀 دستکاری دستی در مواقع خرابی: دیگه لازم نیست خودمون نگران Failover باشیم.
🛑 Single Point of Failure: بدون Sentinel اگه Master بمیره، کلی مشکل داریم.
📈 افزایش عملکرد: درخواستهای Read بین Replicaها پخش میشه.
⚠️ کاهش ریسک Data Loss: به دلیل مدیریت خودکار Failover.
وقتی Master بیخبر غیبش میزنه، Sentinelها دور هم جمع میشن و یه تصمیم مهم میگیرن: کی بشه Master بعدی؟! 🤔
Sentinelها همیشه حواسشون به Master هست. هر چند ثانیه یه پینگ میفرستن و منتظر جواب میشن. اگه چندتا Sentinel ببینن که دیگه Master جواب نمیده، میگن: «خب، بهنظر میرسه که کارش تمومه!». 😬 اما این کافی نیست!
وقتی Master از دسترس خارج میشه، Sentinelها رأیگیری میکنن تا یکیشون نقش لیدر رو بگیره و هدایت Failover رو به دست بگیره.
خب، حالا که رئیس انتخاب شد، باید یه Master جدید پیدا کنه. ولی هر Replicaای مناسب این کار نیست! Sentinel چند تا چیزو چک میکنه:
بعد از کلی بررسی، یه Replica انتخاب میشه و با اجرای SLAVEOF NO ONE تبدیل به Master جدید میشه. 🎉
حالا که Master جدید انتخاب شد، وقتشه که به کلاینتها و سایر نودها بگه: «هی بچهها! این رئیس جدیدتونه!»
Sentinelها همچنان کارشون رو ادامه میدن و اگه Master جدید هم یه وقت غیبش زد، دوباره همین پروسه رو انجام میدن.
✅ Sentinelها دائماً Master رو چک میکنن.
✅ اگه Master بمیره، رأیگیری میشه و یه Sentinel لیدر میشه.
✅ لیدر یه Replica رو انتخاب و به Master جدید تبدیل میکنه.
✅ کلاینتها و Replicaهای دیگه آپدیت میشن.
✅ Sentinel همچنان روی Master جدید نظارت داره.
و اینجوری Redis Sentinel بدون نیاز به دخالت دستی، یه سیستم همیشه در دسترس رو مدیریت میکنه! 😎🚀
import redis sentinels = [("redis-sentinel-0", 26379), ("redis-sentinel-1", 26379), ("redis-sentinel-2", 26379)] rs = redis.sentinel.Sentinel(sentinels, socket_timeout=0.1) master = rs.master_for("mymaster", socket_timeout=0.1) slave = rs.slave_for("mymaster", socket_timeout=0.1) master.set("key", "value") print(slave.get("key"))
package main import ( "fmt" "github.com/go-redis/redis/v8" "context" ) var ctx = context.Background() func main() { sentinel := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: "mymaster", SentinelAddrs: []string{"redis-sentinel-0:26379", "redis-sentinel-1:26379", "redis-sentinel-2:26379"}, }) err := sentinel.Set(ctx, "key", "value", 0).Err() if err != nil { panic(err) } val, err := sentinel.Get(ctx, "key").Result() if err != nil { panic(err) } fmt.Println("Value:", val) }
خب، بریم سر اصل مطلب و یه Helm Chart برای Redis Sentinel روی Kubernetes دپلوی کنیم.
helm repo add bitnami https://charts.bitnami.com/bitnami helm install my-redis bitnami/redis --set architecture=replication,sentinel.enabled=true
۲. بررسی وضعیت پادها
kubectl get pods
۳. دریافت اطلاعات Sentinel
kubectl exec -it my-redis-master-0 -- redis-cli INFO SENTINEL
خیلی راحت توی values.yml چارتتون تو قسمت podAnnotations دو تا پارامتر زیر رو اضافه کنید (البته این مدلی فقط در صورتی کار میکنه که روی کلاسترتون یه Prometheus داشته باشید تا بتونه متریکای پاداتون رو Scrape کنه. اینم بعدا حس و حالش باشه مقالشو مینویسم براتون):
podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "9121"
چندتا از متریک هایی که بهمون میده:
- redis_master_last_io_seconds_ago : مدت زمان (به ثانیه) از آخرین ارتباط موفق بین مستر و یک رپلیکا. - redis_commands_processed_total : تعداد کل دستورات پردازششده . - redis_connected_slave_lag_seconds : لگ (به ثانیه) بین مستر و رپلیکا. - redis_connected_clients : تعداد کلاینتهای متصل در حال حاضر به ردیس. - redis_db_keys_expiring : تعداد کلیدهایی که در تمام دیتابیسهای دارای تاریخ انقضا هستند. - redis_db_keys : تعداد کل کلیدهای ذخیرهشده در تمام دیتابیسهای.
برید از اینجا داشبورد رو import کنید و حالشو ببرید.
حالا ما یه سیستم Redis Sentinel داریم که روی Kubernetes اجرا میشه و با GitLab CI/CD میتونیم پروسه دپلوی رو خودکار کنیم. تازه داریم با Prometheus و Grafana هم مانیتورش میکنیم.
این یعنی دردسر کمتر، آرامش بیشتر! 😌🔥
اگه تا اینجا اومدی، حتماً توی کامنتا نظرتو بگو! 😃