Thailand Meetup: MongoDB Data Modeling Hands-on @SCK-Dojo

วันนี่้มีงานฟรี เลยไปฟังมา จัดที่ SCK Dojo ครับ ตอนไปผมหลง ลง MRT ผิดสถานี และตอนเดินมาเชื่อ Google Map เข้าผิดซอยด้วย 555 โดยสำหรับหัวข้อวันนี้จะประมาณนี้ครับ

MongoDB คือ อะไร

เป็น NoSQL แบบนึง โดยจะในรูปแบบ Document โดยที่ 1 Document อารมณ์ประมาณ 1 Record แต่มันทำได้ยึดหยุ่นกว่า เช่น ไม่ได้ Strick เรื่อง Field โดยที่ 1 Document จะใหญ่สุดๆได้ 16 MB ซึ่งจะจัดเก็บในรูปแบบ BSON (JSON ที่บีบอัดแล้ว)

  • Advantages
    - Cloud base NoSQL As A Service MongoDB Atlas Database
    - flexible document schema ไม่ต้องกังวลเหมือน RDBMS มันไม่ lock column ยัดลงไปได้เลย มี หรือไม่มี Schema ก็ได้ แต่ควรทำ schema validation จะได้ไม่มีปัญหาภายหลัง
    - ใน Database กำหนด Collection อะไรให้ก่อน ซึ่ง Collection = กลุ่ม Document มี Key/Index Limit 64 ตัว
    - support หลากหลายภาษา เข้าใจว่าเป็นพวก Library / Driver นะ
    - powerful querying ด้วยตัว MongoDB's Query Language (MQL)  + analytic
    - Easy to horizontal scale-out with sharding ต้องวาง Component ดีก่อน
    - Simple Install
  • Disadvantages- ง่าย เลยทำให้ผิด บ่อย อาจจะเอาแนวคิดของ RDBMS ตั้ง แต่จริงๆควรเอา Usage Pattern มาตั้งมากกว่า

MongoDB Version

  • Community
  • Enterprise
  • Atlas - PaaS เอา DB ไปฝาก ตอนนี้มีของเด่นๆ
    - พวก Search+ AI Atlas Search
    - Streaming Processing = kafka

ตัว Version ของ MongoDB มี Stable 5 6 7 8 / Rapid พวก .1 . 2 (มันของที่เอาไปใน Stable ถัดไป มาให่ลองก่อน)

MongoDB Deployment

  1. Standalone
  1. Replication (Replication Set) - เน้น HA
    - 1 ตัว Primary (Read/Write) ที่เหลือเป็น Secondary โดยจะ Sync ทุก 2 Sec ถ้า Primary หัวหน้าตุย Secondary ที่ Timestamp มากสุดจะขึ้นแทน
    - ตัวกลุ่มที่ Voter (กลุ่มที่จะสิทธิได้เป็น Primary ) ได้สุดสุง 7 ตัว
    - Replication Set ยัดได้มากสุด 9 / หัก Voter 7 แสดงว่าสามารถเปิด Read On Standby 2 ตัว แต่ข้อมูลจะช้ากว่า 2 Sec //เอาปรับสัดส่วนได้นะ 4 Voter 3 / ROS 1
    - จริงๆ Secondary ทุกตัว ไม่จำเป็นต้องไปดึงจาก primary ก็ได้ ถ้ากลัว primary ทำงานหนัก เอา P <-S0 <S1,S2,S3 มาดึงต่อไป แต่ S0 พังเละ
    - ถ้า Secondary ส่ง write > read node มันไม่ให้ //DB2 คือ HA หลุดเลย
    - Initial Secondary ถ้าตายไปแล้ว Data เยอะ Copy มาใส่น่าจะไวกว่า Sync , Speaker เคยลองแล้ว 1TB ใช้ 2 Week
  2. Sharding - แยกเก็บ ช่วยกันอ่าน parallel (Horizontal Scaling)
    - ถ้าข้อมูลเกิน 1 TB ควรแยกออกมา เพื่อให้ Backup เร็ว / Query เร็ว ลด Cost ด้วย ยิ่งใช้แรมเยอะ เครื่องมันแพง แบ่งเครื่อง node ออกมาเป็นกลุ่มย่อยๆ
    - ที่ยาก Shard Key ทำให้ ทุก Shard Balance ได้
    - Collection Shading - Table Partition ใน RDBMS

Tuning อาจจะดู Data แยก Collection ออกมาก่อน แล้วถ้าไม่ไหวค่อยมาท่า Sharding ก็ได้นะ

  1. Sharding + Replication Set แบ่งกลุ่มกันทำงาน และมี HA

Data Modeling

แนวคิดมันจะต่างกับ RDBMS มองตาม App usage (Read / Write Ratio) เน้นที่ใช้กัน 6 ตัว

  • Computed Pattern (เดิม Pre-Computed)
    - ทำอะไรบ้างอย่างก่อน Write / Update เช่น ทำ Sum / Average
    - ส่วนตัวทำที่ App หรือ แยก Batch อันนี้ทำที่ฝั่ง Client ของ Mongo แล้วส่งไป Save ถ้า document เป็น Order ติด Sum / Count
  • Inheritance Pattern
    - Polymorphism ของ OOP ข้อมูล มี Field ที่ต่างกันน้อย เหมือนกันเยอะ
    - ถ้าไปแยก Collection แล้วมา Join Cost มันจะเยอะ เลยเอามารวมกัน และหา Column ที่ Common เป็น Key
  • Extended Reference Pattern
    - เอา Field ที่นิยมใช้ มาแปะกับอีกที Collection ภาพแบบ denormalization นี้แหละ ลด Join
    - แต่เอามาแปะเยอะไม่ได้ 1 Document 16 MB หรือ ประมาณ 200 Fields
  • Schema Versioning Pattern
    - ใช้ตอน App ไม่อยากมี Downtime เพิ่ม Field schema_version เข้าไป ของเดิม ถ้าไม่เคยทำอาจจะ assume เป็น v1 จาก query
  • Subset Pattern
    - ให้ตัวอย่างมาก่อน แล้วถ้าอยากดูเต็มไป ไปเอาจากอีก Collection จะได้ลดขนาดของ Document
    - เช่น Collection Product จะมี Product ห้อย Review 10 อันแรก ถ้าจะเอา Review ทั้งหมดให้ไปดึงจาก Collection Review แทน
  • Bucket Pattern
    - compute + subset pattern เน้นทำให้ Idx Ram + Storage น้อย
    - ออกแบบมาทำพวก Time Series โดยเริ่มมีมาใน MongoDB 5.0 Time Series Collections — MongoDB Manual เพราะก่อนหน้านี้ลองไป Apply กันเองแล้วเจอปัญหากัน
    - ถ้าคาดการณ์แล้ว Data เยอะ ควรทำ Shard ไม่ให้ document Storage ใหญ่ไป

และมี Pattern อื่นๆด้วย สรุปตามภาพนี้ ซึ่งผมก็จิ๊กมากอีกที 55 อ่านเต็มๆที่นี่เลย Building with Patterns: A Summary | MongoDB

จิ๊กมาจาก https://www.facebook.com/photo?fbid=10161301532618588&set=a.59246048587

Tools

อื่นๆ

Blog ของท่านอื่นๆ

Resource

และก็พี่ Speaker มีเขียนหนังสือด้วยนะ Implementing CI/CD Using Azure Pipelines: Manage and automate the secure flexible deployment of applications using real-world use cases: Champeethong, Piti, Mardeni, Roberto //ส่วนเรารอของเดิมหมดก่อนไปสักเล่มก่อน ตอนนี้ดองเยอะ

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.