Giới thiệu

Khi triển khai các ứng dụng web server, bạn sẽ gặp một yêu cầu duy trì và lưu trữ log. Trong bài viết này sẽ hướng dẫn về Fluentd triển khai trên Google Cloud để bắt log của nginx và chuyển về Google Big Query.

Fluentd là một trình thu thập dữ liệu mã nguồn mở để thống nhất cơ sở lưu trữ log của bạn. Nó kết hợp các giải pháp đối với việc tính toán, ứng dụng, và dữ liệu với nhau để việc thu thập và lưu trữ log trở nên đơn giản và dễ mở rộng.

Fluentd có 4 tính năng chính khiến nó có khả năng xây dựng các pipeline mượt mà và đang tin cậy dùng cho việc quản lí log.

  • Log được kết hợp với JSON: Fluentd cố gắng để cấu trúc dữ liệu như JSON càng nhiều càng tốt. Điều này cho phép Fluentd để thống nhất tất cả các khía cạnh của xử lý log: thu thập, lọc, đệm, và xuất bản ghi log trên nhiều nguồn và điểm đến khác nhau. Việc xử lý dữ liệu downstream là dễ dàng hơn nhiều với JSON, vì nó có đủ cấu trúc để có thể truy cập mà không làm cứng hóa sơ đồ dữ liệu.
  • Hỗ trợ plugin: Fluentd có một hệ thống plugin linh hoạt cho phép cộng đồng để mở rộng chức năng của nó. Hơn 300 plugin cộng đồng đóng góp các plugin kết nối hàng chục nguồn dữ liệu đến hàng chục đầu ra dữ liệu và cho phép thao tác với dữ liệu khi cần thiết. Bằng cách sử dụng plug-in, bạn có thể tận dụng tốt hơn các bản ghi của mình ngay lập tức.
  • Tối thiểu tài nguyên yêu cầu: Một trình thu thập dữ liệu cần có dung lượng nhẹ để nó chạy thoải mái trên mọi máy. Fluentd được viết bằng C và Ruby, nên đòi hỏi tối thiểu tài nguyên của hệ thống. Bản tiêu chuẩn của nó chiếm 30-40MB bộ nhớ và có thể xử lý 13.000 event / giây / lõi.
  • Độ tin cậy: Data loss sẽ không bao giờ xuất hiện. Fluentd hỗ trợ cả bộ đệm dựa trên bộ nhớ và file để tránh data loss. Nó cũng hỗ trợ chuyển đổi dự phòng mạnh mẽ và có thể được thiết lập cho tính sẵn sàng cao.

Chuẩn bị môi trường

Để tạo một server có nginx có thể tạo từ Google Compute Engine một cách nhanh chóng

https://console.cloud.google.com/marketplace/details/click-to-deploy-images/nginx

Google Cloud Platform cung cấp Cơ sở hạ tầng dưới dạng dịch vụ, Nền tảng là dịch vụ và môi trường máy tính Serverless. Tức là chúng ta không cần phải cài đặt cũng như congfig môi trường chỉ cần LAUNCH là chúng ta có web server đầy dủ bao gồm cả nginx.

Do máy server mình dùng để thử nghiệm nên chỉ chon CPU 1core và ổ cứng 10G

Sau khi tạo máy ảo xong màn hình quản lý sẽ có danh sách server

Phần External IP dùng để access từ bên ngoài trình duyệt web.

Sau khi tạo xong server chúng ta vẫn cài thêm fluentd. Kích vào nút SSH để hiện console và thực hiện cài đặt bằng lệnh như bên dưới

curl -L
   https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
   | sh

Tuy nhiên chúng ta vẫn cần thêm 1 plugin để có thể đẩy dữ liệu vào Big Query.

sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery

Bên phía Big Query chúng ta cần tạo một table để chứa dữ liệu từ fluentd

dữ liệu access.log của nginx có thể được nhìn như sau

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

Cấu trúc table trên Big Query

[  { "type": "TIMESTAMP", "name": "time" },
   { "type": "STRING",    "name": "remote" },
   { "type": "STRING",    "name": "host" },
   { "type": "STRING",    "name": "user" },
   { "type": "STRING",    "name": "method" },
   { "type": "STRING",    "name": "path" },
   { "type": "STRING",    "name": "code" },
   { "type": "INTEGER",   "name": "size" },
   { "type": "STRING",    "name": "referer" },
   { "type": "STRING",    "name": "agent" },
   { "type": "STRING",    "name": "http_x_forwarded_for" } ]

Thực hiện chuyển dữ liệu log

Đọc dữ liệu log

Trong console của server mở file config của fluentd

sudo vim /etc/td-agent/td-agent.conf

và thêm vào bên dưới phần setting cấu hình cho việc chuyển dữ liệu log

<source>
  @type tail
  @id input_tail
  <parse>
    @type nginx
  </parse>
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/httpd-access.log.pos
  tag nginx.access
</source>

Giái thích về các config bên trên

  • `@type tail` để đọc log mới nhất real time, chúng ta có thể chọn source type csv hoặc một vài option khác
  • `@type tail` trong parser chỉ loại cần parser ở đây đang dung nginx
  • `path /var/log/nginx/access.log` đường dẫn đến file log
  • `pos_file /var/log/td-agent/httpd-access.log.pos` ghi thông tin position của lần đọc cuối cùng vào file nàu

Import vào Big query

Thêm tiếp đoạn config vào

/etc/td-agent/td-agent.conf
<match nginx.access>
  @type bigquery_insert

  # Authenticate with BigQuery using the VM's service account.
  auth_method compute_engine
  project [MY_PROJECT_NAME]
  dataset fluentd
  table nginx_access
  fetch_schema true

  <inject>
    # Convert fluentd timestamp into TIMESTAMP string
    time_key time
    time_type string
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </inject>
</match>
  • `@type bigquery_insert` insert data vào big query. Đã cài plugin ở phần trên
  • `auth_method compute_engine` xử dụng phương thức xác thực là compute engine. Để có thể dử dụng được phương thức này cần stop máy ảo vào trang Edit vào Enable BigQuery access. Ngoài ra cũng có thể xác thức bằng các cách khác nhau như xử dũng private key hay JSON key
  • Ngoài ra còn có các thông tin về database cũng như table tren Big query

Kiểm thử

Truy cập vào external ip của server để ghi access.log. Khi truy cập vào chũng ta sẽ thấy trang của nginx

Vào Big query kiểm tra dữ liệu đã được insert vào chưa

SELECT * FROM `fluentd.nginx_access` limit 100

Config cho chạy từng file log

Phía trên mình đã thừ dùng để import dữ liệu log real time vào Big Query. Trường nếu muốn chuyển theo từng file log chúng ta chỉ cần chuyển config thành như sau

<match nginx.access>
  @type bigquery_load

  <buffer>
    @type file
    path /var/log/bigquery_nginx_access.*.buffer
    flush_at_shutdown true
    timekey_use_utc
    total_limit_size 1g
    flush_interval 3600
  </buffer>

  # Authenticate with BigQuery using the VM's service account.
  auth_method compute_engine
  project [MY_PROJECT_NAME]
  dataset fluentd
  table nginx_access
  fetch_schema true

  <inject>
    # Convert fluentd timestamp into TIMESTAMP string
    time_key time
    time_type string
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </inject>
</match>

Kết luận

Thu thập các bản ghi từ Web service một cách dễ dàng với Fluentd. Nhiều người dùng dùng Fluentd để xây dựng một logging pipeline thực hiện cả tìm kiếm thời gian thực đăng nhập và lưu trữ lâu dài. Kiến trúc này tận dụng khả năng của Fluentd để sao chép luồng dữ liệu và xuất chúng ra nhiều hệ thống lưu trữ. Ví dụ, bạn có thể sử dụng Elasticsearch cho thời gian thực tìm kiếm, nhưng sử dụng MongoDB hoặc Hadoop choo việc phân tích và lưu trữ lâu dài.

Các ứng dụng web tạo ra rất nhiều bản ghi log, và chúng thường có định dạng không thống nhất và lưu trữ trên hệ thống tập tin địa phương. Điều này có thể gây ra vấn đề vì hai lý do.


Thứ nhất, các bản ghi rất khó để phân tích theo cú pháp lập trình, đòi hỏi rất nhiều biểu thức tính toán thông thường, và do đó rất khó dễ tiếp cận cho những ai muốn tìm hiểu hành vi người dùng thông qua phân tích thống kê, rà soát kết quả của thử nghiệm A / B, hoặc phát hiện lỗi.

Thứ hai, các bản ghi không thể truy cập trong thời gian thực vì số lượng lớn log dạng văn bản được nạp vào hệ thống lưu trữ. Tệ hơn nữa, nếu ổ đĩa của máy chủ bị hỏng vì quá tải, các bản ghi sẽ bị mất hoặc bị hỏng.

Nói về GCP thì hỗ trợ chúng ta rất nhiều thứ. Không quá khó để tiệp cận và chỉ cần mất vài phút là chúng ta có thể xây dụng lên một hệ thống đồ sộ chỉ cần có tiền.

Tài liểu tham khảo: