পিএইচপি -> মাইএসকিউএল ধারাবাহিক সংযোগ পুলিং মাইএসকিএল_পকনেক্ট ছাড়াই - সম্ভব?


12

আমি কিছুক্ষণের জন্য এটি করার একটি দুর্দান্ত উপায়টি বের করার চেষ্টা করছি। এটি করার জন্য সঠিক টুকরোগুলি খুঁজে পেতে খুব কষ্ট হয়েছে। আমি অনুমান করছি এটি অবশ্যই সম্ভব হবে।

এটিকে এখানে সহজ শর্তে বলতে গেলে আমি যা সম্পাদন করতে চাই তা হল:

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

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

Externally hosted MySQLD

কাজ করার মতো কোনও সরঞ্জাম / উপায় কি বিদ্যমান?

আমরা মূলত mysql_pconnect ব্যবহার করে স্থির মাইএসকিএল সংযোগগুলি প্রয়োগ করতে চাই।

আমি শ্রদ্ধার সাথে জিজ্ঞাসা করছি যে কীভাবে অবিচ্ছিন্ন সংযোগের প্রয়োজন হয় না সেগুলি সম্পর্কে আমরা আলোচনা শুরু করি না। আমরা TIME_WAIT বন্দরগুলির বাইরে চলে যাচ্ছি, এবং অন্যান্য সমস্যা রয়েছে যা এই ধরণের সিস্টেমটি প্রয়োগ করা হলে সমাধান হবে।

হ্যাঁ, সংক্ষিপ্তসার হিসাবে ... আমরা স্থানীয় প্রান্তের উপর ভিত্তি করে সকেটযুক্ত একটি মাইএসকিএল সংযোগ পুলার প্রয়োগ করব এবং বহিরাগতভাবে হোস্ট করা মাইএসকিএল সার্ভারের সাথে সংযোগগুলি (ল্যান) দ্বারা চালিত হয়েছি।

আমরা লেনদেন বা অন্য কিছু ব্যবহার করি না যা মাইএসকিএল সংযোগগুলি পুনর্ব্যবহারের ফলে প্রভাবিত হবে।

আমরা মাস্টার + মাস্টার পারকোনা 5.5 ক্লাস্টার সহ সামনের প্রান্তে লিনাক্স চালাচ্ছি।

ধন্যবাদ!

উত্তর:


12

অনেক খোঁজাখুঁজির পরে, আমি শেষ পর্যন্ত একটি সমাধান খুঁজে পেয়েছি।

আমি অনেক লেখক নই, তাই এটিকে যথাসম্ভব সংক্ষিপ্ত করে তোলার জন্য আমি যথাসাধ্য চেষ্টা করব।

যতদূর আমি খুঁজে পেতে পারি, সম্ভাব্য 2 টি সমাধান রয়েছে:

এসকিউএল রিলে

http://sqlrelay.sourceforge.net/

এটি ঠিক কীভাবে প্রশ্নটি জিজ্ঞাসা করেছিল এবং আরও একগুচ্ছ। আমি এ সম্পর্কে যা জানতে পেরেছিলাম তার খুব বেশি বিশদে যেতে চাই না তবে উল্লেখ করব যে এটি একটি কার্যকর সমাধান ছিল না কারণ এটি স্বচ্ছ নয়। অর্থ এই যে প্রবাহটি নিম্নরূপ:

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

সুতরাং এটি মাইএসকিএল থেকে এসকিএল রিলেতে সমস্ত কোড পুনর্লিখনের সাথে জড়িত। আমাদের ক্ষেত্রে একটি বিকল্প নয়।

যা যা বলা হচ্ছে তা যদি কেউ এসকিউএল রিলে থাকা অসংখ্য বৈশিষ্ট্যের জন্য একটি নতুন নতুন স্কেল প্রকল্পের পরিকল্পনা করে থাকেন তবে এটি সুন্দর শোনাচ্ছে।

মাইএসকিএল প্রক্সি

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

এই সমাধানটি আমরা ব্যবহার করে শেষ করেছি।

আমরা এটি যা করতে চাই তা করার মূল কীটি মাইএসকিএল প্রক্সিটির জন্য পুলিং 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

মাইএসকিএল-প্রক্সিতে স্যুইচ করার পরে এবং জিনিসগুলিকে নিষ্পত্তি করার জন্য:

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

আপনি স্পষ্ট দেখতে পাচ্ছেন, মাইএসকিএলে TIME_WAIT বন্দরগুলি প্রায় কোনওটিতেই নেমেছে।

Mysql_pconnect / mysqli_connect (... পি: হোস্টনাম ...) ব্যবহার করে সংযোগগুলি এখন বাস্তবে স্থায়ী

উল্লেখ করার মতো উল্লেখযোগ্যভাবে পুলার লুয়া স্ক্রিপ্টের শীর্ষের কাছে কয়েকটি কনফিগারযোগ্য সেটিংস রয়েছে।

স্থানীয় min_idle_connitions

এবং

স্থানীয় সর্বাধিক_সংক্রান্ত_সংযোগ

এগুলি বেশ স্ব ব্যাখ্যাযোগ্য বলে মনে হয়। ব্যতীত: এটি প্রদর্শিত হবে যে প্রতিটি ব্যবহারকারীর নাম (এবং পাসওয়ার্ড? স্বীকৃত ... সম্ভবত এটি নয়) combination সংমিশ্রণটি তার নিজস্ব ক্রমাগত সংযোগগুলির সেট তৈরি করে।

সুতরাং ডাটাবেসে সংযুক্ত হবে এমন অনন্য মাইএসকিএল ব্যবহারকারীর সংখ্যা দ্বারা সর্বোচ্চ_সংস্থান_সংযোগগুলি গুণ করুন। এবং এটি আপনাকে কতটা নিষ্ক্রিয় সংযোগগুলি শেষ করবে তা একটি ধারণা দেওয়া উচিত।

সুতরাং, আমার পুনরুক্তি করা যাক তাই এই ছোট্ট ব্লার্বটি গুগলের মাধ্যমে অনুসন্ধানকারীদের জন্য কিছু কীওয়ার্ডকে হিট করেছে:

পিএইচপি ব্যবহার করার সময় কি মাইএসকিএল_পকনেক্ট ছাড়া স্থির মাইএসকিএল সংযোগ থাকা সম্ভব?

হ্যাঁ, এসকিউএল রিলে মাধ্যমে এটি করা যেতে পারে যদি আপনি আপনার ক্যোয়ারীগুলির প্রসারণের মাধ্যমে আপনার কোডগুলি নষ্ট করতে বা স্বচ্ছভাবে রো-পুলিং.লুয়া স্ক্রিপ্টের সাথে মাইএসকিএল-প্রক্সি ব্যবহার করে আপনার কোডের বেশিরভাগটিকে পুনরায় বিলম্ব করতে না চান।

আমরা প্রায় এক বছর ধরে এই জাতীয় কিছু চাইছিলাম।

উপভোগ করুন!


মাইসকলির অবিচ্ছিন্ন ক্রিয়াকলাপ দ্বারা সরবরাহ করা ক্লিনআপ কার্যকারিতা (নীচের উত্তর অনুসারে বর্ণিত) কীভাবে ব্যবহার করবেন না ? আপনার যদি মাইসকিলে অ্যাক্সেস না থাকে তবে কেন mysql_pconnectকিছু "ক্লিনআপ ফাংশন" দিয়ে প্রতিটি সংযোগটি কেবল ব্যবহার এবং শুরু করবেন না ?
পেসারিয়ার

4
  1. mysqliএক্সটেনশনের জন্য পিএইচপি 5.3 এ অবিচ্ছিন্ন সংযোগ সমর্থন চালু হয়েছিল । সমর্থন ইতিমধ্যে PDO MYSQL এবং ext / mysql তে উপস্থিত ছিল। অবিচ্ছিন্ন সংযোগের পিছনে ধারণাটি হ'ল ক্লায়েন্ট প্রক্রিয়া এবং একটি ডাটাবেসের মধ্যে একটি সংযোগটি একাধিকবার তৈরি এবং ধ্বংস হওয়ার পরিবর্তে ক্লায়েন্ট প্রক্রিয়া দ্বারা পুনরায় ব্যবহার করা যেতে পারে। এটি অপ্রয়োজনীয় সংযোগগুলি ক্যাশে হ'ল এবং পুনরায় ব্যবহারের জন্য প্রস্তুত হওয়ায় এটি প্রতিবারই নতুন সংযোগ তৈরির ওভারহেড হ্রাস করে।

  2. মাইএসকিএল এক্সটেনশনের বিপরীতে, mysqliঅবিচ্ছিন্ন সংযোগ খোলার জন্য পৃথক ফাংশন সরবরাহ করে না। একটি অবিচ্ছিন্ন সংযোগ খোলার জন্য আপনাকে সংযোগ করার সময় হোস্টনেমে p: প্রেন্ডেন্ড করতে হবে।

  3. অবিচ্ছিন্ন সংযোগগুলির সমস্যাটি হ'ল তাদের ক্লায়েন্টরা অবিশ্বাস্য অবস্থায় রেখে যেতে পারে। উদাহরণস্বরূপ, কোনও ক্লায়েন্ট অপ্রত্যাশিতভাবে শেষ হওয়ার আগে একটি টেবিল লক সক্রিয় হতে পারে। এই অবিচ্ছিন্ন সংযোগটির পুনঃব্যবহার করা একটি নতুন ক্লায়েন্ট প্রক্রিয়া সংযোগটি "যেমন রয়েছে" পাবে। প্রোগ্রামারটির বোঝা বাড়িয়ে অবিচ্ছিন্ন সংযোগটির ভাল ব্যবহার করার আগে কোনও ক্লিনআপ নতুন ক্লায়েন্ট প্রক্রিয়া দ্বারা করা দরকার।

মাইসকিলি এক্সটেনশনের অবিচ্ছিন্ন সংযোগ তবে অন্তর্নির্মিত ক্লিনআপ হ্যান্ডলিং কোড সরবরাহ করে। মাইসকিলি দ্বারা পরিচালিত পরিষ্কারের মধ্যে রয়েছে:

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()

যদিও স্বয়ংক্রিয় ক্লিনআপ বৈশিষ্ট্যের সুবিধাগুলি এবং অসুবিধা রয়েছে has সুবিধাটি হ'ল প্রোগ্রামারটিকে আর ক্লিনআপ কোড যুক্ত করার বিষয়ে আর চিন্তা করার দরকার নেই, কারণ এটি স্বয়ংক্রিয়ভাবে বলা হয়। যাইহোক, অসুবিধাটি হ'ল কোডটি সম্ভবত কিছুটা ধীর হতে পারে, কারণ ক্লিনআপটি সম্পাদন করার জন্য কোডটি প্রতিবার সংযোগ পুল থেকে কোনও সংযোগ ফিরে আসার পরে চালানো দরকার।

MYSQLI_NO_CHANGE_USER_ON_PCONNECTসংজ্ঞায়িত পিএইচপি সংকলন করে স্বয়ংক্রিয় ক্লিনআপ কোডটি স্যুইচ অফ করা সম্ভব ।

বিঃদ্রঃ:

মাইএসকিলি এক্সটেনশন মাইএসকিউএল নেটিভ ড্রাইভার বা মাইএসকিউএল ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময় অবিচ্ছিন্ন সংযোগগুলিকে সমর্থন করে।

এছাড়াও আপনি এই লিঙ্কগুলি উল্লেখ করতে পারেন: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistance-connitions-evil/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.