2011-03-29 7 views
5

मैं कई नेटवर्क कंप्यूटर पर कई प्रक्रियाएं एक साथ SQLA डेटाबेस 1.4.92.1 के माध्यम से एक ही SQLite डेटाबेस तक पहुंचना चाहता हूं। लेखन कम होगा, इसलिए SQLite का एकल-लेखन डिज़ाइन कोई समस्या नहीं होनी चाहिए।OpenAFS लॉकिंग के साथ SQLite संगत?

मैं जानना चाहता हूं कि यह संभव है या नहीं। मुझे जानकारी के दो महत्वपूर्ण टुकड़ों का पता लगाने में परेशानी हो रही है:

SQLite documentation बताता है कि "SQLite यूनिक्स पर लॉकिंग लागू करने के लिए POSIX सलाहकार ताले का उपयोग करता है"। यह भी चेतावनी देता है कि "आपकी सबसे अच्छी रक्षा नेटवर्क फाइल सिस्टम पर फ़ाइलों के लिए SQLite का उपयोग नहीं करना है"। हालांकि, यह निर्दिष्ट नहीं लगता है कि SQLite केवल पूर्ण-फ़ाइल लॉकिंग का उपयोग करता है, या यह बाइट-रेंज लॉकिंग का भी उपयोग करता है या नहीं।

मुझे यह भी पता चल रहा है कि किस प्रकार के लॉकिंग OpenAFS 1.4.12.1 का समर्थन करता है। यह unofficial source from 1998 दुर्भाग्यवश सबसे अच्छा स्रोत है जिसे मैं ढूंढने में सक्षम हूं। उसके बाद, पूर्ण-फ़ाइल लॉकिंग समर्थित थी लेकिन बाइट-रेंज लॉकिंग नहीं थी।

आधिकारिक दस्तावेज केवल this page बदल जाता है, जो इसके अनुकूल शीर्षक के बावजूद वास्तव में कुछ भी नहीं कहता है कि पॉज़िक्स बाइट-रेंज सलाहकार लॉकिंग नवीनतम ओपनएएफएस द्वारा समर्थित है या नहीं।

संपादित करें: क्या यह संभव है? यदि हां, तो क्या कोई संकलन-समय SQLite झंडे की आवश्यकता है?

उत्तर

5

मैं कुछ समय के लिए SQLite का उपयोग कर रहा हूं और कुछ लॉकिंग मुद्दों से निपटने का "भाग्य" है। मुझे पूरा यकीन है कि SQLite डिफ़ॉल्ट रूप से यूनिक्स फाइल सिस्टम पर बाइट-रेंज लॉक का उपयोग करता है।

अधिक सटीक होने के लिए, इसमें कुछ वैकल्पिक लॉकिंग विधियों के लिए कोड शामिल है (उदाहरण के लिए flock() और dotlock-style पूर्ण-फ़ाइल ताले का उपयोग करना)। SQLITE_ENABLE_LOCKING_STYLE option के साथ संकलित होने पर यह अंतर्निहित फाइल सिस्टम के लिए उचित लॉकिंग विधि को स्वत: पहचानने का प्रयास करता है।

ऑटो-डिटेक्शन कोड में कुछ हार्ड-कोड किए गए केस होते हैं (उदा। "यूएफएस", "एनएफएस" और "एसएमबीएफएस"), इनमें से कोई भी एएफएस नहीं है। यदि कोई हार्ड-कोडेड केस मेल नहीं खाता है, तो SQLite fcntl() का उपयोग कर फ़ाइल पर बाइट-रेंज लॉक प्राप्त करने का प्रयास करता है। यह तब मानता है कि यदि fcntl() कॉल सफल होता है, तो बाइट-रेंज लॉक उपलब्ध हैं।

यहां ओपनएएफएस चीजें बनाने के लिए आता है दिलचस्प। स्पष्ट रूप से ([1], [2], [3]) ओपनएएफएस में लंबा बाइट-रेंज लॉक के बारे में उपयोगकर्ता स्पेस अनुप्रयोगों के झूठ बोलने का इतिहास है। आउच:

/* next line makes byte range locks always succeed, 
* even when they should block */ 
if (af->l_whence != 0 || af->l_start != 0 || af->l_len != 0) { 
    DoLockWarning(); 
    afs_PutFakeStat(&fakestate); 
    return 0; 
} 

एक शब्द में: openafs-1.4.14 स्रोत कोड से!

यह बाइट-रेंज ताले सफल होने के लिए अनुमति देता है इससे कोई फर्क नहीं पड़ता। लिनक्स पर, यह अनुमानतः और भी बदतर है: यह उसी सिस्टम की प्रक्रियाओं के बीच बाइट-रेंज लॉक प्रदान करने के लिए कर्नेल इंफ्रास्ट्रक्चर का उपयोग करता है। इसका मतलब यह है कि कोई एप्लिकेशन केवल एक नई प्रक्रिया को फोर्क नहीं कर सकता है और लॉकिंग तंत्र का परीक्षण कर सकता है - बाइट-रेंज लॉक ठीक काम करने लगते हैं, जबकि रिमोट प्रोसेस से फ़ाइल की सुरक्षा के लिए बेहद असफल हो जाते हैं।

संक्षेप में: आप OpenAFS के साथ एक असम्बद्ध SQLite विश्वसनीय रूप से उपयोग नहीं कर सकते हैं। अधिकांश अन्य नेटवर्क फाइल सिस्टम में भी समस्याएं हैं, इसलिए पूरी तरह से नेटवर्क फाइल सिस्टम से बचने की सिफारिश है।

कुछ संभव किसी विशेष क्रम में काम arounds:

  • एक उचित डीबीएमएस, इस तरह के PostgreSQL के रूप में प्रयोग करें। यदि ऐसा करना संभव है, तो आप लंबे समय तक बेहतर हो जाएंगे।

  • एक पूर्ण उड़ा डीबीएमएस ओवरकिल होने पर, अपने आवेदन के लिए अपने सर्वर को कार्यान्वित करें।

  • SQLA स्रोत कोड को डिफ़ॉल्ट रूप से flock() पर OpenAFS पर संशोधित करें। मुझे यकीन नहीं है कि यह ठीक से काम करेगा, क्योंकि ओपनएएफएस का एक लंबा इतिहास है ([1], [2]) सादा-पुराने flock() के साथ भी लॉकिंग समस्याओं के, लेकिन जब तक आप इसका परीक्षण नहीं करेंगे तब तक आपको पता नहीं चलेगा।

  • कर्नेल के माध्यम से जाने के बजाय ओपनएएफएस उपयोगकर्ता स्पेस का उपयोग करके SQLite के लिए अपने स्वयं के ओपनएएफएस वीएफएस को कार्यान्वित करें।

  • किसी अन्य नेटवर्क फाइल सिस्टम के साथ अपनी किस्मत आजमाएं।

जो कुछ भी आप करते हैं, आपको व्यापक परीक्षण करना होगा यदि किसी भी तरह से इसमें SQLite3 और साझा डेटाबेस फ़ाइल शामिल है।

संपादित करें:

एक टिप्पणीकार dotlock फ़ाइल सिस्टम का उपयोग करने का सुझाव दिया। मैं ओपनएएफएस स्रोत कोड में बहुत ज्यादा नहीं पहुंचा, लेकिन पहली नज़र में यह open(O_CREAT|O_EXCL) डॉकलॉक फ़ाइलों को बनाने की विधि का समर्थन करता है जो SQLite उपयोग करता है। यदि यह काम करता है जैसा कि यह माना जाता है, तो SQLite वास्तव में ओपनएएफएस के साथ प्रयोग योग्य हो सकता है यदि आप इसे डॉटलॉक विधि का उपयोग करने के लिए मजबूर करते हैं।

यह कहा गया है कि, मिश्रण में नेटवर्क फाइल सिस्टम की जटिलताओं को शुरू किए बिना, स्थानीय स्थानीय फाइल सिस्टम पर डॉटलॉक्स पर्याप्त समस्याएं हैं - यही कारण है कि मैंने इसे पहले स्थान पर सुझाव नहीं दिया था।

+0

+1 वास्तव में बहुत कुछ। हालांकि, यह मानते हुए कि एएफएस परमाणु फ़ाइल निर्माण प्रदान करता है, काम नहीं करेगा? – janneb

+0

@janneb: मैंने OpenAFS स्रोत w.r.t. की जांच की। dotlocks। परिणाम उत्साहजनक थे - या डॉटलॉक्स से जुड़ी कुछ भी प्रोत्साहित करने के रूप में प्रोत्साहित किया जा सकता है। – thkala

संबंधित मुद्दे