Làm thế nào tôi nên lưu trữ chuỗi thời gian trong mongodb


11

Tôi cần tạo một cơ sở dữ liệu về chuỗi thời gian và thực hiện các tác vụ sau:

  • tạo chuỗi thời gian mới
  • cập nhật chuỗi thời gian hiện tại
  • truy vấn một hoặc nhiều chuỗi thời gian cùng một lúc (ví dụ: tất cả các chuỗi thời gian cho cùng một ngày, v.v ...)

Mongo có thích nghi với điều đó không và nếu có, tôi nên cấu trúc cơ sở dữ liệu như thế nào? (một lần serie = một tài liệu? Hoặc một tài liệu = một mục nhập của serie thời gian và tất cả các tài liệu này tạo thành bộ sưu tập là toàn bộ chuỗi thời gian?)

Tôi hơi lạc lõng ở đây và tôi thấy khó tìm thấy bất kỳ thông tin nào vì thông thường Mongo được trình bày là rất linh hoạt để người dùng có sự lựa chọn trong cơ sở hạ tầng.

Bất kỳ liên kết đến hướng dẫn nào giải thích cụ thể cách quản lý chuỗi thời gian trong Mongo đều rất đáng hoan nghênh.

Cảm ơn bạn!


Đọc thiết kế lược đồ cho dữ liệu chuỗi thời gian trong MongoDB ngày hôm nay. Rất tốt viết về điều này.
akauppi

Có một tờ giấy trắng cập nhật thảo luận về chuỗi thời gian trong MongoDB. mongodb.com/collonymous/time-series-best-practices
Robert Walters

Câu trả lời:


6

Tôi đề nghị một mục nhập chuỗi thời gian duy nhất cho mỗi tài liệu. Có một số vấn đề với việc lưu trữ nhiều mục trên mỗi tài liệu:

  • một tài liệu duy nhất được giới hạn ở một kích thước nhất định (hiện tại là 16 MB); điều này giới hạn số lượng mục có thể được lưu trữ trong một tài liệu
  • khi nhiều mục nhập được thêm vào tài liệu, toàn bộ tài liệu (và chuỗi thời gian) sẽ không cần phải xóa và phân bổ lại thành một phần bộ nhớ lớn hơn
  • truy vấn trên tài liệu phụ bị giới hạn so với truy vấn trên tài liệu thông thường
  • tài liệu có cấu trúc rất phẳng (như một tài liệu phụ cho mỗi giây) không được thực hiện
  • tính năng giảm bản đồ tích hợp không hoạt động tốt trên các tài liệu phụ

Cũng lưu ý rằng dấu thời gian được tích hợp vào đối tượng MongoDB mặc định . Bạn có thể sử dụng điều này nếu độ chính xác của chuỗi thời gian ít hơn một giây.

Dưới đây là một tài liệu BSON mẫu từ thư viện ghi nhật ký sự kiện sử dụng MongoDB :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Vì nhật ký sự kiện tương tự như chuỗi thời gian, có thể đáng để nghiên cứu phần còn lại của mã . Có các phiên bản trong Java, C #, PHP và Python.

Đây là một dự án nguồn mở tương tự khác: Zarkov


[cập nhật] Đáp lại bình luận của @ RockScience, tôi đã thêm một số tài liệu tham khảo:


đó sẽ là RẤT NHIỀU tài liệu nếu chuỗi thời gian của tôi có dữ liệu trong ngày trong vài năm !!! nó không phải là một vấn đề để có nhiều tài liệu? Đến từ một nền tảng sql, tôi chỉ thấy nó không hiệu quả bộ nhớ. (Vì sẽ có rất nhiều sự lặp lại cho tất cả các điểm dữ liệu của cùng một chuỗi thời gian)
RockScience

@RockScience: MongoDB, giống như nhiều cơ sở dữ liệu NoQuery khác, tránh sự bình thường hóa và hiệu quả bộ nhớ có lợi cho những thứ khác như tính linh hoạt, tốc độ và giảm mức sử dụng CPU. Nếu bạn cần hiệu quả bộ nhớ, MongoDB có thể không phải là giải pháp phù hợp với bạn. MongoDB sao chép tên văn bản đầy đủ của từng lĩnh vực vào mỗi tài liệu, vì đã khóc rất to! Dù sao, tôi đã cập nhật câu trả lời của mình với một vài tài nguyên khác, bao gồm cả nghiên cứu trường hợp về cách MongoDB được sử dụng để lưu trữ chuỗi thời gian rất lớn.
Leftium

2

Tôi đã tìm thấy câu hỏi này trên SO ( /programming/4814167/storing-time-series-data-relational-or-non ) trong đó OP hỏi cách lưu trữ chuỗi thời gian. Mặc dù câu hỏi của anh ấy dựa nhiều hơn vào việc sử dụng cơ sở dữ liệu NoQuery hoặc RDBMS và bạn dường như khá tập trung vào việc sử dụng db NoQuery.

Cũng tìm thấy bài viết này về " Yêu cầu cơ sở dữ liệu duy nhất của dữ liệu chuỗi thời gian " có thể hữu ích.

Hi vọng điêu nay co ich.


2

Có chắc chắn, cơ sở dữ liệu NoQuery phù hợp hơn với việc lưu trữ dữ liệu thời gian hơn RDBMS truyền thống.

Có MongoDB đặc biệt thích nghi với trường hợp sử dụng này.

-Làm thế nào bạn nên cấu trúc cơ sở dữ liệu? Một tài liệu = một chuỗi thời gian đầu vào VS nhiều chuỗi thời gian.

Câu trả lời là lưu trữ trong một tài liệu nhiều lần. Có ít tài liệu sẽ giúp hiệu suất với ít đọc hơn. Một mẹo nhỏ là chuẩn bị tài liệu của bạn với các giá trị được xác định trước. Điều này sẽ tối ưu hóa việc cập nhật tài liệu bằng cách tránh Record Padding .

Dưới đây là ví dụ về lược đồ về cách lưu trữ tối ưu thời gian trong một giờ với khoảng thời gian:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

Bạn khởi tạo nó với 0 giá trị, và sau đó các cập nhật sẽ được tối ưu hóa. Các lần đọc được tối ưu hóa vì một tài liệu được đọc thay vì 60. Nếu bạn cần lưu trữ dữ liệu trong một ngày hoặc một tháng bạn tiến hành với cùng một kỹ thuật, bạn sẽ có được ý tưởng.

Đây là liên kết đến một hướng dẫn giải thích cụ thể cách quản lý chuỗi thời gian trong MongoDb từ Blog MongoDb chính thức: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Bucketing dữ liệu trong một tài liệu sẽ tốt hơn từ việc sử dụng tài nguyên và hiệu suất. Có ba kịch bản lược đồ được thảo luận trên chuỗi thời gian cập nhật cho giấy trắng thực hành tốt nhất MongoDB. mongodb.com/collonymous/time-series-best-practices
Robert Walters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.