1 คะแนน โดย GN⁺ 2024-05-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

Datomic: ฐานข้อมูลระบบบันทึกข้อมูลแบบใช้งานทั่วไป

# ภูมิหลังของ Datomic

  • Datomic เป็นฐานข้อมูลแบบใช้งานทั่วไปสำหรับระบบบันทึกข้อมูล
  • สถานะของฐานข้อมูลแสดงด้วยทริปเปิล [entity, attribute, value] (EAV) ซึ่งเรียกว่า datom
  • ควบคุมชนิดและคาร์ดินาลิตีของแอตทริบิวต์ผ่าน สคีมา
  • เป็น ฐานข้อมูลเชิงเวลา ที่ จำลองเวลาอย่างชัดเจน
  • แต่ละทรานแซกชันระบุด้วย ตราประทับเวลาเชิงตรรกะ t และ เวลาแบบนาฬิกาจริง txInstant
  • ทรานแซกชันสามารถ เพิ่ม หรือ ลบ datom ได้
  • datom ทุกตัวคงการอ้างอิงถึงทรานแซกชันไว้
  • ฐานข้อมูลคือ ชุดของทูเพิลที่เพิ่มขึ้นอย่างต่อเนื่อง เหล่านี้

# ความสามารถของ Datomic

  • ผู้ใช้สามารถขอสถานะสแนปชอตของฐานข้อมูลตาม เวลาเชิงตรรกะหรือเวลาจริง ได้
  • สามารถดูประวัติทั้งหมดของฐานข้อมูลได้
  • สืบค้นได้ผ่าน API สไตล์ Datalog, API สำรวจกราฟแบบประกาศ, และ ชนิดข้อมูล Entity สไตล์ ODM
  • มีสองเวอร์ชันคือ Datomic Pro และ Datomic Cloud

# 1.1 สถาปัตยกรรม

  • Datomic Pro ประกอบด้วยบริการหลายตัวที่ทำงานร่วมกัน
  • Transactors ทำทรานแซกชันเขียน ดูแลดัชนี และเขียนข้อมูลลงสตอเรจ
  • Peers เป็นไคลเอนต์แบบหนา โดยมีไลบรารี JVM สำหรับส่งทรานแซกชัน รันคิวรี และแคชผลลัพธ์
  • Clients เป็นไคลเอนต์แบบบาง โดยส่งต่อทรานแซกชันและคิวรีไปยัง peer server
  • เพิ่มแต่ละทรานแซกชันลงใน log ตามลำดับเวลา
  • จัดเก็บเป็น ต้นไม้ถาวรและไม่เปลี่ยนแปลง ในดาต้าสโตร์อย่าง Cassandra หรือ DynamoDB
  • รับประกันลำดับทรานแซกชันแบบโกลบอลด้วยโอเปอเรชัน Sequential CaS
  • Peers เชื่อมต่อกับสตอเรจและ transactors โดยตรง

# 1.2 โมเดลทรานแซกชัน

  • Datomic มีโมเดลทรานแซกชันที่เป็นเอกลักษณ์
  • แยก เส้นทางการอ่าน และ เส้นทางการเขียน ออกจากกันอย่างเคร่งครัด
  • การอ่าน ได้สถานะที่ไม่เปลี่ยนแปลงของฐานข้อมูล
  • ทรานแซกชันเขียน แสดงเป็นลิสต์ของโอเปอเรชันที่มีลำดับ
  • ฟังก์ชันทรานแซกชันจะอ่านสถานะฐานข้อมูลและคืนค่าชุดโอเปอเรชันใหม่
  • ฟังก์ชันทรานแซกชันจะไม่คืนค่าให้ผู้เรียก
  • ทรานแซกชันคืนค่าเฉพาะผลกระทบเท่านั้น
  • NuBank ใช้ Datomic ในการให้บริการทางการเงิน

# 1.3 ความสอดคล้อง

  • โฆษณาว่าเป็น ทรานแซกชัน ACID พร้อมให้คำมั่นอย่างชัดเจนเรื่องโมเดลความสอดคล้องและการรับประกันความทนทาน
  • ทรานแซกชันถูกจัดเก็บเป็น การเขียนเชิงอะตอมเพียงครั้งเดียว
  • peer ทุกตัวมองเห็นทรานแซกชันที่เสร็จสมบูรณ์จนถึงจุดเวลาหนึ่ง
  • รับประกันทรานแซกชันแบบ Serializable
  • สามารถซิงก์เป็นสถานะล่าสุดได้ด้วยการเรียก d/sync
  • ออกแบบมาเป็น ระบบเขียนเดี่ยว แต่สามารถมี transactor หลายตัวทำงานพร้อมกันได้

# 2 การออกแบบการทดสอบ

  • ออกแบบชุดทดสอบ Datomic โดยใช้ ไลบรารีทดสอบ Jepsen
  • ติดตั้ง Datomic Pro 1.0.7075 บนคลัสเตอร์โหนด Debian Bookworm
  • โปรวิชันตาราง DynamoDB บน AWS
  • รันทดสอบบนโหนดหลายแบบ รวมถึง Transactors และ Peers
  • ดำเนินงานของชุดทดสอบผ่าน HTTP API
  • ฉีดความผิดพลาดหลายรูปแบบ รวมถึง network partition และ Garbage Collection
  • รีสตาร์ต transactors ด้วย บริการ systemd

# 2.1 การเพิ่มรายการในลิสต์

  • ออกแบบงานเพิ่มรายการในลิสต์โดยใช้ Elle transaction checker
  • แต่ละลิสต์ระบุด้วย คีย์หลัก
  • ทำทรานแซกชันที่มีทั้ง การอ่าน และ การเพิ่มข้อมูล
  • Datomic จัดเก็บแอตทริบิวต์หลายค่าเป็น เซตที่ไม่เรียงลำดับ
  • ใช้ ฟังก์ชันทรานแซกชัน เพื่อแสดงทรานแซกชันอ่าน-เขียน

# 2.2 การเพิ่มรายการในลิสต์ด้วย CaS

  • ใช้ฟังก์ชัน db/cas เพื่อควบคุมการอัปเดตแอตทริบิวต์พร้อมกัน
  • ใช้แพตเทิร์น CaS เพื่อรับประกัน snapshot isolation
  • เข้ารหัสแต่ละลิสต์เป็น สตริงค่าเดียวคั่นด้วยจุลภาค

# 2.3 ความสอดคล้องภายใน

  • ออกแบบงานเพื่อวัด ความสอดคล้องภายใน
  • รวมทรานแซกชันที่เปลี่ยน ค่าแอตทริบิวต์ หลายครั้ง หรือ เพิ่มและลบข้อเท็จจริง
  • ทำ โอเปอเรชัน CaS หลายครั้ง

# 2.4 การอนุมัติ

  • ออกแบบ state machine เพื่อจำลอง การอนุมัติ และ การปฏิเสธ
  • ฟังก์ชัน อนุมัติ และ ปฏิเสธ จะตรวจสอบสถานะแต่ละแบบ และยกเลิกทรานแซกชัน

# 3 ผลลัพธ์

  • ไม่พบพฤติกรรมที่ขัดต่อคำกล่าวอ้างด้านความปลอดภัยหลักของ Datomic
  • ทรานแซกชันดูเสมือนถูกดำเนินการตามลำดับรวม
  • ทรานแซกชันอ่านที่ใช้ (d/sync conn) สอดคล้องกับลำดับเวลาแบบเรียลไทม์
  • ความสอดคล้องภายใน สอดคล้องกับเอกสารของ Datomic แต่ต่างจากพฤติกรรมของฐานข้อมูลทั่วไป

# 3.1 ความสอดคล้องภายใน

  • ฐานข้อมูลส่วนใหญ่ให้ความหมายแบบ serial execution ภายในทรานแซกชัน
  • Datomic ปฏิบัติต่อโอเปอเรชันทั้งหมดในทรานแซกชันเป็น การทำงานพร้อมกัน
  • ฟังก์ชันทรานแซกชัน สังเกตเห็นเฉพาะสถานะฐานข้อมูล ณ จุดเริ่มต้นของทรานแซกชัน
  • หากเกิดการชนกันกับ แอตทริบิวต์แบบคาร์ดินาลิตีเดี่ยว ทรานแซกชันจะถูกยกเลิก

# 3.2 virtual write skew

  • เนื่องจากฟังก์ชันทรานแซกชันทำงาน พร้อมกัน ฟังก์ชันที่ถูกต้องเมื่อแยกกันอาจให้ผลลัพธ์ผิดเมื่อทำงานร่วมกัน
  • หากเรียกฟังก์ชัน อนุมัติ และ ปฏิเสธ ในทรานแซกชันเดียวกัน การอนุมัติและการปฏิเสธอาจเกิดขึ้นพร้อมกันได้
  • สอดคล้องกับเอกสารของ Datomic แต่ผู้ใช้อาจรู้สึกแปลกใจ

# 3.3 ตัวระบุเงื่อนไขเอนทิตี

  • สามารถใช้ ตัวระบุเงื่อนไขเอนทิตี เพื่อรับประกันอินวาเรียนต์ของฐานข้อมูล
  • มีข้อจำกัดหลายแบบ รวมถึง ชนิด ความเป็นเอกลักษณ์ และตัวระบุเงื่อนไขตามกำหนดเอง
  • ตัวระบุเงื่อนไขเอนทิตี จะตรวจสอบสถานะทั้งหมดของฐานข้อมูลเพื่อตัดสินว่าจะอนุญาตทรานแซกชันหรือไม่
  • เพิ่มตัวระบุเงื่อนไขเอนทิตีให้กับฟังก์ชัน อนุมัติ และ ปฏิเสธ เพื่อรับประกันอินวาเรียนต์

ความเห็นของ GN⁺

  • Datomic เป็นฐานข้อมูลเชิงเวลาที่ช่วยให้ค้นหาสถานะในอดีตของข้อมูลได้ง่าย จึงมีประโยชน์มากกับระบบบันทึกข้อมูลอย่าง บริการทางการเงิน
  • โมเดลการทำงานพร้อมกันของ ฟังก์ชันทรานแซกชัน ช่วยเพิ่มประสิทธิภาพ แต่ผู้ใช้อาจไม่คุ้นเคย
  • สามารถใช้ ตัวระบุเงื่อนไขเอนทิตี เพื่อทำข้อจำกัดด้านความถูกต้องสมบูรณ์ของข้อมูลที่ซับซ้อนได้ง่าย
  • มีการใช้งานในบริการการเงินขนาดใหญ่อย่าง NuBank จึงพิสูจน์แล้วทั้งด้าน เสถียรภาพและความสามารถในการขยายระบบ
  • โมเดลทรานแซกชันที่เป็นเอกลักษณ์ของ Datomic ต้องการวิธีคิดที่ต่างจากฐานข้อมูลแบบเดิม จึงอาจมี เส้นโค้งการเรียนรู้

1 ความคิดเห็น

 
GN⁺ 2024-05-17
ความเห็นจาก Hacker News

สรุปรวมคอมเมนต์จาก Hacker News

  • การถกเถียงที่น่าสนใจและการปรับปรุงเอกสาร

    • การพูดคุยระหว่างกระบวนการทดสอบน่าสนใจมาก และก็น่าแปลกใจที่ Jepsen ไม่พบบั๊กระดับร้ายแรง การทำให้เอกสารและพฤติกรรมผิดปกติที่ตั้งใจไว้ชัดเจนขึ้นเป็นผลลัพธ์ที่มีประโยชน์ และเป็นแบบฝึกหัดที่ช่วยเพิ่มความมั่นใจให้กับการดำเนินงานของธนาคารที่ใช้ Datomic
  • การทำความเข้าใจพฤติกรรมธุรกรรมของ Datomic

    • นี่เป็นครั้งแรกที่ได้อ่านรายงาน Jepsen แบบลงลึก และชอบคำอธิบายที่ชัดเจนเกี่ยวกับพฤติกรรมธุรกรรมของ Datomic ทำให้ตระหนักว่าตัวเองยังไม่เข้าใจความแตกต่างจากฐานข้อมูล SQL ดีพอ โครงสร้างธุรกรรมของ Datomic และการเปลี่ยนชื่อองค์ประกอบต่าง ๆ ดูสะดุดตา
  • คุณค่าของรายงาน Datomic

    • เป็นรายงานที่ละเอียดมาก และเป็นการวิเคราะห์ฐานข้อมูลที่ยอดเยี่ยมสำหรับฐานข้อมูลที่ดี ดีใจที่เอกสารชัดเจนขึ้นและได้รับการอัปเดตด้วย และยังคิดด้วยว่าอยากให้ Apple ว่าจ้างการวิเคราะห์ Jepsen สำหรับ FoundationDB
  • ที่มาของชื่อ Jepsen

    • ชื่อ Jepsen มาจากนักร้อง Carly Rae Jepsen และคิดว่าเป็นชื่อที่เหมาะสมอย่างยิ่งสำหรับงานวิจัยระบบกระจาย
  • ช่วยในการเขียนโปรแกรม Clojure

    • เป็นงานที่ยอดเยี่ยมเสมอ ชอบอ่านเพื่อเรียนรู้เกี่ยวกับระบบประเภทนี้ และเก็บเกร็ดเล็ก ๆ น้อย ๆ ที่ช่วยในการเขียนโปรแกรม Clojure
  • การสร้าง datastore แบบ Datomic

    • ช่วงนี้กำลังสร้าง datastore แบบ Datomic อยู่ จึงคิดว่ารายงานนี้น่าจะมีประโยชน์ นอกจากนี้ยังชอบบทวิเคราะห์ MongoDB และแนะนำให้ลองดูบทวิเคราะห์ของ Redis, RethinkDB และตัวอื่น ๆ ด้วย
  • โมเดลข้อมูลของ Datomic

    • โมเดลข้อมูลของ Datomic เข้าใจได้ไม่ยากหากคุ้นเคยกับ triple store/RDF แต่กลับไม่ค่อยถูกพูดถึงบ่อยนักในเอกสารหรือการสนทนาออนไลน์ เลยสงสัยว่าเป็นเพราะผู้คนไม่คุ้นกับแนวคิดเหล่านี้ หรือเพราะความเชื่อมโยงกับ semantic web อาจทำให้สับสน
  • การทำให้เอกสารของ Datomic ชัดเจนขึ้น

    • Jepsen ช่วยทำให้สถานการณ์ที่มีการละเมิด immutability ชัดเจนขึ้น แต่ดูเหมือนว่าแนวทางของ Datomic จะเน้นไปที่การทำเอกสารให้ชัดเจนขึ้น และทีม Datomic ก็ดูเหมือนจะมองการละเมิดเหล่านี้ว่าเป็นความผิดพลาดของผู้ใช้
  • ข้อดีของการออกแบบแบบ single-thread

    • การตัดสินใจออกแบบให้จัดการงานเขียนด้วย single-thread นั้นได้ผลดี Datomic เป็นผลลัพธ์ของการออกแบบที่ยอดเยี่ยม และอยากกลับไปใช้อีกครั้ง
  • ลักษณะธุรกรรมของ Datomic

    • แม้จะไม่ได้ใช้ Datomic มากนัก แต่ก็ไม่แปลกใจกับการที่ธุรกรรมมีลักษณะเป็นการประมวลผลแบบ batch โดยพื้นฐาน ทำงานด้วย single-thread จึงมี race condition น้อย และแม้จะช้าโดยการออกแบบ แต่ก็ปลอดภัย