Thứ sáu, 23/05/2014 | 00:00 GMT+7

Giới thiệu về thống kê theo dõi với Graphite, StatsD và CollectD

Có rất nhiều lý do tại sao thu thập số liệu thống kê về server , ứng dụng và lưu lượng truy cập của bạn là một ý tưởng hay. Thu thập và sắp xếp dữ liệu có thể giúp bạn tự tin trong các quyết định của bạn về việc mở rộng quy mô, khắc phục sự cố và theo dõi các điểm khó khăn trong cấu hình của bạn.

Có nhiều công cụ được dùng để theo dõi số liệu trên máy của ta và chúng thường được giao cho một phần nhỏ nhất định của quy trình. Ta có thể kết hợp các công cụ này lại với nhau để tạo ra một hệ thống thu thập, ghi lại và hiển thị kết quả.

Trong hướng dẫn này, ta sẽ thảo luận về một số công nghệ cho phép bạn thu thập, lưu trữ và trực quan hóa dữ liệu được tạo bởi các server và ứng dụng của bạn.

Ta sẽ thảo luận về Graphite , một thư viện đồ thị được tạo thành từ một số thành phần được dùng để hiển thị trực quan dữ liệu theo thời gian. Ta cũng sẽ xem xét thu thập , một nền tảng thống kê hệ thống có thể thu thập thông tin gần thời gian thực về một server đang chạy. Cuối cùng trong danh sách của ta sẽ là StatsD , một công cụ tổng hợp thống kê linh hoạt được dùng để thu thập và sắp xếp dữ liệu tùy ý.

Trong hướng dẫn sau, ta sẽ giới thiệu cho các bạn cách cài đặt và cấu hình các thành phần này trên server Ubuntu 14.04 để giúp bạn cài đặt và chạy.

Tại sao ta theo dõi dữ liệu?

Điều đầu tiên mà ta cần cài đặt là lý do mà ta theo dõi dữ liệu trong môi trường server hoặc ứng dụng.

Lý do tổng quát thực sự khá đơn giản: ta càng có nhiều dữ liệu, ta càng có khả năng hiểu những gì đang xảy ra tại bất kỳ thời điểm nào. Điều này mang lại cho ta khả năng đáng chú ý để backup các quyết định của ta với dữ liệu cứng và xem trước liệu một thay đổi có được nhắm đến vào đúng thành phần hay không. Thống kê theo dõi cung cấp cho ta nguồn thông tin bổ sung có thể không có trong log ứng dụng.

Hầu hết (nhưng không phải tất cả) hệ thống ghi log không thể tương quan dữ liệu từ các ứng dụng khác nhau hoặc kết nối các sự kiện với các trạng thái hệ thống nhất định bởi vì chúng đại diện cho kết quả ứng dụng độc lập. Điều này có thể khiến việc xây dựng một cái nhìn tổng thể về các tình huống xung quanh một sự kiện trở nên khó khăn.

Ta có thể tưởng tượng trong giây lát rằng bạn gặp sự cố khi server database của bạn gặp sự cố. Trong khi đọc log , bạn có thể nhận thấy rằng vào lúc 15:35:28 UTC, dịch vụ MySQL của bạn đã bị lỗi do lỗi OOM (hết bộ nhớ). Bây giờ ta biết rằng việc sử dụng bộ nhớ là vấn đề, nhưng ta có thể không biết điều gì đã gây ra mức tăng đột biến sử dụng bộ nhớ trong một server ổn định trước đây.

Nếu ta đang theo dõi dữ liệu về server và các ứng dụng của bạn , ta có thể bắt đầu tập hợp các phần dữ liệu hệ thống rõ ràng khác nhau để giúp ta hiểu môi trường trông như thế nào chính xác tại thời điểm xảy ra sự cố. Ta có thể thấy rằng ta đã có một sự gia tăng ổn định trong việc sử dụng bộ nhớ có thể do rò rỉ bộ nhớ. Nếu ta có thông tin về việc sử dụng bộ nhớ cấp ứng dụng, ta có thể biết chính xác chương trình nào là thủ phạm. Ta cũng có thể thấy rằng có một sự đột biến bất thường, có thể nghĩa là một cái gì đó hoàn toàn khác.

Trong một kịch bản khác, ta có thể thấy hệ thống trông như thế nào trước và sau khi triển khai. Nếu mã mới tạo ra một số điều kiện lạ, ta có thể thấy ảnh hưởng của nó đối với các thành phần khác và so sánh hiệu suất của nó với mã cũ của ta . Ta có thể xác định những điểm mà mã mới của ta đang cho thấy sự cải thiện và những điểm mà ta có thể đã mắc lỗi.

Với việc thu thập dữ liệu thông minh, ta có thể xem hệ thống của bạn như một hệ thống, thay vì một tập hợp lỏng lẻo của các thành phần không liên quan.

Thành phần than chì

Ta sẽ bắt đầu ngược lại một chút ở đây và nói về Graphite, thư viện vẽ đồ thị, trước tiên. Sau đó, ta sẽ quay lại và giới thiệu một số phần mềm mà Graphite có thể sử dụng để lấy dữ liệu.

Graphite là một thư viện đồ thị chịu trách nhiệm lưu trữ và hiển thị các biểu diễn trực quan của dữ liệu. Điều này nghĩa là Graphite yêu cầu các ứng dụng khác thu thập và chuyển các điểm dữ liệu.

Bản thân dự án Graphite bao gồm một vài thành phần khác nhau, mỗi thành phần đều có một mục đích cụ thể, tập trung.

Ứng dụng web Graphite

Thành phần năng động và dễ thấy nhất của cài đặt Graphite là ứng dụng web Graphite.

Đây là nơi bạn có thể thiết kế đồ thị vẽ dữ liệu của bạn :

Đồ thị ví dụ về than chì

Graphite cung cấp cho bạn một giao diện rất linh hoạt để thiết kế đồ thị. Bạn có thể kết hợp các loại số liệu khác nhau, ghi nhãn kiểm soát, phông chữ, màu sắc và thuộc tính đường, đồng thời bạn có thể thay đổi kích thước và thao tác dữ liệu theo ý muốn.

Ý tưởng chính để phân tích ở đây là Graphite hiển thị đồ thị dựa trên các điểm dữ liệu mà nó nhận được và các hướng bạn cung cấp cho nó. Nó không chỉ in ra biểu đồ và sau đó vứt bỏ dữ liệu. Bạn có thể hiển thị dữ liệu trong bất kỳ dữ liệu nào bạn muốn một cách nhanh chóng.

Ứng dụng web cũng cho phép bạn lưu các thuộc tính và bố cục đồ thị, để bạn có thể kéo lên giao diện giám sát của bạn với tất cả các cài đặt bạn muốn. Bạn có thể có bao nhiêu chế độ xem console tùy thích, nghĩa là bạn có thể có một console riêng cho từng máy hoặc ứng dụng. Nếu bạn cần tương quan dữ liệu giữa các dữ liệu này, chỉ cần kéo và thả các biểu đồ để kết hợp hiển thị.

Tuy nhiên, sự linh hoạt không kết thúc ở đó. Graphite cho phép bạn hiển thị đồ thị tại một URL trống để nhúng vào các giao diện khác. Bạn cũng có thể xuất dữ liệu dưới dạng biểu diễn phi đồ họa như JSON hoặc CSV hoặc xuất SVG với thông tin dữ liệu được nhúng.

Đến đây bạn đã biết về những gì bạn có thể làm với dữ liệu khi nhận được, hãy nói về các thành phần Graphite khác để xem các quy trình cho phép ta làm điều này.

Carbon

Carbon là phần backend lưu trữ cho cấu hình Graphite. Một cấu hình Graphite duy nhất sẽ có một hoặc nhiều Carbon daemon chịu trách nhiệm xử lý dữ liệu được gửi qua bởi các quá trình thu thập và truyền thống kê khác (bộ thu thập không phải là một phần của Graphite).

Có nhiều loại daemon Carbon khác nhau, mỗi loại xử lý dữ liệu theo một cách khác nhau. Cơ bản nhất trong số này được gọi là carbon-cache.py . Daemon này là thẳng tiến. Nó lắng nghe dữ liệu trên một cổng và ghi dữ liệu đó vào đĩa khi nó đến, một cách hiệu quả.

Nó lưu trữ dữ liệu khi nó đến và sau đó lưu nó vào đĩa sau một khoảng thời gian định trước. Điều quan trọng là phải nhận ra rằng thành phần Carbon xử lý các quy trình nhận và truyền dữ liệu. Nó không xử lý các cơ chế lưu trữ thực tế. Điều đó được để lại cho thành phần whisper mà ta sẽ nói đến trong giây lát.

Daemon carbon-cache.py được cho biết các định dạng, giao thức và cổng để hoạt động. Nó cũng cho biết những policy lưu giữ dữ liệu sẽ sử dụng để lưu trữ dữ liệu. Chúng được trao cho thì thầm. Đối với hầu hết các cấu hình cơ bản, một carbon-cache.py đơn là đủ để xử lý việc nhận dữ liệu.

Nhiều version có thể được chạy cùng một lúc khi cài đặt của bạn phát triển. Chúng có thể được cân bằng bởi một carbon-relay.py hoặc carbon-aggregator.py ở phía trước.

Daemon carbon-relay.py được dùng để gửi yêu cầu đến tất cả các daemon backend vì một số dự phòng. Nó cũng được dùng để chia nhỏ dữ liệu trên các carbon-cache.py khác nhau để trải rộng các tải đã đọc trên nhiều vị trí lưu trữ.

Daemon carbon-aggregator.py có thể đệm dữ liệu và sau đó kết xuất nó vào carbon-cache.py sau một thời gian. Điều này có thể giúp giảm thiểu tác động của việc xử lý số liệu thống kê của bạn lên hệ thống với chi tiết nhỏ.

Thì thầm

Whisper là một thư viện database mà Graphite sử dụng để lưu trữ thông tin mà nó được gửi đi.

Nó rất linh hoạt và cho phép dữ liệu chuỗi thời gian được lưu trữ rất chi tiết. Nó tạo ra các repository khác nhau ở các mức độ chi tiết khác nhau, để trong thực tế sử dụng, thông tin được phân cấp thành độ phân giải thấp hơn một cách duyên dáng khi vượt qua các ngưỡng lão hóa đã cấu hình nhất định.

Ví dụ: bạn có thể lưu trữ một điểm dữ liệu mỗi giây cho một số liệu nhất định. Bạn có thể nói thầm rằng dữ liệu chi tiết này nên được lưu giữ trong 5 giờ. Bạn cũng có thể có một repository dữ liệu có độ phân giải thấp hơn. Nó có thể chỉ lưu trữ một điểm mỗi phút và giữ nó trong repository ảng thời gian 6 tháng.

Mỗi điểm trong repository lưu trữ có độ phân giải thấp hơn được tính toán từ cùng một dữ liệu được ghi trong các lưu trữ có độ phân giải cao hơn. Bạn có thể có nhiều repository với các độ phân giải và tỷ lệ lưu giữ khác nhau như bạn muốn. Bạn có thể cấu hình cách thì thầm tính toán dữ liệu cho các repository có độ phân giải thấp hơn tùy thuộc vào loại chỉ số đang được theo dõi.

Ví dụ: một số liệu có thể là số liệu thống kê số lần một số sự kiện xảy ra trong một khung thời gian ngắn. Để tạo một điểm cho khung thời gian lớn hơn ở độ phân giải thấp hơn, bạn sẽ cộng các điểm dữ liệu của repository có độ phân giải cao hơn để tóm tắt các giá trị dữ liệu trong repository ảng thời gian lớn hơn.

Whisper có thể tính toán dữ liệu có độ phân giải thấp hơn theo những cách khác tùy thuộc vào bản chất của các chỉ số.Ví dụ: một số dữ liệu được tổng quát hóa bằng cách tính trung bình, trong khi những dữ liệu khác có thể đang theo dõi giá trị tối đa. Đối với giá trị trung bình, giá trị trung bình thực tế được tính từ các điểm có độ phân giải cao hơn để tạo ra điểm có độ phân giải thấp hơn. Để tối đa, giá trị cao nhất nên được giữ lại và phần còn lại nên vứt bỏ để duy trì ý nghĩa của con số.

Whisper tính toán và ghi lại dữ liệu có độ phân giải thấp hơn tại thời điểm nó nhận được dữ liệu (sau khoảng thời gian cần thiết để thu thập các giá trị cần thiết). Nó chỉ đơn giản là thu thập các điểm dữ liệu mà nó cần để thực hiện kỹ thuật tổng hợp dữ liệu (trung bình, tối đa, v.v.) và sau đó ghi nó.

Graphite sẽ sử dụng repository có độ phân giải cao nhất chứa khung thời gian được yêu cầu khi nó truy vấn dữ liệu để hiển thị đồ thị.

Thu thập và phân phối số liệu thống kê

Như ta đã đề cập ở trên, bản thân Graphite không quan tâm đến việc thu thập dữ liệu. Thay vào đó, nó dựa vào việc được cung cấp thông tin từ các dịch vụ khác. Điều này cho phép dự án duy trì trọng tâm hẹp và cho phép nó tương tác theo module với nhiều loại dịch vụ đầu vào.

Dưới đây, ta sẽ thảo luận về các giao thức Graphite hiểu, và sau đó thảo luận hai chương trình bộ sưu tập nổi tiếng, collectdStatsD, được dùng để truyền dữ liệu đến Carbon để xử lý.

Giao thức

Có ba giao thức khác nhau mà bạn có thể sử dụng để gửi dữ liệu đến Graphite.

Đầu tiên, Graphite chấp nhận và có thể hiểu văn bản thuần túy. Đây là định dạng linh hoạt nhất vì hầu hết mọi ứng dụng hoặc dịch vụ đều có thể tạo ra kết quả văn bản và điều này được dùng để cấp Graphite hoặc một công cụ trung gian.

Tin nhắn văn bản thuần túy bao gồm thông tin về tên chỉ số, giá trị đang được cung cấp và dấu thời gian cho giá trị đó. Các tin nhắn này có thể được gửi thẳng tới Carbon trên một cổng được chỉ định cho văn bản thuần túy, không cần định dạng bổ sung.

Vì Graphite được tạo bằng Python, nên Graphite cũng chấp nhận định dạng tuần tự hóa dữ liệu “kén”. Tiêu chuẩn Python này cho phép bạn đệm và gửi nhiều giá trị thời gian trong một giao dịch duy nhất.

Graphite cũng có thể chấp nhận dữ liệu bằng cách sử dụng bản tin AMQP. Điều này cho phép bạn xử lý dung lượng lớn dữ liệu một cách duyên dáng hơn. Bạn có thể cung cấp một số lượng lớn thống kê và xử lý sự gián đoạn trong kết nối mạng giữa các server từ xa mà không làm mất dữ liệu với cấu hình này.

Collectd

Một trong những cách dễ nhất để thu thập thông tin chi tiết về server là sử dụng daemon có tên là collectd.

Collectd có thể thu thập số liệu thống kê về nhiều thành phần khác nhau của môi trường server . Nó cho phép bạn dễ dàng theo dõi các số liệu phổ biến như sử dụng bộ nhớ, tải CPU, lưu lượng mạng, v.v. Điều này cho phép bạn dễ dàng tương quan các sự kiện với trạng thái hệ thống của bạn .

Ngoài việc thu thập thông tin hệ thống tiêu chuẩn, collectd còn có một hệ thống plugin mở rộng chức năng của nó. Điều này nghĩa là bạn có thể dễ dàng theo dõi các phần mềm phổ biến như Apache, Nginx, iptables, memcache, MySQL, PostgreSQL, OpenVPN và nhiều phần mềm khác.

Collectd cung cấp một cách đơn giản để lấy dữ liệu từ các ứng dụng tạo sẵn và các dịch vụ phổ biến trên server của bạn. Điều này sẽ được sử dụng để theo dõi hành vi của cơ sở hạ tầng của bạn và các dịch vụ mà bạn dựa vào.

Thống kêD

StatsD là một daemon rất đơn giản được dùng để gửi dữ liệu khác đến Graphite. Lợi ích của cách tiếp cận này là việc xây dựng theo dõi thống kê cho các ứng dụng và hệ thống mà bạn đang tạo sẽ trở nên đơn giản.

StatsD hoạt động bằng cách lắng nghe trên một giao diện cho các gói UDP đơn giản đại diện cho một điểm dữ liệu duy nhất. Điều này nghĩa là nó có thể chấp nhận một lượng lớn thông tin theo cách không kết nối. Sau đó, nó có thể tổng hợp các giá trị mà nó nhận được và chuyển chúng sang Graphite.

Hệ thống này cho phép bạn gửi số liệu thống kê với số lượng lớn mà không lo lắng về việc tăng độ trễ của ứng dụng. Dịch vụ StatsD sẽ thu thập tất cả dữ liệu khi nó đến, tổng hợp và sau đó gửi các điểm dữ liệu đẹp, tóm tắt đến Graphite trong khung thời gian mà nó mong đợi.

Vì những ưu điểm này, nó thực sự là một trung gian tốt cho bất kỳ loại dữ liệu nào được gửi đến Graphite. Nhưng cách chính mà ta có thể tận dụng điều này là theo dõi các ứng dụng và công cụ của chính ta mà ta tạo ra.

StatsD là hoàn hảo cho việc này bởi vì nó là một daemon có mục đích chung chấp nhận lưu lượng UDP. Có nhiều thư viện phía client khác nhau bằng các ngôn ngữ lập trình khác nhau có thể gửi dữ liệu trực tiếp đến một version StatsD. Điều này nghĩa là các ứng dụng bạn đang xây dựng có thể dễ dàng gửi dữ liệu để được theo dõi.

Kết luận

Bây giờ, bạn đã hiểu khá rõ về cách một tập hợp các số liệu thống kê và tiện ích vẽ đồ thị khác nhau có thể hoạt động cùng nhau để cung cấp cho bạn bức tranh toàn cảnh về môi trường của bạn.

Trong hướng dẫn tiếp theo, ta sẽ thảo luận về cách cài đặt Graphite trên server Ubuntu 14.04 . Sau đó, ta sẽ treo lên collectdStatsD để Graphite để thức ăn trong số liệu thống kê để theo dõi.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan