PHP -> माईस्क्ल लगातार कनेक्शन पूल के बिना mysql_pconnect - संभव?


12

मैं कुछ समय के लिए इसे करने का एक अच्छा तरीका जानने की कोशिश कर रहा हूं। लेकिन ऐसा करने के लिए सही टुकड़ों को खोजने में कठिन समय रहा है। मैं अनुमान लगा रहा हूं कि यह संभव होना चाहिए।

इसे सरल शब्दों में कहें तो मैं इसे पूरा करना चाहता हूं:

PHP / Other front end -> [SOCKET] ->

Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]->

Externally hosted MySQLD

क्या ऐसा उपकरण / काम करने का तरीका मौजूद है?

हम मूल रूप से mysql_pconnect का उपयोग किए बिना लगातार mysql कनेक्शन लागू करना चाहेंगे।

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

तो हाँ, संक्षेप में ... हम एक mysql कनेक्शन पूलर को लागू करना चाहते हैं जो स्थानीय छोर पर आधारित सॉकेट है, और उन कनेक्शनों को बनाए रखता है जो बाहरी रूप से होस्ट किए गए mysql सर्वर के लिए हैं।

हम लेन-देन या किसी और चीज का उपयोग नहीं करते हैं जो पुनर्नवीनीकरण होने वाले mysql कनेक्शन से प्रभावित होगा।

हम एक मास्टर + मास्टर percona 5.5 क्लस्टर के साथ सामने के छोर पर लिनक्स चला रहे हैं।

धन्यवाद!

जवाबों:


12

बहुत खोज के बाद, मैंने आखिरकार एक समाधान ढूंढ लिया है।

मैं ज्यादा लेखक नहीं हूं, इसलिए मैं इसे यथासंभव संक्षिप्त बनाने की पूरी कोशिश करूंगा।

अब तक जहां तक ​​मुझे पता चला, 2 संभावित समाधान हैं:

एसक्यूएल रिले

http://sqlrelay.sourceforge.net/

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

PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

इसलिए इसमें mysql से sql relay तक हमारे सभी कोड को फिर से लिखना शामिल होगा। हमारे मामले में कोई विकल्प नहीं है।

यह सब कहा जा रहा है, अगर कोई एक ताजा बड़े पैमाने पर परियोजना की योजना बना रहा है जिसमें SQL रिले के लिए कई विशेषताओं में से किसी की आवश्यकता होती है, तो यह सुंदर लगता है।

मैसकल प्रॉक्सी

http://forge.mysql.com/wiki/MySQL_Proxy

यह वह समाधान है जिसका हमने उपयोग किया है।

इसे बनाने की कुंजी यह है कि हम जो करना चाहते हैं वह है mysql प्रॉक्सी के लिए LUA स्क्रिप्ट।

यह LUA एक्सटेंशन यहां पाया जा सकता है:

https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua

बहुत अधिक विस्तार में जाने के बिना, यहां कुछ बुनियादी आँकड़े दिए गए हैं ... ध्यान में रखते हुए, यह कम उपयोग के समय पर परीक्षण किया जाता है:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

Mysql- प्रॉक्सी पर जाने के बाद, और चीजों को व्यवस्थित करने दें:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

जैसा कि आप स्पष्ट रूप से देख सकते हैं, mysql को TIME_WAIT पोर्ट लगभग कोई भी नहीं गिरा है।

कनेक्शन अब वास्तव में mysql_pconnect / mysqli_connect (... p: hostname ...) का उपयोग किए बिना लगातार हैं

वर्थ लुआ लिपि के शीर्ष के पास कुछ विन्यास सेटिंग्स दिखाई देती हैं।

स्थानीय min_idle_connections

तथा

स्थानीय max_idle_connections

ये बहुत आत्म व्याख्यात्मक प्रतीत होते हैं। सिवाय इसके कि: ऐसा प्रतीत होगा कि प्रत्येक उपयोगकर्ता नाम (और पासवर्ड? अछूता ... सबसे अधिक संभावना नहीं है।) संयोजन लगातार कनेक्शन का अपना सेट बनाता है।

तो डेटाबेस से जुड़ने वाले अनन्य mysql उपयोगकर्ताओं की संख्या से max_idle_connections को गुणा करें। और इससे आपको अंदाजा होना चाहिए कि आपके पास कितने निष्क्रिय कनेक्शन होंगे।

इसलिए, मुझे इस छोटे ब्लर्ब के लिए पुनरावृत्ति करने दें जो Google के माध्यम से खोज करने वालों के लिए कुछ कीवर्ड्स को हिट करता है:

PHP का उपयोग करते समय mysql_pconnect के बिना लगातार mysql कनेक्शन रखना संभव है?

हाँ, यह एसक्यूएल रिले के माध्यम से किया जा सकता है, अगर आपको अपने कोड को फिर से बनाने में कोई आपत्ति नहीं है, तो अपने प्रश्नों को उनके विस्तार के लिए पाइप करें या आरओ-पूलिंग.लुआ स्क्रिप्ट के साथ mysql- प्रॉक्सी का उपयोग करें।

हम लगभग एक साल से ऐसा ही कुछ चाहते हैं।

का आनंद लें!


क्यों नहीं mysqli के लगातार कार्य द्वारा प्रदान की गई सफाई की कार्यक्षमता (नीचे दिए गए उत्तर के अनुसार) का उपयोग करें ? यदि आपके पास mysqli तक पहुंच नहीं है, तो बस mysql_pconnectकुछ "क्लीनअप फ़ंक्शंस" के साथ प्रत्येक कनेक्शन का उपयोग और शुरू क्यों न करें ?
पचेरियर

4
  1. mysqliविस्तार के लिए PHP 5.3 में लगातार कनेक्शन समर्थन शुरू किया गया था । समर्थन पहले से ही पीडीओ MYSQL और ext / mysql में मौजूद था। लगातार कनेक्शन के पीछे विचार यह है कि ग्राहक प्रक्रिया और डेटाबेस के बीच संबंध ग्राहक प्रक्रिया द्वारा पुन: उपयोग किया जा सकता है, बल्कि कई बार बनाया और नष्ट किया जा सकता है। यह आवश्यक होने पर हर बार नए कनेक्शन बनाने के ओवरहेड को कम करता है, क्योंकि अप्रयुक्त कनेक्शन को कैश किया जाता है और पुन: उपयोग के लिए तैयार किया जाता है।

  2. Mysql एक्सटेंशन के विपरीत, mysqliलगातार कनेक्शन खोलने के लिए एक अलग फ़ंक्शन प्रदान नहीं करता है। एक स्थायी कनेक्शन खोलने के लिए आपको पी को प्रीपेन्ड करना होगा: कनेक्ट करते समय होस्टनाम के लिए।

  3. लगातार कनेक्शन के साथ समस्या यह है कि उन्हें ग्राहकों द्वारा अप्रत्याशित राज्यों में छोड़ा जा सकता है। उदाहरण के लिए, एक क्लाइंट अनपेक्षित रूप से समाप्त होने से पहले एक टेबल लॉक सक्रिय हो सकता है। इस निरंतर कनेक्शन का पुन: उपयोग करने वाली एक नई क्लाइंट प्रक्रिया को कनेक्शन "जैसा है" मिलेगा। प्रोग्रामर पर बोझ बढ़ाते हुए किसी भी क्लीनअप को नई क्लाइंट प्रक्रिया द्वारा किया जाना चाहिए, क्योंकि यह लगातार कनेक्शन का अच्छा उपयोग कर सकता है।

हालांकि mysqli एक्सटेंशन का लगातार कनेक्शन बिल्ट-इन क्लीनअप हैंडलिंग कोड प्रदान करता है। Mysqli द्वारा किए गए सफाई में शामिल हैं:

Rollback active transactions

Close and drop temporary tables

Unlock tables

Reset session variables

Close prepared statements (always happens with PHP)

Close handler

Release locks acquired with `GET_LOCK()`

यह सुनिश्चित करता है कि लगातार कनेक्शन कनेक्शन पूल से वापसी पर एक साफ स्थिति में हैं, इससे पहले कि क्लाइंट प्रक्रिया उनका उपयोग करती है।

Mysqli एक्सटेंशन सी-एपीआई फ़ंक्शन को स्वचालित रूप से कॉल करके इस क्लीनअप को करता है mysql_change_user()

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

MYSQLI_NO_CHANGE_USER_ON_PCONNECTपरिभाषित PHP के साथ संकलन करके, स्वचालित सफाई कोड को बंद करना संभव है ।

ध्यान दें:

MySQL नेटिव ड्राइवर या MySQL क्लाइंट लाइब्रेरी का उपयोग करते समय mysqli एक्सटेंशन लगातार कनेक्शन का समर्थन करता है।

इसके अलावा आप इन लिंक का उल्लेख कर सकते हैं: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

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