Scaling Logstash (พร้อม Redis / ElasticSearch)


16

ในคลัสเตอร์ที่มีเซิร์ฟเวอร์มากกว่า 12 centos 5.8 ฉันปรับใช้ logstash โดยใช้ native logstash shipper ซึ่งส่ง/var/log/*/*.logกลับไปยังเซิร์ฟเวอร์ logstash ส่วนกลาง

เราพยายามใช้ rsyslogd เป็นผู้ส่ง แต่เนื่องจากข้อผิดพลาดในโมดูล ImFile ของ rsyslogd หากปลายทางระยะไกลไม่ตอบกลับบันทึกจะซ้อนกันในหน่วยความจำ

ขณะนี้เรากำลังใช้ Redis เป็นกลไกการขนส่งดังนั้น logstash01 จึงมี redis ทำงานอยู่ภายในเครื่องซึ่งเชื่อมโยงกับ IP สำหรับ VLAN สำหรับบันทึกเหล่านี้

ดังนั้น logstash-shipper ส่งไปยัง redis เมื่อ logstash01 logstash01 ส่งไปยัง Elasticsearch ที่ทำงานในกระบวนการแยกต่างหาก

นี่คือสิ่งที่เราเห็น Elasticsearch มี 141 กระทู้ที่ถูกบล็อก การรัดพาเรนต์ของ ElasticSearch แสดง:

futex(0x7f4ccd1939d0, FUTEX_WAIT, 26374, NULL

นี่คือ jstack จาก elasticsearch

นี่คือ jstack จาก logstash

ดังนั้น .. เมื่อคืนที่ผ่านมาผู้ให้บริการเว็บบางคน (บันทึกของพวกเขาถูกปรับแต่งโดย logstash) ไปที่ถั่วโดยมีค่าเฉลี่ยการโหลดมากกว่า 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 ฆาตกรฆ่า Redis เซิร์ฟเวอร์ซึ่งบันทึกแล้วความหมายซ้อนขึ้นในหน่วยความจำบนเซิร์ฟเวอร์ที่มีการจัดส่งสิ่ง .. ซึ่งอย่างใดหมายความว่า Apache ได้รับกางเกงในบิด (ตรงไปตรงมาฉันไม่แน่ใจว่าฉันแค่คิดว่ามันปรับแต่งบันทึก)

นี่คือทฤษฎีของฉันว่าเหตุการณ์ที่เกิดขึ้น:

  1. เรามีการจราจรติดขัด
  2. มีการสร้างบันทึกจำนวนมหาศาล
  3. สิ่งเหล่านี้ซ้อนกันใน Redis เนื่องจาก logstash / elasticsearch ดูเหมือนว่าจะสามารถจัดการเหตุการณ์ใหม่ได้ 300-400 ครั้ง / วินาที
  4. Redis เติมเต็มจนถึงจุดที่นักฆ่า OOM ฆ่ามันอย่างไร้สติ
  5. Redis หยุดรับรายการใหม่
  6. ตอนนี้ไอเท็มเริ่มซ้อนกันบนฝั่งโฮสต์รีโมต
  7. ทุกอย่างเป็นไปถั่ว Apache หยุดรับคำขอ (ทำไม?).

คำถามเหล่านี้:

  1. ทำไมอาปาเช่จึงบ้าคลั่งถ้ามีบางสิ่งที่ปรับแต่งบันทึกของมัน มันเป็นสิ่งที่ tailing มันป้องกัน apache จากการเขียน?

  2. มีวิธีที่มีเหตุผลเพื่อทำให้ ElasticSearch เร็วขึ้น / ดีขึ้น / ยืดหยุ่นหรือไม่?

  3. มีวิธีที่มีเหตุผลที่จะทำให้ Redis มีความยืดหยุ่นและไม่ตายเพราะเป็น 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 และการตั้งค่าที่ยอดเยี่ยมเหล่านี้ ตอนนี้ฉันกำลังเขียนตัวรับ syslog อย่างง่าย ๆ ของฉันในไพ ธ อน วิธีเดียวที่จะจัดการคือการเริ่มต้นข้างหน้าและเพิ่มโหนด ES เพิ่มขนาดของ logstash ... ฝันร้าย ฉันเชื่อว่า apache บล็อกการเขียนล็อกไฟล์ดังนั้นอาจเป็นปัญหาหากไม่สามารถเขียนไปยังล็อกไฟล์ได้
Abhishek Dujari

Re: ปัญหา rsyslog, Bitbucket มีปัญหาเนื่องจากปัญหา rsyslog ด้วย พวกเขาblogged เกี่ยวกับมันและวิธีการทำงานรอบ ๆ มัน
James O'Gorman

คำตอบ:


22

โพสต์ของคุณไม่ได้อธิบายอะไรมากเกี่ยวกับข้อมูลจำเพาะ (หน่วยความจำบนดัชนี LS, ปริมาณการบันทึกหรืออื่น ๆ ) แต่ฉันจะพยายามตอบคำถามของคุณให้ดีที่สุดที่ฉันทำได้ ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งใน devststash ของ logs -

  1. Apache going nuts อาจเป็นผลข้างเคียงของกระบวนการ logstash ที่ทำขึ้น ตอนนี้ฉันจะทิ้งมันไว้

  2. วิธีที่มีเหตุผลในการสร้าง ES f / b / s คือการเพิ่มโหนด ES เพิ่มเติม มันเป็นเรื่องง่ายอย่างจริงจัง พวกเขายังค้นหาอัตโนมัติซึ่งกันและกันขึ้นอยู่กับโครงสร้างเครือข่าย หลังจาก 17 ปีในอุตสาหกรรมนี้ฉันไม่เคยเห็นอะไรในระดับแนวนอนเหมือนกับ ElasticSearch

  3. หากต้องการ f / b / s Redis อย่าใช้การทำคลัสเตอร์ Redis ใด ๆ Logstash รุ่นที่ใหม่กว่าสามารถทำ Redis loadbalancing ภายในได้ เอาต์พุต Redis รองรับรายการโฮสต์ Redis ในปลั๊กอินการกำหนดค่าและการสนับสนุนกำลังจะถูกเพิ่มลงในด้านอินพุตเช่นกันเพื่อให้ตรงกับที่ ในระหว่างนั้นคุณสามารถใช้นิยามอินพุต Redis ได้หลายคำสั่งในดัชนี / ฝั่งผู้บริโภค

  4. ฉันไม่สามารถตอบคำถามนี้ได้นอกจากบอกว่าดูเหมือนคุณกำลังพยายามทำอะไรมากมายกับโฮสต์เดี่ยว

กระบวนการปรับขนาดที่ดีใด ๆ เริ่มต้นด้วยการแยกส่วนประกอบที่จัดวางไว้เป็นระบบที่แตกต่างกัน ฉันไม่เห็นการกำหนดค่าของคุณในทุกที่ยกเว้นสถานที่ที่ล็อกสต๊อก 'คอขวด' อยู่ในตัวกรอง ขึ้นอยู่กับจำนวนการแปลงที่คุณทำอาจส่งผลต่อการใช้หน่วยความจำของกระบวนการ Logstash

Logstash ใช้งานได้ดีเช่นเลโก้ คุณสามารถใช้อิฐ 2x4 หรือคุณสามารถใช้อิฐ 2x2 สองก้อนเพื่อทำภารกิจเดียวกันให้สำเร็จ ยกเว้นในกรณีที่เป็น logstash จริง ๆ แล้วมันมีความทนทานในการใช้อิฐขนาดเล็กกว่าอิฐก้อนใหญ่ก้อนเดียว

คำแนะนำทั่วไปที่เราให้ตามปกติคือ:

  • จัดส่งบันทึกโดยเร็วที่สุดจากขอบหากคุณสามารถใช้การส่งผ่านเครือข่ายแท้แทนการเขียนลงดิสก์นั่นเป็นเรื่องดี แต่ไม่จำเป็น Logstash ใช้ JVM และมีผลดีและไม่ดี ใช้ผู้ส่งทางเลือก ฉันเขียนหลามแบบพื้นฐาน ( https://github.com/lusis/logstash-shipper ) แต่ฉันอยากจะแนะนำให้คนใช้ Beaver แทน ( https://github.com/josegonzalez/beaver )

  • สร้างบันทึกของคุณในรูปแบบที่ต้องการการกรองเพียงเล็กน้อยเท่าที่จะทำได้ (รูปแบบ json หรือรูปแบบ json-optimally) สิ่งนี้ไม่สามารถทำได้ ฉันเขียน appender log4j เพื่อทำสิ่งนี้ ( https://github.com/lusis/zmq-appender ) และในที่สุดก็แยกเค้าโครงรูปแบบเป็น repo ของตัวเอง ( https://github.com/lusis/log4j-jsonevent-layout ) ซึ่งหมายความว่าฉันไม่ต้องทำการกรองใด ๆ ในล็อกสโตร์สำหรับบันทึกเหล่านั้น ฉันเพิ่งตั้งค่าชนิดของอินพุตเป็น 'json-event'

สำหรับ apache คุณสามารถลองใช้วิธีนี้: http://cookbook.logstash.net/recipes/apache-json-logs/

  • แยกสิ่งต่าง ๆ ออกเป็นหลายองค์ประกอบในการพูดคุยทุกครั้งที่ฉันทำเกี่ยวกับ logstash ฉันอธิบายว่ามันเป็นท่อยูนิกซ์บนสเตอรอยด์ คุณสามารถสร้างท่อยาวหรือสั้นตามที่คุณต้องการ คุณปรับขนาด logstash โดยเลื่อนความรับผิดชอบไปตามแนวนอน นี่อาจหมายถึงการทำให้การส่งต่อยาวขึ้น แต่เราไม่ได้พูดถึงสิ่งใดที่มีความเกี่ยวข้องทางสถิติในแง่ของค่าใช้จ่ายแอบแฝง หากคุณมีการควบคุมเครือข่ายของคุณได้ดีขึ้น (เช่นไม่ใช่ใน EC2) คุณสามารถทำสิ่งที่น่าอัศจรรย์ด้วยการแยกการรับส่งข้อมูลมาตรฐาน

นอกจากนี้โปรดทราบว่ารายชื่อผู้รับจดหมายของ logstash นั้นทำงานมากดังนั้นคุณควรเริ่มต้นที่นั่นเสมอ ฆ่าเชื้อโรคและสรุปการกำหนดค่าของคุณเนื่องจากเป็นจุดเริ่มต้นที่ดีที่สุด

มี บริษัท ต่างๆ (เช่น Sonian) การปรับขนาด ElasticSearch ให้อยู่ในระดับเพตาไบต์และ บริษัท (เช่น Mailchimp และ Dreamhost) จะปรับขนาด Logstash ให้อยู่ในระดับบ้าเช่นกัน มันสามารถทำได้


ฉันได้วางข้อมูลระบบลงใน Q
Tom O'Connor

ฉันจะบอกว่า 8G นั้นใช้กำลังน้อยกว่านั้นขึ้นอยู่กับปริมาณของบันทึกและระยะเวลาที่คุณเก็บไว้ ฉันจะเริ่มต้นด้วยการย้าย Redis และ Logstash ไปยังเซิร์ฟเวอร์อื่น คุณกำลังใช้ ES อยู่ระหว่างดำเนินการกับ Logstash หรือเป็นบริการที่แตกต่างกันหรือไม่?
lusis

1
มันเป็นบริการที่แตกต่าง ฉันขยับตัวหนาก่อนวันคริสต์มาสและปิด Redis ยังคงมีพฤติกรรมของดิสก์และสิ่งทั้งหมดมีเสถียรภาพมากขึ้น
Tom O'Connor

ลิงก์ apache-json-logs เสียหาย มีการเปลี่ยนหรือไม่
Kate Ebneter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.