प्लग खेचून टाका. किलस्विच दाबा. हे उपजत गुण तेव्हा काम करतात जेव्हा तुम्ही एका मशीनजवळ उभे असता. पण जेव्हा तुमचे AI सिस्टम तीन अवेलेबिलिटी झोनमध्ये पसरलेल्या पन्नास नोड्सवर चालते, तेव्हा ते अपयशी ठरतात. बहुतेक इंजिनिअरिंग टीम्स हे कडू अनुभवातून शिकतात. ते एका मध्यवर्ती डेटाबेसमध्ये बदल करतात, एका बुलियन व्हॅल्यूला true वरून false मध्ये बदलतात आणि सिस्टीम थांबेल असे मानतात. पण तसे होत नाही. डेटाबेस स्वच्छ दिसतो. सर्व्हिस अजूनही चालू असते.
एका स्विचचा आभास
एका कंट्रोलरची कल्पना करा जो epoch 12 मध्ये रिव्होकेशन (रद्द करणे) नोंदवतो. तो हा बदल एका पर्सिस्टंट स्टोअरमध्ये (persistent store) लिहितो आणि सुटकेचा निश्वास सोडतो. दरम्यान, Worker B हा epoch 11 च्या कॅश्ड ग्रँटवर (cached grant) चालत असतो. त्या वर्करला ही सूचना कधीच मिळाली नाही. तीस सेकंदांनंतर, तो मॉडेल इन्फरन्स जॉब सुरू करतो, GPU क्लस्टर सुरू करतो किंवा बाह्य API ला कॉल करतो. ऑडिट लॉग सांगतो की ॲक्सेस रद्द करण्यात आला होता. तरीही ती क्रिया घडते.
हा पर्सिस्टन्स (persistence) आणि प्रोपॅगेशन (propagation) मधील फरक आहे. डेटाबेसमध्ये लिहिणे म्हणजे सिस्टीमची स्थिती (system state) नव्हे. ते एका टेबलमधील एक रो (row) आहे, आणि तुमच्या सिस्टीममधील अनेक ॲक्टर्सना ज्या क्षणी गरज असते, त्याच क्षणी त्या टेबलची तपासणी (poll) करण्याची गरज नसते. जर तुम्ही इमर्जन्सी स्टॉपला लाइट स्विचप्रमाणे मानले, तर तुम्हाला समजेल की खोलीच्या काही कोपऱ्यांत अंधार कधीच येत नाही.
डिस्ट्रिब्युटेड सिस्टिम्सचे कडू वास्तव
तुम्हाला अपयशासाठी (failure) डिझाइन करावे लागेल. केवळ अधूनमधून होणाऱ्या अपयशासाठी नाही, तर सतत, गोंधळलेल्या आणि स्वतंत्र अपयशासाठी. वर्कर्स काम सुरू असतानाच रीबूट होतात. क्यू कन्स्युमर्स (queue consumers) मिनिटांच्या फरकाने मागे पडतात. एक रेप्लिका (replica) अडकल्यामुळे ऑथोरायझेशन सर्व्हिसेस जुना डेटा (stale data) देतात. मेसेजेस ड्युप्लिकेट होतात. मेसेजेस गायब होतात. मेसेजेस चुकीच्या क्रमाने येतात. तुमचा NTP डेमन (daemon) ड्रिफ्ट होतो आणि अचानक एक नोड इतर नोड्सपेक्षा दहा सेकंद मागे असल्याचे समजतो. घड्याळांमध्ये त्रुटी असतात आणि इव्हेंट्सचा क्रम ठरवण्यासाठी तुम्ही 'वॉल टाइम'वर (wall time) विश्वास ठेवू शकत नाही.
जर तुमचा इमर्जन्सी प्रोटोकॉल विश्वसनीय नेटवर्क, क्रमाने मेसेज डिलिव्हरी किंवा सिंक्रोनाइझ्ड घड्याळांवर अवलंबून असेल, तर तो प्रोटोकॉल नाही. ती केवळ एक इच्छा आहे. वर्कर्स, क्यू कन्स्युमर्स आणि ऑथोरायझेशन सर्व्हिसेस स्वतंत्रपणे निकामी होतात. तुमची सुरक्षा नियमावली (safety rules) पायाभूत सुविधा (infrastructure) प्रतिकूल असतानाही पाळली गेली पाहिजे.
प्रत्यक्षात काम करणारे पाच नियम
सुरक्षा ही अशा 'इनव्हेरिएंट्स'मधून (invariants) येते जे गोंधळातही टिकून राहतात. रिव्होकेशन हे केवळ कागदोपत्री न राहता प्रत्यक्षात लागू व्हावे यासाठी खालील नियम पाळा:
कोणतीही क्रिया रिव्होकेशन इपॉकपेक्षा (revocation epoch) कमी इपॉक असलेल्या ग्रँटसह सुरू होऊ नये.
हे तुमचे मुख्य सुरक्षा कवच (guardrail) आहे. प्रत्येक परमिशन ग्रँटसोबत एक इपॉक नंबर असतो. प्रत्येक रिव्होकेशनसोबत एक नवीन नंबर असतो. कोणताही वर्कर कृती करण्यापूर्वी, तो या नंबरची तुलना करतो. जर वर्करचा ग्रँट त्याने पाहिलेल्या नवीनतम रिव्होकेशनपेक्षा जुना असेल, तर वर्कर थांबतो. इपॉक्स तुम्हाला एक लॉजिकल क्लॉक (logical clock) देतात ज्यासाठी सिस्टीम क्लॉकची गरज नसते. ज्या वर्करकडे इपॉक 11 आहे, त्याला इपॉक 12 ने मूळ अधिकार रद्द केले आहेत हे समजताच काम करण्यास नकार द्यावा लागेल.
कॅश्ड ग्रँट्स (Cached grants) एका निश्चित कालमर्यादेत संपले पाहिजेत.
परमिशन मेमरीमध्ये कायमस्वरूपी राहू नये. एका ठराविक कालावधीनंतर वर्कर्सना त्यांचे अधिकार पुन्हा पडताळून (revalidate) पाहावे लागतील किंवा ते सोडावे लागतील. याशिवाय, ऑफलाइन गेलेला नोड काही दिवस किंवा आठवड्यांनंतर पुन्हा सुरू होऊन जुन्या (fossilized) ग्रँटचा वापर करून कृती करू शकतो. एक लीज (lease) सेट करा. त्याचे काटेकोरपणे पालन करा. वेळ हे तुमचे स्वयंचलित क्लिनअप क्रू (cleanup crew) बनेल.
सिस्टीम रीस्टार्ट केल्यामुळे सेव्ह केलेला इपॉक कमी होऊ शकत नाही.
पर्सिस्टन्स महत्त्वाचे आहे. जर कंट्रोलर क्रॅश झाला आणि पुन्हा सुरू झाला, तर त्याने आतापर्यंत जारी केलेला सर्वोच्च इपॉक पुन्हा मिळवला पाहिजे. जुन्या इपॉकवर परत जाणे म्हणजे रद्द केलेले परमिशन पुन्हा जिवंत करणे होय, जणू काही इमर्जन्सी स्टॉप कधी झालाच नव्हता. इपॉक ब्रॉडकास्ट करण्यापूर्वी तो सुरक्षितपणे स्टोअर करा. यासाठी 'राईट-अहेड लॉग' (write-ahead log), कन्फर्मड 'fsync' किंवा 'रेप्लिकेटेड कन्सेन्सस ग्रुप' (replicated consensus group) वापरा. इतिहास नेहमी पुढेच जातो.
ड्युप्लिकेट रिव
