Giới hạn chuỗi thời gian MongoDB

Một trong những mặt hàng có vé lớn tại MongoDB 5 gần đây. 0 ra mắt là sự ra đời của các bộ sưu tập “chuỗi thời gian” chuyên biệt.  

Cơ sở dữ liệu chuỗi thời gian (TSDB) từ lâu đã là một lĩnh vực chuyên biệt trong bối cảnh cơ sở dữ liệu. Khái niệm chính trong cơ sở dữ liệu chuỗi thời gian là, đối với nhiều dữ liệu, dấu thời gian của dữ liệu là một yếu tố quan trọng, cả về chi phí vận hành và giá trị phân tích. Khi phân tích dự đoán đã trở thành một công cụ được sử dụng rộng rãi hơn trong kinh doanh, nhu cầu đo lường mức độ thay đổi của một mục dữ liệu theo thời gian trở nên quan trọng hơn. Đồng thời, tầm quan trọng ngày càng tăng của dữ liệu cảm biến - Internet of Things - đã dẫn đến sự bùng nổ thông tin được đánh dấu thời gian thường được tạo ra ở tần số rất cao.

Cơ sở dữ liệu quan hệ không được tối ưu hóa đặc biệt tốt cho loại lưu lượng truy cập chuỗi thời gian tốc độ cao do IoT tạo ra. Các cơ sở dữ liệu NoSQL “cột rộng” như Cassandra và HBase có thể chấp nhận tỷ lệ đầu vào cao hơn dựa trên kiến ​​trúc phân tán được tối ưu hóa ghi của chúng. Cơ sở dữ liệu chuỗi thời gian chuyên dụng như Open TSDB tồn tại, nhưng những cơ sở dữ liệu này hiện không được áp dụng rộng rãi.  

MongoDB được triển khai rộng rãi trên nhiều ngành công nghiệp và đã được đưa vào sử dụng để lưu trữ dữ liệu theo định hướng chuỗi thời gian trong nhiều trường hợp. Tuy nhiên, như với hầu hết các cơ sở dữ liệu, cuối cùng sẽ xảy ra tắc nghẽn đối với lưu lượng ghi và chi phí lưu trữ cũng có thể là vấn đề. Các truy vấn tổng hợp trên dữ liệu chuỗi thời gian chi tiết cũng có thể cực kỳ tốn nhiều tài nguyên

MongoDB 4. 0 khách hàng thường khắc phục những hạn chế này bằng cách áp dụng mô hình dữ liệu tùy chỉnh giúp giảm chi phí chuỗi thời gian/IoT. Thông thường, một số lớp phần mềm trung gian sẽ nối nhiều phép đo vào một tài liệu JSON duy nhất—đôi khi được gọi là "bộ chứa"?. Mặc dù điều này giúp giảm chi phí chèn, nhưng nó cũng tạo ra một mô hình lập trình khó sử dụng và khiến các truy vấn phân tích trở nên rườm rà và không tự nhiên

Mục đích của MongoDB 5. 0 là cung cấp các ưu điểm của mô hình dữ liệu được nhóm trong khi vẫn cung cấp các mẫu lập trình đơn giản và quen thuộc.   

Nhìn bề ngoài, bộ sưu tập chuỗi thời gian MongoDB trông giống như bất kỳ bộ sưu tập nào khác, mặc dù bạn phải chỉ định thuộc tính dấu thời gian cùng với thuộc tính “độ chi tiết” mô tả tần suất dữ liệu được mong đợi. Ngoài ra, người ta có thể chỉ định thuộc tính siêu dữ liệu có thể được lập chỉ mục cho mục đích truy vấn. Cuối cùng, dữ liệu trong bộ sưu tập chuỗi thời gian có thể được tự động xóa sau một khoảng thời gian nhất định

Về cơ bản, MongoDB lưu trữ dữ liệu trong các nhóm được căn chỉnh nhiều nhất có thể theo cài đặt mức độ chi tiết. Điều này làm giảm số lượng thao tác ghi cần thiết và lưu trữ dữ liệu ở định dạng nhỏ gọn hơn. Các nhóm cũng bao gồm các giá trị tối đa và tối thiểu cho nhóm, có thể được sử dụng để tăng tốc các loại hoạt động tổng hợp nhất định.  

MongoDB 5. 0 cũng giới thiệu chức năng tổng hợp mới “Windowing”. Cửa sổ hay các hàm “phân tích” là một trong những phần mạnh nhất nhưng khó học nhất của ngôn ngữ SQL. Hàm cửa sổ phân vùng các hàng trong tập kết quả và tạo một loại "bảng ảo" mà hàm hoạt động với. Chức năng này hoạt động trên một “cửa sổ” gồm các hàng xung quanh hàng hiện tại, cho phép bạn truy cập thông tin về xu hướng hoặc nhóm. Hàm MongoDB $setWindowFields triển khai chức năng tương ứng với các hàm SQL Windowing

Trong khi cửa sổ hoạt động trong MongoDB 5. 0 có thể được sử dụng đối với bất kỳ bộ sưu tập nào, chúng đặc biệt hữu ích trong bối cảnh chuỗi thời gian vì chúng có thể được sử dụng cho các mục đích như đường trung bình động và các phân tích theo định hướng thời gian khác.  

Hiện tại, các bộ sưu tập theo chuỗi thời gian chỉ được thêm vào, mặc dù bạn có thể cập nhật trực tiếp bộ nhớ cơ bản nếu bạn cảm thấy dũng cảm. Ngoài ra còn có những hạn chế trong bản phát hành ban đầu xung quanh việc lập chỉ mục và tính khả dụng của một số tính năng nâng cao như luồng thay đổi. Những hạn chế này dự kiến ​​​​sẽ được giải tỏa trong các phiên bản trong tương lai

Các bộ sưu tập chuỗi thời gian đại diện cho một nỗ lực khác của công ty MongoDB nhằm mở rộng việc sử dụng MongoDB cho nhiều ứng dụng và kịch bản hơn. Họ là một sự bổ sung đáng hoan nghênh

Dữ liệu chuỗi thời gian là dữ liệu được thu thập theo thời gian, như chỉ số cảm biến hoặc lịch sử giá cổ phiếu. Các bộ sưu tập Chuỗi thời gian MongoDB cho phép lưu trữ và truy vấn các bản ghi dữ liệu chuỗi thời gian lặp đi lặp lại một cách hiệu quả trong cơ sở dữ liệu MongoDB

Studio 3T đã thêm hỗ trợ cho các bộ sưu tập Chuỗi thời gian trong phiên bản 2022. 9

Trong bài viết này, chúng tôi sẽ giải thích Chuỗi thời gian nói chung là gì và cách các bộ sưu tập Chuỗi thời gian MongoDB làm cho việc lưu trữ và truy vấn các bộ sưu tập đó hiệu quả hơn

Chuỗi thời gian là gì

Chuỗi thời gian là thuật ngữ chỉ dữ liệu trong đó trường quan trọng nhất là dấu thời gian, bởi vì mỗi mục nhập trong chuỗi thời gian biểu thị dữ liệu cho thời gian đó

Vì vậy, giả sử bạn có một nhiệt kế, nó ghi lại nhiệt độ mỗi phút

10:00,25.1
10:01,25.2
10:02,25.1
10:03,24.7

Đây không phải là nhiệt kế duy nhất của chúng tôi, vì vậy chúng tôi nên xác định nó tốt hơn bằng một số dữ liệu về dữ liệu, siêu dữ liệu

Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7

Bây giờ, để lưu trữ dữ liệu này trong MongoDB, chúng tôi sẽ biến nó thành JSON. (Và biến những thời điểm đó thành các loại ISODate thích hợp)

{
	timestamp: ISODate("2022-10-06T10:00:00.000Z"),
         location: { 
                room: "Living Room",
           	sensor: "Sensor 1"
        },
	temperature: 25.1
}
{
	timestamp: ISODate("2022-10-06T10:01:00.000Z"),
        location: { 
                room: "Living Room",
           	sensor: "Sensor 1"
         },
	temperature: 25.2
}
{
	timestamp: ISODate("2022-10-06T10:02:00.000Z"),
        location: { 
                room: "Living Room",
           	sensor: "Sensor 1"
        },
	temperature: 25.1
}
{
	timestamp: ISODate("2022-10-06T10:03:00.000Z"),
         location: { 
                room: "Living Room",
           	sensor: "Sensor 1"
         },
	temperature: 24.7
} 

Điều này rất dễ nhập vào MongoDB, nhưng hãy xem xét những điều sau

  • Để lấy nhiệt độ trung bình trong bốn phút đó, cần phải truy xuất và tổng hợp bốn tài liệu khác nhau
  • Mỗi một trong bốn tài liệu đó lặp lại các giá trị giống nhau cho thông tin vị trí và cảm biến

Nghe có vẻ không tệ phải không? .  

Tính toán theo thời gian liên quan đến việc tìm kiếm hàng trăm tài liệu trong MongoDB. Lập chỉ mục vị trí, cảm biến và thời gian cung cấp cho bạn một số chỉ mục lớn, vì vậy đó không phải là một tùy chọn. Ngoài ra, sẽ có rất nhiều lần lặp lại trong cơ sở dữ liệu, chiếm hết dung lượng lưu trữ của bạn

Nén dữ liệu

Điều lý tưởng mà chúng tôi muốn làm, để tiết kiệm dung lượng, là tích lũy tất cả các mục nhập cho một vị trí cụ thể trong một bản ghi

{
	 location: { 
                room: "Living Room",
           	sensor: "Sensor 1"
          },
          Data: {
                  timestamp: {
                   	0: ISODate("2022-10-06T10:00:00.000Z"),
                   	1: ISODate("2022-10-06T10:01:00.000Z"),
                   	2: ISODate("2022-10-06T10:02:00.000Z"),
                   	3: ISODate("2022-10-06T10:03:00.000Z")
                   },
                   temperature: {
                   	0: 25.1,
                   	1: 25.2,
                   	2: 25.1,
                   	3: 24.7
                   }
           }
}   

Bây giờ, để thực hiện các phép tính, chúng tôi chỉ có một tài liệu để truy xuất và siêu dữ liệu chỉ xuất hiện một lần. Mỗi điểm dữ liệu của trường cũng được lập chỉ mục để truy xuất nhanh hơn nữa

Nhưng đây cũng là một nỗi đau lớn để quản lý. Và kích thước tối đa của tài liệu MongoDB là 16 MB nên chúng tôi không thể giữ mọi thứ trong một tài liệu. Chúng tôi có thể chia chúng thành các khối thời gian với một tài liệu trên mỗi khối, nhưng ồ không. Sau đó, nó thậm chí còn phức tạp hơn

Và đó là nơi giải cứu các bộ sưu tập Chuỗi thời gian MongoDB

Bộ sưu tập chuỗi thời gian MongoDB là gì?

Điều gì sẽ xảy ra nếu chúng ta có thể nói với MongoDB rằng một trường là dấu thời gian và trường khác là siêu dữ liệu và mọi thứ khác là điểm dữ liệu?

Đó là những gì bộ sưu tập Chuỗi thời gian MongoDB làm. Bạn tạo bộ sưu tập Chuỗi thời gian MongoDB trong Studio 3T giống như bất kỳ bộ sưu tập nào khác, nhưng tại thời điểm tạo, bạn có thể cho MongoDB biết tên của trường có dấu thời gian trong đó và tên của trường có dữ liệu meta. Hãy tạo một bộ sưu tập roomtemps

Giới hạn chuỗi thời gian MongoDB

Trường thời gian của chúng tôi là

Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
0 và trường meta của chúng tôi là
Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
1

Cài đặt mức độ chi tiết là một gợi ý cho MongoDB về những gì mong đợi về mật độ của các điểm dữ liệu. Nó mặc định là giây, nhưng nếu dữ liệu của bạn đến sau mỗi phút hoặc mỗi giờ, bạn có thể muốn điều chỉnh nó. Hết hạn sau giây cũng là tùy chọn. Cài đặt này có thể xóa dữ liệu của bạn trong bộ sưu tập chuỗi thời gian sau một khoảng thời gian nhất định. Điều đó hữu ích nếu bộ sưu tập của bạn chỉ có dữ liệu “nóng” hoặc dữ liệu gần đây. Chúng tôi sẽ để cả hai thứ đó một mình và nhấp vào tạo

Bây giờ chúng ta có thể thêm các tài liệu JSON của mình từ trước đó, chính xác như chúng được hiển thị và sau đó truy vấn bộ sưu tập

Giới hạn chuỗi thời gian MongoDB
Xem Bộ sưu tập chuỗi thời gian MongoDB dưới dạng chuỗi thời gian

Điều này trông khá giống với các tài liệu chúng tôi vừa chèn. Đó là bởi vì trong nền, MongoDB đã tạo một bộ sưu tập hệ thống –

Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
2 – để lưu trữ dữ liệu ở định dạng trông giống như một tài liệu đơn với tất cả dữ liệu của chúng tôi từ trước đó.  

Bộ sưu tập mà chúng tôi đang làm việc – roomtemps – trông giống như một bộ sưu tập đơn giản gồm các tài liệu tại một thời điểm, bởi vì đó là cách chúng tôi muốn trực quan hóa dữ liệu Chuỗi thời gian của mình trong MongoDB, vì vậy thật dễ dàng để làm việc với tổng hợp.   

Nếu chúng ta nhìn vào hệ thống. xô. roomtemps, chúng ta có thể xem tài liệu nén của mình

Giới hạn chuỗi thời gian MongoDB
Xem cấu trúc dữ liệu cơ bản của Bộ sưu tập chuỗi thời gian MongoDB

Có một điểm khác biệt – có một phần điều khiển chứa các giá trị tối thiểu và tối đa cho tất cả các trường dữ liệu. Tại sao? . Bạn không cần phải làm bất cứ điều gì khi truy vấn dữ liệu này nhưng MongoDB có thể sử dụng các giá trị tối thiểu và tối đa để tìm nhanh các bit của chuỗi thời gian hoặc các giá trị nằm trong phạm vi. Và bởi vì nhiều truy vấn chuỗi thời gian là “Điều gì đã xảy ra trong khoảng thời gian này”, nó thực sự có thể tối ưu hóa các truy vấn

Bộ sưu tập chỉ mục và chuỗi thời gian

Với tất cả sự tối ưu hóa này, vẫn còn một điều có thể được thực hiện để tăng hiệu suất truy vấn trên các bộ sưu tập Chuỗi thời gian. Thêm chỉ mục phụ vào các trường của siêu dữ liệu (và thêm dấu thời gian) sẽ cung cấp chỉ mục mạnh để truy xuất theo vị trí

Giới hạn chuỗi thời gian MongoDB
Lập chỉ mục Bộ sưu tập chuỗi thời gian MongoDB

Tổng hợp với Bộ sưu tập chuỗi thời gian MongoDB

Sức mạnh thực sự của Chuỗi thời gian xuất hiện khi bạn cần tổng hợp dữ liệu. Với sự hỗ trợ cho các bộ sưu tập Chuỗi thời gian, một số giai đoạn tổng hợp mới được xây dựng có tính đến loại dữ liệu này. Điều đó không có nghĩa là các giai đoạn này chỉ hoạt động với bộ sưu tập Chuỗi thời gian, chỉ là chúng hoạt động tốt hơn với dữ liệu chuỗi thời gian. Ví dụ: chúng tôi đã viết về giai đoạn $setWindowFields trong Studio 3T Blog bằng cách sử dụng các bộ sưu tập bình thường. Nhưng nó có thể kích hoạt một số tập hợp chuỗi thời gian mạnh mẽ

$setWindowFields

Vấn đề với tập hợp là, không lưu trữ dữ liệu trong các biến, nó liên quan đến từng tài liệu trong sự cô lập. Đó là nơi mà

Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
1 xuất hiện vì nó kết hợp một số chức năng của
Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
2 tổng hợp với các chức năng của cửa sổ.  

{ 
    "partitionBy" : { location:"$location", day: { $dayOfYear: "$timestamp" } }, 
    "output" : { 
        "averaged" : { 
            "$avg" : "$temperature", 
            "window" : { 
                documents: [ "unbounded", "unbounded" ]
            }
        }
    }
}

Phần “partitionBy” phân chia và nhóm dữ liệu theo siêu dữ liệu của chúng tôi và trong trường hợp này là theo ngày trong năm. Phần “đầu ra” sau đó xác định đầu ra nào sẽ được thêm vào mọi tài liệu, dựa trên phân vùng của chúng. Vì vậy, trường đầu tiên của chúng tôi là trường "trung bình" cho nhiệt độ. Đây sẽ là mức trung bình cho phân vùng đó. Phần “cửa sổ” nói sử dụng toàn bộ phân vùng để tính trung bình, “không giới hạn”. Kết quả của giai đoạn này là mọi tài liệu đều nhận được nhiệt độ trung bình cho phân vùng được thêm vào.  

Thêm vào một trận đấu $

{
     "$expr": { $lt: [ "$temperature", "$averaged" ] }    
}

Và bây giờ, kết quả của sự tổng hợp là mọi sự cố xảy ra khi một địa điểm có nhiệt độ thấp hơn mức trung bình cho ngày hôm đó

Bạn có thể thay đổi cửa sổ đó để hoạt động với các cửa sổ đang di chuyển, điều chỉnh cả ranh giới của phép tính trung bình. Hoặc so sánh các tài liệu tương đối với nhau. Và nếu bạn muốn nhiều hơn một phép tính trung bình, thì có rất nhiều tính năng bao gồm bộ tích lũy, xếp hạng, thứ tự và lấp đầy khoảng trống

Tất nhiên, bạn có thể sử dụng bất kỳ tập hợp nào bạn muốn với tập hợp Chuỗi thời gian. Chúng tôi chỉ đề cập đến

Living Room,Sensor 1,10:00,25.1
Living Room,Sensor 1,10:01,25.2
Living Room,Sensor 1,10:02,25.1
Living Room,Sensor 1,10:03,24.7
1 vì nó gần như được tùy chỉnh để phân tích dữ liệu Chuỗi thời gian

Kết thúc chuỗi thời gian

Đây chỉ là phần giới thiệu nhanh về bộ sưu tập Chuỗi thời gian. Bây giờ bạn nên hiểu lý do tại sao bạn sẽ sử dụng chúng (để giảm nhu cầu lưu trữ và tối ưu hóa thời gian) và có các tập hợp MongoDB sẽ cho phép bạn tận dụng khả năng lưu trữ hiệu quả dữ liệu Chuỗi thời gian. Từ phiên bản 2022. 9, Studio 3T sẽ cho phép bạn tạo các bộ sưu tập Chuỗi thời gian. Tuy nhiên, một lưu ý cuối cùng, có những hạn chế đối với các bộ sưu tập Chuỗi thời gian MongoDB mà bạn nên lưu ý vì chúng tiềm ẩn về cách chúng được triển khai

MongoDB có tốt cho dữ liệu chuỗi thời gian không?

MongoDB là cơ sở dữ liệu có mục đích chung dựa trên tài liệu với thiết kế lược đồ linh hoạt và ngôn ngữ truy vấn phong phú. Kể từ MongoDB 5. 0, MongoDB vốn hỗ trợ dữ liệu chuỗi thời gian .

Hạn chế của MongoDB là gì?

Kích thước tài liệu BSON tối đa là 16 megabyte . Kích thước tài liệu tối đa giúp đảm bảo rằng một tài liệu không thể sử dụng quá nhiều RAM hoặc quá nhiều băng thông trong quá trình truyền. Để lưu trữ tài liệu lớn hơn kích thước tối đa, MongoDB cung cấp GridFS API.

Cơ sở dữ liệu nào là tốt nhất cho dữ liệu chuỗi thời gian?

8 cơ sở dữ liệu chuỗi thời gian hàng đầu .
InfluxDB
Prometheus
khí cầu
Dữ liệuStax
nhiệm vụDB
tu sĩ
Dòng thời gian của Amazon
phân tích xu hướng

MongoDB có thể xử lý hàng triệu bản ghi không?

Làm việc với MongoDB và ElasticSearch là một quyết định chính xác để xử lý hàng triệu bản ghi trong thời gian thực . Những cấu trúc và khái niệm này có thể được áp dụng cho các bộ dữ liệu lớn hơn và cũng sẽ hoạt động rất tốt.