Fluentd ra đời vào năm 2011 trong bối cảnh big data đang dần trở thành xu hướng chính trong lĩnh vực công nghệ thông tin, với sự phát triển mạnh mẽ của Hadoop. Treasure Data, một startup tại Silicon Valley, được thành lập với mục tiêu khai thác giá trị từ việc xử lý dữ liệu bán cấu trúc dựa trên nền tảng Hadoop.
Trong quá trình làm việc, Treasure Data nhận thấy họ cần một công cụ giúp thu thập dữ liệu từ nhiều nguồn khác nhau và nạp dữ liệu vào kho lưu trữ Hadoop một cách hiệu quả. Để giải quyết vấn đề này, họ bắt đầu phát triển Fluentd.
1. Log Event là gì?
Log events là thông tin văn bản có thể đọc được bởi con người, từ mức độ có cấu trúc đến không cấu trúc. Mỗi sự kiện log đều có một mốc thời gian xác định, thường là timestamp tuyệt đối (như 01:00:00 ngày 1 tháng 1 năm 1970
), nhưng cũng có thể là tương đối, ví dụ: +0.60 seconds
(log event xảy ra 0.60 giây sau một sự kiện trước đó).
Ngoài ra, mỗi log event có một liên kết rõ ràng hoặc ngầm với một vị trí, nơi event xảy ra, vị trí này có thể là vật lý hoặc logic. Ví dụ từ Fluentd cho thấy log event bao gồm timestamp, vị trí (host) và các nội dung bán cấu trúc bổ sung, giúp chúng ta hiểu rõ hơn về sự kiện và môi trường mà nó diễn ra.
2. Fluentd là gì?
2.1 Định nghĩa Fluentd
Fluentd và Fluent Bit là công cụ thu thập log từ nhiều nguồn khác nhau, như hạ tầng mạng, hệ điều hành, ứng dụng tùy chỉnh, và các dịch vụ PaaS/SaaS. Nhiệm vụ chính của Fluentd là gửi các sự kiện log này đến công cụ xử lý phù hợp để phân tích và lấy thông tin, thay vì trực tiếp phân tích log chi tiết.
Bằng cách hợp nhất log từ mọi nguồn, Fluentd giúp chúng ta có cái nhìn tổng quan, chẳng hạn như xác định liệu lỗi từ ứng dụng có bắt nguồn từ cơ sở dữ liệu, hay vấn đề của hệ điều hành gây ra.
2.2 So sánh Fluentd với Middleware
Fluentd có thể được xem như một dạng enterprise service bus (ESB), nhưng thay vì xử lý dữ liệu ứng dụng, Fluentd chuyên thu thập và xử lý log events. Tương tự middleware, Fluentd có thể nhận log từ nhiều nguồn khác nhau (input), sau đó định tuyến và chuyển các log này đến đích (output). Nó cũng có khả năng chuyển đổi và định tuyến log giống như cách middleware xử lý dữ liệu.
- Middleware: Đây là thuật ngữ chung chỉ các phần mềm cung cấp dịch vụ cho các ứng dụng phần mềm vượt ra ngoài những gì hệ điều hành cung cấp. Middleware thường kết nối các phần mềm khác nhau, giúp chúng giao tiếp và hoạt động cùng nhau. Do đó, nó đôi khi được ví như "chất kết dính" (software glue), vì nó gắn kết các thành phần phần mềm riêng lẻ lại với nhau.
- Enterprise Service Bus (ESB): Đây là một loại middleware cụ thể, chuyên dùng để truyền dữ liệu giữa các phần mềm trong một doanh nghiệp gần như thời gian thực (nearly realtime). ESB không chỉ truyền dữ liệu mà còn quản lý, sắp xếp thứ tự thực thi của các phần mềm khác nhau, đảm bảo chúng hoạt động đồng bộ và hiệu quả.
3. Vì sao chúng ta cần ghi Log?
3.1 Gỡ lỗi (Debug)
Log giúp chúng ta biết phần nào của code đang chạy đã gây ra lỗi. Một số log được giữ lại khi deploy lên môi trường production để đảm bảo hệ thống hoạt động ổn định (Access logs, Error logs, Warning logs) và tránh bị dư thừa, trong khi những log không cần thiết có thể bị tắt đi (chỉ bật khi đang phát triển) như Debug logs, Verbose logs, Test logs.
Ví dụ: Nếu một trang web không tải được dữ liệu, log có thể ghi lại thông báo như: Error loading user data at 10:35AM.
Điều này giúp xác định rằng lỗi xảy ra ở bước tải dữ liệu.
3.2 Xử lý dữ liệu bất thường
Khi hệ thống gặp dữ liệu ngoài phạm vi dự kiến, việc ghi log có thể ghi nhận sự kiện này và giúp hệ thống tiếp tục hoạt động, phân tích nguyên nhân gây chậm trễ.
Ví dụ: Nếu giá trị nhận được ngoài phạm vi mong đợi, log có thể ghi lại như: Unexpected value 'X' encountered in payment method selection.
Điều này giúp lập trình viên biết có lỗi trong quá trình xử lý giá trị này.
3.3 Audit và Bảo mật
Log giúp theo dõi các hoạt động trên hệ thống để phát hiện hành vi bất thường hoặc có ý định xâm phạm bảo mật. Điều này giúp bảo vệ dữ liệu và ngăn chặn các cuộc tấn công.
Việc tổng hợp các sự kiện log để tạo ra chuỗi kiểm tra (audit trail) là vô cùng quan trọng. Một sự kiện bất thường đơn lẻ có thể không đáng chú ý, nhưng nếu nó lặp đi lặp lại một cách không bình thường, nó có thể báo hiệu một vấn đề nghiêm trọng hơn.
Ví dụ: Nếu ai đó cố gắng đăng nhập hệ thống nhiều lần mà không thành công, log có thể ghi lại sự kiện: 5 failed login attempts from IP address 192.168.1.1.
Việc này giúp quản trị viên phát hiện hoạt động đáng ngờ để có hành động kịp thời.
3.4 Phân tích nguyên nhân (Root Cause Analysis)
Đôi khi, chúng ta gặp vấn đề nhưng không rõ nguyên nhân thật sự là gì, vì chỉ nhìn vào log của từng thành phần hay service đơn lẻ. Ví dụ, ứng dụng chạy có vẻ chậm nhưng không có dấu hiệu rò rỉ bộ nhớ.
Chỉ khi kết hợp log từ nhiều nguồn khác nhau, ta mới có thể thấy được vấn đề thực sự, chẳng hạn một dịch vụ khác trên cùng máy chủ không giải phóng đúng tài nguyên như CPU, gây ảnh hưởng đến toàn bộ hệ thống.
3.5 Xác định nguyên nhân về hiệu suất
Các công cụ như Prometheus và Grafana có thể thu thập dữ liệu hiệu suất, nhưng để biết tại sao vấn đề xảy ra, chúng ta cần log chi tiết từ hệ thống, chẳng hạn như log truy vấn cơ sở dữ liệu hoặc log luồng xử lý ứng dụng.
3.6 Phát hiện bất thường (Anomaly Detection)
Hệ thống có thể hoạt động bình thường khi kiểm thử, nhưng khi đưa vào môi trường thực tế, các vấn đề bất thường có thể xuất hiện. Log giúp tìm ra các dấu hiệu của bất thường này.
Ví dụ, lỗi Intel Pentium FDIV trong thập niên 1990 là lỗi tính toán do thiết kế chip, mà chỉ có thể phát hiện bằng cách log các phép tính quan trọng.
3.7 Tăng hiệu quả Xử lý sự cố
Các log được ghi lại kèm theo mã lỗi cụ thể giúp liên kết chính xác vấn đề với nguyên, từ đó giúp tăng tốc độ giải quyết sự cố.
Ví dụ: Nếu hệ thống gặp lỗi khi kết nối tới máy chủ, log có thể ghi lại mã lỗi như: Error 500: Cannot connect to database server at 2024-09-29 10:15AM.
Nhờ mã lỗi này, kỹ thuật viên có thể nhanh chóng xác định rằng có sự cố về kết nối cơ sở dữ liệu và bắt đầu xử lý vấn đề.
3.8 Kích hoạt quy trình tự động
Log còn giúp tự động kích hoạt các quy trình khi phát hiện một sự kiện nhất định, thay vì đòi hỏi sự can thiệp thủ công.
Ví dụ: Trong một hệ thống giám sát máy chủ, log có thể ghi lại thông tin về mức sử dụng tài nguyên. Khi log phát hiện CPU sử dụng vượt quá 90%
trong thời gian dài, thông báo CPU usage exceeded 90% for 10 minutes
có thể tự động kích hoạt một quy trình để giảm tải, như chuyển bớt yêu cầu sang một máy chủ khác hoặc gửi cảnh báo đến quản trị viên hệ thống. Quy trình này giúp ngăn chặn quá tải và duy trì hiệu suất hệ thống mà không cần sự can thiệp của con người.
4. So sánh Fluentd và Logstash
Mặc dù Fluentd và Logstash có nhiều điểm chung, khiến việc thay thế Logstash bằng Fluentd trong hệ thống là hoàn toàn khả thi, nhưng vẫn có một số khác biệt quan trọng đáng chú ý giữa hai sản phẩm này.
Fluentd | Logstash | |
---|---|---|
Nhà phát triển chính và quản lý sản phẩm | Treasure Data được quản lý bởi CNCF | Elastic |
Hỗ trợ thương mại | Có | Có (lựa chọn mạnh hơn, hỗ trợ toàn bộ stack) |
Số lượng plugin | ~500 | ~200 |
Cách cấu hình | Khai báo—sử dụng các thẻ | Thủ tục—sử dụng cấu trúc if-then-else |
Hiệu suất | Tiêu thụ bộ nhớ thấp hơn so với Logstash | Tiêu thụ bộ nhớ cao hơn so với Fluentd |
Bộ nhớ đệm (Caching) | Tính tuỳ biến cao, hỗ trợ bộ nhớ đệm từ files và memory | Hàng đợi trong memory với kích thước cố định |
Ngôn ngữ/runtime machine | CRuby, không yêu cầu runtime để thực thi phần core của Fluentd | JRuby, phụ thuộc vào runtime của Java (JVM) |
Chọn Logstash nếu bạn cần một giải pháp xử lý log toàn diện, có khả năng xử lý luồng dữ liệu phức tạp và ứng dụng các bộ lọc logic nâng cao. Đặc biệt, Logstash là lựa chọn tối ưu nếu hệ thống của bạn đã sử dụng hoặc có kế hoạch triển khai Elastic Stack, vì nó tích hợp hoàn hảo với các công cụ như Elasticsearch để tìm kiếm và phân tích log.
5. Fluentd và Fluent Bit
Fluentd có một kernel nhỏ được viết bằng C, nhưng phần lớn của nó được phát triển bằng Ruby, điều này tạo ra một số hạn chế về hiệu suất vì Ruby chạy trên trình thông dịch. Để sử dụng Fluentd trong các thiết bị có tài nguyên hạn chế, như các thiết bị IoT (ví dụ: smart meter hoặc Raspberry Pi), cần một phiên bản nhẹ hơn.
Đây là lý do Fluent Bit ra đời. Fluent Bit là một phiên bản rút gọn của Fluentd, với các tính năng đơn giản hơn, tập trung vào việc thu thập và gửi log đến hệ thống trung tâm để xử lý. Tại đó, Fluentd có thể thực hiện các công việc xử lý log phức tạp hơn, như lọc, chuyển đổi và làm giàu dữ liệu.
Fluentd | Fluent Bit | |
---|---|---|
Ngôn ngữ phát triển | Viết bằng C & Ruby | Viết bằng C để tối ưu hóa kích thước triển khai |
Phụ thuộc | Phụ thuộc vào RubyGems | Không có phụ thuộc (trừ khi tùy chỉnh) |
Dung lượng bộ nhớ | Yêu cầu bộ nhớ ~20MB, tùy thuộc vào cấu hình và plugin | ~150KB |
Plugin sẵn có | Có thể sử dụng khoảng 300 plugin được tích hợp và từ bên thứ ba | Giới hạn ở các plugin tích hợp và 30 extension khác |
Hệ điều hành hỗ trợ | Cung cấp các bản cài đặt sẵn cho nhiều hệ điều hành, bao gồm hầu hết các phiên bản của Windows, OS X, và Linux | Một số biến thể Linux nhỏ gọn dựa trên CentOS, Debian (và các phiên bản như Raspbian), Ubuntu cho x86 và bộ xử lý AArch đã được phát triển. Các hệ điều hành khác như BSD-based Unixes có thể được hỗ trợ, nhưng không có đảm bảo về plugin |
6. Kết luận
Nhờ khả năng thu thập, chuyển đổi, và xử lý log từ nhiều nguồn khác nhau một cách hiệu quả, Fluentd không chỉ giải quyết các thách thức về quản lý dữ liệu mà còn trở thành một lựa chọn phổ biến cho các doanh nghiệp đang tìm kiếm giải pháp linh hoạt và tiết kiệm tài nguyên.
Các bài viết liên quan:
Bài viết liên quan
Linux là gì? So sánh Hệ điều hành Linux và Windows
Oct 03, 2024 • 8 min read
Full bộ source code: Simple Task Microservices
Oct 02, 2024 • 1 min read
Nginx là gì? Web Server đa năng cho các Hệ thống lớn
Sep 27, 2024 • 11 min read
Hướng dẫn Cài đặt Self-hosted Runners cho Github Actions
Sep 25, 2024 • 7 min read
Infrastructure as Code (IaC) là gì?
Sep 23, 2024 • 9 min read
Hướng dẫn triển khai CI/CD cho ứng dụng NextJS sử dụng Github Actions
Sep 17, 2024 • 13 min read