MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

अपना पहला सलाहकार लिखें

क्या आपने कभी सोचा है कि ClusterControl में वह सलाह क्या ट्रिगर करती है कि आपकी डिस्क भर रही है? या यदि वे मौजूद नहीं हैं तो InnoDB तालिकाओं पर प्राथमिक कुंजी बनाने की सलाह? ये सलाहकार क्लस्टरकंट्रोल डोमेन स्पेसिफिक लैंग्वेज (डीएसएल) में लिखी गई मिनी स्क्रिप्ट हैं जो कि जावास्क्रिप्ट जैसी भाषा है। इन लिपियों को ClusterControl में लिखा, संकलित, सहेजा, निष्पादित और शेड्यूल किया जा सकता है। ClusterControl डेवलपर स्टूडियो ब्लॉग श्रृंखला इसी के बारे में होगी।

आज हम डेवलपर स्टूडियो की मूल बातें कवर करेंगे और आपको दिखाएंगे कि अपना पहला सलाहकार कैसे बनाया जाए जहां हम दो स्थिति चर चुनेंगे और उनके परिणाम के बारे में सलाह देंगे।

सलाहकार

सलाहकार मिनी स्क्रिप्ट हैं जिन्हें ClusterControl द्वारा निष्पादित किया जाता है, या तो ऑन-डिमांड या शेड्यूल के बाद। वे सरल कॉन्फ़िगरेशन सलाह, थ्रेसहोल्ड पर चेतावनी या आपके सर्वर या डेटाबेस की स्थिति के आधार पर पूर्वानुमानों या क्लस्टर-व्यापी स्वचालन कार्यों के लिए अधिक जटिल नियमों से कुछ भी हो सकते हैं। सामान्य तौर पर, सलाहकार अधिक विस्तृत विश्लेषण करते हैं, और अलर्ट की तुलना में अधिक व्यापक अनुशंसाएं प्रस्तुत करते हैं।

सलाहकारों को ClusterControl डेटाबेस के अंदर संग्रहीत किया जाता है और आप नए जोड़ सकते हैं या मौजूदा सलाहकारों को बदल/संशोधित कर सकते हैं। हमारे पास एक सलाहकार Github रिपॉजिटरी भी है जहां आप अपने सलाहकारों को हमारे और अन्य ClusterControl उपयोगकर्ताओं के साथ साझा कर सकते हैं।

सलाहकारों के लिए उपयोग की जाने वाली भाषा तथाकथित ClusterControl DSL है और यह समझने में आसान भाषा है। कुछ अंतरों के साथ जावास्क्रिप्ट की तुलना में भाषा का शब्दार्थ सबसे अच्छा हो सकता है, जहां सबसे महत्वपूर्ण अंतर हैं:

  • अर्धविराम अनिवार्य हैं
  • विभिन्न संख्यात्मक डेटा प्रकार जैसे पूर्णांक और अहस्ताक्षरित लंबे लंबे पूर्णांक।
  • सरणी दो आयामी हैं और एकल आयामी सरणी सूचियां हैं।

आप ClusterControl DSL संदर्भ में मतभेदों की पूरी सूची पा सकते हैं।

डेवलपर स्टूडियो इंटरफ़ेस

डेवलपर स्टूडियो इंटरफ़ेस क्लस्टर> प्रबंधित करें> डेवलपर स्टूडियो के अंतर्गत पाया जा सकता है। यह इस तरह एक इंटरफ़ेस खोलेगा:

सलाहकार

सलाहकार बटन सभी सलाहकारों के उनके आउटपुट के साथ एक सिंहावलोकन उत्पन्न करेगा जब से वे पिछली बार चले थे:

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

आयात सलाहकार

आयात बटन आपको नए सलाहकारों के साथ एक टारबॉल आयात करने की अनुमति देगा। टैरबॉल को सलाहकारों के मुख्य पथ के सापेक्ष बनाया जाना है, इसलिए यदि आप MySQL क्वेरी कैश आकार स्क्रिप्ट (s9s/mysql/query_cache/qc_size.js) का एक नया संस्करण अपलोड करना चाहते हैं तो आपको टैरबॉल शुरू करना होगा s9s निर्देशिका से।

निर्यात सलाहकार

आप ट्री में एक नोड का चयन करके और निर्यात बटन दबाकर सलाहकारों या उनके एक हिस्से को निर्यात कर सकते हैं। यह प्रस्तुत संरचना के पूर्ण पथ में फ़ाइलों के साथ एक टैरबॉल बनाएगा। मान लीजिए कि हम परिवर्तन करने से पहले s9s/mysql सलाहकारों का बैकअप बनाना चाहते हैं, हम केवल ट्री में s9s/mysql नोड का चयन करते हैं और निर्यात दबाते हैं:

नोट:सुनिश्चित करें कि s9s निर्देशिका /home/myuser/ में मौजूद है।

यह एक आंतरिक निर्देशिका संरचना s9s/mysql/*

के साथ /home/myuser/s9s/mysql.tar.gz नामक एक टैरबॉल बनाएगा

नया सलाहकार बनाना

चूंकि हमने निर्यात और आयात को कवर कर लिया है, इसलिए अब हम प्रयोग शुरू कर सकते हैं। तो चलिए एक नया सलाहकार बनाते हैं! निम्नलिखित संवाद प्राप्त करने के लिए नए बटन पर क्लिक करें:

इस संवाद में, आप या तो एक खाली फ़ाइल के साथ अपना नया सलाहकार बना सकते हैं या इसे पहले गैलेरा या MySQL विशिष्ट टेम्पलेट से भर सकते हैं। दोनों टेम्प्लेट आवश्यक शामिल करेंगे (common/mysql_helper.js) और गैलेरा या MySQL नोड्स को पुनः प्राप्त करने के लिए मूल बातें और उन पर लूप।

गैलेरा टेम्पलेट के साथ एक नया सलाहकार बनाना इस तरह दिखता है:

#include "common/mysql_helper.js"

यहां आप देख सकते हैं कि MySQL नोड्स को जोड़ने और क्वेरी करने के लिए आधार प्रदान करने के लिए mysql_helper.js को शामिल किया गया है।

इस फ़ाइल में ऐसे कार्य हैं जिन्हें आप आवश्यकता पड़ने पर लागू कर सकते हैं जैसे उदाहरण के लिए readVariable(,) जो आपको वैश्विक चर मान प्राप्त करने या readStatusVariable(,) को आमंत्रित करने की अनुमति देगा जो आपको भी अनुमति देगा MySQL में वैश्विक स्थिति चर प्राप्त करने के लिए। यह फ़ाइल नीचे देखे गए पेड़ में स्थित हो सकती है:

var WARNING_THRESHOLD=0;
…
if(threshold > WARNING_THRESHOLD)

चेतावनी सीमा वर्तमान में 0 पर सेट है, जिसका अर्थ है कि यदि मापी गई सीमा चेतावनी सीमा से अधिक है, तो सलाहकार को उपयोगकर्ता को चेतावनी देनी चाहिए। ध्यान दें कि चर थ्रेशोल्ड अभी तक टेम्पलेट में सेट/उपयोग नहीं किया गया है क्योंकि यह आपके अपने सलाहकार के लिए एक किकस्टार्ट है।

var hosts     = cluster::Hosts();
var hosts     = cluster::mySqlNodes();
var hosts     = cluster::galeraNodes();

ऊपर दिए गए कथन मेजबानों को क्लस्टर में लाएंगे और आप इसका उपयोग उन पर लूप करने के लिए कर सकते हैं। उनके बीच अंतर यह है कि पहले कथन में सभी गैर-MySQL होस्ट (CMON होस्ट भी), दूसरे में सभी MySQL होस्ट और अंतिम एक केवल शामिल हैं। गैलेरा होस्ट करता है। इसलिए यदि आपके गैलेरा क्लस्टर में MySQL एसिंक्रोनस रीड स्लेव संलग्न हैं, तो वे होस्ट शामिल नहीं होंगे।

इसके अलावा, ये सभी ऑब्जेक्ट एक जैसा व्यवहार करेंगे और उनके चर, स्थिति और उनके विरुद्ध क्वेरी को पढ़ने की क्षमता पेश करेंगे।

सलाहकार बटन

अब जब हमने एक नया सलाहकार बना लिया है तो इस सलाहकार के लिए छह नए बटन उपलब्ध हैं:

सहेजें आपके नवीनतम संशोधनों को सलाहकार के पास सहेज लेगा (CMON डेटाबेस में संग्रहीत), स्थानांतरित करें सलाहकार को एक नए पथ पर ले जाएगा और निकालें स्पष्ट रूप से सलाहकार को हटा देगा।

बटन की दूसरी पंक्ति अधिक दिलचस्प है। सलाहकार को संकलित करना सलाहकार के कोड को संकलित करेगा। यदि कोड ठीक से संकलित होता है, तो आपको यह संदेश संदेश . में दिखाई देगा सलाहकार के कोड के नीचे संवाद:

जबकि यदि संकलन विफल हो गया, तो संकलक आपको संकेत देगा कि यह कहाँ विफल हुआ:

इस मामले में संकलक इंगित करता है कि लाइन 24 पर एक सिंटैक्स त्रुटि पाई गई थी।

संकलित करें और चलाएं बटन न केवल स्क्रिप्ट को संकलित करेगा बल्कि इसे निष्पादित भी करेगा और इसका आउटपुट संदेश, ग्राफ या कच्चे संवाद में दिखाया जाएगा। अगर हम auto_tuners से टेबल कैश स्क्रिप्ट को संकलित और चलाते हैं, तो हमें इसके समान आउटपुट मिलेगा:

अंतिम बटन अनुसूची है बटन। इससे आप अपने सलाहकारों को शेड्यूल (या अनशेड्यूल) कर सकते हैं और उसमें टैग जोड़ सकते हैं। हम इस पोस्ट के अंत में इसे कवर करेंगे जब हमने अपना स्वयं का सलाहकार बनाया है और इसे शेड्यूल करना चाहते हैं।

मेरा पहला सलाहकार

अब जबकि हमने ClusterControl डेवलपर स्टूडियो की मूल बातें कवर कर ली हैं, अब हम अंत में एक नया सलाहकार बनाना शुरू कर सकते हैं। उदाहरण के तौर पर हम अस्थायी तालिका अनुपात को देखने के लिए एक सलाहकार तैयार करेंगे। निम्नलिखित के रूप में एक नया सलाहकार बनाएँ:

हम जिस सलाहकार को बनाने जा रहे हैं, उसके पीछे का सिद्धांत सरल है:हम डिस्क पर बनाई गई अस्थायी तालिकाओं की संख्या की तुलना बनाई गई अस्थायी तालिकाओं की कुल संख्या से करेंगे:

tmp_disk_table_ratio = Created_tmp_disk_tables / (Created_tmp_tables + Created_tmp_disk_tables) * 100;

सबसे पहले हमें स्क्रिप्ट के शीर्ष में कुछ मूल बातें सेट करने की आवश्यकता है, जैसे थ्रेसहोल्ड और चेतावनी और ठीक संदेश। सभी परिवर्तन और परिवर्धन नीचे लागू किए गए हैं:

var WARNING_THRESHOLD=20;
var TITLE="Temporary tables on disk ratio";
var ADVICE_WARNING="More than 20% of temporary tables are written to disk. It is advised to review your queries, for example, via the Query Monitor.";
var ADVICE_OK="Temporary tables on disk are not excessive." ;

हमने यहां थ्रेशोल्ड को 20 प्रतिशत पर सेट किया है जिसे पहले से ही बहुत खराब माना जाता है। लेकिन उस विषय पर और अधिक एक बार जब हमने अपने सलाहकार को अंतिम रूप दे दिया है।

आगे हमें इन स्टेटस वेरिएबल्स को MySQL से प्राप्त करने की आवश्यकता है। इससे पहले कि हम किसी निष्कर्ष पर पहुँचें और कुछ "Show GLOBAL STATUS LIKE 'Created_tmp_%'" क्वेरी को निष्पादित करें, MySQL इंस्टेंस के स्टेटस वेरिएबल को पुनः प्राप्त करने के लिए पहले से ही एक फ़ंक्शन है, जैसा कि हमने ऊपर वर्णित किया है जहां यह फ़ंक्शन कॉमन/mysql_helper में स्थित है। जेएस:

statusVar = readStatusVariable(<host>, <statusvariablename>);

Created_tmp_disk_tables और Created_tmp_tables लाने के लिए हम अपने सलाहकार में इस फ़ंक्शन का उपयोग कर सकते हैं।

    for (idx = 0; idx < hosts.size(); ++idx)
    {
        host        = hosts[idx];
        map         = host.toMap();
        connected     = map["connected"];
        var advice = new CmonAdvice();
        var tmp_tables = readStatusVariable(host, ‘Created_tmp_tables’);
        var tmp_disk_tables = readStatusVariable(host, ‘Created_tmp_disk_tables’);

और अब हम अस्थायी डिस्क तालिका अनुपात की गणना कर सकते हैं:

        var tmp_disk_table_ratio = tmp_disk_tables / (tmp_tables + tmp_disk_tables) * 100;

और अगर यह अनुपात हमारे द्वारा शुरुआत में निर्धारित सीमा से अधिक है तो सतर्क करें:

        if(checkPrecond(host))
        {
           if(tmp_disk_table_ratio > WARNING_THRESHOLD) {
               advice.setJustification("Temporary tables written to disk is excessive");
               msg = ADVICE_WARNING;
           }
           else {
               advice.setJustification("Temporary tables written to disk not excessive");
               msg = ADVICE_OK;
           }
        }

यहां संदेश चर के लिए सलाह असाइन करना महत्वपूर्ण है क्योंकि इसे बाद में सेटएडवाइस () फ़ंक्शन के साथ सलाह ऑब्जेक्ट में जोड़ा जाएगा। पूर्णता के लिए पूरी स्क्रिप्ट:

#include "common/mysql_helper.js"

/**
 * Checks the percentage of max ever used connections 
 * 
 */ 
var WARNING_THRESHOLD=20;
var TITLE="Temporary tables on disk ratio";
var ADVICE_WARNING="More than 20% of temporary tables are written to disk. It is advised to review your queries, for example, via the Query Monitor.";
var ADVICE_OK="Temporary tables on disk are not excessive.";

function main()
{
    var hosts     = cluster::mySqlNodes();
    var advisorMap = {};

    for (idx = 0; idx < hosts.size(); ++idx)
    {
        host        = hosts[idx];
        map         = host.toMap();
        connected     = map["connected"];
        var advice = new CmonAdvice();
        var tmp_tables = readStatusVariable(host, 'Created_tmp_tables');
        var tmp_disk_tables = readStatusVariable(host, 'Created_tmp_disk_tables');
        var tmp_disk_table_ratio = tmp_disk_tables / (tmp_tables + tmp_disk_tables) * 100;
        
        if(!connected)
            continue;
        if(checkPrecond(host))
        {
           if(tmp_disk_table_ratio > WARNING_THRESHOLD) {
               advice.setJustification("Temporary tables written to disk is excessive");
               msg = ADVICE_WARNING;
               advice.setSeverity(0);
           }
           else {
               advice.setJustification("Temporary tables written to disk not excessive");
               msg = ADVICE_OK;
           }
        }
        else
        {
            msg = "Not enough data to calculate";
            advice.setJustification("there is not enough load on the server or the uptime is too little.");
            advice.setSeverity(0);
        }
        advice.setHost(host);
        advice.setTitle(TITLE);
        advice.setAdvice(msg);
        advisorMap[idx]= advice;
    }
    return advisorMap;
}

अब आप 20 की दहलीज के साथ खेल सकते हैं, उदाहरण के लिए इसे 1 या 2 तक कम करने का प्रयास करें और फिर आप शायद देख सकते हैं कि यह सलाहकार वास्तव में आपको इस मामले पर सलाह कैसे देगा।

जैसा कि आप देख सकते हैं, एक साधारण स्क्रिप्ट के साथ आप एक दूसरे के खिलाफ दो चर की जांच कर सकते हैं और उनके परिणाम के आधार पर रिपोर्ट/सलाह कर सकते हैं। लेकिन क्या यह सब है? अभी भी कुछ चीज़ें हैं जिन्हें हम सुधार सकते हैं!

मेरे पहले सलाहकार में सुधार

पहली चीज जो हम सुधार सकते हैं, वह यह है कि यह सलाहकार बहुत मायने नहीं रखता। पिछले FLUSH STATUS या MySQL के स्टार्टअप के बाद से मेट्रिक वास्तव में डिस्क पर अस्थायी तालिकाओं की कुल संख्या को दर्शाता है। यह जो नहीं कहता वह दर . पर है यह वास्तव में डिस्क पर अस्थायी टेबल बनाता है। इसलिए हम होस्ट के अपटाइम का उपयोग करके Created_tmp_disk_tables को रेट में बदल सकते हैं:

    var tmp_disk_table_rate = tmp_disk_tables / uptime;

यह हमें प्रति सेकंड अस्थायी तालिकाओं की संख्या देनी चाहिए और tmp_disk_table_ratio के साथ संयुक्त होना चाहिए, यह हमें चीजों पर अधिक सटीक दृष्टिकोण देगा। दोबारा, एक बार जब हम प्रति सेकंड दो अस्थायी तालिकाओं की सीमा तक पहुंच जाते हैं, तो हम तुरंत अलर्ट/सलाह नहीं भेजना चाहते हैं।

एक और चीज जिसे हम सुधार सकते हैं वह है आम/mysql_helper.js लाइब्रेरी से readStatusVariable(, ) फ़ंक्शन का उपयोग नहीं करना। यह फ़ंक्शन हर बार जब हम एक स्टेटस वेरिएबल पढ़ते हैं, तो MySQL होस्ट के लिए एक क्वेरी निष्पादित करता है, जबकि CMON पहले से ही उनमें से अधिकांश को हर सेकेंड में पुनर्प्राप्त कर लेता है और हमें वैसे भी रीयल-टाइम स्टेटस की आवश्यकता नहीं होती है। ऐसा नहीं है कि दो या तीन प्रश्न क्लस्टर में मेजबानों को मार देंगे, लेकिन अगर इनमें से कई सलाहकार एक समान तरीके से चलाए जाते हैं, तो यह अतिरिक्त प्रश्नों के ढेर बना सकता है।

इस मामले में हम host.sqlInfo() फ़ंक्शन का उपयोग करके मानचित्र में स्थिति चर पुनर्प्राप्त करके इसे अनुकूलित कर सकते हैं और मानचित्र के रूप में सब कुछ पुनर्प्राप्त कर सकते हैं। इस फ़ंक्शन में होस्ट की सबसे महत्वपूर्ण जानकारी होती है, लेकिन इसमें सभी शामिल नहीं होते हैं। उदाहरण के लिए वेरिएबल अपटाइम जो हमें दर के लिए चाहिए वह host.sqlInfo() मानचित्र में उपलब्ध नहीं है और इसे readStatusVariable(, ) फ़ंक्शन के साथ पुनर्प्राप्त किया जाना है।

हमारे सलाहकार अब इस तरह दिखेंगे, जिसमें परिवर्तन/जोड़ बोल्ड में चिह्नित हैं:

#include "common/mysql_helper.js"

/**
 * Checks the percentage of max ever used connections 
 * 
 */ 
var RATIO_WARNING_THRESHOLD=20;
var RATE_WARNING_THRESHOLD=2;
var TITLE="Temporary tables on disk ratio";
var ADVICE_WARNING="More than 20% of temporary tables are written to disk and current rate is more than 2 temporary tables per second. It is advised to review your queries, for example, via the Query Monitor.";
var ADVICE_OK="Temporary tables on disk are not excessive.";

function main()
{
    var hosts     = cluster::mySqlNodes();
    var advisorMap = {};

    for (idx = 0; idx < hosts.size(); ++idx)
    {
        host        = hosts[idx];
        map         = host.toMap();
        connected     = map["connected"];
        var advice = new CmonAdvice();
        var hostStatus = host.sqlInfo();
        var tmp_tables = hostStatus['CREATED_TMP_TABLES'];
        var tmp_disk_tables = hostStatus['CREATED_TMP_DISK_TABLES'];
        var uptime = readStatusVariable(host, 'uptime');
        var tmp_disk_table_ratio = tmp_disk_tables / (tmp_tables + tmp_disk_tables) * 100;
        var tmp_disk_table_rate = tmp_disk_tables / uptime;
        
        if(!connected)
            continue;
        if(checkPrecond(host))
        {
           if(tmp_disk_table_rate > RATE_WARNING_THRESHOLD && tmp_disk_table_ratio > RATIO_WARNING_THRESHOLD) {
               advice.setJustification("Temporary tables written to disk is excessive: " + tmp_disk_table_rate + " tables per second and overall ratio of " + tmp_disk_table_ratio);
               msg = ADVICE_WARNING;
               advice.setSeverity(0);
           }
           else {
               advice.setJustification("Temporary tables written to disk not excessive");
               msg = ADVICE_OK;
           }
        }
        else
        {
            msg = "Not enough data to calculate";
            advice.setJustification("there is not enough load on the server or the uptime is too little.");
            advice.setSeverity(0);
        }
        advice.setHost(host);
        advice.setTitle(TITLE);
        advice.setAdvice(msg);
        advisorMap[idx]= advice;
    }
    return advisorMap;
}

मेरे पहले सलाहकार को शेड्यूल करना

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

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

इस ब्लॉग के बाद, यदि नोड्स प्रभावित होते हैं, तो हम SELinux के लिए एक चेकर या स्पेक्टर और मेल्टडाउन के लिए सुरक्षा जांच बनाएंगे। बने रहें!


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला में स्कीमा और मॉडल दोनों क्यों होते हैं?

  2. MongoDB से कनेक्ट करने के लिए स्प्रिंग का उपयोग कैसे करें जिसके लिए प्रमाणीकरण की आवश्यकता है

  3. नेवला के साथ संग्रह के तत्वों को खोजें और गिनें

  4. MongoDB - टेक्स्ट फ़ील्ड और टेक्स्ट इंडेक्स पर इंडेक्स के बीच अंतर?

  5. MongoDB के साथ GUID आधारित शार्ड कुंजी को प्रोग्रामेटिक रूप से पूर्व-विभाजित कैसे करें