ฉันจะเก็บอนุกรมเวลาเป็น mongodb ได้อย่างไร


11

ฉันต้องการสร้างฐานข้อมูลของอนุกรมเวลาและทำงานต่อไปนี้:

  • สร้างชุดเวลาใหม่
  • อัปเดตอนุกรมเวลาที่มีอยู่
  • สอบถามชุดข้อมูลหนึ่งหรือหลายครั้งในคราวเดียว (ตัวอย่างเช่นชุดเวลาทั้งหมดสำหรับวันที่เดียวกัน ฯลฯ ... )

Mongo ปรับให้เข้ากับสิ่งนั้นหรือไม่และถ้าใช่ฉันจะจัดโครงสร้างฐานข้อมูลได้อย่างไร (เซเรียครั้งเดียว = หนึ่งเอกสารหรือหนึ่งเอกสาร = หนึ่งรายการของซีรีย์เวลาและเอกสารเหล่านี้ทั้งหมดรวบรวมชุดซึ่งเป็นอนุกรมเวลาทั้งหมดหรือไม่)

ฉันหลงทางไปนิดหน่อยและฉันพบว่ามันยากที่จะหาข้อมูลใด ๆ ซึ่งโดยปกติแล้ว Mongo จะมีความยืดหยุ่นสูงดังนั้นผู้ใช้จึงมีทางเลือกในโครงสร้างพื้นฐาน

การเชื่อมโยงไปยังบทช่วยสอนที่อธิบายวิธีการจัดการอนุกรมเวลาใน Mongo โดยเฉพาะนั้นยินดีต้อนรับอย่างมาก

ขอขอบคุณ!


อ่านการออกแบบสคีมาสำหรับข้อมูลอนุกรมเวลาใน MongoDBวันนี้ เขียนดีมากในเรื่องนี้
akauppi

มีเอกสารทางเทคนิคฉบับปรับปรุงที่กล่าวถึงชุดข้อมูลเวลาใน MongoDB mongodb.com/collateral/time-series-best-practices
Robert Walters

คำตอบ:


6

ฉันแนะนำรายการอนุกรมเวลาเดียวต่อเอกสาร มีปัญหากับการจัดเก็บหลายรายการต่อเอกสาร:

  • เอกสารเดียวถูก จำกัด ขนาดที่แน่นอน (ปัจจุบัน 16 MB) จำกัด จำนวนรายการที่สามารถเก็บไว้ในเอกสารเดียว
  • เมื่อมีการเพิ่มรายการลงในเอกสารเอกสารทั้งหมด (และอนุกรมเวลา) จะถูกลบโดยไม่จำเป็นและจัดสรรให้กับหน่วยความจำขนาดใหญ่กว่าเดิม
  • คำสั่งในเอกสารย่อยมีข้อ จำกัด เมื่อเปรียบเทียบกับคำสั่งในเอกสารทั่วไป
  • เอกสารที่มีโครงสร้างแบบเรียบมาก (เช่นเดียวกับเอกสารย่อยหนึ่งรายการสำหรับแต่ละวินาที) ไม่ใช่การแสดง
  • การลดแผนที่ในตัวใช้งานไม่ได้กับเอกสารย่อย

นอกจากนี้ยังทราบประทับเวลาที่ถูกสร้างขึ้นในการเริ่มต้น MongoDB มี objectid คุณสามารถใช้สิ่งนี้หากความแม่นยำอนุกรมเวลาน้อยกว่าหนึ่งวินาที

นี่คือตัวอย่างเอกสาร BSON จากไลบรารีการบันทึกเหตุการณ์ที่ใช้ 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
    }
}

ตั้งแต่บันทึกเหตุการณ์คล้ายกับซีรีส์ครั้งอาจจะมีมูลค่าการศึกษาส่วนที่เหลือของรหัส มีเวอร์ชันใน Java, C #, PHP และ Python

นี่เป็นอีกหนึ่งโครงการโอเพ่นซอร์สที่คล้ายกัน: Zarkov


[อัพเดต]ตามความเห็นของ @ RockScience ฉันได้เพิ่มการอ้างอิงเพิ่มเติม:


มันจะเป็นเอกสารจำนวนมากถ้าอนุกรมเวลาของฉันมีข้อมูลระหว่างวันเป็นเวลาหลายปี !!! มันไม่ใช่ปัญหาที่จะมีเอกสารจำนวนมากเหรอ? มาจากพื้นหลังของ sql ฉันเพิ่งพบว่าหน่วยความจำไม่ค่อยมีประสิทธิภาพ (เนื่องจากจะมีการซ้ำซ้อนมากสำหรับจุดข้อมูลทั้งหมดของอนุกรมเวลาเดียวกัน)
RockScience

@RockScience: MongoDB เช่นเดียวกับฐานข้อมูล NoSQL อื่น ๆ อีกมากมายการทำให้เป็นมาตรฐานและประสิทธิภาพของหน่วยความจำช่วยให้สิ่งอื่น ๆ เช่นความยืดหยุ่นความเร็วและการใช้งาน CPU ลดลง หากคุณต้องการประสิทธิภาพของหน่วยความจำ MongoDB อาจไม่ใช่โซลูชันที่เหมาะสมสำหรับคุณ MongoDB คัดลอกชื่อข้อความแบบเต็มของแต่ละฟิลด์ลงในเอกสารทุกฉบับเพื่อส่งเสียงดัง! อย่างไรก็ตามฉันได้อัปเดตคำตอบของฉันด้วยแหล่งข้อมูลเพิ่มเติมไม่กี่แห่งรวมถึงกรณีศึกษาเกี่ยวกับวิธีที่ MongoDB ใช้ในการจัดเก็บซีรี่ส์เวลาที่มีขนาดใหญ่มาก
Leftium

2

ฉันพบคำถามนี้ใน SO ( /programming/4814167/storing-time-series-data-relational-or-non ) ที่ซึ่ง OP ถามถึงวิธีการเก็บอนุกรมเวลา แม้ว่าคำถามของเขาจะขึ้นอยู่กับการใช้ฐานข้อมูล NoSQL หรือ RDBMS และคุณก็ดูเหมือนจะใช้ NoSQL db เป็นอย่างดี

นอกจากนี้ยังพบบทความนี้เกี่ยวกับ " ความต้องการฐานข้อมูลเฉพาะของข้อมูลอนุกรมเวลา " ที่อาจมีประโยชน์

หวังว่านี่จะช่วยได้


2

ใช่แน่นอนฐานข้อมูล NoSQL จะเหมาะกับการจัดเก็บข้อมูลชุดเวลามากกว่า RDBMS แบบดั้งเดิม

ใช่ MongoDB ได้รับการปรับให้เข้ากับกรณีการใช้งานนี้เป็นพิเศษ

- คุณควรจัดโครงสร้างฐานข้อมูลอย่างไร? One document = หนึ่งชุดข้อมูลการป้อนข้อมูล VS หลายชุดเวลา

คำตอบคือการจัดเก็บในเอกสารหนึ่งชุดหลายครั้ง การมีเอกสารน้อยลงจะช่วยให้ประสิทธิภาพการอ่านลดลง เคล็ดลับอย่างหนึ่งคือการเตรียมเอกสารของคุณด้วยค่าที่กำหนดไว้ล่วงหน้า นี้จะเพิ่มประสิทธิภาพการปรับปรุงเอกสารโดยหลีกเลี่ยงการบันทึก Padding

ต่อไปนี้เป็นตัวอย่างสคีมาเกี่ยวกับวิธีการจัดเก็บชุดเวลาหนึ่งชั่วโมงด้วยช่วงเวลานาทีที่เหมาะสม:

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

คุณเริ่มต้นด้วยค่า 0 จากนั้นการปรับปรุงจะได้รับการปรับให้เหมาะสม การอ่านจะได้รับการปรับให้เหมาะสมเพราะอ่านเอกสารหนึ่งฉบับแทนที่จะเป็น 60 ถ้าคุณต้องการจัดเก็บข้อมูลมูลค่าวันหรือหนึ่งเดือนที่คุณใช้เทคนิคเดียวกันคุณจะได้แนวคิด

นี่คือลิงก์ไปยังบทช่วยสอนที่อธิบายถึงวิธีการจัดการอนุกรมเวลาใน MongoDb จากบล็อก MongoDb อย่างเป็นทางการ: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- MongoDB


1
การเก็บข้อมูลในเอกสารจะดีขึ้นจากประสิทธิภาพและการใช้ทรัพยากร มีสถานการณ์จำลองสามอย่างที่กล่าวถึงในชุดข้อมูลเวลาที่อัปเดตสำหรับเอกสารทางปฏิบัติที่ดีที่สุดของ MongoDB mongodb.com/collateral/time-series-best-practices
Robert Walters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.