
В ہم نے RabbitMQ کلسٹرنگ کو فالٹ ٹولرنس اور زیادہ دستیابی کے لیے کور کیا ہے۔ اب آئیے اپاچی کافکا کی گہرائی میں کھودتے ہیں۔
یہاں، نقل کی اکائی تقسیم ہے۔ ہر موضوع میں ایک یا زیادہ پارٹیشنز ہوتے ہیں۔ ہر پارٹیشن کا ایک لیڈر ہوتا ہے، پیروکاروں کے ساتھ یا اس کے بغیر۔ موضوع بناتے وقت، پارٹیشنز کی تعداد اور نقل کا عنصر بیان کیا جاتا ہے۔ عام قدر 3 ہے، یعنی تین نقلیں: ایک رہنما اور دو پیروکار۔

تصویر 1. تین بروکرز میں چار حصے تقسیم کیے گئے ہیں۔
تمام پڑھنے لکھنے کی درخواستیں قائد کے پاس جاتی ہیں۔ پیروکار وقتاً فوقتاً رہنما کو تازہ ترین پیغامات کی بازیافت کے لیے درخواستیں بھیجتے ہیں۔ صارفین کبھی بھی پیروکاروں تک رسائی حاصل نہیں کرتے۔ مؤخر الذکر صرف فالتو پن اور غلطی کو برداشت کرنے کے لیے موجود ہے۔

تقسیم کی ناکامی۔
جب ایک بروکر ناکام ہو جاتا ہے، تو کئی پارٹیشنز کے لیڈر اکثر ناکام ہو جاتے ہیں۔ ہر تقسیم میں، دوسرے نوڈ سے پیروکار رہنما بن جاتا ہے۔ حقیقت میں، یہ ہمیشہ ایسا نہیں ہوتا ہے، کیوں کہ مطابقت پذیری کے عوامل بھی ایک کردار ادا کرتے ہیں: آیا ہم وقت ساز پیروکار ہیں، اور اگر نہیں، چاہے غیر مطابقت پذیر نقل میں ناکامی کی اجازت ہے۔ لیکن آئیے ابھی چیزوں کو آسان رکھیں۔
بروکر 3 نیٹ ورک چھوڑ دیتا ہے، اور بروکر 2 پر پارٹیشن 2 کے لیے ایک نیا لیڈر منتخب ہوتا ہے۔

تصویر 2۔ بروکر 3 کا انتقال ہو گیا اور بروکر 2 پر اس کا پیروکار تقسیم 2 کا نیا لیڈر منتخب ہو گیا۔
پھر بروکر 1 چھوڑ دیتا ہے اور سیکشن 1 بھی اپنے لیڈر کو کھو دیتا ہے، جس کا کردار بروکر 2 کو جاتا ہے۔

تصویر 3۔ ایک بروکر باقی ہے۔ تمام رہنما ایک ہی بروکر پر ہیں جس میں صفر فالتو پن ہے۔
جب بروکر 1 نیٹ ورک پر واپس آتا ہے، تو یہ چار پیروکاروں کا اضافہ کرتا ہے، جو ہر پارٹیشن کو کچھ فالتو پن فراہم کرتا ہے۔ تاہم، تمام رہنما بروکر 2 پر برقرار ہیں۔

تصویر 4. رہنما بروکر 2 پر رہتے ہیں۔
جب بروکر 3 بڑھتا ہے، تو ہم فی پارٹیشن تین نقلوں پر واپس آتے ہیں۔ لیکن تمام رہنما اب بھی بروکر 2 پر ہیں۔

تصویر 5. بروکرز 1 اور 3 کی بازیابی کے بعد غیر متوازن لیڈر کی جگہ کا تعین
کافکا کے پاس لیڈر ری بیلنسنگ کے لیے RabbitMQ سے زیادہ موثر ٹول ہے۔ وہاں، ہمیں تھرڈ پارٹی پلگ ان یا اسکرپٹ استعمال کرنا پڑا جس نے ہجرت کے دوران فالتو پن کو کم کرکے ماسٹر نوڈ مائیگریشن پالیسیوں میں ترمیم کی۔ مزید برآں، بڑی قطاروں کے لیے، ہمیں مطابقت پذیری کے دوران عدم دستیابی کو قبول کرنا پڑا۔
کافکا کے پاس قائد کے کردار کے لیے "ترجیحی نقل" کا تصور ہے۔ جب ٹاپک پارٹیشنز بنائے جاتے ہیں، کافکا لیڈروں کو نوڈس میں یکساں طور پر تقسیم کرنے کی کوشش کرتا ہے اور ان ابتدائی لیڈروں کو بطور ترجیحی نشان زد کرتا ہے۔ وقت گزرنے کے ساتھ، سرور ریبوٹس، ناکامیوں، اور کنیکٹیویٹی میں رکاوٹوں کی وجہ سے، لیڈر دوسرے نوڈس پر ختم ہو سکتے ہیں، جیسا کہ اوپر بیان کردہ انتہائی صورت میں ہے۔
اسے ٹھیک کرنے کے لیے، کافکا دو اختیارات پیش کرتا ہے:
- آپشن auto.leader.rebalance.enable=true کنٹرولر نوڈ کو خود بخود لیڈروں کو ترجیحی نقلوں پر دوبارہ تفویض کرنے کی اجازت دیتا ہے اور اس طرح یکساں تقسیم کو بحال کرتا ہے۔
- ایڈمنسٹریٹر اسکرپٹ چلا سکتا ہے۔ kafka-preferred-replica-election.sh دستی دوبارہ تفویض کے لیے۔

تصویر 6. دوبارہ توازن کے بعد نقل
یہ ناکامی کا ایک آسان ورژن تھا، لیکن حقیقت زیادہ پیچیدہ ہے، حالانکہ یہاں کچھ بھی پیچیدہ نہیں ہے۔ یہ سب ان سنک ریپلیکس (ISRs) پر آتا ہے۔
مطابقت پذیر نقلیں (ISR)
ISR تقسیم کی نقلوں کا ایک مجموعہ ہے جسے "ان-سنک" سمجھا جاتا ہے۔ ایک رہنما ہے، لیکن کوئی پیروکار نہیں ہوسکتا ہے۔ فالوور کو ان سنک سمجھا جاتا ہے اگر اس نے وقفہ ختم ہونے سے پہلے لیڈر کے تمام پیغامات کی صحیح کاپیاں بنا لی ہوں۔ replica.lag.time.max.ms.
ایک پیروکار کو ISR سیٹ سے ہٹا دیا جاتا ہے اگر وہ:
- وقفہ کے اندر نمونے لینے کی درخواست نہیں کی۔ replica.lag.time.max.ms (موت سمجھا جاتا ہے)
- وقفہ کے دوران اپ ڈیٹ کرنے کا وقت نہیں تھا۔ replica.lag.time.max.ms (سست سمجھا جاتا ہے)
پیروکار وقفہ میں انتخاب کی درخواستیں کرتے ہیں۔ replica.fetch.wait.max.ms، جو بطور ڈیفالٹ 500 ms ہے۔
ISR کے مقصد کو واضح طور پر بیان کرنے کے لیے، ہمیں پروڈیوسر کی تصدیقات اور کچھ ناکامی کے منظرناموں کو دیکھنے کی ضرورت ہے۔ پروڈیوسر منتخب کر سکتے ہیں جب بروکر تصدیق بھیجے:
- acks=0، تصدیق نہیں بھیجی گئی ہے۔
- acks=1، رہنما کے اپنے مقامی لاگ پر پیغام لکھنے کے بعد ایک اعتراف بھیجا جاتا ہے۔
- acks=all، ISR میں تمام نقلوں کے اپنے مقامی لاگز پر پیغام لکھنے کے بعد اعتراف بھیجا جاتا ہے۔
کافکا کی اصطلاح میں، اگر کسی آئی ایس آر نے کوئی پیغام محفوظ کیا ہے، تو وہ "عزم" ہے۔ Acks=all سب سے محفوظ آپشن ہے، لیکن یہ اضافی لیٹنسی بھی متعارف کراتا ہے۔ آئیے ناکامی کی دو مثالوں کو دیکھتے ہیں اور مختلف 'acks' اختیارات ISR تصور کے ساتھ کیسے تعامل کرتے ہیں۔
Acks=1 اور ISR
اس مثال میں، ہم دیکھیں گے کہ اگر لیڈر تمام پیروکاروں کے ہر پیغام کے محفوظ ہونے کا انتظار نہیں کرتا ہے، اگر لیڈر ناکام ہو جاتا ہے تو ڈیٹا کا نقصان ممکن ہے۔ غیر مطابقت پذیر پیروکار کی ناکامی کو ترتیب کے ذریعہ فعال یا غیر فعال کیا جاسکتا ہے۔ unclean.leader.election.enable.
اس مثال میں، پروڈیوسر کے پاس acks=1 ہے۔ تقسیم تینوں دلالوں میں تقسیم ہے۔ بروکر 3 پیچھے ہے۔ یہ آٹھ سیکنڈ پہلے لیڈر کے ساتھ ہم آہنگ ہوا اور اب 7456 پیغامات پیچھے ہے۔ بروکر 1 صرف ایک سیکنڈ پیچھے ہے۔ ہمارا پروڈیوسر سست یا مردہ پیروکاروں کی طرف سے بغیر کسی اوور ہیڈ کے، جس کی لیڈر کو توقع نہیں ہوتی، ایک پیغام بھیجتا ہے اور فوری طور پر ایک آک وصول کرتا ہے۔

تصویر 7. تین نقلوں کے ساتھ ISR
بروکر 2 کریش ہو جاتا ہے، اور پروڈیوسر کو کنکشن کی خرابی ملتی ہے۔ بروکر 1 میں قیادت کی منتقلی کے بعد، ہم 123 پیغامات کھو دیتے ہیں۔ بروکر 1 پر ایک پیروکار ISR میں لاگ ان ہوا تھا لیکن لیڈر کے کریش ہونے پر لیڈر کے ساتھ مکمل طور پر ہم آہنگ نہیں ہوا تھا۔

تصویر 8۔ حادثے کے دوران پیغامات ضائع ہو جاتے ہیں۔
ترتیب میں bootstrap.servers پروڈیوسر کے پاس کئی بروکرز درج ہیں اور وہ دوسرے بروکر سے یہ فیصلہ کرنے کے لیے کہہ سکتا ہے کہ پارٹیشن کا نیا لیڈر کون ہے۔ اس کے بعد یہ بروکر 1 کے ساتھ رابطہ قائم کرتا ہے اور پیغامات بھیجنا جاری رکھتا ہے۔

تصویر 9. مختصر وقفے کے بعد پیغام بھیجنا دوبارہ شروع ہوتا ہے۔
بروکر 3 اور بھی پیچھے ہے۔ یہ بازیافت کی درخواستیں کرتا ہے لیکن مطابقت پذیر نہیں ہوسکتا ہے۔ یہ بروکرز کے درمیان سست نیٹ ورک کنکشن، سٹوریج کا مسئلہ، وغیرہ کی وجہ سے ہو سکتا ہے۔ اسے ISR سے ہٹا دیا جاتا ہے۔ ISR اب ایک ہی نقل پر مشتمل ہے — لیڈر! پروڈیوسر پیغامات بھیجنا اور اعترافات وصول کرتا رہتا ہے۔

تصویر 10. بروکر 3 پر فالوور کو ISR سے ہٹا دیا گیا ہے۔
بروکر 1 کریش ہو گیا، اور بروکر 3 نے قیادت سنبھال لی، 15286 پیغامات کو کھو دیا! پروڈیوسر کو کنکشن کی خرابی موصول ہوتی ہے۔ ISR سے باہر قیادت کی ناکامی صرف ترتیب کی خرابی کی وجہ سے ممکن تھی۔ unclean.leader.election.enable=true. اگر اس میں انسٹال ہے۔ جھوٹی، منتقلی واقع نہیں ہوتی، اور تمام پڑھنے اور لکھنے کی درخواستوں کو مسترد کر دیا جاتا۔ اس صورت میں، ہم بروکر 1 کے ریپلیکا میں اپنے برقرار ڈیٹا کے ساتھ واپس آنے کا انتظار کرتے ہیں، جو ایک بار پھر قیادت سنبھال لے گا۔

تصویر 11۔ بروکر 1 کریش۔ حادثے کے دوران بڑی تعداد میں پیغامات ضائع ہو جاتے ہیں۔
پروڈیوسر آخری بروکر کے ساتھ تعلق قائم کرتا ہے اور دیکھتا ہے کہ اب یہ تقسیم کا رہنما ہے۔ یہ بروکر 3 کو پیغامات بھیجنا شروع کر دیتا ہے۔

تصویر 12. ایک مختصر وقفے کے بعد، پیغامات دوبارہ سیکشن 0 پر بھیجے جاتے ہیں۔
ہم نے دیکھا کہ نئے روابط قائم کرنے اور نیا لیڈر تلاش کرنے کے لیے مختصر رکاوٹوں کو چھوڑ کر، پروڈیوسر مسلسل پیغامات بھیج رہا تھا۔ یہ ترتیب مستقل مزاجی (ڈیٹا کی حفاظت) کی قیمت پر دستیابی کو یقینی بناتی ہے۔ کافکا نے ہزاروں پیغامات کھوئے لیکن نئے پیغامات کو قبول کرنا جاری رکھا۔
Acks=all اور ISR
آئیے اس منظر نامے کو دوبارہ دہراتے ہیں، لیکن ساتھ acks = تمامبروکر 3 کی تاخیر اوسطاً چار سیکنڈ ہے۔ پروڈیوسر اس کے ساتھ ایک پیغام بھیجتا ہے۔ acks = تمام، اور اب فوری جواب موصول نہیں ہوتا ہے۔ لیڈر پیغام کو ذخیرہ کرنے کے لیے ISR میں موجود تمام نقلوں کا انتظار کرتا ہے۔

تصویر 13. تین نقلوں کے ساتھ ISR۔ ایک سست ہے، جس کی وجہ سے لکھنے میں تاخیر ہو رہی ہے۔
چار سیکنڈ کی اضافی تاخیر کے بعد، بروکر 2 ایک AC بھیجتا ہے۔ تمام نقلیں اب مکمل طور پر اپ ڈیٹ ہو چکی ہیں۔

تصویر 14. تمام نقلیں پیغامات کو محفوظ کرتی ہیں اور ایک AC بھیجا جاتا ہے۔
بروکر 3 اب اور بھی پیچھے رہ گیا ہے اور اسے ISR سے ہٹا دیا گیا ہے۔ تاخیر نمایاں طور پر کم ہو گئی ہے کیونکہ ISR میں اب کوئی سست نقلیں نہیں ہیں۔ بروکر 2 اب صرف بروکر 1 کا انتظار کرتا ہے، جس کا اوسط وقفہ 500 ایم ایس ہے۔

تصویر 15. بروکر 3 کی نقل ISR سے ہٹا دی گئی ہے۔
پھر بروکر 2 کریش ہو جاتا ہے اور لیڈر شپ پیغامات کو کھونے کے بغیر بروکر 1 کے پاس جاتی ہے۔

تصویر 16. بروکر 2 گرتا ہے۔
پروڈیوسر ایک نیا لیڈر ڈھونڈتا ہے اور اسے پیغامات بھیجنا شروع کر دیتا ہے۔ تاخیر کو مزید کم کر دیا گیا ہے، کیونکہ ISR اب ایک ہی نقل پر مشتمل ہے! لہذا، اختیار acks = تمام فالتو پن کا اضافہ نہیں کرتا۔

تصویر 17. بروکر 1 پر نقل پیغامات کو کھونے کے بغیر قیادت سنبھالتی ہے۔
پھر بروکر 1 گرتا ہے اور برتری 14238 پیغامات کے نقصان کے ساتھ بروکر 3 کو جاتی ہے!

تصویر 18. بروکر 1 کی موت اور ناپاک سیٹ اپ کے ساتھ قیادت کی منتقلی کے نتیجے میں ڈیٹا کا بڑے پیمانے پر نقصان ہوتا ہے۔
ہم آپشن کو انسٹال نہیں کر سکتے تھے۔ unclean.leader.election.enable معنی میں سچ. پہلے سے طے شدہ طور پر یہ برابر ہے۔ جھوٹی. ترتیب دینا acks = تمام с unclean.leader.election.enable=true کچھ اضافی ڈیٹا سیکیورٹی کے ساتھ دستیابی فراہم کرتا ہے۔ لیکن جیسا کہ آپ دیکھ سکتے ہیں، ہم اب بھی پیغامات کو کھو سکتے ہیں۔
لیکن اگر ہم ڈیٹا کی حفاظت کو بڑھانا چاہتے ہیں تو کیا ہوگا؟ ہم سیٹ کر سکتے ہیں۔ unclean.leader.election.enable = غلط، لیکن یہ ضروری نہیں کہ ہمیں ڈیٹا کے نقصان سے محفوظ رکھے۔ اگر لیڈر سخت کریش کرتا ہے اور اپنے ساتھ ڈیٹا لے جاتا ہے، تب بھی پیغامات ضائع ہو جاتے ہیں، نیز رسائی اس وقت تک ختم ہو جاتی ہے جب تک کہ منتظم صورت حال کو بحال نہ کر دے۔
بہتر ہے کہ تمام پیغامات کے بے کار ہونے کی ضمانت دی جائے، یا بصورت دیگر تحریر کو رد کر دیں۔ پھر، کم از کم بروکر کے نقطہ نظر سے، ڈیٹا کا نقصان صرف اس صورت میں ممکن ہے جب بیک وقت دو یا زیادہ ناکامیاں واقع ہوں۔
Acks=all، min.insync.replicas اور ISR
موضوع کی ترتیب کے ساتھ min.insync.replicas ہم ڈیٹا سیکیورٹی کی سطح کو بڑھا رہے ہیں۔ آئیے ایک بار پھر پچھلے منظر نامے کے آخری حصے پر جائیں، لیکن اس بار min.insync.replicas=2.
لہذا، بروکر 2 کا ایک ریپلیکا لیڈر ہے، اور بروکر 3 پر پیروکار کو ISR سے ہٹا دیا گیا ہے۔

تصویر 19. دو نقلوں سے آئی ایس آر
بروکر 2 ناکام ہو جاتا ہے، اور قیادت پیغام کے نقصان کے بغیر بروکر 1 کے پاس جاتی ہے۔ تاہم، ISR اب صرف ایک نقل پر مشتمل ہے۔ یہ تحریریں وصول کرنے کے لیے درکار کم از کم تعداد کو پورا نہیں کرتا، اس لیے بروکر لکھنے کی کوشش کا جواب غلطی کے ساتھ دیتا ہے۔ NotEnoughReplicas.

شکل 20. ISRs کی تعداد min.insync.replicas میں بیان کردہ سے ایک کم ہے۔
یہ ترتیب مستقل مزاجی کے لیے دستیابی کی قربانی دیتی ہے۔ کسی پیغام کو تسلیم کرنے سے پہلے، ہم اس بات کی ضمانت دیتے ہیں کہ یہ کم از کم دو نقلوں پر لکھا گیا ہے۔ اس سے پروڈیوسر کو بہت زیادہ اعتماد ملتا ہے۔ پیغام کا نقصان صرف اس صورت میں ممکن ہے جب ایک اضافی پیروکار کو پیغام کی نقل تیار کرنے سے پہلے ایک مختصر وقت کے اندر دو نقلیں بیک وقت ناکام ہو جائیں، جس کا امکان نہیں ہے۔ لیکن اگر آپ انتہائی بے وقوف ہیں، تو آپ نقل کے عنصر کو 5، اور پر سیٹ کر سکتے ہیں۔ min.insync.replicas 3. ریکارڈ کھونے کے لیے تین بروکرز کو بیک وقت کریش کرنا پڑے گا! بلاشبہ، آپ اضافی تاخیر کے ساتھ اس قابل اعتمادی کی ادائیگی کریں گے۔
جب ڈیٹا کی حفاظت کے لیے دستیابی ضروری ہے۔
جیسا کہ کبھی کبھی ڈیٹا کی حفاظت کے لیے رسائی ضروری ہوتی ہے۔ یہاں آپ کو غور کرنے کی ضرورت ہے:
- کیا پبلشر صرف ایک غلطی واپس کر سکتا ہے اور اپ اسٹریم سروس یا صارف کو بعد میں دوبارہ کوشش کر سکتا ہے؟
- کیا ناشر بعد میں دوبارہ کوشش کرنے کے لیے پیغام کو مقامی طور پر یا ڈیٹا بیس میں محفوظ کر سکتا ہے؟
اگر جواب نفی میں ہے، تو دستیابی کو بہتر بنانے سے ڈیٹا سیکیورٹی بہتر ہوتی ہے۔ اگر آپ تحریری ناکامی پر دستیابی کا انتخاب کرتے ہیں تو آپ کم ڈیٹا کھو دیں گے۔ لہذا، یہ سب توازن تلاش کرنے پر آتا ہے، اور فیصلہ مخصوص صورتحال پر منحصر ہوتا ہے۔
ISR کے معنی
ایک ISR سیٹ آپ کو ڈیٹا کی حفاظت اور تاخیر کے درمیان بہترین توازن کا انتخاب کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، یہ دستیابی کو یقینی بنا سکتا ہے یہاں تک کہ اگر زیادہ تر نقلیں ناکام ہو جائیں، جبکہ مردہ یا سست نقلوں کے تاخیر کے اثرات کو کم سے کم کر دیں۔
ہم معنی خود چنتے ہیں۔ replica.lag.time.max.ms آپ کی ضروریات کے مطابق. بنیادی طور پر، اس پیرامیٹر کا مطلب ہے کہ ہم کتنی تاخیر قبول کرنے کے لیے تیار ہیں۔ acks = تمامپہلے سے طے شدہ قدر دس سیکنڈ ہے۔ اگر یہ آپ کے لیے بہت طویل ہے، تو آپ اسے کم کر سکتے ہیں۔ یہ ISR میں تبدیلیوں کی تعدد میں اضافہ کرے گا، کیونکہ پیروکاروں کو ہٹا دیا جائے گا اور زیادہ کثرت سے شامل کیا جائے گا۔
RabbitMQ میں صرف آئینے کا ایک سیٹ ہے جسے نقل کرنے کی ضرورت ہے۔ سست آئینے اضافی تاخیر کو متعارف کراتے ہیں، اور مردہ آئینے جواب دینے کے لیے نیٹ ورک ٹک تک لے سکتے ہیں۔ ISR ان تاخیری مسائل سے بچنے کا ایک دلچسپ طریقہ ہے۔ تاہم، ہمیں فالتو پن کھونے کا خطرہ ہے، کیونکہ ISR کو صرف لیڈر کے لیے ہی کاٹا جا سکتا ہے۔ اس خطرے سے بچنے کے لیے درج ذیل کنفیگریشن کا استعمال کریں: min.insync.replicas.
کلائنٹ کنکشن کی گارنٹی
ترتیبات میں۔ bootstrap.servers پروڈیوسر اور صارفین کلائنٹ کنکشن کے لیے متعدد بروکرز کی وضاحت کر سکتے ہیں۔ خیال یہ ہے کہ اگر ایک نوڈ نیچے چلا جاتا ہے، تو کئی فالتو نوڈس ہیں جن سے کلائنٹ ایک کنکشن کھول سکتا ہے۔ یہ ضروری طور پر پارٹیشن لیڈر نہیں ہیں، بلکہ بوٹسٹریپنگ کے لیے صرف ایک اسپرنگ بورڈ ہیں۔ کلائنٹ ان سے پوچھ سکتا ہے کہ کون سا نوڈ پڑھنے/لکھنے تک رسائی کے لیے پارٹیشن لیڈر کی میزبانی کرتا ہے۔
RabbitMQ میں، کلائنٹ کسی بھی نوڈ سے جڑ سکتے ہیں، اور اندرونی روٹنگ روٹس مناسب نوڈ سے درخواستیں کر سکتے ہیں۔ اس کا مطلب ہے کہ آپ RabbitMQ کے سامنے لوڈ بیلنسر انسٹال کر سکتے ہیں۔ کافکا کو کلائنٹس سے متعلقہ پارٹیشن کے لیڈر کی میزبانی کرنے والے نوڈ سے جڑنے کی ضرورت ہوتی ہے۔ اس صورت حال میں، لوڈ بیلنس ممکن نہیں ہے. فہرست bootstrap.servers یہ یقینی بنانے کے لیے اہم ہے کہ گاہک ناکامی کے بعد درست نوڈس تک رسائی حاصل کر سکتے ہیں اور ان کا پتہ لگا سکتے ہیں۔
کافکا متفقہ فن تعمیر
ابھی تک، ہم نے اس بات کا احاطہ نہیں کیا کہ کلسٹر کس طرح بروکر کی ناکامی کا پتہ لگاتا ہے یا نیا لیڈر کیسے منتخب ہوتا ہے۔ یہ سمجھنے کے لیے کہ کافکا نیٹ ورک پارٹیشنز کے ساتھ کیسے کام کرتا ہے، ہمیں سب سے پہلے متفقہ فن تعمیر کو سمجھنا ہوگا۔
ہر کافکا کلسٹر زوکیپر کلسٹر کے ساتھ تعینات کیا جاتا ہے — ایک تقسیم شدہ اتفاق رائے کی خدمت جو نظام کو دستیابی پر مستقل مزاجی کو ترجیح دیتے ہوئے کسی دی گئی ریاست پر اتفاق رائے تک پہنچنے کے قابل بناتی ہے۔ پڑھنے اور لکھنے کی کارروائیوں کی منظوری کے لیے زوکیپر نوڈس کی اکثریت کی رضامندی درکار ہوتی ہے۔
زوکیپر کلسٹر اسٹیٹ کو اسٹور کرتا ہے:
- عنوانات کی فہرست، سیکشنز، کنفیگریشن، موجودہ لیڈر کی نقلیں، ترجیحی نقل۔
- کلسٹر ممبران۔ ہر بروکر زوکیپر کلسٹر کو پنگ دیتا ہے۔ اگر اسے ایک مقررہ مدت کے اندر پنگ موصول نہیں ہوتا ہے، تو زوکیپر بروکر کو غیر دستیاب کے طور پر نشان زد کرتا ہے۔
- کنٹرولر کے لیے پرائمری اور سیکنڈری نوڈس کا انتخاب کرنا۔
کنٹرولر نوڈ کافکا بروکرز میں سے ایک ہے جو ریپلیکا لیڈروں کو منتخب کرنے کے لیے ذمہ دار ہے۔ Zookeeper کنٹرولر کو کلسٹر ممبرشپ اور موضوع کی تبدیلیوں کے بارے میں اطلاعات بھیجتا ہے، اور کنٹرولر کو ان تبدیلیوں پر عمل کرنا چاہیے۔
مثال کے طور پر، دس پارٹیشنز کے ساتھ ایک نئے موضوع پر غور کریں اور 3 کے ریپلیکشن فیکٹر۔ کنٹرولر کو ہر پارٹیشن کے لیے لیڈر کا انتخاب کرنا چاہیے، بروکرز کے درمیان لیڈروں کو بہترین طریقے سے تقسیم کرنے کی کوشش کرنا چاہیے۔
ہر سیکشن کنٹرولر کے لیے:
- ISR اور لیڈر کے بارے میں Zookeeper میں معلومات کو اپ ڈیٹ کرتا ہے۔
- ہر بروکر کو لیڈر اور آئی ایس آر کمانڈ بھیجتا ہے جو اس پارٹیشن کی نقل کی میزبانی کرتا ہے، بروکرز کو ISR اور لیڈر کے بارے میں مطلع کرتا ہے۔
جب لیڈر کے ساتھ بروکر ناکام ہو جاتا ہے، تو زوکیپر کنٹرولر کو ایک اطلاع بھیجتا ہے، جو ایک نئے لیڈر کا انتخاب کرتا ہے۔ ایک بار پھر، کنٹرولر پہلے زوکیپر کو اپ ڈیٹ کرتا ہے اور پھر ہر بروکر کو ایک کمانڈ بھیجتا ہے، انہیں قیادت کی تبدیلی کے بارے میں مطلع کرتا ہے۔
ہر لیڈر ISR سیٹ کا ذمہ دار ہے۔ ترتیب replica.lag.time.max.ms اس بات کا تعین کرتا ہے کہ اس میں کون داخل ہوگا۔ جب ISR تبدیل ہوتا ہے، لیڈر نئی معلومات زوکیپر کو منتقل کرتا ہے۔
زوکیپر کو ہمیشہ کسی بھی تبدیلی کے بارے میں مطلع کیا جاتا ہے تاکہ کسی رکاوٹ کی صورت میں انتظامیہ آسانی سے نئے لیڈر تک منتقل ہو سکے۔

تصویر 21. کافکا اتفاق رائے
نقل کا پروٹوکول
نقل کی تفصیلات کو سمجھنے سے آپ کو ڈیٹا کے نقصان کے ممکنہ منظرناموں کو بہتر طور پر سمجھنے میں مدد ملتی ہے۔
انتخابی سوالات، لاگ اینڈ آفسیٹ (LEO) اور ہائی واٹر مارک (HW)
ہم نے دیکھا ہے کہ پیروکار وقفے وقفے سے لیڈر کو بازیافت کی درخواستیں بھیجتے ہیں۔ پہلے سے طے شدہ وقفہ 500 ms ہے۔ یہ RabbitMQ سے اس لحاظ سے مختلف ہے کہ RabbitMQ میں، نقل کی شروعات ماسٹر کے ذریعے کی جاتی ہے، قطار کے آئینے سے نہیں۔ ماسٹر تبدیلیوں کو آئینے میں دھکیلتا ہے۔
لیڈر اور تمام پیروکار لاگ اینڈ آفسیٹ (LEO) اور ایک ہائی واٹر مارک (HW) اسٹور کرتے ہیں۔ LEO آخری پیغام کے آفسیٹ کو مقامی نقل میں اسٹور کرتا ہے، اور HW آخری کمٹ کے آفسیٹ کو اسٹور کرتا ہے۔ یاد رکھیں کہ کمٹ کی حیثیت تک پہنچنے کے لیے، پیغام کو تمام ISR نقلوں میں محفوظ کیا جانا چاہیے۔ اس کا مطلب ہے کہ LEO عام طور پر HW سے تھوڑا آگے ہوتا ہے۔
جب لیڈر کو کوئی پیغام ملتا ہے، تو وہ اسے مقامی طور پر اسٹور کرتا ہے۔ ایک پیروکار اپنے LEO کو منتقل کرکے بازیافت کی درخواست کرتا ہے۔ لیڈر پھر اس LEO سے شروع ہونے والے پیغامات کا ایک بیچ بھیجتا ہے اور موجودہ HW کو بھی منتقل کرتا ہے۔ جب لیڈر کو یہ اطلاع ملتی ہے کہ تمام نقلوں نے پیغام کو ایک دیے گئے آفسیٹ میں محفوظ کر لیا ہے، تو یہ HW نشان کو آگے بڑھاتا ہے۔ صرف لیڈر ہی HW کو آگے بڑھا سکتا ہے، اور اس طرح تمام پیروکار اپنی درخواستوں کے جواب میں موجودہ قدر سیکھتے ہیں۔ اس کا مطلب ہے کہ پیروکار پیغامات اور HW کے علم میں رہنما سے پیچھے رہ سکتے ہیں۔ صارفین کو صرف موجودہ HW تک پیغامات موصول ہوتے ہیں۔
نوٹ کریں کہ "مسلسل" کا مطلب میموری پر لکھا جاتا ہے، ڈسک پر نہیں۔ کارکردگی کے لیے، کافکا ایک خاص وقفے پر ڈسک سے ہم آہنگ ہوتا ہے۔ RabbitMQ میں بھی اسی طرح کا وقفہ ہوتا ہے، لیکن یہ صرف ماسٹر اور تمام آئینوں کے ڈسک پر پیغام لکھنے کے بعد ہی پبلشر کو ایک اعتراف بھیجے گا۔ کارکردگی کی وجوہات کی بناء پر، کافکا کے ڈویلپرز نے میموری پر پیغام لکھتے ہی ایک آک بھیجنے کا فیصلہ کیا۔ کافکا شرط لگا رہا ہے کہ فالتو پن صرف یادداشت میں تسلیم شدہ پیغامات کے قلیل مدتی ذخیرہ کے خطرے کو دور کرتا ہے۔
قیادت کی ناکامی۔
جب کوئی لیڈر ناکام ہوجاتا ہے، تو زوکیپر کنٹرولر کو مطلع کرتا ہے، جو ایک نئے لیڈر کی نقل کا انتخاب کرتا ہے۔ نیا لیڈر اپنے LEO کی بنیاد پر ایک نیا HW نشان سیٹ کرتا ہے۔ اس کے بعد پیروکار نئے لیڈر کے بارے میں معلومات حاصل کرتے ہیں۔ کافکا ورژن پر منحصر ہے، ایک پیروکار دو میں سے ایک منظرنامے کا انتخاب کرے گا:
- معلوم HW پر مقامی لاگ کو چھوٹا کریں اور اس نشان کے بعد پیغامات کے لیے نئے لیڈر کو درخواست بھیجیں۔
- رہنما کے طور پر انتخاب کے وقت HW کو تلاش کرنے کے لیے لیڈر کو ایک سوال بھیجیں، اور پھر لاگ کو اس آفسیٹ پر تراشیں۔ اس کے بعد یہ اس آفسیٹ سے شروع کرتے ہوئے متواتر نمونے کی درخواستیں کرنا شروع کر دے گا۔
پیروکار کو درج ذیل وجوہات کی بنا پر لاگ کو تراشنا پڑ سکتا ہے۔
- جب کوئی لیڈر ناکام ہو جاتا ہے، تو زوکیپر میں رجسٹرڈ ISR سیٹ میں پہلا پیروکار الیکشن جیتتا ہے اور لیڈر بن جاتا ہے۔ ISR میں تمام پیروکاروں کو، اگرچہ "مطابقت پذیر" سمجھا جاتا ہے، ہو سکتا ہے کہ سابق رہنما کے تمام پیغامات کی کاپیاں موصول نہ ہوں۔ یہ ممکن ہے کہ منتخب پیروکار کے پاس تازہ ترین کاپی نہ ہو۔ کافکا اس بات کی ضمانت دیتا ہے کہ نقل کے درمیان کوئی فرق نہیں ہے۔ لہذا، انحراف سے بچنے کے لیے، ہر پیروکار کو اپنے انتخاب کے وقت نئے لیڈر کی HW قدر کے مطابق اپنے لاگ کو چھوٹا کرنا چاہیے۔ یہ ترتیب کی ایک اور وجہ ہے۔ acks = تمام مستقل مزاجی کے لیے بہت ضروری ہے۔
- پیغامات وقفے وقفے سے ڈسک پر لکھے جاتے ہیں۔ اگر تمام کلسٹر نوڈس بیک وقت ناکام ہو جاتے ہیں، تو مختلف آفسیٹس والی نقلیں ڈسک پر محفوظ ہو جائیں گی۔ یہ بالکل ممکن ہے کہ جب بروکرز آن لائن واپس آجائیں تو منتخب ہونے والا نیا لیڈر اپنے پیروکاروں کے پیچھے ہوگا کیونکہ اسے پہلے ڈسک پر لکھا گیا تھا۔
کلسٹر میں دوبارہ شامل ہو رہا ہے۔
کلسٹر میں دوبارہ شامل ہونے پر، نقلیں وہی سلوک کرتی ہیں جیسا کہ لیڈر کی ناکامی کے دوران ہوتا ہے: وہ لیڈر کی نقل کو چیک کرتے ہیں اور اپنے لاگ کو اس کے HW (انتخابات کے وقت) پر تراشتے ہیں۔ مقابلے کے لحاظ سے، RabbitMQ دوبارہ جوائنڈ نوڈس کو بالکل نیا سمجھتا ہے۔ دونوں صورتوں میں، بروکر کسی بھی موجودہ ریاست کو مسترد کر دیتا ہے۔ اگر خودکار مطابقت پذیری کا استعمال کیا جاتا ہے، تو ماسٹر کو "دنیا کو انتظار کرنے دو" کے نقطہ نظر کا استعمال کرتے ہوئے بالکل موجودہ مواد کو نئے آئینے میں نقل کرنا چاہیے۔ اس آپریشن کے دوران، ماسٹر کسی بھی پڑھنے یا لکھنے کی کارروائیوں کو قبول نہیں کرتا ہے۔ یہ نقطہ نظر بڑی قطاروں کے ساتھ مسائل پیدا کرتا ہے۔
کافکا ایک تقسیم شدہ لاگ ہے، اور عام طور پر RabbitMQ قطار سے زیادہ پیغامات ذخیرہ کرتا ہے، جہاں پڑھنے کے بعد ڈیٹا کو قطار سے ہٹا دیا جاتا ہے۔ فعال قطاریں نسبتاً چھوٹی رہیں۔ تاہم، کافکا اپنی برقرار رکھنے کی پالیسی کے ساتھ ایک لاگ ہے، جسے دنوں یا ہفتوں پر سیٹ کیا جا سکتا ہے۔ تقسیم شدہ لاگ کے لیے قطار بند کرنے اور مکمل مطابقت پذیری کا طریقہ مکمل طور پر ناقابل قبول ہے۔ اس کے بجائے، کافکا کے پیروکار آسانی سے اپنے لاگ کو لیڈر کے HW (اس کے انتخاب کے وقت) پر تراشتے ہیں اگر ان کی کاپی لیڈر سے آگے ہو۔ کسی پیروکار کے پیچھے رہنے کے زیادہ امکان کی صورت میں، یہ صرف اپنے موجودہ LEO سے شروع ہونے والی بازیافت کی درخواستیں کرنا شروع کر دیتا ہے۔
نئے یا دوبارہ شامل ہونے والے پیروکار ISR سے باہر شروع ہوتے ہیں اور کمٹ میں حصہ نہیں لیتے ہیں۔ وہ صرف گروپ کے ساتھ مل کر کام کرتے ہیں، جتنی جلدی ممکن ہو پیغامات وصول کرتے ہیں جب تک کہ وہ لیڈر کو پکڑ کر ISR میں داخل نہ ہو جائیں۔ کوئی لاک ان نہیں ہے اور آپ کے تمام ڈیٹا کو ضائع کرنے کی ضرورت نہیں ہے۔
رابطے کا نقصان
کافکا میں RabbitMQ سے زیادہ اجزاء ہوتے ہیں، اس لیے جب کلسٹر کنیکٹیویٹی میں خلل پڑتا ہے تو اس میں طرز عمل کا زیادہ پیچیدہ مجموعہ ہوتا ہے۔ تاہم، کافکا کو کلسٹرز کے لیے زمین سے ڈیزائن کیا گیا تھا، اس لیے اس کے حل بہت اچھی طرح سے سوچے گئے ہیں۔
ذیل میں رابطے کی ناکامی کے کچھ منظرنامے ہیں:
- منظر نامہ 1: پیروکار لیڈر کو نہیں دیکھ سکتا، لیکن پھر بھی زوکیپر کو دیکھتا ہے۔
- منظر نامہ 2: رہنما کوئی پیروکار نہیں دیکھتا، لیکن پھر بھی زوکیپر کو دیکھتا ہے۔
- منظر نامہ 3۔ پیروکار رہنما کو دیکھتا ہے، لیکن زوکیپر کو نہیں دیکھتا۔
- منظر نامہ 4۔ لیڈر پیروکاروں کو دیکھتا ہے، لیکن زوکیپر کو نہیں دیکھتا۔
- منظر نامہ 5: پیروکار دوسرے کافکا نوڈس اور زوکیپر دونوں سے مکمل طور پر الگ ہے۔
- منظر نامہ 6: لیڈر دوسرے کافکا نوڈس اور زوکیپر دونوں سے مکمل طور پر الگ ہے۔
- منظر نامہ 7: کافکا کنٹرولر نوڈ ایک اور کافکا نوڈ نہیں دیکھتا ہے۔
- منظر نامہ 8۔ کافکا کنٹرولر زوکیپر کو نہیں دیکھ رہا ہے۔
ہر منظر نامے کا اپنا طرز عمل ہوتا ہے۔
منظر نامہ 1: پیروکار لیڈر کو نہیں دیکھ سکتا، لیکن پھر بھی زوکیپر کو دیکھتا ہے۔

تصویر 22. منظر نامہ 1. تین نقلوں کا ISR
کنکشن کا وقفہ بروکر 3 کو بروکرز 1 اور 2 سے الگ کرتا ہے، لیکن زوکیپر سے نہیں۔ بروکر 3 اب بازیافت کی درخواستیں نہیں بھیج سکتا ہے۔ وقت ختم ہونے کے بعد، replica.lag.time.max.ms اسے ISR سے ہٹا دیا جاتا ہے اور پیغام کے کمٹ میں حصہ نہیں لیتا ہے۔ ایک بار کنیکٹیویٹی بحال ہو جانے کے بعد، یہ درخواستیں بازیافت کرنا دوبارہ شروع کر دے گا اور لیڈر سے ملنے کے بعد ISR میں دوبارہ شامل ہو جائے گا۔ زوکیپر پنگ وصول کرتا رہے گا اور فرض کرے گا کہ بروکر زندہ اور ٹھیک ہے۔

تصویر 23. منظر نامہ 1. بروکر کو ISR سے ہٹا دیا جاتا ہے اگر replica.lag.time.max.ms وقفہ کے اندر اس سے بازیافت کی کوئی درخواست موصول نہیں ہوتی ہے۔
کوئی منطقی تقسیم دماغ یا نوڈ معطلی نہیں ہے، جیسا کہ RabbitMQ میں ہے۔ اس کے بجائے، فالتو پن کم ہو جاتا ہے۔
منظر نامہ 2: رہنما کوئی پیروکار نہیں دیکھتا، لیکن پھر بھی زوکیپر کو دیکھتا ہے۔

تصویر 24۔ منظر نامہ 2۔ لیڈر اور دو پیروکار
نیٹ ورک میں رکاوٹ لیڈر کو اپنے پیروکاروں سے الگ کر دیتی ہے، لیکن بروکر پھر بھی زوکیپر کو دیکھتا ہے۔ جیسا کہ پہلے منظر نامے میں، ISR سکڑتا ہے، لیکن اس بار صرف لیڈر کو، کیونکہ تمام پیروکار بازیافت کی درخواستیں بھیجنا بند کر دیتے ہیں۔ ایک بار پھر، کوئی منطقی علیحدگی نہیں ہے. اس کے بجائے، کنیکٹیویٹی بحال ہونے تک نئے پیغامات کی فالتو پن کا نقصان ہے۔ زوکیپر کو پنگ ملنا جاری ہے اور اسے یقین ہے کہ بروکر زندہ اور ٹھیک ہے۔

تصویر 25. منظر نامہ 2. ISR صرف لیڈر پر سکیڑا ہوا ہے۔
منظر نامہ 3: پیروکار رہنما کو دیکھتا ہے لیکن زوکیپر کو نہیں۔
پیروکار زوکیپر سے الگ ہوتا ہے، لیکن لیڈر کے ساتھ بروکر سے نہیں۔ نتیجے کے طور پر، پیروکار بازیافت کی درخواستیں کرتا رہتا ہے اور ISR کا رکن بنتا ہے۔ زوکیپر اب پنگ وصول نہیں کرتا ہے اور بروکر کریش کو رجسٹر نہیں کرتا ہے، لیکن چونکہ یہ صرف ایک پیروکار ہے، اس لیے بازیابی پر کوئی نتیجہ نہیں نکلتا۔

تصویر 26۔ منظر نامہ 3۔ پیروکار رہنما کو بازیافت کی درخواستیں بھیجتا رہتا ہے۔
منظر نامہ 4: رہنما پیروکاروں کو دیکھتا ہے لیکن زوکیپر کو نہیں۔

تصویر 27۔ منظر نامہ 4۔ لیڈر اور دو پیروکار
رہنما زوکیپر سے الگ ہوتا ہے، لیکن پیروکاروں کے ساتھ دلالوں سے نہیں۔

تصویر 28۔ منظر نامہ 4۔ لیڈر زوکیپر سے الگ تھلگ ہے۔
کچھ وقت کے بعد، زوکیپر بروکر کی ناکامی کو رجسٹر کرے گا اور کنٹرولر کو مطلع کرے گا۔ کنٹرولر پھر پیروکاروں میں سے ایک نیا لیڈر منتخب کرے گا۔ تاہم، اصل لیڈر اس کو لیڈر مانتا رہے گا اور اس سے اندراجات قبول کرتا رہے گا۔ acks = 1پیروکار اب اسے بازیافت کی درخواستیں نہیں بھیجتے ہیں، لہذا یہ انہیں مردہ سمجھے گا اور ISR کو خود سے دبانے کی کوشش کرے گا۔ لیکن چونکہ اس کا زوکیپر سے کوئی تعلق نہیں ہے، اس لیے یہ ایسا نہیں کر سکے گا اور اس وقت مزید پوسٹس کو قبول کرنا بند کر دے گا۔
Сообщения acks = تمام وہ تسلیم نہیں کریں گے کیونکہ ISR میں ابتدائی طور پر تمام نقلیں شامل ہیں، لیکن پیغامات ان تک نہیں پہنچتے ہیں۔ جب ابتدائی لیڈر انہیں ISR سے ہٹانے کی کوشش کرتا ہے، تو یہ ایسا نہیں کر سکے گا اور کسی بھی پیغام کو قبول کرنا بالکل بند کر دے گا۔
کلائنٹس جلد ہی لیڈر کی تبدیلی کو محسوس کرتے ہیں اور نئے سرور کو ریکارڈ بھیجنا شروع کر دیتے ہیں۔ نیٹ ورک بحال ہونے کے بعد، اصل لیڈر کو احساس ہوتا ہے کہ وہ لیڈر نہیں رہا اور لاگ انحراف سے بچنے میں ناکامی کے وقت نئے لیڈر کے پاس HW قدر کے مطابق لاگ ان کو چھوٹا کرتا ہے۔ اس کے بعد یہ نئے لیڈر کو بازیافت کی درخواستیں بھیجنا شروع کرتا ہے۔ اصل لیڈر کے تمام ریکارڈز کھو گئے ہیں جو نئے لیڈر کے لیے نقل نہیں کیے گئے ہیں۔ اس کا مطلب یہ ہے کہ وہ پیغامات ختم ہو جائیں گے جنہیں اصل لیڈر نے چند سیکنڈ کے دوران تسلیم نہیں کیا تھا جب دو لیڈر فعال تھے۔

تصویر 29. منظر نامہ 4. نیٹ ورک بحال ہونے کے بعد بروکر 1 پر لیڈر پیروکار بن جاتا ہے۔
منظر نامہ 5: پیروکار دوسرے کافکا نوڈس اور زوکیپر دونوں سے مکمل طور پر الگ ہے۔
پیروکار دوسرے کافکا نوڈس اور زوکیپر دونوں سے مکمل طور پر الگ تھلگ ہے۔ اسے آسانی سے ISR سے ہٹا دیا جاتا ہے جب تک کہ نیٹ ورک ٹھیک نہیں ہو جاتا، اور پھر دوسروں کے ساتھ مل جاتا ہے۔

تصویر 30۔ منظر نامہ 5۔ ایک الگ تھلگ پیروکار کو ISR سے ہٹا دیا جاتا ہے۔
منظر نامہ 6: لیڈر دوسرے کافکا نوڈس اور زوکیپر دونوں سے مکمل طور پر الگ ہے۔

تصویر 31۔ منظر نامہ 6۔ لیڈر اور دو پیروکار
لیڈر اپنے پیروکاروں، کنٹرولر اور زوکیپر سے بالکل الگ تھلگ ہے۔ مختصر مدت کے لیے، وہ پوسٹس قبول کرتے رہیں گے۔ acks = 1.

تصویر 32. منظر نامہ 6. لیڈر کو دیگر کافکا اور زوکیپر نوڈس سے الگ کرنا
میعاد ختم ہونے کے بعد کوئی درخواست وصول نہیں کرنا replica.lag.time.max.ms، یہ ISR کو اپنے تک سکڑنے کی کوشش کرے گا، لیکن ایسا نہیں کر سکے گا کیونکہ زوکیپر سے کوئی تعلق نہیں ہے، پھر یہ تحریریں قبول کرنا بند کر دے گا۔
دریں اثنا، زوکیپر الگ تھلگ بروکر کو مردہ کے طور پر نشان زد کرے گا، اور کنٹرولر ایک نیا لیڈر منتخب کرے گا۔

تصویر 33۔ منظر نامہ 6۔ دو رہنما
ابتدائی رہنما چند سیکنڈ کے لیے تحریریں قبول کر سکتا ہے، لیکن پھر کسی بھی پیغام کو قبول کرنا بند کر دیتا ہے۔ کلائنٹس کو ہر 60 سیکنڈ میں تازہ ترین میٹا ڈیٹا کے ساتھ اپ ڈیٹ کیا جاتا ہے۔ انہیں لیڈر کی تبدیلی کے بارے میں مطلع کیا جائے گا اور وہ نئے لیڈر کو خط بھیجنا شروع کر دیں گے۔

تصویر 34۔ منظر نامہ 6۔ مینوفیکچررز نئے لیڈر کی طرف جا رہے ہیں۔
نیٹ ورک کے کھو جانے کے بعد سے اصل لیڈر کے بنائے گئے تمام تسلیم شدہ لاگز ضائع ہو جائیں گے۔ نیٹ ورک بحال ہونے کے بعد، اصل لیڈر Zookeeper کے ذریعے پتہ لگائے گا کہ اب وہ لیڈر نہیں ہے۔ اس کے بعد یہ انتخابات کے وقت اپنے لاگ کو نئے لیڈر کے HW میں تراشے گا اور ایک پیروکار کے طور پر درخواستیں بھیجنا شروع کر دے گا۔

تصویر 35۔ منظر نامہ 6۔ نیٹ ورک کنیکٹیویٹی بحال ہونے کے بعد اصل لیڈر پیروکار بن جاتا ہے۔
اس صورت حال میں، ایک مختصر مدت کے لئے ایک منطقی علیحدگی کا مشاہدہ کیا جا سکتا ہے، لیکن صرف اس صورت میں acks = 1 и min.insync.replicas نیز 1. منطقی تقسیم خود بخود ختم ہو جاتی ہے یا تو نیٹ ورک کے بحال ہونے کے بعد، جب اصل لیڈر کو معلوم ہو جاتا ہے کہ وہ لیڈر نہیں رہا، یا جب تمام کلائنٹس کو یہ احساس ہو کہ لیڈر بدل گیا ہے اور نئے لیڈر کو لکھنا شروع کر دیتے ہیں — جو بھی پہلے آئے۔ دونوں صورتوں میں، کچھ پیغام کا نقصان ہوگا، لیکن صرف اس کے ساتھ acks = 1.
اس منظر نامے کی ایک اور تبدیلی اس وقت ہوتی ہے جب، نیٹ ورک کی تقسیم سے بالکل پہلے، پیروکار پیچھے ہو جاتے ہیں، اور لیڈر ISR کو صرف اپنے آپ تک محدود کر دیتا ہے۔ اس کے بعد رابطہ منقطع ہونے کی وجہ سے یہ الگ تھلگ ہو جاتا ہے۔ ایک نیا لیڈر منتخب کیا جاتا ہے، لیکن اصل لیڈر لکھنا قبول کرتا رہتا ہے، چاہے acks = تمامکیونکہ ISR میں کوئی اور نہیں ہے۔ نیٹ ورک بحال ہونے کے بعد یہ ریکارڈ ضائع ہو جائیں گے۔ اس سے بچنے کا ایک ہی طریقہ ہے۔ min.insync.replicas = 2.
منظر نامہ 7: کافکا کنٹرولر نوڈ ایک اور کافکا نوڈ نہیں دیکھتا ہے۔
عام طور پر، کافکا نوڈ کے ساتھ کنکشن کھونے کے بعد، کنٹرولر لیڈر کو تبدیل کرنے کے بارے میں کوئی معلومات فراہم کرنے سے قاصر ہوگا۔ بدترین صورت میں، یہ ایک قلیل مدتی منطقی تقسیم کا باعث بنے گا، جیسا کہ منظر نامہ 6 میں۔ اکثر، بروکر صرف قیادت کے لیے امیدوار نہیں بنے گا اگر مؤخر الذکر ناکام ہوجاتا ہے۔
منظر نامہ 8۔ کافکا کنٹرولر زوکیپر کو نہیں دیکھ رہا ہے۔
زوکیپر کو ناکام کنٹرولر سے پنگ نہیں ملے گا اور وہ کنٹرولر کے طور پر ایک نیا کافکا نوڈ منتخب کرے گا۔ اصل کنٹرولر خود کو اسی طرح پیش کرنا جاری رکھ سکتا ہے، لیکن اسے زوکیپر سے اطلاعات موصول نہیں ہوں گی، اس لیے اس کے پاس انجام دینے کے لیے کوئی کام نہیں ہوگا۔ ایک بار جب نیٹ ورک بحال ہو جائے گا، اسے احساس ہو گا کہ یہ اب کنٹرولر نہیں رہا اور ایک باقاعدہ کافکا نوڈ بن گیا ہے۔
منظرناموں سے اخذ کردہ نتائج
ہم دیکھتے ہیں کہ پیروکار کنیکٹیویٹی کے نقصان کے نتیجے میں پیغام کا نقصان نہیں ہوتا ہے، لیکن نیٹ ورک کے ٹھیک ہونے تک محض عارضی طور پر فالتو پن کو کم کرتا ہے۔ یہ، یقیناً، اگر ایک یا زیادہ نوڈس کھو جائیں تو ڈیٹا کے نقصان کا باعث بن سکتا ہے۔
اگر رابطہ ختم ہونے کی وجہ سے رہنما زوکیپر سے الگ ہو جاتا ہے، تو اس کے نتیجے میں پیغامات ضائع ہو سکتے ہیں acks = 1زوکیپر سے کنکشن کا فقدان دو لیڈروں کے ساتھ قلیل مدتی منطقی تقسیم کا سبب بنتا ہے۔ یہ مسئلہ پیرامیٹر سے حل ہوتا ہے۔ acks = تمام.
پیرامیٹر min.insync.replicas دو یا دو سے زیادہ نقلیں اضافی ضمانتیں فراہم کرتی ہیں کہ اس طرح کے قلیل مدتی منظرناموں کے نتیجے میں پیغام ضائع نہیں ہوگا، جیسا کہ منظرنامہ 6 میں ہے۔
پیغام کے نقصان کا خلاصہ
آئیے ان تمام طریقوں کی فہرست بنائیں جن سے آپ کافکا میں ڈیٹا کھو سکتے ہیں:
- کسی بھی رہنما کی ناکامی اگر پیغامات کا استعمال کرتے ہوئے تسلیم کیا گیا تھا۔ acks = 1
- قیادت کی کوئی بھی ناپاک منتقلی، یعنی ISR سے باہر کسی پیروکار کو، یہاں تک کہ اس کے ساتھ acks = تمام
- اگر پیغامات کے استعمال کی تصدیق ہو جائے تو رہنما کو زوکیپر سے الگ کر دیں۔ acks = 1
- لیڈر کی مکمل تنہائی، جس نے پہلے ہی آئی ایس آر گروپ کو اپنے تک محدود کر لیا ہے۔ تمام مواصلات بھی ختم ہو جائیں گے۔ acks = تمامیہ صرف اس صورت میں درست ہے۔ min.insync.replicas=1.
- تمام پارٹیشن نوڈس کی بیک وقت ناکامی۔ چونکہ پیغامات کو میموری سے تسلیم کیا جاتا ہے، کچھ کو ابھی تک ڈسک پر نہیں لکھا جا سکتا ہے۔ سرور ریبوٹ کے بعد، کچھ پیغامات غائب ہو سکتے ہیں۔
ناپاک قیادت کی تبدیلیوں کو یا تو ان پر پابندی لگا کر یا کم از کم دو کی فالتو پن کو یقینی بنا کر بچا جا سکتا ہے۔ سب سے مضبوط ترتیب ایک مجموعہ ہے۔ acks = تمام и min.insync.replicas 1 سے زیادہ.
RabbitMQ اور Kafka کی وشوسنییتا کا براہ راست موازنہ
وشوسنییتا اور اعلیٰ دستیابی کو یقینی بنانے کے لیے، دونوں پلیٹ فارم بنیادی اور ثانوی نقل کے نظام کو نافذ کرتے ہیں۔ تاہم، RabbitMQ میں Achilles کی ہیل ہے۔ ناکامی کے بعد دوبارہ جڑنے پر، نوڈس اپنے ڈیٹا کو ضائع کر دیتے ہیں، اور ہم وقت سازی کو مسدود کر دیا جاتا ہے۔ یہ دوہری ہچکچاہٹ RabbitMQ میں بڑی قطاروں کی پائیداری کو مشکوک بناتی ہے۔ آپ کو یا تو کم فالتو پن یا طویل مدتی بلاکنگ کو قبول کرنا پڑے گا۔ فالتو پن کو کم کرنے سے ڈیٹا کے بڑے پیمانے پر نقصان کا خطرہ بڑھ جاتا ہے۔ تاہم، اگر قطاریں چھوٹی ہیں، فالتو پن کی خاطر کنکشن کی دوبارہ کوششوں کے ساتھ غیر دستیابی کی مختصر مدت (چند سیکنڈ) کا انتظام کیا جا سکتا ہے۔
کافکا کو یہ مسئلہ نہیں ہے۔ یہ ڈیٹا کو صرف اس مقام پر ضائع کرتا ہے جہاں لیڈر اور پیروکار الگ ہوجاتے ہیں۔ تمام مشترکہ ڈیٹا محفوظ ہے۔ مزید برآں، نقل نظام کو مسدود نہیں کرتی ہے۔ لیڈر ریکارڈز کو قبول کرتا رہتا ہے جب کہ نیا پیروکار پکڑتا ہے، کلسٹر میں شامل ہونا یا دوبارہ شامل ہونا DevOps کے لیے ایک معمولی کام بناتا ہے۔ بلاشبہ، اب بھی چیلنجز ہیں، جیسے نقل کے دوران نیٹ ورک تھرو پٹ۔ اگر ایک ساتھ متعدد پیروکاروں کو شامل کیا جاتا ہے، تو آپ تھرو پٹ کی حد کو مار سکتے ہیں۔
RabbitMQ ایک کلسٹر میں ایک سے زیادہ سرورز کی بیک وقت ناکامیوں کے دوران قابل اعتمادی کے لحاظ سے کافکا کو پیچھے چھوڑ دیتا ہے۔ جیسا کہ پہلے ذکر کیا گیا ہے، RabbitMQ پبلشر کو تب ہی ایک اعتراف بھیجتا ہے جب ماسٹر اور تمام آئینوں پر ڈسک پر پیغام لکھا جاتا ہے۔ تاہم، یہ دو وجوہات کی بناء پر اضافی تاخیر کا تعارف کراتا ہے:
- fsync ہر چند سو ملی سیکنڈ میں
- آئینے کی ناکامی کا پتہ صرف ان پیکٹوں کے ٹائم ٹو لائیو کے بعد لگایا جا سکتا ہے جو ہر نوڈ (نیٹ ٹک) کی دستیابی کی جانچ پڑتال کرتے ہیں۔ اگر آئینہ سست یا نیچے ہے، تو یہ تاخیر میں اضافہ کرتا ہے۔
کافکا اس حقیقت پر انحصار کرتا ہے کہ اگر ایک پیغام کو متعدد نوڈس میں ذخیرہ کیا جاتا ہے، تو یہ پیغامات کو یاد کر سکتے ہیں جیسے ہی وہ میموری میں ہوں گے۔ اس سے کسی بھی قسم کے پیغامات کے ضائع ہونے کا خطرہ ہوتا ہے (یہاں تک کہ acks = تمام, min.insync.replicas=2) بیک وقت انکار کی صورت میں۔
مجموعی طور پر، کافکا اعلیٰ کارکردگی کا مظاہرہ کرتا ہے اور اسے کلسٹرز کے لیے زمین سے ڈیزائن کیا گیا ہے۔ اگر قابل اعتمادی کی ضرورت ہو تو پیروکاروں کی تعداد 11 تک بڑھائی جا سکتی ہے۔ نقل کا عنصر 5 ہے، اور مطابقت پذیری میں نقل کی کم از کم تعداد 1 ہے۔ min.insync.replicas=3 پیغام کے نقصان کو ایک بہت ہی نایاب واقعہ بنا دے گا۔ اگر آپ کا بنیادی ڈھانچہ نقل کے اس عنصر اور فالتو پن کی سطح کو سپورٹ کر سکتا ہے، تو آپ اس اختیار کا انتخاب کر سکتے ہیں۔
RabbitMQ کلسٹرنگ چھوٹی قطاروں کے لیے اچھا ہے۔ تاہم، بھاری ٹریفک میں چھوٹی قطاریں بھی تیزی سے بڑھ سکتی ہیں۔ جیسے جیسے قطاریں بڑی ہوتی جاتی ہیں، دستیابی اور وشوسنییتا کے درمیان سخت تجارت کی ضرورت ہوتی ہے۔ RabbitMQ کلسٹرنگ کم عام حالات کے لیے بہترین موزوں ہے، جہاں RabbitMQ کی لچک کے فوائد کلسٹرنگ کی کسی بھی خرابی سے کہیں زیادہ ہیں۔
بڑی قطاروں کے لیے RabbitMQ کی کمزوری کا ایک تریاق ان کو متعدد چھوٹی قطاروں میں تقسیم کرنا ہے۔ اگر آپ کو پوری قطار کی مکمل ترتیب کی ضرورت نہیں ہے، بلکہ صرف متعلقہ پیغامات (مثال کے طور پر، کسی مخصوص کلائنٹ کے پیغامات)، یا بالکل بھی آرڈر دینے کی ضرورت نہیں ہے، تو یہ طریقہ قابل قبول ہے: میرا پروجیکٹ دیکھیں۔ قطار کو تقسیم کرنا (منصوبہ ابھی ابتدائی مراحل میں ہے)۔
آخر میں، RabbitMQ اور Kafka دونوں کے جھرمٹ اور نقل کے میکانزم میں بہت سے کیڑے کے بارے میں مت بھولنا۔ وقت گزرنے کے ساتھ، سسٹمز زیادہ پختہ اور مستحکم ہو گئے ہیں، لیکن کوئی بھی پیغام نقصان سے 100% محفوظ نہیں رہے گا! مزید برآں، ڈیٹا سینٹرز میں بڑے پیمانے پر آفات ہوتی ہیں!
اگر میں نے کچھ یاد کیا ہے، غلطی کی ہے، یا آپ کسی بھی نکات سے متفق نہیں ہیں، تو براہ کرم بلا جھجھک کوئی تبصرہ کریں یا مجھ سے رابطہ کریں۔
مجھ سے اکثر پوچھا جاتا ہے، "مجھے کس چیز کا انتخاب کرنا چاہیے، کافکا یا RabbitMQ؟" یا "کون سا پلیٹ فارم بہتر ہے؟" سچ تو یہ ہے کہ یہ واقعی آپ کی صورتحال، آپ کے موجودہ تجربے وغیرہ پر منحصر ہے۔ میں اپنی رائے پیش کرنے میں ہچکچاہٹ محسوس کرتا ہوں، کیونکہ استعمال کے تمام معاملات اور ممکنہ حدود کے لیے ایک ہی پلیٹ فارم کی سفارش کرنا ایک حد سے زیادہ آسان ہو گا۔ میں نے مضامین کی یہ سیریز لکھی ہے تاکہ آپ اپنی رائے قائم کر سکیں۔
میں کہوں گا کہ دونوں نظام اس میدان میں رہنما ہیں۔ میں تھوڑا متعصب ہو سکتا ہوں، کیونکہ میرے پروجیکٹس کے ساتھ میرے تجربے نے مجھے پیغام کی ضمانت اور قابل اعتمادی جیسی چیزوں پر زیادہ اہمیت دی ہے۔
میں دوسری ٹیکنالوجیز دیکھتا ہوں جن میں اس قابل اعتماد اور ضمانت شدہ آرڈر کی کمی ہے، پھر میں RabbitMQ اور Kafka کو دیکھتا ہوں اور مجھے ان دونوں سسٹمز میں ناقابل یقین قدر نظر آتی ہے۔
ماخذ: www.habr.com
