ProxySQL - कनेक्शन के लिए एक उपकरण

हैलो, मेरा नाम अलेक्जेंडर याकोवले है, मैं सिटीमोबिल के लिए काम करता हूं और काम करता हूं। आज मैं आपको एक बहुत ही रोचक उत्पाद ProxySQL के बारे में बताऊंगा - यह एक उच्च-प्रदर्शन MySQL प्रॉक्सी है जो बहुत सारी चीजें कर सकता है - मुखौटा द्वारा अनुरोधों को पकड़ना और मारना, इसके साथ आप sql इंजेक्शन की खोज कर सकते हैं, लोड की नकल कर सकते हैं और बहुत कुछ। मैं उसके साथ अपने अनुभव के बारे में बात करूंगा।
जल्दी या बाद में, किसी भी बड़ी आईटी परियोजना, जिसका विकास सर्वरों की एक जोड़ी के साथ शुरू हुआ, नीचे वर्णित स्थिति का सामना करेगा। कल्पना करें कि परियोजना में शुरू में केवल एक डेटाबेस था - मास्टर सर्वर। धीरे-धीरे, इसमें दासों का एक समूह जोड़ा गया। फिर उन्होंने शार्किंग शुरू की।

और एक ठीक दिन, लोड अचानक 10 गुना बढ़ जाता है। उदाहरण के लिए, क्योंकि आपका मुख्य प्रतिद्वंद्वी गिर गया है, और ग्राहक आपके पास पहुंच गए हैं। इस बिंदु पर, यह आपको लगता है कि आप केवल वेब सर्वर को जोड़कर लोड को माप सकते हैं। लेकिन ऐसा करने के बाद, एक अप्रिय स्थिति पैदा होती है।

एक जादूगर के उदाहरण पर विचार करें। मान लें कि आपके पास 50 वेब सर्वर हैं और प्रत्येक 200 php-fpm प्रक्रियाओं पर। फिर 50 * 200 कनेक्शन मास्टर के लिए उड़ान भरेंगे, और उस पर 50 * 200 / नंबर के गुलाम प्रत्येक गुलाम के पास आएंगे (यदि, ज़ाहिर है, राउंड्रोबिन को हाइप्रोक्सी में कॉन्फ़िगर किया गया है) - नीचे दी गई तस्वीर देखें। बेशक, मास्टर के लिए 10 हजार कनेक्शन बहुत हैं, लेकिन अभी भी सहने योग्य हैं, और यदि 200 वेब साइट हैं, तो कनेक्शन की संख्या और भी अधिक होगी, और एक कनेक्शन = एक धागा।
यह इस अड़चन में था कि हम भागे।

छवि

फिर हम बहस करने लगे: विज़ार्ड का कनेक्शन हमेशा कोड में स्थापित होता है, लेकिन क्या यह सभी fpm प्रक्रियाओं के लिए आवश्यक है? शायद ऩही। हमने देखा कि मास्टर को बड़ी संख्या में दृढ़ता-कनेक्शन बस पर्चियों में लटकाते हैं। और उन्होंने फैसला किया कि हमें डेमोइटलिप्लेक्सिंग की जरूरत है।

छवि

ऐसा करने के लिए, हमने ProxySQL नामक एक उत्पाद की ओर ध्यान आकर्षित किया। यह एक सामान्य रिवर्स प्रॉक्सी की तरह काम करता है: इसके लिए कनेक्शन स्थापित किए जाते हैं, और यह कॉन्फ़िगरेशन में निर्दिष्ट कुछ नियमों के अनुसार ट्रैफ़िक को पुनर्वितरित करता है।

हमने अपने सभी वेब सर्वर पर ProxySQL स्थापित किया है, और एप्लिकेशन कॉन्फ़िगरेशन में हमने निर्दिष्ट किया है कि मास्टर डेटाबेस में कॉल 127.0.0.1 पते पर किया जाता है। यदि प्रत्येक वेब सर्वर पर 200 एफपीएम श्रमिकों से पहले इस मशीन से मास्टर बेस के 200 कनेक्शन का मतलब है, तो अब स्थिति बदल गई है। ये 200 कनेक्शन ProxySQL में आते हैं, और 50-70 अलग-अलग समय पर निकलते हैं। यही है, ProxySQL मौजूदा कनेक्शन का पुन: उपयोग कर सकता है।

डेमुलिप्लेक्सिंग के लिए धन्यवाद, हमने सभी स्वामी पर 3-10 बार कनेक्शन की संख्या कम कर दी, नीचे दिए गए स्वामी में से एक के वर्तमान कनेक्शन ग्राफ को देखें।

छवि

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

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

ProxySQL की विशेषता यह है कि इसका विन्यास है, जो हमारे मामले में कठपुतली के माध्यम से लुढ़का हुआ है (कठपुतली के लिए एक ProxySQL मॉड्यूल है), लेकिन एक परिवर्तन करने के लिए रनटाइम ज़ोन की अवधारणा भी है (सर्वर जोड़ें, उपयोगकर्ता जोड़ें, सर्वर और उपयोगकर्ता को हटाएं) ), आपको सामान्य पुनरारंभ / पुनः लोड करने की आवश्यकता नहीं है। सब कुछ ProxySQL कंसोल के माध्यम से किया जाता है, उदाहरण के लिए।

mysql -ulogin -ppassword -h 127.0.0.1 -P6032 -e "INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sm_username','pass',1);;LOAD MYSQL USERS TO RUNTIME;SAVE MYSQL USERS TO DISK;"

अधिक विस्तार से, ज़ाहिर है, आधिकारिक दस्तावेज में proxysql.com/documentation

आपका ध्यान देने के लिए धन्यवाद।

हमारा कॉन्फ़िगरेशन, जिसके साथ हमने ऊपर वर्णित समस्या को हल किया है, नीचे देखें।

हमारा विन्यास

datadir="/var/lib/proxysql"

admin_variables=
{
    admin_credentials="user:pass"
    mysql_ifaces="0.0.0.0:6032"
    refresh_interval=2000
    web_enabled=true
    web_port=6080
    stats_credentials="stats:admin"
}

mysql_variables =
{
    threads = 1000
    max_connections = 2000
    default_query_delay= 0
    default_query_timeout=1
    have_compress=true
    poll_timeout=2000
    interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
    default_schema="information_schema"
    stacksize=1048576
    server_version="5.7.22"
    connect_timeout_server=10000
    monitor_history=60000
    monitor_connect_interval=200000
    monitor_ping_interval=200000
    ping_interval_server_msec=5000
    ping_timeout_server=200
    commands_stats=true
    sessions_sort=true
    monitor_username="root"
    monitor_password="password"
    monitor_galera_healthcheck_interval=200
    monitor_galera_healthcheck_timeout=80
}

mysql_servers =
(
  {
    address = "ip_real_mysql_server",
    port = 3306,
    max_connections = 10000,
    host_group = 1,
  })
mysql_users =
(
  {
    username = "user",
    password = "pass",
    default_hostgroup = 1,
    transaction_persistent = 0,
    active = 1,
  })

All Articles