นี่เป็นคำถามที่ตามมาต่อจากนี้ คำถามก่อนหน้าสร้างขึ้นเพราะฉันพบข้อมูลเพิ่มเติมและง่ายกว่าที่จะตั้งเป็นคำถามใหม่
ฉันใช้ syslog-ng OSE v3.31.2 เพื่อรับข้อความ syslog RFC3164 ผ่านพอร์ต UDP 514 จากลูกค้าจำนวนมาก และเขียนไปยังทั้งสองไฟล์ และส่งต่อไปยัง telegraf ผ่านพอร์ต TCP 601 ที่ไม่ใช่ TLS RFC5424 เพื่อแทรกลงใน ฐานข้อมูล InfluxDB
การกำหนดค่า syslog-ng ของฉันคือ:
@เวอร์ชั่น: 3.29
@รวม "scl.conf"
ตัวเลือก {
ล้างเส้น (1);
};
แหล่งที่มา s_network {
พอร์ต udp(ip(0.0.0.0)(514));
};
ปลายทาง d_file {
ไฟล์ ("/var/log/messages");
};
ปลายทาง d_telegraf {
syslog (พอร์ต "telegraf" (601) การขนส่ง (tcp));
};
บันทึก {
แหล่งที่มา (s_network);
ปลายทาง (d_telegraf);
ปลายทาง (d_file);
};
ส่วนที่เกี่ยวข้องของการกำหนดค่า telegraf ของฉันมีลักษณะดังนี้:
[global_tags]
[ตัวแทน]
ช่วงเวลา = "100ms"
round_interval = จริง
metric_buffer_limit = 10,000
flush_buffer_when_full = จริง
collection_jitter = "0 วินาที"
flush_interval = "100ms"
flush_jitter = "0 วินาที"
แก้จุดบกพร่อง = จริง
เงียบ = เท็จ
[[เอาท์พุท.influxdb]]
url = ["http://influxdb:8086"]
ฐานข้อมูล = "logs_db"
[[อินพุต.syslog]]
เซิร์ฟเวอร์ = "tcp://telegraf:601"
โดยพื้นฐานแล้ว syslog-ng ถูกตั้งค่าเพื่อส่งต่อรายการ syslog ผ่านการเชื่อมต่อ TCP ไปยัง telegraf
ปัญหาคือฉันเห็นว่า syslog-ng ประสบปัญหาการตัดการเชื่อมต่อ TCP จาก telegraf บ่อยครั้ง สิ่งเหล่านี้แสดงในบันทึก syslog-ng เป็น:
[2021-11-17T02:55:32.662972] EOF เกิดขึ้นในขณะที่ไม่ได้ใช้งาน fd='12'
[2021-11-17T02:55:32.663102] ปิดการเชื่อมต่อ Syslog; fd='12', เซิร์ฟเวอร์='AF_INET(192.168.0.6:601)', time_reopen='60'
[2021-11-17T02:56:32.719139] สร้างการเชื่อมต่อ Syslog แล้ว fd='12', เซิร์ฟเวอร์='AF_INET(192.168.0.6:601)', local='AF_INET(0.0.0.0:0)'
การตัดการเชื่อมต่อนี้มักจะเกิดขึ้นเมื่อฉันส่งบันทึกไปยัง syslog-ng ด้วย:
คนตัดไม้ -i -d -- เซิร์ฟเวอร์ localhost ทดสอบ
แต่ถ้าฉันปล่อยไว้เฉยๆ ฉันก็จะได้:
[2021-11-17T02:57:05.392356] EOF บนช่องควบคุม ปิดการเชื่อมต่อ
ในกรณีเหล่านี้ 192.168.0.6 คือเซิร์ฟเวอร์โทรเลข
แม้ว่าฉันสามารถตั้งค่าตัวเลือกได้ เวลาเปิดใหม่ (1)
เพื่อให้การเชื่อมต่อใหม่เร็วขึ้น ฉันต้องการค้นหาสาเหตุที่แท้จริงและป้องกันการตัดการเชื่อมต่อตั้งแต่แรก
เป็นไปได้ไหมว่ามีความเข้ากันไม่ได้ระหว่าง syslog-ng และ telegraf ซึ่งเป็นสาเหตุของ EOF นี้และการตัดการเชื่อมต่อที่ไม่สะอาด
ทั้งหมดนี้ทำงานภายในสแต็คที่เขียนโดยนักเทียบท่าบนโฮสต์เดียว
แก้ไข: ฉันเริ่มมองหา RFC5424 และ RFC6587. การใช้ Wireshark เพื่อดมกลิ่นแพ็กเก็ตจาก syslog-ng ซึ่งกำหนดไว้สำหรับ telegraf ฉันได้พิจารณาแล้วว่าสิ่งเหล่านี้กำลังใช้ octet-stuffing (หรือที่เรียกว่า non-transparent framing) แทนที่จะใช้ octet-counting ซึ่ง telegraf คาดหวังไว้โดยค่าเริ่มต้น เพย์โหลดของแต่ละข้อความ syslog ไปยัง telegraf เริ่มต้นด้วยอักขระ "<" แทนที่จะเป็นจำนวนเต็ม
ฉันตั้งสมมติฐานว่า telegraf ยอมรับข้อความเหล่านี้ แต่ติดขัดในการแยกวิเคราะห์ ดังนั้นจึงปิดการเชื่อมต่อ FIN แรกที่ปิดการเชื่อมต่อมาจากโทรเลข
น่าเสียดายที่เมื่อฉันตั้งค่า telegraf ให้ยอมรับการใส่กรอบที่ไม่โปร่งใส มันปฏิเสธรายการทั้งหมดและฉันยังไม่ได้หาสาเหตุ
ฉันยังไม่ทราบวิธีกำหนดค่า syslog-ng เป็นข้อความเอาต์พุตด้วยการกำหนดเฟรมแบบ octet-counting
แต่อย่างน้อยข้อความ EOF และการตัดการเชื่อมต่อได้หยุดเกิดขึ้นแล้ว แต่ฉันไม่แน่ใจว่าจะมีความหมายมากหาก telegraf ปฏิเสธข้อความทั้งหมดทันที