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

MongoDB के लिए एक प्रदर्शन धोखा पत्रक

डेटाबेस का प्रदर्शन संगठनात्मक प्रदर्शन को प्रभावित करता है, और हम एक त्वरित सुधार की तलाश करना चाहते हैं। MongoDB में प्रदर्शन को बेहतर बनाने के कई तरीके हैं। इस ब्लॉग में, हम आपके डेटाबेस वर्कलोड को बेहतर ढंग से समझने में आपकी मदद करेंगे, और ऐसी चीजें जो इसे नुकसान पहुंचा सकती हैं। उत्पादन डेटाबेस का प्रबंधन करने वाले किसी भी व्यक्ति के लिए सीमित संसाधनों का उपयोग करने का ज्ञान आवश्यक है।

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

प्रदर्शन की नि:शुल्क निगरानी

MongoDB ने स्टैंडअलोन इंस्टेंस और प्रतिकृति सेट के लिए क्लाउड में एक निःशुल्क प्रदर्शन निगरानी उपकरण पेश किया। सक्षम होने पर, मॉनिटर किया गया डेटा समय-समय पर विक्रेता की क्लाउड सेवा पर अपलोड किया जाता है। इसके लिए किसी अतिरिक्त एजेंट की आवश्यकता नहीं है, कार्यक्षमता को नए MongoDB 4.0+ में बनाया गया है। सेटअप और प्रबंधन के लिए प्रक्रिया काफी सरल है। एकल कमांड सक्रियण के बाद, आपको अपने हाल के प्रदर्शन आँकड़ों तक पहुँचने के लिए एक अद्वितीय वेब पता मिलेगा। आप केवल पिछले 24 घंटों में अपलोड किए गए मॉनिटर किए गए डेटा तक पहुंच सकते हैं।

इस फीचर को एक्टिवेट करने का तरीका यहां बताया गया है। आप रनटाइम के दौरान नि:शुल्क निगरानी को सक्षम/अक्षम कर सकते हैं:

-- Enable Free Monitoring
db.enableFreeMonitoring()
-- Disable Free Monitoring
db.disableFreeMonitoring()

आप कॉन्फ़िगरेशन फ़ाइल सेटिंग Cloud.monitoring.free.state या कमांड-लाइन विकल्प --enableFreeMonitoring

का उपयोग करके mongod स्टार्टअप के दौरान मुफ्त निगरानी को सक्षम या अक्षम भी कर सकते हैं।
db.enableFreeMonitoring()

सक्रियण के बाद, आपको वास्तविक स्थिति वाला एक संदेश दिखाई देगा।

{
    "state" : "enabled",
    "message" : "To see your monitoring data, navigate to the unique URL below. Anyone you share the URL with will also be able to view this page. You can disable monitoring at any time by running db.disableFreeMonitoring().",
    "url" : "https://cloud.mongodb.com/freemonitoring/cluster/XEARVO6RB2OTXEAHKHLKJ5V6KV3FAM6B",
    "userReminder" : "",
    "ok" : 1
}

बस स्थिति आउटपुट से ब्राउज़र में URL को कॉपी/पेस्ट करें, और आप प्रदर्शन मेट्रिक्स की जाँच शुरू कर सकते हैं।

MongoDB फ्री मॉनिटरिंग निम्नलिखित मेट्रिक्स के बारे में जानकारी प्रदान करता है:

  • ऑपरेशन एक्ज़ीक्यूशन टाइम्स (पढ़ें, लिखें, कमांड)
  • डिस्क का उपयोग (किसी भी ड्राइव का अधिकतम उपयोग%, सभी ड्राइव का औसत उपयोग%)
  • स्मृति (निवासी, आभासी, मैप की गई)
  • नेटवर्क - इनपुट / आउटपुट (BYTES IN, BYTES OUT)
  • नेटवर्क - अनुरोधों की संख्या (NUM अनुरोध)
  • प्रतिस्पर्धियों (INSERT, QUERY, UPDATE, DELETE, GETMORE, COMMAND)
  • प्रतिद्वंद्वी - प्रतिकृति (INSERT, QUERY, UPDATE, DELETE, GETMORE, COMMAND)
  • क्वेरी लक्ष्यीकरण (स्कैन किया गया / लौटाया गया, स्कैन किया गया ऑब्जेक्ट / लौटाया गया)
  • कतार (पाठक, लेखक, कुल)
  • सिस्टम CPU उपयोग (USER, NICE, KERNEL, IOWAIT, IRQ, SOFT IRQ, STEAL, GUEST)
MongoDB फ्री मॉनिटरिंग फर्स्ट यूज MongoDB फ्री मॉनिटरिंग सिस्टम CPU उपयोग MongoDB फ्री मॉनिटरिंग चार्ट

अपनी नि:शुल्क निगरानी सेवा की स्थिति देखने के लिए, निम्न विधि का उपयोग करें:

db.getFreeMonitoringStatus()

सर्वरस्टैटस और हेल्पर db.serverStatus() में फ्री मॉनिटरिंग फील्ड में फ्री मॉनिटरिंग स्टैटिस्टिक्स भी शामिल हैं।

अभिगम नियंत्रण के साथ चलते समय, नि:शुल्क निगरानी सक्षम करने और स्थिति प्राप्त करने के लिए उपयोगकर्ता के पास निम्नलिखित विशेषाधिकार होने चाहिए:

{ resource: { cluster : true }, actions: [ "setFreeMonitoring", "checkFreeMonitoringStatus" ] }

यह टूल उन लोगों के लिए एक अच्छी शुरुआत हो सकती है, जिन्हें कमांडलाइन से MongoDB सर्वर स्टेटस आउटपुट को पढ़ना मुश्किल लगता है:

db.serverStatus()

नि:शुल्क निगरानी एक अच्छी शुरुआत है लेकिन इसके बहुत सीमित विकल्प हैं, यदि आपको अधिक उन्नत उपकरण की आवश्यकता है तो आप MongoDB Ops Manager या ClusterControl की जांच कर सकते हैं।

डेटाबेस संचालन लॉग करना

MongoDB ड्राइवर और क्लाइंट एप्लिकेशन सर्वर लॉग फ़ाइल को जानकारी भेज सकते हैं। ऐसी जानकारी घटना के प्रकार पर निर्भर करती है। वर्तमान सेटिंग्स की जाँच करने के लिए, व्यवस्थापक के रूप में लॉगिन करें और निष्पादित करें:

db.getLogComponents()

लॉग संदेशों में कई घटक शामिल हैं। यह संदेशों का एक कार्यात्मक वर्गीकरण प्रदान करना है। प्रत्येक घटक के लिए, आप भिन्न लॉग वर्बोसिटी सेट कर सकते हैं। घटकों की वर्तमान सूची है:

ACCESS, COMMAND, CONTROL, FTD, GEO, INDEX, NETWORK, QUERY, REPL_HB, REPL, ROLLBACK, REPL, SHARDING, STORAGE, RECOVERY, JOURNAL, STORAGE, WRITE.

प्रत्येक घटक के बारे में अधिक जानकारी के लिए, दस्तावेज़ीकरण देखें।

क्वेरी कैप्चर करना - डेटाबेस प्रोफाइलर

MongoDB डेटाबेस प्रोफाइलर उन ऑपरेशनों के बारे में जानकारी एकत्र करता है जो एक mongod उदाहरण के विरुद्ध चलते हैं। डिफ़ॉल्ट रूप से, प्रोफाइलर कोई डेटा एकत्र नहीं करता है। आप सभी कार्रवाइयों (मान 2), या वे जो धीमाओं के मान से अधिक समय लेते हैं, एकत्र करना चुन सकते हैं . उत्तरार्द्ध एक उदाहरण पैरामीटर है जिसे मोंगोडब कॉन्फ़िगरेशन फ़ाइल के माध्यम से नियंत्रित किया जा सकता है। वर्तमान स्तर की जाँच करने के लिए:

db.getProfilingLevel()

सेट की गई सभी क्वेरीज़ को कैप्चर करने के लिए:

db.setProfilingLevel(2)

कॉन्फ़िगरेशन फ़ाइल में, आप सेट कर सकते हैं:

profile = <0/1/2>
slowms = <value>

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

फिर 10 सबसे हाल की सूची बनाने के लिए:

db.system.profile.find().limit(10).sort(
{ ts : -1 }
).pretty()

सभी को सूचीबद्ध करने के लिए:

db.system.profile.find( { op:
{ $ne : 'command' }
} ).pretty()

और एक विशिष्ट संग्रह के लिए सूचीबद्ध करने के लिए:

db.system.profile.find(
{ ns : 'mydb.test' }
).pretty()

MongoDB लॉगिंग

MongoDB लॉग स्थान को आपके कॉन्फ़िगरेशन की लॉगपथ सेटिंग में परिभाषित किया गया है, और यह आमतौर पर /var/log/mongodb/mongod.log है। आप MongoDB कॉन्फ़िगरेशन फ़ाइल /etc/mongod.conf पर पा सकते हैं।

यहां नमूना डेटा है:

2018-07-01T23:09:27.101+0000 I ASIO     [NetworkInterfaceASIO-Replication-0] Connecting to node1:27017
2018-07-01T23:09:27.102+0000 I ASIO     [NetworkInterfaceASIO-Replication-0] Failed to connect to node1:27017 - HostUnreachable: Connection refused
2018-07-01T23:09:27.102+0000 I ASIO     [NetworkInterfaceASIO-Replication-0] Dropping all pooled connections to node1:27017 due to failed operation on a connection
2018-07-01T23:09:27.102+0000 I REPL_HB  [replexec-2] Error in heartbeat (requestId: 21589) to node1:27017, response status: HostUnreachable: Connection refused
2018-07-01T23:09:27.102+0000 I ASIO     [NetworkInterfaceASIO-Replication-0] Connecting to node1:27017

आप घटक की लॉग वर्बोसिटी को सेटिंग (क्वेरी उदाहरण) द्वारा संशोधित कर सकते हैं:

db.setLogLevel(2, "query")

लॉग फ़ाइल महत्वपूर्ण हो सकती है, इसलिए आप प्रोफाइलिंग से पहले इसे साफ़ करना चाह सकते हैं। MongoDB कमांडलाइन कंसोल से, दर्ज करें:

db.runCommand({ logRotate : 1 });

ऑपरेटिंग सिस्टम पैरामीटर की जांच करना

स्मृति सीमाएं

अपने लॉगिन से जुड़ी सीमाओं को देखने के लिए, ulimit -a कमांड का उपयोग करें। निम्नलिखित थ्रेशोल्ड और सेटिंग्स मोंगोड और मोंगोस परिनियोजन के लिए विशेष रूप से महत्वपूर्ण हैं:

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-n (open files): 64000
-m (memory size): unlimited [1]
-u (processes/threads): 32000

मोंगोड स्टार्टअप स्क्रिप्ट के नए संस्करण (/etc/init.d/mongod) में डिफ़ॉल्ट सेटिंग्स को प्रारंभ विकल्प में बनाया गया है:

start()
{
  # Make sure the default pidfile directory exists
  if [ ! -d $PIDDIR ]; then
    install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
  fi

  # Make sure the pidfile does not exist
  if [ -f "$PIDFILEPATH" ]; then
      echo "Error starting mongod. $PIDFILEPATH exists."
      RETVAL=1
      return
  fi

  # Recommended ulimit values for mongod or mongos
  # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  #
  ulimit -f unlimited
  ulimit -t unlimited
  ulimit -v unlimited
  ulimit -n 64000
  ulimit -m unlimited
  ulimit -u 64000
  ulimit -l unlimited

  echo -n $"Starting mongod: "
  daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod
}

मेमोरी मैनेजमेंट सबसिस्टम की भूमिका जिसे वर्चुअल मेमोरी मैनेजर भी कहा जाता है, संपूर्ण कर्नेल और उपयोगकर्ता प्रोग्राम के लिए भौतिक मेमोरी (RAM) के आवंटन का प्रबंधन करना है। इसे vm.* पैरामीटर द्वारा नियंत्रित किया जाता है। MongoDB प्रदर्शन को ट्यून करने के लिए आपको पहले दो बातों पर विचार करना चाहिए - vm.dirty_ratio और vm.dirty_background_ratio

vm.dirty_ratio सिस्टम मेमोरी की पूर्ण अधिकतम मात्रा है जिसे डिस्क पर सब कुछ करने से पहले गंदे पृष्ठों से भरा जा सकता है। जब सिस्टम इस बिंदु पर पहुंच जाता है, तब तक सभी नए I/O ब्लॉक हो जाते हैं जब तक कि डिस्क पर गंदे पृष्ठ नहीं लिखे जाते। यह अक्सर लंबे I/O विराम का स्रोत होता है। डिफ़ॉल्ट 30 है, जो आमतौर पर बहुत अधिक है। vm.dirty_background_ratio सिस्टम मेमोरी का प्रतिशत है जिसे "डर्टी" पेजों से भरा जा सकता है - मेमोरी पेज जिन्हें अभी भी डिस्क पर लिखे जाने की आवश्यकता है। अच्छी शुरुआत 10 से जाना और प्रदर्शन को मापना है। कम मेमोरी वाले वातावरण के लिए, 20 एक अच्छी शुरुआत है। बड़ी मेमोरी वाले डेटाबेस सर्वर पर गंदे अनुपात के लिए अनुशंसित सेटिंग vm.dirty_ratio =15 और vm.dirty_background_ratio =5 या संभवतः कम है।

गंदा अनुपात चलाने के लिए जाँच करें:

sysctl -a | grep dirty

आप "/etc/sysctl.conf" में निम्न पंक्तियों को जोड़कर इसे सेट कर सकते हैं:

स्वैपनेस

सर्वर पर जहां MongoDB एकमात्र सेवा चल रही है, vm.swapiness =1 सेट करना एक अच्छा अभ्यास है। डिफ़ॉल्ट सेटिंग 60 पर सेट है जो डेटाबेस सिस्टम के लिए उपयुक्त नहीं है।

vi /etc/sysctl.conf
vm.swappiness = 1

पारदर्शी विशाल पृष्ठ

यदि आप RedHat पर अपना MongoDB चला रहे हैं, तो सुनिश्चित करें कि पारदर्शी विशाल पृष्ठ अक्षम हैं।
इसे कमांड द्वारा जांचा जा सकता है:

cat /proc/sys/vm/nr_hugepages 
0

0 का अर्थ है कि पारदर्शी विशाल पृष्ठ अक्षम हैं।

फाइलसिस्टम विकल्प

ext4 rw,seclabel,noatime,data=ordered 0 0

NUMA (गैर-समान मेमोरी एक्सेस)

MongoDB NUMA का समर्थन नहीं करता, इसे BIOS में अक्षम करें।

नेटवर्क स्टैक

net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096

एनटीपी डीमन

एनटीपी टाइम सर्वर दानव को स्थापित करने के लिए, निम्न में से एक सिस्टम कमांड का उपयोग करें।

#Red Hat
sudo yum install ntp
#Debian
sudo apt-get install ntp

आप किसी अन्य ब्लॉग में MongoDB के लिए OS प्रदर्शन के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

योजना के बारे में बताएं

अन्य लोकप्रिय डेटाबेस सिस्टम के समान, MongoDB एक व्याख्या सुविधा प्रदान करता है जो बताता है कि डेटाबेस ऑपरेशन कैसे निष्पादित किया गया था। व्याख्या परिणाम क्वेरी योजनाओं को चरणों के पेड़ के रूप में प्रदर्शित करते हैं। प्रत्येक चरण अपने ईवेंट (अर्थात दस्तावेज़ या अनुक्रमणिका कुंजियाँ) को पैरेंट नोड में भेजता है। लीफ नोड्स संग्रह या सूचकांकों तक पहुँचते हैं। आप किसी क्वेरी में व्याख्या ('निष्पादन आँकड़े') जोड़ सकते हैं।

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} ).explain('executionStats');
or append it to the collection:
db.inventory.explain('executionStats').find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} );

कुंजियाँ जिनका मान आपको उपरोक्त कमांड निष्पादन के आउटपुट में देखना चाहिए:

  • totalKeysExamed:क्वेरी वापस करने के लिए स्कैन की गई अनुक्रमणिका प्रविष्टियों की कुल संख्या।
  • totalDocsपरीक्षित:परिणाम खोजने के लिए स्कैन किए गए दस्तावेज़ों की कुल संख्या।
  • ExecutionTimeMillis:क्वेरी योजना चयन और क्वेरी निष्पादन के लिए आवश्यक मिलीसेकंड में कुल समय।

प्रतिकृति अंतराल प्रदर्शन को मापना

प्रतिकृति अंतराल प्राथमिक पर एक ऑपरेशन और ओपलॉग से माध्यमिक तक उस ऑपरेशन के आवेदन के बीच की देरी है। दूसरे शब्दों में, यह परिभाषित करता है कि प्राथमिक नोड के पीछे माध्यमिक कितनी दूर है, जो कि सर्वोत्तम स्थिति में, जितना संभव हो 0 के करीब होना चाहिए।

प्रतिकृति प्रक्रिया कई कारणों से प्रभावित हो सकती है। मुख्य मुद्दों में से एक यह हो सकता है कि द्वितीयक सदस्य सर्वर क्षमता से बाहर हो रहे हैं। प्राथमिक सदस्य पर बड़े लेखन संचालन के कारण द्वितीयक सदस्य ओप्लॉग को फिर से चलाने में असमर्थ होते हैं, या प्राथमिक सदस्य पर अनुक्रमणिका निर्माण करते हैं।

वर्तमान प्रतिकृति अंतराल की जाँच करने के लिए, MongoDB शेल में चलाएँ:

db.getReplicationInfo()
db.getReplicationInfo() 
{
    "logSizeMB" : 2157.1845703125,
    "usedMB" : 0.05,
    "timeDiff" : 4787,
    "timeDiffHours" : 1.33,
    "tFirst" : "Sun Jul 01 2018 21:40:32 GMT+0000 (UTC)",
    "tLast" : "Sun Jul 01 2018 23:00:19 GMT+0000 (UTC)",
    "now" : "Sun Jul 01 2018 23:00:26 GMT+0000 (UTC)"

प्रतिकृति स्थिति आउटपुट का उपयोग प्रतिकृति की वर्तमान स्थिति का आकलन करने और यह निर्धारित करने के लिए किया जा सकता है कि क्या कोई अनपेक्षित प्रतिकृति विलंब है।

rs.printSlaveReplicationInfo()

यह प्राथमिक के संबंध में द्वितीयक सदस्यों के बीच समय की देरी को दर्शाता है।

rs.status()

यह प्रतिकृति के लिए गहन विवरण दिखाता है। हम इन आदेशों का उपयोग करके प्रतिकृति के बारे में पर्याप्त जानकारी एकत्र कर सकते हैं। उम्मीद है, ये सुझाव MongoDB प्रदर्शन की समीक्षा करने का एक त्वरित अवलोकन प्रदान करते हैं। अगर हमसे कुछ छूट गया है तो हमें बताएं।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB में केस असंवेदनशील छँटाई

  2. MongoDB C# ड्राइवर के साथ बहुरूपी प्रकारों को डिसेरिएलाइज़ करना

  3. Node.js में सभी MongoDB डेटाबेस को कैसे सूचीबद्ध करें?

  4. जैक्सन के साथ एक वर्ग को दो अलग-अलग तरीकों से क्रमबद्ध करें

  5. मोंगो गैर-अद्वितीय क्षेत्रों पर 'डुप्लिकेट कुंजी त्रुटि' दे रहा है