सेंसर सरणी से भारी मात्रा में डेटा संग्रहीत करना


14

मुझे डेटा सैंपल को विशाल सेंसर एरे से स्टोर करने के लिए एक समाधान (ऐप और डीबी) को लागू करने का काम सौंपा गया है। सरणी में वर्तमान में लगभग 20,000 सेंसर हैं, लेकिन यह जल्द ही बढ़ने वाला है, 100,000 सेंसर तक। प्रत्येक सेंसर प्रत्येक 10 सेकंड में एक डेटा नमूना भेजता है और प्रत्येक नमूना आकार में 28 बाइट्स होता है।

इस प्रकार योग करने से निम्न होता है:

  • प्रति दिन प्रति संवेदक 8640 नमूने
  • प्रति दिन प्रति सेंसर 242kB डेटा
  • प्रति दिन 864 मिलियन नमूने

अब मैं सोच रहा था कि डेटा को संग्रहीत / पुनः प्राप्त करने का सबसे अच्छा तरीका क्या होगा? सॉफ़्टवेयर के पहले ही निर्दिष्ट किए जाने के बाद मैं इस प्रोजेक्ट से "जुड़ गया", इसलिए इसे SQL सर्वर का उपयोग करके Windows प्लेटफ़ॉर्म पर लागू करने की आवश्यकता है।

मेरे सिर में वर्तमान समाधान डेटा नमूनों को संग्रहीत करने के लिए दो तालिकाओं के साथ एक डीबी बनाना है। पहला दूसरे में एक इंडेक्स के एक प्रकार के रूप में कार्य करता है जो प्रति दिन प्रति संवेदक के आधार पर बाइनरी फ़ील्ड में एकत्रित नमूनों को संग्रहीत करता है:

Table 1:

  RecordID - BigInt - Identity
  SensorID - BigInt - Primary Key
  Date - DateTime - Primary Key (yyyy-mm-dd)

Table 2:

  RecordID - BigInt - Primary Key (from an insert into Table 1)
  Data - Binary 

मूल रूप से मैं सभी सेंसर से अस्थायी फाइलों (1 प्रति सेंसर) में नमूने लिखूंगा। प्रत्येक दिन के अंत में मैं तब तालिका 1 में एक प्रविष्टि बनाऊंगा, उत्पन्न RecordID का उपयोग करूँगा और तालिका 2 में डेटा फ़ील्ड में फ़ाइल को डंप कर दूंगा।

इस तरह मैं 864 मिलियन प्रविष्टियों के बजाय प्रति दिन तालिका में केवल 100,000 प्रविष्टियों के साथ समाप्त होता हूं। डेटा लैन या हाई स्पीड वैन पर उपलब्ध होना चाहिए, इसलिए पूरे दिन के आधार पर सेंसर डेटा की पुनर्प्राप्ति स्वीकार्य होगी।

हालाँकि सभी डेटा को संग्रहीत करना पड़ता है, लेकिन इसका अधिकांश हिस्सा शायद कभी नहीं पढ़ा जाएगा। अतः सारणी पर पठन की मात्रा, लिखावट से अधिक नहीं होगी।

मुझे पता है कि मैं डेटा फ़ाइलों के लिए पथ को संग्रहीत करके फ़ाइल सिस्टम का उपयोग करके कुछ लागू कर सकता हूं, लेकिन मैंने पढ़ा है कि SQL सर्वर एनटीएफएस को बेहतर बनाता है जबकि आपके बाइनरी फ़ील्ड कम से कम 256kB के लिए धन्यवाद हैं। (एक ग्रे क्षेत्र 256kB और 1MB के बीच मौजूद है, जबकि NTFS अब तक बाइनरी साइज़> 1 MB के लिए SQL सर्वर से बेहतर प्रदर्शन करता है)।

मैं भी अपनी फ़ाइलों में 100,000 सेंसर से डेटा संग्रहीत करने से थोड़ा सावधान हूं, क्योंकि फ़ाइल सिस्टम में किसी फ़ोल्डर में बड़ी मात्रा में फ़ाइलें होने से, या प्रत्येक फ़ोल्डर में कुछ फ़ाइलों के साथ एक जटिल ट्री संरचना होने से समस्या नहीं होती है, जबकि नहीं यहां तक ​​कि फ़ाइल के विखंडन को भी ध्यान में रखते हुए।

  1. क्या कोई मुझे ऊपर की कुछ व्यावहारिक सलाह / टिप्पणियां दे सकता है?

  2. वहाँ स्पष्ट नुकसान है कि मैं में गिरने जा रहा हूँ?

  3. नमूना डेटा काफी अच्छी तरह से संपीड़ित करता है। 242 kB फ़ाइल लगभग 85kB तक संपीड़ित होती है। लेकिन क्या मैं डेटाबेस स्तर पर कुछ प्रकार के संपीड़न को लागू कर सकता हूं ताकि नमूना डेटा (स्तंभ) स्वचालित रूप से संपीड़ित हो जाए?

  4. SQL सर्वर इस परियोजना के लिए एक स्पष्ट रूप से गलत विकल्प है?

  5. क्या मेरा डिज़ाइन दो तालिकाओं का है, या क्या मैं इसे एक ही तालिका में संयोजित कर सकता हूँ जो अभी भी दो तालिकाओं के रूप में "प्रदर्शनकारी" होगी?


5
SQL सर्वर इस तरह की चीजों के लिए पंक्ति-स्तर और तालिका-स्तरीय संपीड़न का समर्थन करता है।
JNK

2
चूंकि केवल 1 प्रविष्टि / सेंसर / दिन है, क्या आपको टेबल 1 की आवश्यकता है?
गांगेयजेलो

2
एक बार डेटाबेस में आने के बाद आप इस डेटा के साथ क्या करने की योजना बना रहे हैं? मैं एक द्विआधारी प्रारूप में सेंसर डेटा को एकत्र करने में सक्षम होने की कल्पना नहीं कर सकता, कम से कम आसानी से या जल्दी से उन स्तरों पर नहीं।
डेटागोड

1
100,000 सेंसर X 10 नमूने प्रति सेकंड X 28Bytes प्रति नमूना x 24 घंटे प्रति दिन = 2.2TB प्रति दिन। यह दो तालिकाओं में डालने के लिए बहुत कुछ है।
डेटागोड

2
@AlexKuznetsov: मैं स्वयं SQL सर्वर पसंद के बारे में सोच रहा था, लेकिन वे Microsoft सोने के भागीदार हैं, इसलिए मुझे लगता है कि इसका मुख्य कारण है।
ओलिवर

जवाबों:


12

हां, एक बहुत बड़ी गड़बड़ी है जिसे आप काफी तेजी से चलाने जा रहे हैं, और यह तालिकाओं के आकार और रखरखाव के साथ है। आप यह कहकर कुछ हद तक सही रास्ते पर हैं कि आप अपने डेटा को एक अस्थायी तालिका में दैनिक रूप से डालना चाहते हैं, और फिर इसे अपनी स्थायी तालिका में स्थानांतरित कर सकते हैं, लेकिन आप जल्द ही इस योजना के साथ परेशानी में पड़ जाएंगे।

उदाहरण के लिए, मान लें कि आप दो साल के बाद सबसे पुराने महीने के डेटा को "रोल ऑफ" करना चाहते हैं। अपने डिजाइन में, आपको अपनी बड़ी, बड़ी तालिका के खिलाफ एक DELETE विवरण जारी करना होगा। यह संभवत: कुछ धीमा होगा, जो आपके पास अनुक्रमणिकाओं की संख्या पर निर्भर करेगा। इसके अलावा, यह सूचकांक विखंडन का कारण होगा, और इसे ठीक करने का एकमात्र तरीका यह होगा कि यह बहुत बड़ी मेज पर सूचकांक का पुनर्निर्माण या पुनर्गठन करे जिससे प्रदर्शन की समस्या भी हो। एक बड़े एकल टेबल प्रकार के डिजाइन के साथ अन्य मुद्दों की एक पूरी मेजबानी भी है। उदाहरण के लिए, एक बड़ी, एकल तालिका के साथ, आप FILEGROUP आधारित बैकअप नहीं कर सकते हैं , जिसका अर्थ है कि यदि आप अपने डेटाबेस का पूर्ण बैकअप चाहते हैं, तो यह बड़ा होने वाला है, और इसे पूरा होने में लंबा समय लगने वाला है।

इसका क्या उपाय है? तालिका विभाजन। इसके बारे में गहराई से पढ़ें, जितनी भी जगहों पर आप कर सकते हैं। असल में, विभाजन आपको अपने डेटा को "तालिकाओं के भीतर तालिकाओं" पर विभाजित करने की अनुमति देता है - प्रत्येक विभाजन एक ही स्कीमा साझा करता है, और तालिका ऑब्जेक्ट के माध्यम से एक्सेस किया जाता है, लेकिन अलग-अलग अनुक्रमित और बनाए रखा जा सकता है। विभाजन मूल रूप से टेबल होते हैं, कुछ उपयोगी कुंजी द्वारा काट दिए जाते हैं। आपके मामले में यह संभवत: तारीख होगी। उन्हें टेबल की तरह ही (और जैसे ही तेज) गिराया जा सकता है, जिसका अर्थ है कि यदि आप तारीख तक अपने बड़े डेटा टेबल को विभाजित करते हैं, तो आप बस पुराने विभाजन को तुरंत छोड़ सकते हैं, किसी अन्य विभाजन पर अनुक्रमित पर कोई प्रतिकूल प्रभाव नहीं डाल सकते हैं। आप अलग-अलग फ़ाइलग्रुप पर विभाजन डाल सकते हैं, जिसका अर्थ है कि पुराने विभाजन को लुढ़काया जा सकता है, या अगर यह आमतौर पर उपयोग नहीं किया जाता है, तो सस्ती वस्तु भंडारण पर लुढ़का हुआ है। पिछले नहीं बल्कि कम से कम, SQL 2012 में आप 'अपने पुराने, रीड-ओनली विभाजन पर, सक्रिय विभाजन पर एक अलग, अधिक सम्मिलित-उन्मुख अनुक्रमण स्कीम होने के दौरान, जहाँ आप अपने सभी सेंसर डेटा को सम्मिलित कर रहे हैं।

उम्मीद है की यह मदद करेगा। विभाजन योजनाओं और योजनाओं के विभाजन के संबंध में आपके पास अच्छी मात्रा में शोध है, लेकिन उम्मीद है कि अब आपको वह दिशा पता होगी जिसकी आपको तलाश है।

पुनश्च: ओह, और मैं आपके सवालों की बुलेटेड सूची को भूल गया ... उत्तर 1, 2, और 5. ऊपर देखें। उत्तर 3: SQL सर्वर में, आप विभाजन के आधार पर एक विभाजन पर संपीड़ित कर सकते हैं, इसलिए पृष्ठ संपीड़न का उपयोग करके अपने पुराने विभाजन को आक्रामक रूप से संपीड़ित करें। लेकिन मेरा मानना ​​है कि यदि आप ऐसा करते हैं तो आपके आउट-ऑफ-द-रो बड़े डेटा प्रकार संकुचित नहीं होंगे - फिर से, आप अपने सेंसर मानों को सामान्य करके इस समस्या को कम करना चाह सकते हैं। उत्तर 4: बिलकुल नहीं, लेकिन अगर आप करना चाहते हैं तो दिन के हिसाब से स्टैटिक डेटा स्टोर करें और कभी भी किसी अन्य तरीके से उस पर सर्च न करें, कम्प्रेस्ड फ्लैट फाइल्स का जाना बहुत आसान तरीका हो सकता है।

PPS: ओह, और एक और बात। यह सब काम करने के लिए आपको अपने दो-टेबल समाधान की आवश्यकता नहीं है। बड़े बाइनरी सेंसर डेटा प्रकार VARBINARY (MAX) के होने चाहिए क्योंकि इसके मान " पंक्ति से बाहर " संग्रहीत किए जा सकते हैं लेकिन फिर भी एक तालिका में एक स्तंभ हो सकता है ( sp_tableoption प्रलेखन देखें )। आप अपने कुछ सेंसरों के डेटा को बाइनरी डेटा जो कि आपके पास टेबल में है, को सामान्य बनाने पर विचार करना चाह सकते हैं, हालाँकि, यदि आप नहीं करते हैं तो आपका डेटाबेस सेंसर डेटा के चांस को पुनः प्राप्त करने से परे बहुत अच्छा नहीं होगा।


बहुत बढ़िया जानकारी, धन्यवाद। इस उदाहरण में "सामान्यीकृत" के साथ आपका क्या मतलब है, मैं पूरी तरह से निश्चित नहीं हूं। हालांकि मैं मानता हूं कि आपका मतलब है कि मुझे डेटा चंक्स में कुछ अधिक उपयोगी क्षेत्रों को निकालना चाहिए और उन्हें अपने कॉलम में संग्रहीत करना चाहिए। यदि ऐसा है, तो इसका कारण यह है कि मैं शुरू में ऐसा नहीं करना चाहता था, इसका मतलब है कि मैं प्रति दिन 864 मिलियन पंक्तियों के साथ समाप्त करूंगा। सब कुछ समेटना और इसे एक चंक में संग्रहित करने का अर्थ है प्रति दिन केवल 100,000 पंक्तियाँ। या कोई बेहतर तरीका है ?
ओलिवर

1
यदि आप एक डेटाबेस का उपयोग कर रहे हैं, तो हाँ, मेरा वास्तव में यही मतलब है। अगर आपके पास सही हार्डवेयर, इंडेक्सिंग स्कीम और इसे काम करने के लिए विभाजन योजना है तो प्रति दिन 864 मिलियन पंक्तियों को कुशलता से निपटाया जा सकता है। यह सब इस बात पर निर्भर करता है कि आपकी आवश्यकताएं वास्तव में क्या हैं, और आप इन सभी डेटा को क्यों संग्रहीत कर रहे हैं। यदि यह सिर्फ अभिलेखीय उद्देश्यों के लिए है, तो बाइनरी कॉलम ठीक है। यदि आप SQL सर्वर का उपयोग करके व्यावसायिक मूल्य निकालना चाहते हैं, तो यह एक पूरी तरह से अलग कहानी है।
डेव मार्कल

0

एक Hadoop समाधान पर विचार करें। 2 टीबी / दिन जल्दी जोड़ता है। इसके अलावा केवल डेल्टा रिकॉर्ड लॉगिंग पर विचार करें, यानी एक गहन मूल्य, और उसके बाद ही जब कोई परिवर्तन होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.