नोट: जैसा हमेशा है, मेरा सभी सार्वजनिक लेखन मुझसे हाथ से लिखा गया है।
अवलोकन
एक ब्लूम फिल्टर एक प्रायिक संकेत डेटा संरचना है जो आपको तेज़ी और सस्ते में जवाब देने देती है "क्या इस सेट में कुंजी X है?" या "निश्चित रूप से नहीं" या "शायद". आप एक ऐसी फॉल्स पॉज़िटिव दर चुनते हैं जो आपके वज़न और हार्डवेयर के लिए स्वीकार्य है, सेट में कुंजियों को जोड़ते हैं, और बाद में उनकी उपस्थिति की जाँच करते हैं। ब्लूम फिल्टर सेट कार्डिनैलिटी की तुलना में कम मेमोरी का उपयोग करते हैं और गणनात्मक रूप से बहुत सस्ते हैं। इन कारणों से, वे उच्च प्रदर्शन वाले डेटा सिस्टम में बारंबार उपयोग किए जाते हैं। उदाहरण के लिए, डेटाबेस एक इन-मेमोरी ब्लूम फिल्टर रख सकता है और रो बनाते समय डिस्क पर जाने से पहले इसकी जाँच कर सकता है। यह बहुत सारे बहुत धीमे डिस्क IO बचाता है। हम इन्हें ब्लूस्काई बैकएंड के कई स्थानों पर भी उपयोग करते हैं। यह हमें ब्लूस्काई डेटाबेस के विरुद्ध ब्लॉक्स, म्यूट्स, लेबल और अधिक ढूंढते समय लाखों क्वेरीज बचाने देता है। उदाहरण के लिए, अक्सर हम यह पूछ सकते हैं "क्या उपयोगकर्ता X ने उपयोगकर्ता Y को ब्लॉक किया है?" बिना डेटाबेस को छूए।
यहाँ हमारे कुछ ब्लूम फिल्टर सकारात्मक हिट दर के पिछले कई दिनों के ग्राफ़ हैं:
ऊपरी पीली रेखा लगभग 1% की सकारात्मक दर दर्शाती है, जिसका अर्थ है कि 99% समय, हम अपने डेटाबेस की पूछताछ पूरी तरह से छोड़ सकते हैं। यह हमारी साइट को स्केल करने और कम लागत में चलाने की हमारी क्षमता के लिए आवश्यक था।
पारंपरिक ब्लूम फिल्टर
एक ब्लूम फिल्टर बिट्स की एक एरे और k हैश फ़ंक्शन है। आप एरे के आकार और k को पहले से चुनते हैं, और अपने वज़न के अनुसार इसे सही ढंग से आकार देना चाहिए ताकि विशिष्ट फॉल्स पॉज़िटिव दर प्राप्त हो सके। एक कुंजी को सेट में जोड़ने के लिए, इसे k हैश फ़ंक्शन के माध्यम से चलाएं और प्रत्येक स्थान पर बिट्स सेट करें। यह जाँचने के लिए कि एक कुंजी सेट में है या नहीं, इसे k बार हैश करें और बिट एरे में प्रत्येक परिणाम स्थान की जाँच करें। यदि कोई भी बिट शून्य है, तो यह कुंजी कभी नहीं जोड़ी गई थी। यदि सभी बिट्स 1 पर सेट हैं, तो यह सेट में हो सकता है।
डबल हैशिंग
जबकि डिस्क पर जाने की तुलना में बहुत सस्ता है, प्रत्येक कुंजी के लिए k स्वतंत्र हैश गणना करना अभी भी बहुत हाई परफॉर्मेंस सिस्टम के लिए थोड़ा महंगा है। 2008 में, Kirsch और Mitzenmacher ने एक पेपर प्रकाशित किया जिसमें दर्शाया गया था कि दो हैश आपको एक ही आउटपुट दे सकते हैं। गणित मेरे सिर के ऊपर से बहुत अधिक है, लेकिन यदि आप i-वीं स्थान को (hash_1 + i*hash_2) % n के रूप में निकालते हैं, तो फॉल्स पॉज़िटिव दर प्रभावी रूप से k स्वतंत्र हैश के उपयोग के समान है। पहूँच!
bits-and-blooms/bloom द्वारा Daniel Lemire (मेरा एक बहुत बड़ा प्रेरणा स्रोत, आपको चाहिए चाहिए उसकी किताब) द्वारा रखा गया है एक एक अद्भुत डबल हैश ब्लूम फिल्टर कार्यान्वयन जो Go में लिखा गया है। यह 128-बिट murmur3 को दो बार चलाता है ताकि चार 64-बिट मान प्राप्त हों, फिर उन्हें संयोजित करके सभी k बिट स्थानों का उत्पादन करें। हम इसे ब्लूस्काई में उत्पादन में ढूंढ रहे थे।
ब्लूस्काई बैकएंड के लिए, हम बुनियादी तौर पर हर बार एक प्रक्रिया शुरू होती है, SELECT * FROM blocks, mutes, list items, आदि करते हैं और सभी आइटम को ब्लूम फिल्टर में जोड़ते हैं। साथ ही एक वास्तविक समय atproto firehose उपभोक्ता ब्लूम फिल्टर में आइटम सम्मिलित कर रहा है (यहाँ तक कि प्रक्रिया स्टार्टअप के दौरान), इसलिए यदि आप सावधान नहीं हैं तो एक रेस कंडीशन हो सकती है। bits-and-blooms लाइब्रेरी की समस्या यह है कि यह आंतरिक रूप से थ्रेड-सुरक्षित नहीं है, इसलिए हमें ब्लूम फिल्टर एक्सेस को एक म्यूटेक्स के भीतर लपेटना पड़ता था अन्यथा हम डेटा रेस का भोग नहीं उठा सकते। pprof ने दिखाया कि म्यूटेक्स कंटेंशन वास्तव में प्रक्रिया शुरू करने में बंधक पड़ रहा था। एक ही डिप्लॉय 90 मिनट लेने वाला था पूरी तरह से बंद करने के लिए इसके कारण! इसलिए मेरा सहयोगी Jasmine ने लाइब्रेरी का फोर्क किया और atomic-bloom बनाया, जो CPU पर अैटमिक निर्देशों का उपयोग करके वही तार्किकता करता है, लेकिन सुरक्षित और बिना म्यूटेक्स के। इसने कम कंटेंशन की ओर ले गया और म्यूटेक्स-आधारित दृष्टिकोण की तुलना में बहुत तेज़ था। हमारे डिप्लॉय 90 मिनट से लगभग 15 मिनट हो गए, जिससे हमें तेज़ी से और अधिक विश्वास के साथ शिप करने में सक्षम हुए। अद्भुत!
एक ही हैश
क्या हम और आगे बढ़ सकते हैं? ब्लूस्काई के लिए, जवाब नहीं है। कंटेंशन हमारी मूल समस्या थी, न कि हैश फ़ंक्शन की संख्या या अन्य कारक, इसलिए Amdahl के नियम के अनुसार हमने कोई अतिरिक्त लाभ नहीं पाया...
स्रोत: Hacker News · HeadlinesBriefing द्वारा सारांशित