Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Đăng nhập vào Đám mây kết hợp với Fluentd và ObjectRocket

Đăng nhập vào Đám mây kết hợp với Fluentd và ObjectRocket

Bài đăng này do Hart Hoover và Ryan Walker đồng sáng tác

Gần đây, nhóm Rackspace DevOps Automation đã công bố một dịch vụ gửi cảnh báo từ New Relic đến bộ phận hỗ trợ Rackspace. Những cảnh báo này sẽ tạo ra các vé để Kỹ sư DevOps của chúng tôi phản hồi, vì vậy khách hàng của chúng tôi có thể ngủ ngon khi cảnh báo được tạo vào lúc 3 giờ sáng. Khi được kết hợp với các điểm dữ liệu khác được thu thập về môi trường của khách hàng, các Kỹ sư của chúng tôi sẽ xác định vị trí của vấn đề và sau đó thực hiện quy trình hành động thích hợp.

Trong khi thiết kế cơ sở hạ tầng cho dịch vụ này, chúng tôi đã gặp phải một vấn đề phổ biến, nhưng thú vị là chúng tôi cần giới hạn quyền truy cập vào các hệ thống nội bộ của Rackspace để bảo mật trong khi vẫn duy trì điểm cuối công khai mà New Relic có thể nói chuyện. Giải pháp của chúng tôi là thiết kế một dịch vụ với các điểm cuối API công khai và các nhân viên riêng hoàn toàn tách biệt với nhau. Các điểm cuối API công khai nhận cảnh báo từ New Relic và chuyển chúng đến một cá thể ObjectRocket Redis hoạt động như một hàng đợi. Các dịch vụ của nhân viên chạy nội bộ sau tường lửa RackConnect và kéo các thông báo từ hàng đợi và tạo cảnh báo.

Điều này phân vùng các môi trường rất tốt, nhưng đã tạo ra một vấn đề cho chúng tôi liên quan đến việc tổng hợp nhật ký. Chúng tôi chạy một ngăn xếp ElasticSearch / Kibana bên trong môi trường riêng tư của chúng tôi. Đằng sau tường lửa, chúng tôi sử dụng thông thạod để đẩy nhật ký trực tiếp đến ElasticSearch. Bên ngoài tường lửa, không thể tiếp cận ngăn xếp EK. Để giải quyết vấn đề này, chúng tôi đã bắt đầu sử dụng thông thạod để đẩy nhật ký từ các dịch vụ API công khai của mình sang một phiên bản ObjectRocket MongoDB. Trong nội bộ, chúng tôi sử dụng lại thông thường để kéo nhật ký từ ObjectRocket vào ElasticSearch. Điều này mang lại cho chúng tôi một điểm đến duy nhất cho tất cả các hoạt động trong môi trường của chúng tôi.

Fluentd là gì?

Fluentd là một trình thu thập dữ liệu mã nguồn mở cố gắng cấu trúc dữ liệu JSON nhiều nhất có thể. Điều này có nghĩa là bạn không phải viết và duy trì một loạt các tập lệnh để có được dữ liệu ghi nhật ký ở một định dạng tương tự. Tất cả đều là JSON.

Sức mạnh của thông thạo là hỗ trợ nhiều nguồn và điểm đến. Ví dụ:bạn có thể thu thập dữ liệu từ luồng Twitter và thông báo cho bạn về điều đó trong IRC. Có rất nhiều plugin cộng đồng có sẵn.

Sử dụng Fluentd với Docker

Sử dụng plugin MongoDB thông thạo, người ta có thể dễ dàng đẩy nhật ký vào ObjectRocket. Đầu tiên, các nguồn phải được xác định. Vì tất cả các dịch vụ của chúng tôi đang sử dụng Docker, chúng tôi phải đưa nhật ký vùng chứa của mình vào thông thạo. Có một bài đăng tuyệt vời bổ sung cho bài đăng này về cách hoàn thành việc tổng hợp nhật ký với docker-gen và thông thạo của Jason Wilder tại đây. Khi vùng chứa thông thạo đang chạy (và docker-gen đã tạo cấu hình thông thạo), bạn sẽ có một phần như thế này cho mỗi vùng chứa đang chạy:

<source>
  type tail
  format json
  time_key time
  path /var/lib/docker/containers/abcdef/abcdef-json.log
  pos_file /var/lib/docker/containers/abcdef/abcdef-json.log.pos
  tag docker.container.abcdef
  rotate_wait 5
</source>

Điều này kéo dài nhật ký vùng chứa và theo dõi vị trí của nó trong nhật ký bằng một tệp vị trí. Điều quan trọng cần lưu ý là thẻ có trong phần cấu hình này là thẻ thông thạo, được sử dụng để thông báo cho thông thạo phải làm gì với dữ liệu mà nó tổng hợp.

Sử dụng Fluentd với MongoDB

Về mặt công khai, chúng tôi nói với người thạo việc phải làm gì với dữ liệu bằng một "đối sánh". Trong trường hợp này, hãy thay thế các biến bằng thông tin thực tế từ cơ sở dữ liệu ObjectRocket của bạn trong cùng một tệp cấu hình:

<match docker.**>
  type mongo
  database $DBNAME
  collection prod
  host $HOSTNAME
  port $PORT
  ssl
  capped
  capped_size 100m
  user $MONGOUSER
  password $MONGOPASS
  include_tag_key true
</match>

Cài đặt include_tag_key cho thông báo biết để đưa thẻ vào bản ghi cho nhật ký trong MongoDB. Bằng cách này, chúng tôi biết chính xác mục nhập nhật ký thuộc về vùng chứa nào. Fluentd sẽ bắt đầu đưa dữ liệu vào MongoDB, sau đó chúng ta có thể kéo xuống phần riêng tư của ứng dụng.

Về mặt riêng tư, chúng tôi vẫn sử dụng plugin MongoDB thông thạo, nhưng lần này đặt nó làm nguồn:

<source>
  type mongo_tail
  database $DBNAME
  collection prod
  host $HOSTNAME
  port $PORT
  user $MONGOUSER
  password $MONGOPASS
  ssl
  time_key time
  wait_time 5
  tag prod
  id_store_file /app/prod_last_id
</source>

Sau đó, chúng tôi cung cấp một "đối sánh" cho các nhật ký của mình để đưa chúng vào ElasticSearch:

<match **>
  type forest
  subtype elasticsearch
  <template>
    host elasticsearch.domain.com
    port 9200
    index_name fluentd
    logstash_format true
    buffer_type memory
    type_name ${tag}
    flush_interval 3
    retry_limit 17
    retry_wait 1.0
    num_threads 1
  </template>
</match>

Chúng tôi cũng đang sử dụng plugin rừng thông thạo để đơn giản hóa cấu hình gắn thẻ của chúng tôi trên nhiều môi trường.

Fluentd là một cách tuyệt vời để tổng hợp nhật ký Docker của bạn trên nhiều máy chủ và đẩy chúng vào cơ sở dữ liệu MongoDB. Trong trường hợp của chúng tôi, ObjectRocket là một trạm cách giữa các môi trường công cộng và riêng tư của chúng tôi để tổng hợp nhật ký. Các trường hợp sử dụng khác có thể bao gồm phân tích thời gian thực về dữ liệu bạn đang thu thập. Phần tốt nhất cho nhóm của chúng tôi là chúng tôi không phải quản lý MongoDB, nhờ vào độ tin cậy và kiến ​​thức của ObjectRocket.