Điểm:0

syslog-ng: Làm cách nào để giảm độ trễ cao khi chuyển tiếp nhật ký tới người tiêu dùng syslog tcp?

lá cờ al

CẬP NHẬT 2: Tôi đã trả lời câu hỏi này qua câu hỏi mới của mình tại liên kết bên dưới. Nguyên nhân gốc rễ là hành vi của telegraf trong đó theo mặc định, nó sẽ ngắt kết nối TCP 5 giây sau khi nhận được tin nhắn cuối cùng. Điều này có thể là do thiết kế, tuy nhiên tôi gặp vấn đề với tài liệu của họ khiến tôi khó phát hiện ra đây là một giải pháp khắc phục tiềm năng.

Có lẽ câu hỏi này bây giờ có thể bị xóa?


CẬP NHẬT 1: thay vì chỉnh sửa rộng rãi câu hỏi này, làm cho các câu trả lời hiện tại trở nên vô nghĩa, tôi đã đặt một câu hỏi mới dựa trên thông tin mới mà tôi nhận được do đăng câu hỏi này.

syslog-ng/telegraf: EOF xảy ra khi không hoạt động - không tương thích?


Tôi đang sử dụng syslog-ng Open-Source Edition (OSE) v3.31.2 trong ngăn xếp docker-compose.

Tôi có các thông báo nhật ký hệ thống đến qua mạng từ nhiều máy chủ khác nhau thông qua UDP (tôi bị hạn chế bởi vì khách hàng của tôi sử dụng Boost::Log và điều này không hỗ trợ nhật ký hệ thống qua TCP, chỉ UDP) và tôi đã đặt syslog-ng để chuyển tiếp những thứ này đến một dịch vụ khác ở hạ lưu. Điều này xảy ra là telegraf sử dụng một đầu vào.syslog mô-đun, nhưng tôi không chắc điều đó có quan trọng không.

Cấu hình của tôi trông như thế này:

phiên bản @: 3.29
@bao gồm "scl.conf"

tùy chọn {
    flush-lines(1);
};
    
nguồn s_mạng {
    udp(ip(0.0.0.0) cổng(514));
};

đích d_file {
    tệp ("/var/log/tin nhắn");
};
    
điểm đến d_telegraf {
    nhật ký hệ thống (cổng "telegraf" (6514) vận chuyển (tcp));
};
    
nhật ký {
    nguồn(s_mạng);
    điểm đến (d_telegraf);
    đích (d_file);
};

Tôi đã thiết lập rõ ràng toàn cầu tuôn ra dòng giá trị thành 1. Tôi nghĩ đây là giá trị mặc định, nhưng tôi muốn chắc chắn. Tôi muốn thông báo tường trình được chuyển tiếp ngay khi nhận được.

Hầu hết thời gian điều này hoạt động - các "dòng" nhật ký riêng lẻ đến syslog-ng qua UDP 514 và ngay lập tức được ghi vào tệp /var/log/tin nhắnvà trong hầu hết các trường hợp, chúng cũng được chuyển tiếp ngay lập tức tới telegraf trên cổng TCP 6514.

Vấn đề tôi đang thấy là khá thường xuyên syslog-ng giữ lại nhiều dòng nhật ký đến trong khoảng 30-60 giây, sau đó gửi chúng đến telegraf trong một đoạn lớn. Dường như không có nhiều khuôn mẫu cho điều này, nhưng nó xảy ra rất nhiều. Điều kỳ lạ là /var/log/tin nhắn tệp có các mục nhật ký bị thiếu được ghi ngay lập tức, đó chỉ là quá trình phân phối mạng bị trì hoãn. tôi đã nghĩ rằng đường xả(1) sẽ tránh được bộ đệm này, nhưng có vẻ như không.

Tôi đã sử dụng Wireshark để xác định vị trí của độ trễ và nó nằm ở đầu ra của các gói từ syslog-ng, giữa syslog-ng và cổng TCP 6514 của telegraf.

Tôi đã tự hỏi liệu đây có phải là Thuật toán của TCP Nagle hay không - nếu vậy, có cách nào để bật tùy chọn ổ cắm TCP_NO_DELAY cho trình điều khiển đích nhật ký hệ thống của syslog-ng không?

Cuối cùng, những gì tôi đang tìm kiếm là một dịch vụ nhật ký hệ thống nhanh, độ trễ thấp có thể tổng hợp và chuyển tiếp nhật ký nhanh nhất có thể để xem xét theo thời gian thực ở hạ lưu.

CHỈNH SỬA: Tôi đã thử chuyển sang vận chuyển UDP giữa syslog-ng và phép đo từ xa và điều này có vẻ phản hồi nhanh hơn nhiều và sự chậm trễ kéo dài, không thường xuyên đã biến mất. Tuy nhiên, điều này sẽ gây khó khăn cho việc bảo mật kết nối trong tương lai.

Điểm:2
lá cờ vn

Những gì bạn trải nghiệm là không bình thường. Cấu hình trên sẽ chuyển tiếp nhật ký tới d_telegrafd_file đồng thời, càng sớm càng tốt.

Tôi tin rằng bạn đang gặp sự cố kết nối, đó phải là lý do gây ra độ trễ 60 giây, đây là giá trị mặc định của bộ hẹn giờ kết nối lại.

Bạn có thể giảm giá trị này bằng cách sử dụng thời gian mở lại() tùy chọn toàn cầu, ví dụ:

tùy chọn {
  thời gian mở lại (1);
};

Bạn cũng có thể bắt đầu syslog-ng ở nền trước (ở chế độ gỡ lỗi) để điều tra các sự cố kết nối:

$ syslog-ng -Fdev
lá cờ al
Cảm ơn bạn đã gợi ý về `-Fdev` - từ điều này, tôi đã xác định rằng syslog-ng đang báo cáo `EOF trên kênh điều khiển, đóng kết nối;` gần như chính xác 30 giây sau thông báo tường trình cuối cùng (sau khi máy khách kết thúc) và rồi 30 giây sau: `Đã thiết lập kết nối nhật ký hệ thống`. Đầu ra syslog-ng giám sát của Wireshark hiển thị FIN, ACK theo sau là không có gì trong đúng 60 giây, theo sau là SYN mà tôi nghi ngờ là kết nối lại. Tôi sẽ thử `mở lại thời gian (1)` tiếp theo.
lá cờ al
Tôi đã đặt `thời gian mở lại(1)` và kết nối dường như kết nối lại rất nhanh, như mong đợi. Về cơ bản, sự cố "biến mất" với lần thử lại ngắn này. Tuy nhiên, tôi muốn tìm ra nguyên nhân gây ra EOF trên kênh điều khiển - điều này có phải do ứng dụng khách hoạt động không đúng cách tắt mà không đóng kết nối nhật ký hệ thống không? Máy khách đang gửi nhật ký hệ thống qua UDP - nhật ký hệ thống có triển khai trạng thái kết nối giao thức qua UDP không?
lá cờ al
Các máy khách là các ứng dụng nội bộ được viết bằng Boost::Log - vì điều này có thể trở thành một câu hỏi về lập trình, có lẽ tôi cần hỏi trên StackOverflow xem có cách nào để chúng "ngắt kết nối" một cách gọn gàng khi chấm dứt chương trình không?
lá cờ al
Tôi nghĩ ứng dụng khách UDP là một cá trích đỏ. Tôi có thể tạo lại hành vi tương tự với một thông báo nhật ký hệ thống UDP duy nhất được gửi bởi `logger -d`. Từ nhật ký, tôi có thể thấy rằng syslog-ng nhận mục nhập, gửi nó đến cả đích mạng và tệp, sau đó báo cáo "EOF xảy ra khi không hoạt động" 5 giây sau, sau đó đóng kết nối, "EOF trên kênh điều khiển", sau đó 30 - 6o giây sau nó kết nối lại. Nhưng tôi cũng thấy điều này hiếm khi xảy ra khi hoàn toàn không hoạt động, vì vậy có lẽ đã có sự cố mạng cơ bản. Tôi đang sử dụng mạng soạn thảo docker, btw, tất cả đều trên cùng một Máy chủ.
lá cờ al
Điều này hơi khó sử dụng nên tôi có thể viết câu hỏi này thành một câu hỏi riêng. Cảm ơn bạn một lần nữa vì những gợi ý về nơi bắt đầu tìm kiếm.
MrAnno avatar
lá cờ vn
Thông báo về "các kênh điều khiển" có thể gây hiểu nhầm, đây không phải là về các kết nối mạng của bạn, mà là về kênh điều khiển riêng của syslog-ng. Thông báo EOF có nghĩa là bạn có thể đã thực thi `syslog-ng-ctl` để truy vấn số liệu thống kê, tải lại hoặc khởi động lại syslog-ng.
lá cờ al
À, tôi nghĩ phải có một quy trình `syslog-ng-ctl` tự động trong bộ chứa Docker chính thức đang chạy định kỳ vì tôi chưa bao giờ tự chạy chương trình đó theo cách thủ công. Điều đó sẽ giải thích thông điệp đó.
Điểm:1
lá cờ cn

Hãy thử flush-lines(0) bằng cách xóa tất cả các dòng đó cùng nhau.

Làm thế nào để syslog-ng xử lý flush_lines(0)?

https://github.com/syslog-ng/syslog-ng/issues/1411

lá cờ al
Thật vậy, tôi đã thử `flush-lines(0)` và nó cũng bị bỏ qua. Nó dường như không có bất kỳ ảnh hưởng nào đến vấn đề này và đã tìm thấy bằng chứng (rằng tôi đã đặt nhầm chỗ, các tài liệu syslog-ng rất ít thông tin chi tiết một cách đáng buồn) rằng giá trị 0 không thực sự hợp lệ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.