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 ความคิดเห็น
ความเห็นจาก Hacker News
สรุปรวมคอมเมนต์จาก Hacker News
การถกเถียงที่น่าสนใจและการปรับปรุงเอกสาร
การทำความเข้าใจพฤติกรรมธุรกรรมของ Datomic
คุณค่าของรายงาน Datomic
ที่มาของชื่อ Jepsen
ช่วยในการเขียนโปรแกรม Clojure
การสร้าง datastore แบบ Datomic
โมเดลข้อมูลของ Datomic
การทำให้เอกสารของ Datomic ชัดเจนขึ้น
ข้อดีของการออกแบบแบบ single-thread
ลักษณะธุรกรรมของ Datomic