การสร้างเว็บเซอร์วิสที่มีความพร้อมใช้งานสูงโดยไม่ใช้ฐานข้อมูล
การสำรวจ
- สำหรับสตาร์ตอัปใหม่ โดยทั่วไปมักเลือกเว็บเฟรมเวิร์กอย่าง Rails, Django, Node และฐานข้อมูลอย่าง MySQL, PostgreSQL, MongoDB
- แต่ถ้าสามารถรวมเว็บเซอร์วิสและอินสแตนซ์ฐานข้อมูลให้เป็นหนึ่งเดียวได้ล่ะ? สามารถใช้แนวทางที่เก็บข้อมูลทั้งหมดไว้ใน RAM
- เมื่อใช้ RAM เป็นฐานข้อมูล ก็ไม่จำเป็นต้องซีเรียลไลซ์ข้อมูลด้วย SQL query
- ดัชนีสามารถทำได้ด้วย hash table ในหน่วยความจำ
- งานเบื้องหลังสามารถประมวลผลเป็น thread ภายในโปรเซสขนาดใหญ่ได้
- หากโปรเซสล่ม สามารถกู้คืนได้โดยถ่าย snapshot ของ RAM เป็นระยะและบันทึกการเปลี่ยนแปลงลงดิสก์
การขยาย
- เมื่อลูกค้าต้องการความพร้อมใช้งานสูง สามารถทำสำเนาเซิร์ฟเวอร์ด้วยอัลกอริทึมฉันทามติ Raft
- หากเซิร์ฟเวอร์ผู้นำล่ม จะมีการเลือกผู้นำใหม่ขึ้นมารับคำขอแทน
- ด้วยวิธีนี้จึงทำ rolling deployment ได้โดยไม่ต้องรีสตาร์ตเซิร์ฟเวอร์
การแยกออก
- เมื่อมีลูกค้ารายใหญ่จำนวนมากขึ้น สามารถแบ่งเว็บเซอร์วิสด้วย sharding เพื่อรองรับการทำงาน
- ให้คลัสเตอร์เฉพาะสำหรับลูกค้าองค์กรแต่ละราย
- คอขวดหลักอาจเป็นประสิทธิภาพของ commit thread
สแตกของเรา
- ใช้ Common Lisp: รองรับมัลติเธรดได้ดีมาก และเหมาะกับการทำ hot reloading ของโค้ด
- ใช้ bknr.datastore และ bknr.cluster: ใช้ไลบรารี Braft ของ Baidu สำหรับการติดตั้งใช้งาน Raft
- ใช้ EFS สำหรับจัดเก็บไฟล์ภาพ: จัดการข้อผิดพลาดและทดสอบได้ง่ายกว่า S3
สรุป
- สถาปัตยกรรมนี้เหมาะกับสตาร์ตอัปใหม่ และเมื่อใช้ Common Lisp ก็มีเครื่องมือจำนวนมากพร้อมใช้งานอยู่แล้ว
- ขอขอบคุณผู้มีส่วนร่วมของ bknr.datastore, Braft และ Raft
สรุปโดย GN⁺
- บทความนี้นำเสนอสถาปัตยกรรมแบบใหม่สำหรับการสร้างเว็บเซอร์วิสที่มีความพร้อมใช้งานสูงโดยไม่ใช้ฐานข้อมูล
- ใช้ RAM เป็นฐานข้อมูล และรับประกันความพร้อมใช้งานสูงผ่านอัลกอริทึมฉันทามติ Raft
- ใช้ Common Lisp เพื่อรองรับมัลติเธรดและการทำ hot reloading ของโค้ด
- สถาปัตยกรรมนี้เหมาะกับสตาร์ตอัปใหม่ และช่วยให้พัฒนาและดีบักได้รวดเร็ว
- โปรเจ็กต์ที่มีความสามารถคล้ายกัน ได้แก่ Redis และ Memcached
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
การทำ transaction log เองแทนที่จะใช้ SQLite เป็นเรื่องแปลก
การสร้างฐานข้อมูล in-memory เองโดยไม่ใช้ MySQL, Postgres, Redis, MongoDB ฯลฯ เป็นเรื่องซับซ้อน
การไม่ยอมเรียนรู้พื้นฐานของ MySQL หรือ Postgres เป็นการเสียเวลา
เป็นสถาปัตยกรรมที่คล้ายกับ Nomad, Consul และ Vault ของ HashiCorp
มีความเข้าใจผิดว่า RAM ถูกมาก
เคยเห็นโปรเจ็กต์ที่ใช้ไดเรกทอรีของไฟล์ซิสเต็มเป็นตาราง และใช้ไฟล์ JSON เป็นแถวข้อมูล
การใช้ฐานข้อมูลเชิงสัมพันธ์มีความมั่นคงกว่ามาก
มีการทำชั้น consensus แบบ Raft เองเพื่อหลีกเลี่ยงความซับซ้อน
แอปเดสก์ท็อปและแอปมือถือสมัยใหม่มักใช้ฐานข้อมูลอย่าง SQLite
การสร้างฐานข้อมูล in-memory เองไม่ได้ง่ายกว่าการติดตั้ง Postgres หรือ SQLite