6 คะแนน โดย GN⁺ 2025-05-22 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • Litestream เป็นเครื่องมือสำหรับสำรองข้อมูลแอปพลิเคชันแบบฟูลสแต็กที่ใช้ SQLite ไปยัง object storage อย่างปลอดภัย และครั้งนี้มีการเปลี่ยนแปลงฟีเจอร์ครั้งใหญ่ที่สุด
  • มีการนำ รูปแบบไฟล์ LTX และเทคนิค compaction ที่มีประสิทธิภาพกว่าสถาปัตยกรรมเดิมมาใช้ ทำให้กู้คืนแบบ point-in-time ได้อย่างรวดเร็วและมีประสิทธิภาพ
  • ใช้วิธีใหม่ที่อาศัย conditional write เพื่อทำให้การใช้งาน leader singleton และฟีเจอร์ read replica เรียบง่ายขึ้น
  • เร็ว ๆ นี้จะมีเลเยอร์ read-replica แบบอิง VFS ให้ใช้งาน ซึ่งช่วยให้ขยายระบบได้ง่ายในสภาพแวดล้อมที่หลากหลาย
  • สถาปัตยกรรมที่ปรับปรุงครั้งใหญ่นี้ทำให้สามารถซิงก์ฐานข้อมูลจำนวนมากพร้อมกันได้ จึงมีความสามารถในการขยายระบบสูงขึ้น

แนะนำ Litestream และความสำคัญของมัน

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

พัฒนาการของ Litestream

  • Litestream ปรากฏขึ้นในปี 2020 เพื่อทำให้การใช้งาน SQLite ง่ายขึ้น
  • Litestream ทำงานเป็นโปรเซสแยกจากแอปพลิเคชัน SQLite และแทนที่ กระบวนการ WAL checkpointing โดยสตรีมการเปลี่ยนแปลงข้อมูลแบบเรียลไทม์ไปยัง object storage เช่น S3
  • แม้เซิร์ฟเวอร์จะสูญหาย ก็ยังสามารถกู้คืนฐานข้อมูลกลับสู่สถานะล่าสุดจาก object storage ได้อย่างมีประสิทธิภาพ
  • หลังจากนั้นมีการพัฒนาโปรเจ็กต์ LiteFS เพิ่มเติม เพื่อรองรับทั้ง read replica และการสลับไปยังโหนดหลักเมื่อเกิดเหตุขัดข้อง (Primary Failover) ทำให้สามารถใช้ SQLite ในรูปแบบการดีพลอยสมัยใหม่คล้าย Postgres ได้
  • ทั้ง LiteFS และ Litestream ต่างมีข้อดี แต่ Litestream ถูกใช้งานแพร่หลายมากกว่าเพราะติดตั้งและใช้งานง่ายกว่า

การกู้คืนแบบ Point-in-time ที่มีประสิทธิภาพ

  • การออกแบบเดิมของ Litestream จะบันทึกทุกการเปลี่ยนแปลงอย่างต่อเนื่องแล้วส่งไปยัง S3 แต่เมื่อข้อมูลมีการเปลี่ยนแปลงบ่อย การกู้คืนจะไม่มีประสิทธิภาพ
  • ใน LiteFS มีการนำแนวทางที่ รับรู้ระดับทรานแซกชัน มาใช้ พร้อมใช้รูปแบบไฟล์ LTX ที่บันทึกช่วงของเพจที่เปลี่ยนแปลงโดยจัดเรียงลำดับไว้
  • สามารถรวมไฟล์ LTX หลายไฟล์เข้าด้วยกัน (compaction) ได้ง่าย เพื่อคงไว้เฉพาะเวอร์ชันล่าสุด ส่งผลให้ความเร็วและประสิทธิภาพในการกู้คืนข้อมูลดีขึ้นอย่างมาก
  • โครงสร้างนี้มีลักษณะคล้าย LSM tree
  • Litestream รุ่นใหม่ก็นำไฟล์ LTX และแนวทาง compaction มาใช้เช่นกัน ทำให้รองรับการกู้คืนแบบ point-in-time ที่แม่นยำโดยไม่ต้องจัดเก็บข้อมูลซ้ำจำนวนมาก

CASAAS: Compare-and-Swap as a Service

  • Litestream ต้องสามารถทำงานได้แม้แอปพลิเคชัน SQLite จะไม่รับรู้ถึงระบบสำรองข้อมูล และถ้าโปรเซสตายจากความขัดข้องก็อาจทำให้เกิดการตกหล่นของการเปลี่ยนแปลงข้อมูลได้
  • เพื่อแก้ปัญหานี้ จึงมีการนำแนวคิดเรื่อง generation มาใช้ เพื่อระบุแต่ละเซสชันการสำรองข้อมูลและสตรีมล็อกของมันอย่างมีเอกลักษณ์
  • ใน LiteFS ใช้ Consul เพื่อรับประกัน single leader แต่เนื่องจากต้องพึ่งพา dependency ภายนอก Litestream จึงเลือกใช้ ความสามารถ conditional write ของ object storage อย่าง S3 เพื่อทำ single replication path (singleton) ได้อย่างเรียบง่าย
  • ด้วยเหตุนี้จึงทำงานได้อย่างเสถียรและไม่สับสนแม้อยู่ในสภาพแวดล้อมแบบ ephemeral node

ฟีเจอร์ read replica แบบน้ำหนักเบา

  • LiteFS ใช้ไฟล์ซิสเต็ม FUSE เพื่อให้รับรู้ระดับทรานแซกชัน แต่สิ่งนี้เพิ่มทั้งความซับซ้อนและภาระในการนำไปใช้
  • เพื่อลดข้อจำกัดนี้ จึงมีการออกแบบโมดูลขยาย LiteVFS ซึ่งเป็น SQLite Virtual Filesystem (VFS) ให้ทำงานได้ในสภาพแวดล้อมหลากหลายโดยไม่ต้องพึ่ง FUSE
  • ในอนาคต Litestream ก็มีแผนจะใช้เลเยอร์แบบอิง VFS เดียวกัน เพื่อมอบชั้น read-replica ที่ดึงและแคชเพจจาก object storage อย่าง S3 ได้โดยตรง
  • แม้จะไม่เร็วเท่า SQLite บนเครื่องโลคัล แต่คาดว่าจะให้ประสิทธิภาพที่น่าพอใจได้ในหลายกรณีการใช้งานผ่านกลยุทธ์ caching และ prefetching

โอเพนซอร์สและการนำไปใช้งาน

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

การเติบโตไปพร้อมกับ SQLite อย่างต่อเนื่อง

  • SQLite เป็นฐานข้อมูลที่แข็งแกร่งและยังคงสร้างกรณีการใช้งานใหม่ ๆ ได้อย่างต่อเนื่องท่ามกลางการเปลี่ยนแปลงของอุตสาหกรรม
  • ในช่วงหลังมานี้ แม้แต่ในด้านอย่าง เอเจนต์สร้างโค้ดที่อิง LLM ความสำคัญของการย้อนข้อมูลและแตกแขนงข้อมูลแบบเรียลไทม์ก็เพิ่มขึ้น ทำให้ฟีเจอร์การกู้คืนแบบ point-in-time ที่พัฒนาขึ้นของ Litestream อาจกลายเป็นพื้นฐานสำคัญ
  • ในอนาคต สถาปัตยกรรมที่ปรับปรุงใหม่นี้จะช่วยต่อยอดฟีเจอร์ขยายต่าง ๆ เช่น rollback, fork, และการรองรับเอเจนต์อัตโนมัติ
  • Litestream รุ่นใหม่นี้เหนือกว่าดีไซน์เดิม และเสริมทั้งความสามารถในการขยายระบบและความสะดวกในการใช้งาน

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

 
GN⁺ 2025-05-22
ความคิดเห็นบน Hacker News
  • มีคนแชร์ประสบการณ์ตามหาแหล่งเก็บโค้ด โดยบอกว่าเมื่อ 2 ปีก่อนการใช้ litestream และ litefs ยังมีจุดที่ไม่สะดวกอยู่ แต่ครั้งนี้รู้สึกว่าปัญหาส่วนใหญ่ถูกแก้ไปแล้ว ตอนนี้สามารถใช้ litestream กับฐานข้อมูลได้อย่างสบายใจมากขึ้น และกังวลเรื่องหลาย writer น้อยลง คาดหวังกับข้อดีของ read replica FUSE layer และมีการแนะนำวิธี lease arbitration ในพูลรีเควสต์ที่เกี่ยวข้องด้วย (ถ้ามี lease อยู่แล้ว โปรเซสใหม่จะ retry ทุก 1 วินาทีเพื่อรองรับ fast rolling restart) มองว่าเป็นแนวทางที่ใช้งานได้จริง

  • รู้สึกว่า Litestream ตัวใหม่มีทุกฟีเจอร์ที่ตัวเองเคยต้องการครบแล้ว ทำให้รู้สึกคาดหวังและตื่นเต้น

  • มองในแง่บวกว่าวิธีนี้ฉลาดมากและทำให้การดีพลอยง่ายขึ้น ในสถานการณ์ที่ต้องแบ็กอัป SQLite DB หลายพันตัว ก่อนหน้านี้เคยทำทางแก้เฉพาะหน้าด้วย fanotify และ Backup API ของ SQLite ถ้า wildcard replication รองรับไฟล์จำนวนมากได้ ก็อยากย้ายมาใช้ Litestream

  • เน้นว่าหลังเปลี่ยนมาใช้ LTX ถึงจะมีฐานข้อมูลหลายร้อยหรือหลายพันตัวในไดเรกทอรีเดียว ก็สามารถทำ replication ของ /data/*.db ได้ ซึ่งก่อนหน้านี้เป็นอุปสรรคสำคัญ ตอนนี้จึงมองในแง่ดีว่าในสภาพแวดล้อมแบบมัลติเทนเนนต์ จะสามารถทำ point-in-time recovery หรือให้ผู้ใช้ดาวน์โหลดและย้ายข้อมูลเป็นรายฐานข้อมูลได้

  • กล่าวขอบคุณ ben พร้อมแชร์ประสบการณ์ใช้งานจริงว่าใช้ litestream ในโปรดักชันมานานกว่าประมาณ 1 ปีสำหรับงานภายในที่ write-heavy (ขนาดราว 12GB หลังบีบอัด) และมีค่าใช้จ่ายต่อเดือนต่ำมาก (บน azure แค่หลักไม่กี่บาท) พร้อมบอกว่ารอคอยการเปลี่ยนแปลงใหม่ ๆ นี้

  • อยากให้ประสบการณ์นักพัฒนาบน Fly ที่ใช้ SQLite ถูกขัดเกลาให้ดีกว่านี้ โดยจุดที่ยังน่าเสียดายคือยังขาด UI และ CLI ของตัวเอง ทำให้การตั้งค่าฐานข้อมูลเริ่มต้นลงบน Fly Machine มีหลายขั้นตอนกว่าที่คิด fly console ก็ยังทำงานร่วมกับ SQLite ได้ไม่ดี และรันบนอีกเครื่องหนึ่งจึงเข้าไปยังวอลุ่มที่มีข้อมูลไม่ได้ สุดท้ายต้อง fly ssh console —pty เข้าเครื่องนั้นโดยตรง ซึ่งไม่สะดวก และเว็บแอปที่ใช้ SQLite ก็มักเป็นงานขนาดเล็ก จึงต้องดูแลให้ได้จำนวนมากพอถึงจะทำรายได้คุ้ม

    • ถามถึงแนวทางส่วนตัวในการเลือกใช้ Rails 8 คู่กับ SQLite ว่าช่วงนี้ชอบมันมากกว่า Postgres หรือไม่
  • มีคนเล่าว่ากำลังศึกษาดู Litestream อยู่พอดีแล้วมาเจอบทความนี้ในจังหวะเหมาะ ใช้ Sqlite บน VPS และกำลังพิจารณานำ Litestream มาใช้ จึงถามว่าระหว่างที่โปรเซส Litestream กำลังรันอยู่ จะสามารถกู้ฐานข้อมูลกลับไปยังเวลาหนึ่งที่ต้องการได้หรือไม่ โดยสงสัยเรื่องช่วงเวลาที่กู้คืนไม่ได้เพราะ auto-checkpointing จะกิน WAL ตอนที่โปรเซสล่ม (เช่น ถ้าโปรเซสหยุดตั้งแต่ 2:00~3:00 จะกู้กลับได้ที่ 1:55 หรือ 3:05 แต่ข้อมูลสำหรับช่วง 2:00~3:00 จะหายไปหรือไม่)

    • มีคำอธิบายว่า Litestream จะเก็บ WAL segment ตามช่วงเวลา และโดยปกติจะส่งการเปลี่ยนแปลงใน WAL ทุกวินาที ดังนั้นภายในระยะเวลาเก็บรักษาที่ตั้งไว้ จึงสามารถกู้คืนแบบ point-in-time ได้ละเอียดถึงระดับวินาที

    • มีคำถามต่อเรื่องการจัดการ DST (เวลาออมแสง) ว่าในยุโรปวันที่ 30 มีนาคมซึ่งเวลาจะกระโดดจาก 2:00 ไป 3:00 ระบบจะทำงานอย่างไร

  • มีคนแชร์ว่าเคยทำ sqlite vfs ชื่อ DonutDB ที่อิงกับ dynamodb มาก่อน และเมื่อ S3 เพิ่มความสามารถ CAS (Content Addressable Storage) ก็คิดจะรีเฟรช DonutDB ให้รองรับ S3 แต่คราวนี้ lightstream รองรับให้แล้ว จึงดีใจที่ไม่ต้องพัฒนาเอง และตั้งตารอจะลองใช้เครื่องมือใหม่นี้

    • มีคนขอเอกสารทางการหรืออ้างอิงเกี่ยวกับที่บอกว่า S3 เพิ่ม CAS (Content Addressable Storage) เพราะอยากยืนยันว่าหมายถึง CAS จริงหรือไม่
  • มีคำถามว่าปกติเวลาดีพลอยแอปจะเปิดเซิร์ฟเวอร์อินสแตนซ์ใหม่ รอให้ health check ผ่านแล้วค่อยสลับทราฟฟิกก่อนปิดเครื่องเก่า ซึ่งในช่วงสลับนี้เคยมีปัญหาข้อมูลการเปลี่ยนแปลงในฐานข้อมูลสูญหาย จึงสงสัยว่าการเปลี่ยนแปลงครั้งนี้แก้ปัญหานี้ได้หรือยัง

    • มีความเห็นว่าควรมองเซิร์ฟเวอร์ไม่ใช่เป็นแค่อินสแตนซ์เว็บชั่วคราว แต่เป็นฐานข้อมูลโปรดักชันด้วย เวลา deploy เว็บแอป python/sqlite จึงไม่เปลี่ยนทั้งเครื่อง แต่เลือกอัปเกรดเฉพาะแพ็กเกจแล้วรีสตาร์ต service ของ systemd ถ้าจะลด downtime ก็อาจพิจารณาวิธีสลับอย่าง SO_REUSEPORT ได้ ซึ่งระหว่างนั้นโปรเซสใหม่กับเก่าอาจใช้ฐานข้อมูลพร้อมกันได้ แต่ถ้ามีการเปลี่ยน schema ของ DB ก็หลีกเลี่ยง downtime บางช่วงไม่ได้ และมองว่านี่ก็อาจเป็นจริงกับฐานข้อมูลอื่นเช่นกัน

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

  • มีคำถามว่า หากจะใช้ litestream เพื่อทำ replication ให้ฐานข้อมูลจำนวนมากแยกตามผู้ใช้ (ซึ่งเป็น use case หลักในเอกสาร) จะมีวิธีเพิ่มฐานข้อมูลใหม่แบบไดนามิกตอน runtime หรือไม่ เพราะจากที่ดูตอนนี้ไฟล์คอนฟิกยังเป็นแบบ static และหา API สำหรับเปลี่ยนแบบเรียลไทม์ไม่เจอ

    • มีคำตอบว่าปัญหานี้สุดท้ายน่าจะถูกแก้ได้ การตรวจจับ SQLite ใหม่ทำได้ยากแต่ไม่ถึงกับเป็นไปไม่ได้ และก่อนหน้านั้นก็ยังสามารถใช้งานในรูปแบบไลบรารีได้ค่อนข้างง่าย