2009-07-10 17 views
5

मैं लैंप का उपयोग कर एक बहु-किरायेदार वेब एप्लिकेशन विकसित कर रहा हूं। मेरे सभी उपयोगकर्ता सत्र डेटा वर्तमान में mysql में तालिका प्रकार InnoDB के साथ संग्रहीत है।MySQL सत्र तालिका दृष्टिकोण

क्या कोई तरीका है कि मैं मौजूदा सत्रों को स्टोर करने के लिए मेमरी (HEAP होने के लिए उपयोग किया जाता है) तालिका प्रकार का उपयोग कर सकता हूं और सत्र हैंडलर के कचरा कलेक्टर फ़ंक्शन का उपयोग इनो डीबी (नियमित तालिका) और (इन में) मेमोरी टेबल?

क्या यह कॉन्फ़िगरेशन किसी भी तरह से प्रभावित होगा जब मैं बाद में चरण & मास्टर-गुलाम कॉन्फ़िगरेशन क्लस्टर करना चाहता हूं?

अग्रिम धन्यवाद, ocptime

उत्तर

6

एक custom session handler लेखन आश्चर्यजनक रूप से आसान है, लेकिन मुझे लगता है कि शायद बेहतर तरीके MEMORY तालिकाओं की तुलना में सत्र डाटा स्टोर करने की कर रहे हैं।

तरह स्कीमा कुछ (a previous question से परिवर्तन के साथ उठाया)

CREATE TABLE IF NOT EXISTS `session` (
    `id` char(32) NOT NULL, 
    `data` varchar(20000) NOT NULL, 
    `time_created` timestamp NOT NULL default '0000-00-00 00:00:00', 
    `time_updated` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `time_created` (`time_created`), 
    KEY `time_updated` (`time_updated`) 
) ENGINE=MEMORY DEFAULT CHARSET=utf8; 

तो आप बस के रूप में ऊपर या इस tutorial में लिंक में रेखांकित, आपका सत्र हैंडलर कार्यों को परिभाषित करना होगा। यदि आप कचरा संग्रह के दौरान अपनी सत्र जानकारी को सहेजना चाहते हैं तो आपको INNODB इंजन का उपयोग करके ऊपर दिए गए एक तालिका को बनाना होगा और gc() फ़ंक्शन के अंत में थोड़ा सा जोड़ना होगा जो पंक्ति को MEMORY से INNODB तालिकाओं में कॉपी करता है।

हालांकि MEMORY तालिकाओं में कुछ महत्वपूर्ण महत्वपूर्ण सीमाएं हैं। वे BLOB या TEXT कॉलम का उपयोग नहीं कर सकते हैं - यही कारण है कि मेरे ऊपर उस बदसूरत varchar(20000) है। उनके पास 16 एमबी अधिकतम आकार है। यदि आपके पास बहुत सारे उपयोगकर्ता हैं, तो बहुत सारी स्थिति रखें, या कचरे के संग्रह में समस्याएं हैं जो आप उस सीमा और दुर्घटना को मार सकते हैं।

memcache session handler का उपयोग करने का एक बेहतर विचार है, खासकर यदि आपको दूरस्थ भविष्य में सत्र जानकारी संग्रहीत करने की आवश्यकता नहीं है। मुझे यकीन है कि memcached किसी भी आरडीबीएमएस की तुलना में तेज़ है (यहां तक ​​कि MEMORY टेबल के साथ) और यह डिज़ाइन द्वारा अच्छी तरह से स्केल करता है। इसके अलावा आपको अपना खुद का सत्र हैंडलर फ़ंक्शन लिखना पड़ेगा।

+1

[max_heap_table_size] (https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_heap_table_size) सिस्टम चर समायोजित करके अधिकतम तालिका आकार को बढ़ाना संभव है। –

3
InnoDB: ~40 milliseconds Cons: (Slowest) 
MEMORY: ~22 milliseconds Cons: (16MB Max) 
MyISAM: ~25 milliseconds Cons: (Table-level locking) 

मैं उपयोग कर रहा हूँ (जी एस), तो मैं मेम्कैश ऐसा नहीं कर सकते, लेकिन यह सबसे अच्छा होगा।

मैं व्यक्तिगत रूप से मेमरी का उपयोग करने पर विचार कर रहा था, लेकिन मुझे नहीं पता था कि प्रदर्शन लाभ आकार सीमाओं की लागत से बाहर होगा या नहीं। इसलिए मैंने यह किया कि अनुकूलित करने के दौरान हर अच्छे प्रोग्रामर को क्या करना चाहिए: मैंने इसे प्रोफाइल किया।

सवाल में मेरे php पेज चतुर में कैश किया गया है, इसलिए केवल संचालन यहाँ क्या हो रहा है, तो उपयोगकर्ता के प्रवेश की जांच करने के यूआरएल और एक एसक्यूएल सत्र हड़पने पर एक regex देखने वैसे भी यहाँ हैं।

परिणाम हैं : InnoDB के साथ मुझे अनुरोध पर प्रतीक्षा करने के लिए ~ 40 मिलीसेकंड मिल रहा था। (मैंने इसे डेवलपर टूल्स के साथ क्रोम में मापा।) मेमरी में टेबल को स्विच करने के बाद मुझे प्रति अनुरोध ~ 20 मिलीसेकंड मिला। वाह! 50% सुधार! लेकिन प्रतीक्षा करें ... माईसाम के बारे में क्या? मैंने कोशिश की और मुझे प्रति अनुरोध ~ 22-23 मिलीसेकंड मिला। ओह।

यह सिर्फ मुझे परीक्षण है, पूर्ण पैमाने पर आवेदन नहीं।एक असली एप्लिकेशन में हर सेकेंड उस टेबल पर हजारों लोग लिखते हैं, और माईसाम टेबल-स्तरीय लॉकिंग करता है, जो खराब हो सकता है (Which MySQL database engine is better for storing sessions and session data: MyISAM or InnoDB?)।

तो मैं अब स्मृति के लिए चिपक रहा हूं। यह उन कैश किए गए पृष्ठों के लिए एक बड़ा सुधार है, लेकिन मैं आपको प्रोफाइल करने के लिए प्रोत्साहित करता हूं! यदि आपकी वेबसाइट प्रत्येक पृष्ठ का पुनर्निर्माण कर रही है, तो 10 मिलीसेकंड वास्तव में कोई फर्क नहीं पड़ता।

+0

तालिका स्तर लॉकिंग बड़े पैमाने पर आवेदन पर प्रदर्शन को कैसे प्रभावित करेगा। जब कोई लॉगिन पर सत्र में लिखने की कोशिश करता है तो क्या यह प्रभावी रूप से उपयोगकर्ताओं को अवरुद्ध करेगा? – Lightbulb1

+0

@ लाइटबुलब 1, * प्रत्येक * पृष्ठ दृश्य को अंतिम एक्सेस किए गए समय को अपडेट करने के लिए डेटाबेस पर सत्र तालिका को अपडेट करना होगा (सत्र को समाप्त करने के लिए कब और सत्र कब कचरा होने के लिए स्वतंत्र होते हैं)। यदि दो लोगों को एक ही सटीक समय पर एक पृष्ठ मिलता है तो एक व्यक्ति को तब तक इंतजार करना पड़ता है जब तक कि दूसरे व्यक्ति का लेखन समाप्त नहीं हो जाता है क्योंकि जब तक आप एक [LOW_PRIORITY] नहीं करते हैं (http: //dev.mysql .com/doc/refman/5.0/en/update.html) अद्यतन, जो समस्या को ठीक करेगा)। हालांकि यह वास्तव में केवल समयपूर्व अनुकूलन है। यदि आपकी साइट व्यस्त है तो memcached पर विचार करें। – andychase

+0

जानकारी के लिए धन्यवाद। मैंने इससे पहले कि memcache का उपयोग नहीं किया है, इसलिए ऐसा कुछ है जिसे मुझे और अधिक शोध करने की आवश्यकता है। यह भविष्य के लिए समाधान ठीक से होगा। – Lightbulb1

0

सत्र के लिए InnoDB तालिका का उपयोग करें। मैंने पूरे टेबल को ताले डालने के दौरान मेमोरी टेबल सुना है, जबकि इनो डीबीबी केवल उस विशेष पंक्ति को लॉक करता है जिसे छेड़छाड़ की जरूरत है।

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