Đây là một câu chuyện được trích dẫn từ quá trình hình thành và phát triển của Cortex tại Weaveworks Blog. Nếu câu hỏi của bạn là “Cortex là gì?”, câu trả lời thực sự rất đơn giản: Cortex là một dịch vụ Prometheus, có thể mở rộng theo chiều ngang và dành cho nhiều người thuê. Bạn sẽ tìm hiểu rõ hơn điều này sau khi biết được câu chuyện về sự hành trình của Cortex tại Weaveworks Blog dưới đây.
Nội dung bài viết
Sự khởi đầu mới
Tại Weaveworks, chúng tôi đã điều hành sản xuất Kubernetes trong hơn ba năm và sử dụng Prometheus làm công cụ cảnh báo và giám sát chính của mình. Chúng tôi yêu thích Prometheus và đặc biệt đánh giá cao cách nó hoạt động với Kubernetes rất hiệu quả.
Trong những ngày đầu, việc triển khai Prometheus của chúng tôi khá đơn giản: chúng tôi xây dựng hình ảnh chứa Prometheus và các tệp cấu hình của chúng tôi và triển khai nó dưới dạng ReplicaSet. Chúng tôi không cung cấp dịch vụ lưu trữ dài hạn. Nếu Prometheus gặp sự cố, cần nâng cấp phiên bản hoặc khi thay đổi quy tắc cảnh báo, chúng tôi sẽ mất dữ liệu chuỗi thời gian của mình.
Thật ra, chúng tôi có thể chấp nhận được tình hình đó. Hầu hết khi bạn nhìn vào trang tổng quan hoặc chạy một truy vấn, bạn chỉ quan tâm đến dữ liệu gần nhất. Điều này có lẽ đặc biệt đúng trong những ngày đầu của dự án mới, nơi có quá nhiều thay đổi mỗi ngày, khiến việc tìm kiếm các xu hướng hoặc mô hình theo thời gian vô nghĩa. Tuy nhiên, chúng tôi đã cảm thấy mệt mỏi vì liên tục mất các dữ liệu, vì vậy chúng tôi quyết định tìm ra một số cách để lưu trữ chúng. Từ đây, Cortex dần được định hình.
Nếu chúng tôi gặp những vấn đề này thì người khác cũng có thể bị giống vậy. Chúng tôi đã có một dịch vụ giúp mọi người hiểu những gì đang diễn ra trong các cụm của họ, vì vậy tại sao không mở rộng dịch vụ đó để bao gồm cả dữ liệu chuỗi thời gian Prometheus. Điều đó có nghĩa là chúng tôi sẽ cung cấp thêm dịch vụ Prometheus. Những thứ tiếp theo sau thì đơn giản hơn nhiều.
Chúng tôi không muốn chọn cách mỗi khách hàng đều có Prometheus. Chúng tôi đã thử điều đó trước đây và nhận ra rằng những hệ thống như vậy rất khó vận hành. Vì thế, chúng tôi cần một thứ có nhiều người thuê.
Chúng tôi cũng muốn có thể dễ dàng mở rộng quy mô dịch vụ để phù hợp hơn với từng nhu cầu của khách hàng. Prometheus có thể mở rộng, nhưng nó được mở rộng tốt nhất bằng phương pháp sharding. Việc vận hành từng phiên bản cho mỗi khách hàng là trường hợp đặc biệt nên chúng tôi muốn thứ gì đó có thể mở rộng theo chiều ngang. Vì vậy Cortex ra đời, một dịch vụ có thể mở rộng theo chiều ngang, nhiều người thuê, dịch vụ Prometheus.
Cách thức hoạt động của Cortex
Tất cả bắt đầu với một phiên bản Prometheus chạy trên cụm. Phiên bản này chịu trách nhiệm loại bỏ tất cả các dịch vụ của bạn và sau đó chuyển tiếp chúng đến quá trình triển khai Cortex.
Điều này được thực hiện bằng cách sử dụng Prometheus remote_write API, mà các nhà lập trình Cortex ban đầu (là Tom Wilkie và Julius Volz) đã thêm vào Prometheus, để hỗ trợ Cortex và các tích hợp khác.
Prometheus sau đó chuyển tiếp tất cả các mẫu mà nó quét được tới Cortex để lưu trữ trong cơ sở dữ liệu. Là người sử dụng, đây là tất cả những gì bạn cần biết.
Cortex là gì?
Cortex được tạo thành từ nhiều bộ phận.
Cốt lõi của nó là thiết bị nhập (ingesters). Chúng liên tục nhận một luồng mẫu, nhóm lại với nhau thành từng phần và sau đó lưu trữ những phần này trong cơ sở dữ liệu phụ trợ, chẳng hạn như DynamoDB, BigTable hoặc Cassandra. Chunk là cấu trúc dữ liệu cơ bản trong Prometheus 1 và là một cách lưu trữ hiệu quả các mẫu cho một chuỗi thời gian cụ thể. Mục đích của thiết bị nhập là cho phép quá trình phân khúc này xảy ra để Cortex không liên tục ghi vào cơ sở dữ liệu phụ trợ.
Một lần triển khai Cortex có thể có rất nhiều thiết bị nhập để thỏa mãn sự vận hành, nhưng nhìn chung không được ít hơn ba. Thiết bị nhập được sắp xếp bằng cách sử dụng một vòng băm nhất quán, được khóa trên dấu vân tay của chuỗi thời gian và được lưu trữ trong một kho dữ liệu nhất quán, chẳng hạn như Consul.
Nếu bạn đang vận hành 5 thiết bị nhập, mỗi thiết bị sẽ “sở hữu” một phần năm vòng. Tuy nhiên, một phần năm này không liền nhau. Nó không giống như cắt một chiếc bánh thành năm miếng. Nó giống như cắt một chiếc bánh thành một nghìn miếng, và sau đó mỗi thiết bị nhập đòi một phần năm cho mỗi miếng.
Vì sao lại xảy ra vấn đề này?
Cortex nhận mẫu từ các cụm người dùng là các nhà phân phối. Nhà phân phối là một dịch vụ hỗ trợ chiếc vòng tìm ra thiết bị nhập nào nên nhập mẫu. Nó tìm thấy thiết bị nhập “sở hữu” dấu vân tay cụ thể đó, và sau đó gửi nó đến thiết bị đó.
Điều này có nghĩa là nếu một thiết bị nhập gặp sự cố, chúng tôi có hai thiết bị khác có dữ liệu của nó. Tức là nếu một bộ nhập không thể nhận các lần ghi, chúng tôi vẫn có thể chấp nhận các lần ghi cho các chỉ số mà nó có thể chịu trách nhiệm.
Bạn chạy một Prometheus trên cụm của mình, nó sẽ gửi các mẫu đến Cortex, được nhận bởi một nhà phân phối và chuyển tiếp mẫu đến thiết bị nhập. Những thứ này nối mẫu vào một đoạn, cho đến lúc chuyển đoạn đó vào cơ sở dữ liệu phụ trợ.
Cortex cũng giống như Prometheus có nhiều thứ hơn là loại bỏ các chỉ số. Dự án này cũng có chứa một dịch vụ Alertmanager có thể mở rộng theo chiều ngang, một dịch vụ để truy vấn số liệu (cực kỳ quan trọng) và một dịch vụ khác để chạy các quy tắc cảnh báo và ghi lại.
Dự đoán tương lai
Bất chấp ý định của chúng tôi, Cortex vẫn không phải là thứ dễ vận hành nhất. Tuy nhiên, nhiều người và các công ty khác ngoài Weaveworks đang chạy Cortex trong sản xuất hiện nay và đóng góp trở lại cơ sở mã. Nó đã chuyển từ một sản phẩm đóng của chúng tôi thành một dự án nguồn mở do cộng đồng có thể điều hành.
Cá nhân tôi rất hào hứng khi thấy Cortex được cải thiện theo thời gian, trở nên hiệu quả hơn và đáng tin cậy hơn khi chúng tôi tìm hiểu thêm về cách vận hành nó trên quy mô lớn, trong sản xuất. Tôi nóng lòng muốn xem điều gì sẽ xảy ra tiếp theo.