Chọn giải pháp lưu trữ nào để sử dụng cho Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) không phải là một nhiệm vụ đơn giản. Ngày nay, người ta hầu như tha hồ lựa chọn vì có một số giải pháp thay thế tuyệt vời ngoài kia, nhưng bài viết này cố gắng làm sáng tỏ hai trong số các giải pháp này – Elasticsearch và InfluxDB.
Tại sao lại so sánh này? Trong khi InfluxDB được thiết kế cho Cơ sở dữ liệu chuỗi thời gian (Time-Series Database), Elasticsearch được thiết kế và chủ yếu được sử dụng để lập chỉ mục tài liệu. Tuy nhiên, bất chấp sự khác biệt về thiết kế và chức năng này, Elasticsearch được nhiều người sử dụng cho Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) và chúng tôi muốn kiểm tra xem hai cơ sở dữ liệu này hoạt động tốt như thế nào. Hy vọng rằng, so sánh cấp độ cao này sẽ giúp những người đang tìm kiếm câu trả lời cho tình huống khó xử nêu trên.
Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) là gì?
Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) có thể được định nghĩa là các điểm dữ liệu được lập chỉ mục theo thứ tự thời gian của chúng, trong đó khoảng cách giữa hai điểm dữ liệu có thể bằng hoặc không. Nếu tần suất tại đó các điểm dữ liệu được lấy là không đổi (ví dụ: lấy mẫu dữ liệu sau mỗi 10 ms) thì chuỗi được gọi là chuỗi dữ liệu thời gian rời rạc.
Trong hệ thống máy tính, tất cả dữ liệu người dùng có thể được biểu diễn dưới dạng Cơ sở dữ liệu chuỗi thời gian (Time-Series Database), vì tất cả thông tin được lưu trữ đều có thành phần thời gian có thể cung cấp các số liệu khác nhau trong các tình huống khác nhau.
Ví dụ: Twitter, Facebook và LinkedIn có dữ liệu về ngày đăng ký của người dùng, cũng như ngày và giờ mà các hành động khác nhau được thực hiện (tweet hoặc bài viết được đăng, hoạt động thích, v.v.).
Việc dữ liệu đến với tần suất cao hơn có thể tạo ra nhiều thách thức, bao gồm việc phải xử lý số lượng yêu cầu bản ghi lớn hơn mỗi giây và cần lưu trữ tất cả dữ liệu. Một cảm biến, với tần suất lấy mẫu là 30 yêu cầu mỗi giây và tải trọng 1KB, có thể tạo ra 86 MB thông tin mỗi ngày, nghĩa là 100 cảm biến sẽ tạo ra một tải dữ liệu là 8GB mỗi ngày. Truy vấn và tổng hợp một lượng lớn dữ liệu như vậy để trích xuất thông tin hữu ích là một vấn đề khác cần được xem xét.
Và do đó, quyết định chọn công cụ lưu trữ phù hợp để sử dụng cho Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) là một trong những thách thức đầu tiên cần vượt qua khi thiết kế một hệ thống tạo dữ liệu tạm thời.
Về nguyên tắc, bạn có thể sử dụng hầu hết mọi công cụ cơ sở dữ liệu để lưu trữ Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) của mình, nhưng các vấn đề có thể phát sinh sau đó, khi bạn muốn thực hiện phân tích thông tin thu thập được. Chúng ta sẽ thảo luận về hai cơ sở dữ liệu phổ biến được sử dụng để lưu trữ và phân tích Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) là InfluxDB và Elasticsearch.
CHUỖI THỜI GIAN ĐƯỢC SỬ DỤNG NHƯ THẾ NÀO TRONG CUỘC SỐNG HÀNG NGÀY?
Cho đến gần đây, dữ liệu tài chính chỉ đơn thuần là ứng dụng duy nhất của TSDB. Tuy nhiên, việc sử dụng dữ liệu chuỗi thời gian đã được tìm thấy rất nhiều ứng dụng ngày nay. Đặc biệt, nó đề cập đến Internet of Things. Trên thực tế, mọi người đều phải đối mặt với một chuỗi thời gian trong cuộc sống hàng ngày của họ, ngay cả khi không nhận ra điều đó.
Ví dụ cơ bản nhất bao gồm tỷ giá hối đoái tiền tệ hoặc giám sát giá cả an ninh. Cơ sở dữ liệu IoT được cung cấp bởi các thiết bị từ xa giúp nắm bắt các số liệu cần thiết cho các bài đọc thời gian thực và các mục đích phân tích sâu hơn.
Mỗi ứng dụng chuỗi thời gian đo lường mọi thứ đang thay đổi như thế nào theo thời gian. Như vậy, Internet of Things đã cho phép sử dụng “những thứ thông minh” được kết nối với nhau. Công nghệ nhà thông minh thể hiện một số thứ thông minh như đồng hồ đo điện, nước hoặc sưởi thông minh. Chúng ghi lại mức tiêu thụ điện, nước và năng lượng để sưởi ấm một ngôi nhà, tương ứng.
Dữ liệu thường được thu thập hàng giờ, cung cấp cho chủ sở hữu ngôi nhà thông tin thanh toán theo thời gian thực. Trong thời gian dài, các môi trường hỗ trợ cơ sở dữ liệu IoT như vậy lưu trữ rất nhiều dữ liệu. Việc phân tích dữ liệu này có thể cho thấy các mô hình sử dụng tài nguyên theo mùa, xác định các khu vực tiêu thụ kém hiệu quả và dự báo các cách có thể để đạt được mức tiêu thụ không lãng phí với hiệu quả tối đa về nguồn lực và chi phí tối thiểu.
Các trường hợp sử dụng khác cho chuỗi thời gian bao gồm:
- Hệ thống an ninh thông minh phát hiện đột nhập. Chúng cũng có thể được sử dụng để ghi lại thông tin ra vào của công nhân, ghi lại thời gian quá tải và phân tích cách chúng phù hợp với năng suất của từng công nhân cụ thể.
- Cơ sở dữ liệu IoT trong hệ thống thương mại điện tử lưu trữ tất cả thông tin khách hàng từ số tiền giao dịch đến dữ liệu thanh toán, không đề cập đến thông tin đặt hàng, cũng như dữ liệu tồn kho sản phẩm và hậu cần của từng mặt hàng đã đặt hàng.
- IoT trong tái chế năng lượng. Ví dụ, cối xay gió với các cảm biến tích hợp để đo tốc độ gió, cũng như điện được sản xuất.
InfluxDB
InfluxDB là một cơ sở dữ liệu có mục đích chung là lưu trữ Cơ sở dữ liệu chuỗi thời gian (Time-Series Database). Việc lưu trữ và truy vấn dữ liệu được tối ưu hóa cho các điểm dữ liệu có thành phần thời gian.
Khi nói đến việc lưu trữ dữ liệu, nhóm InfluxDB đã phát triển một công cụ lưu trữ tuân theo mô hình cây LSM. Công cụ sắp xếp dữ liệu của nó thành các phân đoạn cho mỗi khoảng thời gian khối tùy thuộc vào chính sách lưu giữ. Nếu chính sách lưu giữ là không giới hạn thì các phân đoạn sẽ được lưu trữ trong bảy ngày. Mỗi phân đoạn liên quan đến cơ sở dữ liệu mà nó được tạo. Bên cạnh các phân đoạn dữ liệu, công cụ lưu trữ bao gồm nhiều thành phần khác như chỉ mục trong bộ nhớ, WAL, bộ nhớ cache cho dữ liệu được lưu trữ trong tệp WAL, TSM nơi dữ liệu được nén và lưu trữ, FileStore, v.v.
Chuỗi thời gian có thể được tổ chức trong cơ sở dữ liệu nơi bạn có thể tổ chức hợp lý các loại dữ liệu mà bạn định lưu trữ. Theo một cách nào đó, các phép đo như disk_space , cpu_load và các phép đo khác có thể được coi là bảng trong SQL, trong đó khóa chính luôn là thành phần thời gian.
Các “bảng” này phải chứa ít nhất một thành phần chính mô tả dữ liệu nào được lưu trữ (ví dụ: core_1, server_12 ) và giá trị số của nó. Khi được truy vấn, bảng đo lường sẽ trả về dấu thời gian, cùng với các khóa và giá trị cho dữ liệu được lưu trữ.
Việc ghi dữ liệu lên InfluxDB có thể được thực hiện theo nhiều cách. Bạn có thể sử dụng giao diện dòng lệnh được cung cấp, các thư viện ứng dụng khách cho ngôn ngữ của bạn hoặc API REST được cung cấp cho cả việc đọc và ghi dữ liệu vào cơ sở dữ liệu. API này cũng cho phép bạn tạo hoặc xóa cơ sở dữ liệu và bảng.
Đây là một ví dụ về InfluxDB trả về các giá trị từ bảng cpu_load_short :
curl -G 'http: // localhost: 8086 / query? pretty = true' --data-urlencode "db = mydb" --data-urlencode "q = SELECT \" value \ "FROM \ "cpu_load_short \" WHERE \ "region \" = 'us-west' "
Để tạo điều kiện dễ dàng trích xuất dữ liệu từ cơ sở dữ liệu, InfluxDB cung cấp giao diện SQL-ish, được gọi như vậy vì nó không cung cấp tất cả các lệnh SQL. Tổng hợp dữ liệu cũng có thể được thực hiện ở cấp độ cơ sở dữ liệu mà không cần bất kỳ xử lý bên ngoài nào.
Hỗ trợ cho các truy vấn tổng hợp được tích hợp trong InfluxDB và có thể được truy cập thông qua giao diện SQL và REST. Một số hàm có sẵn để tổng hợp là COUNT (), DISTINCT (), INTEGRAL (), MEAN (), MEDIAN (), MODE (), SPREAD (), STDDEV () và SUM () .
Dưới đây là một ví dụ cho truy vấn tổng hợp InfluxDB:
SELECT COUNT("water_level") FROM "h2o_feet"
Ngoài ra, InfluxDB có hỗ trợ chuyển đổi dữ liệu, bộ chọn và thậm chí cả các truy vấn dự đoán. Bằng cách gọi các hàm, bạn có thể dễ dàng chuyển đổi dữ liệu trước khi trả lại cho máy khách sẽ sử dụng nó (xem https://docs.influxdata.com/influxdb/v1.3/query_language/functions/ để biết thêm thông tin).
Xem ví dụ này về truy vấn chuyển đổi dữ liệu trả về dẫn xuất của mực nước giữa mỗi điểm dữ liệu trong một khoảng ngày cụ thể:
SELECT DERIVATIVE("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
InfluxDB cũng cung cấp một giao diện người dùng đơn giản, nơi bạn có thể chạy các truy vấn trên cơ sở dữ liệu, xem dữ liệu ở dạng bảng và cũng có thể thực thi một số hoạt động DDL. Để trực quan hóa dữ liệu của mình, bạn có thể sử dụng các công cụ khác như Grafana , nơi bạn có thể định cấu hình quyền truy cập vào dữ liệu InfluxDB của mình và trực quan hóa nó.
Cài đặt InfluxDB tương đối đơn giản. Tùy thuộc vào hệ điều hành, bạn có thể sử dụng trình quản lý gói hoặc tải xuống các tệp nhị phân và cài đặt theo cách thủ công. Cần chỉ ra rằng mặc dù InfluxDB là cơ sở dữ liệu mã nguồn mở, được phát hành theo giấy phép của MIT, nó có một số tính năng không có nguồn mở, chẳng hạn như những tính năng liên quan đến phân cụm, có sẵn trong sản phẩm InfluxEnterprise do nhà bảo trì cung cấp , InfluxData.
Elasticsearch
Elasticsearch là một công cụ phân tích và tìm kiếm toàn văn dựa trên Apache Lucene. Kể từ lần phát hành đầu tiên vào năm 2010, Elasticsearch đã trở nên phổ biến như một công cụ tìm kiếm và lập chỉ mục tài liệu nhanh chóng và có thể mở rộng với hàng triệu người dùng trên toàn thế giới.
Elasticsearch lưu trữ dữ liệu trong các chỉ mục, tương tự như cơ sở dữ liệu quan hệ, nơi dữ liệu được phân tách một cách hợp lý. Một chỉ mục duy nhất có thể chứa dữ liệu về người dùng (thông tin cá nhân, sở thích, v.v.), công ty (ví dụ: tên, địa chỉ, số điện thoại) hoặc các thực thể khác.
Khả năng chia chỉ số thành một hoặc nhiều phân đoạn là một tính năng quan trọng cho phép Elasticsearch vượt trội hơn rất nhiều so với InfluxDB trong tỷ lệ ngang, phân phối và song song hóa dữ liệu. Elasticsearch được thiết kế như một hệ thống phân tán, trong đó có thể dễ dàng thêm nhiều phiên bản hơn vào cụm — nó sẽ tự động di chuyển các phân đoạn và sao chép sang các phiên bản mới để tối đa hóa tính khả dụng của cụm.
Về mặt nội bộ, Elasticsearch dựa vào việc triển khai các chỉ số đảo ngược của Lucene, có thể được xem như một bản đồ các thuật ngữ và các tài liệu có thể tìm thấy các chỉ số này. Điều này hữu ích ở chỗ nó có thể trả về một tập hợp con các tài liệu chứa các thuật ngữ được chỉ định trong một truy vấn tìm kiếm.
Một cấu trúc dữ liệu khác giúp tăng đáng kể hiệu suất, đặc biệt là trong các truy vấn tổng hợp, là cấu trúc giá trị doc. Trong khi các chỉ số đảo ngược ánh xạ các thuật ngữ với tài liệu, các giá trị doc ánh xạ ngược lại, ánh xạ tài liệu với các thuật ngữ. Về cơ bản, một bản đồ bao gồm một danh sách các tài liệu và các thuật ngữ có trong mỗi tài liệu.
Tương tự như InfluxDB, Elasticsearch cung cấp API REST HTTP và API Java để giao tiếp và thao tác dữ liệu. Ngoài ra còn có các thư viện dành riêng cho ngôn ngữ, thường là các trình bao bọc xung quanh các API nói trên.
Việc lưu trữ Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) bắt đầu bằng việc xác định ánh xạ. Trong Elasticsearch, điều này có nghĩa là cho engine biết cách nó nên lưu trữ dữ liệu và cả các trường mà chúng ta sẽ gửi để lập chỉ mục. Việc xác định trước điều này sẽ cải thiện hiệu suất tiếp theo khi truy vấn dữ liệu.
Dấu thời gian được thêm vào ánh xạ của bạn phải là một trong những thuộc tính mà bạn lập chỉ mục. Trong các phiên bản trước, trường _timestamp đã được thêm vào mỗi bản ghi được chèn theo mặc định, nhưng phương pháp này không được chấp nhận trong các phiên bản mới hơn của Elasticsearch.
Elasticsearch cung cấp một khung tổng hợp có thể thực sự hữu ích trong quá trình phân tích, vì nó cung cấp cho các nhà phát triển tùy chọn để thực hiện tổng hợp trên toàn bộ tập hợp tài liệu hoặc Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) trong trường hợp của chúng tôi. Trái ngược với InfluxDB, nơi bạn chỉ có thể thực hiện tổng hợp dữ liệu số, Elasticsearch cũng có thể xử lý dữ liệu văn bản, điều này trở nên rất hữu ích khi bạn có nhật ký chứa thông báo, ngoại lệ và thông tin dựa trên văn bản khác.
So với InfluxDB, Elasticsearch cần cấu hình nhiều hơn một chút để chạy trên các tập dữ liệu lớn. Bạn cần xác định ánh xạ của mình, trường nào được lập chỉ mục, loại dữ liệu nào chúng chứa (văn bản đầy đủ, số, v.v.), số phân đoạn chính, v.v. Một số cài đặt này — và những cài đặt khác — không thể thay đổi khi tài liệu được thêm vào chỉ mục, vì vậy chúng cần được xem xét cẩn thận trước khi bạn bắt đầu sử dụng nó. Cách duy nhất để khắc phục sự cố sau này là thực sự tạo một chỉ mục mới với cài đặt mới, lập chỉ mục lại tất cả các tài liệu, rồi chuyển sang chỉ mục mới. Tất nhiên, việc thực hiện điều này trên một hệ thống trực tiếp là điều bạn muốn tránh.
Elasticsearch thường được sử dụng kết hợp với các thành phần khác của ngăn xếp – Logstash và Kibana (gọi chung là ELK Stack hoặc Elastic Stack) để tổng hợp, phân tích và giám sát nhật ký. Logstash là một quy trình xử lý mã nguồn mở cung cấp cho bạn khả năng nhập nhật ký từ các nguồn khác nhau (tệp, hàng đợi tin nhắn, cơ sở dữ liệu, v.v.), chuyển đổi chúng và xuất chúng tới một điểm cuối xác định hoặc kho dữ liệu, thường là Elasticsearch.
Kibana là giao diện người dùng của ngăn xếp, cung cấp cho người dùng trình bày trực quan về các tệp nhật ký được lưu trữ và cho phép họ dễ dàng định cấu hình trang tổng quan, bảng tùy chỉnh và các công cụ hỗ trợ khác để trực quan hóa.
Tổng hợp
Lưu trữ một lượng lớn Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) có thể là một nhiệm vụ khó khăn, một công việc đòi hỏi nỗ lực và nghiên cứu đáng kể về việc sử dụng công cụ lưu trữ nào. Cả InfluxDB và Elasticsearch đều có ưu và nhược điểm của chúng và không có quy tắc cứng và nhanh nào về quy tắc phù hợp cho một trường hợp sử dụng cụ thể.
Mặc dù InfluxDB là một cơ sở dữ liệu tương đối non trẻ, nhưng có vẻ như nó chuyên về Cơ sở dữ liệu chuỗi thời gian (Time-Series Database) hơn. Đo điểm chuẩn đã chỉ ra rằng nó có thể xử lý số lần ghi cao hơn Elasticsearch và sự phát triển hơn nữa sẽ cho phép nó dễ dàng trở thành người dẫn đầu trong việc lưu trữ Cơ sở dữ liệu chuỗi thời gian (Time-Series Database).
Ngoài ra, nếu bạn định ghi dữ liệu dạng văn bản vào cơ sở dữ liệu của mình — ví dụ: thông báo nhật ký, ngoại lệ, yêu cầu hoặc phản hồi — và sau đó truy vấn chúng theo nội dung, Elasticsearch là giải pháp tốt hơn vì nó chuyên về tìm kiếm dữ liệu dạng văn bản.
Việc sử dụng InfluxDB cho loại bản ghi nhật ký này và truy vấn sau này có thể yêu cầu sử dụng một công cụ tìm kiếm bổ sung, điều này có thể gây ra các vấn đề khác về đồng bộ hóa dữ liệu giữa hai hệ thống. Khi xem xét cuối cùng, cần chỉ ra rằng khung tổng hợp trong Elasticsearch có thể mở rộng hơn và không chỉ giới hạn ở dữ liệu số và văn bản.