स्केलिंग लॉगस्टैश (रेडिस / इलास्टिक्स खोज के साथ)


16

12 सेंटीमीटर से अधिक 5.8 सर्वरों के क्लस्टर पर, मैंने देशी लॉगस्टैश शिपर का उपयोग करके लॉगस्टैश को तैनात किया, जो /var/log/*/*.logकेंद्रीय लॉगस्टैश सर्वर पर वापस भेजता है।

हमने rsyslogd को shipper के रूप में उपयोग करने की कोशिश की, लेकिन rsyslogd के ImFile मॉड्यूल में बग के कारण, यदि दूरस्थ छोर ने उत्तर नहीं दिया, तो लॉग स्मृति में ढेर हो जाएंगे।

हम वर्तमान में Redis को परिवहन तंत्र के रूप में उपयोग कर रहे हैं, इसलिए logstash01 स्थानीय रूप से चलने वाली redis है, इन लॉग के लिए VLAN के लिए IP से बाध्य है।

तो logstash-shipper logstash01 पर redis को भेजता है। logstash01 एक अलग प्रक्रिया में चल रहे एलिस्टिक्स को भेजता है।

यहां हम देख रहे हैं। इलास्टिसर्च में 141 अवरुद्ध धागे हैं। इलास्टिसर्च अभिभावक शो को स्ट्रगल करना:

futex(0x7f4ccd1939d0, FUTEX_WAIT, 26374, NULL

यहाँ इलास्टिक्स खोज से jstack है

यहाँ लॉगस्टैश से jstack है

तो .. कल रात, कुछ वेब्सवर्कर्स (जिनके लॉग लॉगस्ट द्वारा पूंछे गए हैं) पागल हो गए, जिनमें 500 से अधिक लोड औसत हैं।

Logstash01 पर, यह है

Dec 19 00:44:45 logstash01 kernel: [736965.925863] Killed process 23429 (redis-server) total-vm:5493112kB, anon-rss:4248840kB, file-rss:108kB

तो OOM- किलर ने रेडिस-सर्वर को मार दिया, जिसका मतलब था कि लॉग इन सर्वरों पर मेमोरी में ढेर हो गया जो कि शिपिंग सामान थे .. जिसका किसी भी तरह से मतलब है कि अपाचे को एक मोड़ में अपने शूरवीर मिलते हैं। (स्पष्ट रूप से, मुझे यकीन नहीं है कि, मैं सिर्फ यह मान रहा हूं कि यह लॉग को पूंछ रहा है) ।।

यह मेरा सिद्धांत है कि कैसे घटनाएँ सामने आईं:

  1. हमारे पास एक ट्रैफिक स्पाइक था।
  2. लॉग की एक विशाल राशि उत्पन्न की गई थी।
  3. ये Redis में ढेर हो गए, क्योंकि logstash / elasticsearch केवल 300-400 नई घटनाओं / सेकंड को संभालने में सक्षम प्रतीत होता है।
  4. रेडिस पूरी तरह से उस बिंदु तक भर गया था जहां ओओएम-हत्यारे ने इसे मूर्खतापूर्ण तरीके से मार दिया था।
  5. रेडिस नए आइटम स्वीकार करना बंद कर देता है।
  6. आइटम अब दूरस्थ मेजबान पक्ष पर ढेर करना शुरू करते हैं।
  7. सब कुछ पागल हो जाता है । अपाचे अनुरोध स्वीकार करना बंद कर देता है। (क्यों?)।

प्रश्न ये हैं:

  1. अपाचे क्यों पागल हो जाता है अगर वहाँ सिर्फ कुछ लॉग इसकी पूंछ है। क्या यह है कि इसे पूंछने वाली चीज लेखन से अपाचे को रोकती है?

  2. क्या इलास्टिक खोज को तेज / बेहतर / लचीला बनाने के लिए एक समझदार तरीका है?

  3. क्या रेडिस को लचीला बनाने के लिए एक सामान्य तरीका है और OOM'd होने के कारण मरना नहीं है

  4. क्या मेरे द्वारा इसे स्थापित करने के तरीके में कोई मौलिक दोष है, या सभी को यह समस्या है?

- संपादित करें -

कुछ निष्कर्ष @lusis के लिए।

admin@log01:/etc/init$ free -m
             total       used       free     shared    buffers     cached
Mem:          7986       6041       1944          0        743       1157
-/+ buffers/cache:       4140       3845
Swap:         3813       3628        185

Filesystem             Size  Used Avail Use% Mounted on
/dev/sda2               19G  5.3G   13G  31% /
udev                   3.9G  4.0K  3.9G   1% /dev
tmpfs                  1.6G  240K  1.6G   1% /run
none                   5.0M     0  5.0M   0% /run/lock
none                   3.9G     0  3.9G   0% /run/shm
/dev/sda1               90M   72M   14M  85% /boot
/dev/mapper/data-disk  471G  1.2G  469G   1% /data

/dev/sda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
/dev/mapper/data-disk on /data type ext3 (rw)
/data/elasticsearch on /var/lib/elasticsearch type none (rw,bind)

log01:/etc/init$ top 
top - 14:12:20 up 18 days, 21:59,  2 users,  load average: 0.20, 0.35, 0.40
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
Cpu0  :  3.0%us,  1.0%sy,  0.0%ni, 95.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  : 12.0%us,  1.0%sy,  0.0%ni, 86.6%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu2  :  4.7%us,  0.3%sy,  0.0%ni, 94.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  5.6%us,  1.3%sy,  0.0%ni, 93.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  5.3%us,  1.3%sy,  0.0%ni, 93.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  6.4%us,  1.0%sy,  0.0%ni, 92.3%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   8178120k total,  6159036k used,  2019084k free,   761780k buffers

1
मैं ES और इन सुपर शांत setups के साथ समस्या है। मैं अब अजगर में अपना खुद का सरल syslog रिसीवर लिख रहा हूं। सौदा करने का एकमात्र तरीका आगे शुरू करना था और ईएस नोड्स को जोड़ना जारी रखा, लॉगस्टैश के बढ़ते आकार ... दुःस्वप्न। मेरा मानना ​​है कि अपाचे लॉग फाइल राइट पर ब्लॉक करता है ताकि अगर वह लॉग फाइल में नहीं लिख सके तो यह एक समस्या हो सकती है।
अभिषेक दुजारी

पुन :: rsyslog मुद्दा, Bitbucket एक समस्या rsyslog समस्याओं के कारण भी था। उन्होंने इसके बारे में ब्लॉग किया और उन्होंने इसके चारों ओर कैसे काम किया।
जेम्स ओ'गोर्मन

जवाबों:


22

आपकी पोस्ट ऐनक (एलएस इंडेक्सर पर मेमोरी, लॉग वॉल्यूम या बहुत कुछ) के रूप में बहुत अधिक वर्णन नहीं करती है, लेकिन मैं आपके सवालों का जवाब देने की कोशिश करूंगा और सबसे अच्छा कर सकता हूं। अस्वीकरण: मैं लॉगस्टैश देवों में से एक हूं -

  1. अपाचे गोइंग नट्स की संभावना थी कि लोगस्टैश प्रक्रिया के अभिनय का एक पक्ष प्रभाव हो। मैं अभी के लिए एक तरफ रख दिया था।

  2. ईएस एफ / बी / एस बनाने का समझदार तरीका अधिक ईएस नोड है। यह गंभीरता से आसान है। वे भी नेटवर्क टोपोलॉजी के आधार पर एक दूसरे को ऑटोडिस्कवर करते हैं। इस उद्योग में 17 वर्षों के बाद मैंने कभी भी किसी पैमाने को क्षैतिज रूप से इतना आसान नहीं देखा जितना कि इलास्टिकसर्च।

  3. एफ / बी / एस रेडिस के लिए, किसी भी रेडिस क्लस्टरिंग का उपयोग न करें। लॉगस्टैश के नए संस्करण आंतरिक रूप से रेडिस लोडबैलेंसिंग कर सकते हैं। Redis आउटपुट प्लगइन कॉन्फिग में Redis होस्ट की एक सूची का समर्थन करता है और समर्थन को इनपुट साइड में जोड़ने के साथ-साथ उस से मेल खाता है। अंतरिम में आप अनुक्रमणिका / उपभोक्ता पक्ष पर कई Redis इनपुट परिभाषाओं का उपयोग कर सकते हैं।

  4. मैं यह कहने से परे जवाब नहीं दे सकता कि ऐसा लगता है कि आप एक एकल (संभवतः कमज़ोर मेजबान) के साथ बहुत कुछ करने की कोशिश कर रहे हैं।

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

लॉजस्टैश लेगोस की तरह काम करता है। आप या तो 2x4 ईंट का उपयोग कर सकते हैं या समान कार्य को पूरा करने के लिए दो 2x2 ईंटों का उपयोग कर सकते हैं। लॉगस्टैश के मामले को छोड़कर, यह वास्तव में एक बड़ी ईंट की तुलना में छोटी ईंटों का उपयोग करने के लिए मजबूत है।

कुछ सामान्य सलाह जो हम आम तौर पर देते हैं:

  • किनारे से जितनी जल्दी हो सके जहाज लॉग करें यदि आप डिस्क पर लिखने के बजाय शुद्ध नेटवर्क परिवहन का उपयोग कर सकते हैं, तो यह अच्छा है लेकिन आवश्यक नहीं है। Logstash JVM- आधारित है और इसके अच्छे और बुरे प्रभाव हैं। एक वैकल्पिक शिपर का उपयोग करें। मैंने एक अजगर आधारित एक ( https://github.com/lusis/logstash-shipper ) लिखा था लेकिन मैं सुझाव दूंगा कि लोग इसके बजाय बीवर का उपयोग करें ( https://github.com/josegonzalez/beaver )।

  • अपने लॉग को एक ऐसे प्रारूप में उत्पन्न करें जिसके लिए जितना संभव हो उतना कम फ़िल्टरिंग की आवश्यकता होती है (json या optimis json-event format) यह हमेशा संभव नहीं होता है। मैं एक log4j appender लिखा था यह करने के लिए ( https://github.com/lusis/zmq-appender ) और अंत में (अपनी ही रेपो में पैटर्न लेआउट बाहर तोड़ दिया https://github.com/lusis/log4j-jsonevent-layout )। इसका मतलब है कि मुझे उन लॉग के लिए लॉगस्टैश में कोई फ़िल्टरिंग करने की आवश्यकता नहीं है। मैंने केवल 'json-event' के इनपुट पर प्रकार सेट किया है

अपाचे के लिए, आप इस दृष्टिकोण की कोशिश कर सकते हैं: http://cookbook.logstash.net/recipes/apache-json.logs/

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

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

वहाँ कंपनियों (Sonian की तरह) ElasticSearch स्केलिंग करने के लिए petabyte स्तर और कंपनियों (Mailchimp और Dreamhost की तरह) Logstash के रूप में अच्छी तरह से पागल स्तर तक स्केलिंग कर रहे हैं। यह किया जा सकता है।


मैं कुछ सिस्टम जानकारी को Q
टॉम ओ'कॉनर

मैं कहूंगा कि लॉग्स की मात्रा और आप उन्हें कब तक रख रहे हैं, इसके आधार पर 8 जी को कम किया गया है। मैं Redis और Logstash को किसी अन्य सर्वर पर ले जाकर शुरू करूँगा। क्या आप लॉग-इन के साथ ईएस-इन-प्रोसेस या एक अलग सेवा के रूप में चल रहे हैं?
लूसी

1
यह एक अलग सेवा है। मैंने क्रिसमस से पहले एक साहसिक कदम उठाया, और डिस्क व्यवहार के लिए रेडिस की दृढ़ता को बंद कर दिया, और पूरी बात अधिक स्थिर हो गई।
टॉम ओ'कॉनर

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