ภูมิหลัง
- Wafris เป็นบริษัทเว็บแอปพลิเคชันไฟร์วอลล์โอเพนซอร์สที่ให้บริการไคลเอนต์ Rails middleware
- ไคลเอนต์ v1 รุ่นแรกต้องใช้ที่เก็บข้อมูล Redis ในเครื่อง แต่ตอนนี้ได้เปิดตัวไคลเอนต์ v2 ที่ใช้ SQLite แล้ว
- บทความนี้กล่าวถึงกระบวนการตัดสินใจย้ายจาก Redis ไปเป็น SQLite ประเด็นด้านประสิทธิภาพ และการเปลี่ยนแปลงทางสถาปัตยกรรม
สรุป
- SQLite, Redis และ RDBMS แบบดั้งเดิม (Postgres/MySQL) ต่างก็มีข้อดีข้อเสียของตัวเอง
- ที่เก็บข้อมูลเหล่านี้ไม่สามารถใช้แทนกันได้ทั้งหมด และการพยายามทำเช่นนั้นอาจก่อให้เกิดปัญหา
- บทความนี้อธิบายกระบวนการรีอาร์คิเทกต์ไคลเอนต์ v1 ที่อิง Redis ไปเป็นไคลเอนต์ v2 ที่อิง SQLite
อะไรบีบให้ต้องเปลี่ยน?
- เป้าหมายของ Wafris คือทำให้นักพัฒนาปกป้องเว็บไซต์ได้อย่างง่ายดาย
- ไคลเอนต์ v1 ใช้ที่เก็บข้อมูล Redis แต่ผู้ใช้จำนวนมากประสบปัญหาในการดีพลอย Redis
- จึงเปลี่ยนไปใช้ SQLite เพื่อลดภาระที่ผู้ใช้ต้องกลายเป็นผู้ดูแล Redis
ความเร็วคืออะไร?
- Redis เร็วกว่า RDBMS แบบดั้งเดิม แต่ก็ยังมีองค์ประกอบที่ต้องดูแลอยู่มาก
- ในสภาพแวดล้อมคลาวด์ ความหน่วงเครือข่ายเป็นปัญหาใหญ่
- SQLite สามารถมอบประสิทธิภาพที่เร็วกว่าได้ด้วยการลดเวลา round-trip ของเครือข่าย
สมมติฐานแบบโมโนลิธิก
- แอปพลิเคชันแบบกระจายจำนวนมากก่อปัญหาเมื่อใช้ Redis
- จึงทบทวนสถาปัตยกรรมใหม่เพื่อลดความซับซ้อนของการใช้ Redis
การนำ SQLite มาใช้
- SQLite ช่วยลดคอขวดจาก network IO
- SQLite แข่งกับการเปิดไฟล์ (
fopen()) ไม่ได้แข่งกับฐานข้อมูลแบบไคลเอนต์/เซิร์ฟเวอร์
การทำเบนช์มาร์กระหว่าง SQLite กับ Redis
- SQLite เร็วกว่า Redis ราว 3 เท่าในบางกรณีการใช้งาน
- แม้ยังไม่รวมผลของความหน่วงเครือข่าย SQLite ก็ยังเร็วกว่า
สิ่งที่หายไปจากกราฟ
- ถึงแม้ประสิทธิภาพของ SQLite ในเบนช์มาร์กจะแย่กว่า แต่ในสภาพแวดล้อมจริงก็อาจเร็วกว่าเพราะความหน่วงเครือข่าย
- SQLite ขยายในแนวนอนได้ง่าย และลดภาระของผู้ใช้ในการติดตั้งและตั้งค่า
การสร้างสถาปัตยกรรมการซิงก์
- ใน v1 (Redis) เมื่อผู้ใช้อัปเดตกฎ ระบบจะอัปเดตไปยังที่เก็บข้อมูล Redis
- ใน v2 (SQLite) ไคลเอนต์จะตรวจสอบกฎที่อัปเดตเป็นระยะ และดาวน์โหลดฐานข้อมูล SQLite ใหม่
สถาปัตยกรรมแบบกระจายของ SQLite
- แก้ปัญหาคอขวดของฐานข้อมูลด้วยการซิงก์ SQLite DB ไปยังแต่ละคอมพิวต์อินสแตนซ์
บทสรุป
- สถาปัตยกรรม v2 ที่อิง SQLite ช่วยให้หลายเว็บไซต์ทนต่อการโจมตีและคงสถานะออนไลน์ไว้ได้
- ช่วยลดภาระของผู้ใช้ และมอบอินเทอร์เน็ตที่ปลอดภัยและมั่นคงยิ่งขึ้น
สรุปโดย GN⁺
- บทความนี้อธิบายกระบวนการย้ายจาก Redis ไปเป็น SQLite และเหตุผลเบื้องหลัง
- SQLite ลดความหน่วงเครือข่าย จึงช่วยเพิ่มประสิทธิภาพ และลดภาระของผู้ใช้ในการติดตั้งและตั้งค่า
- สถาปัตยกรรมแบบกระจายของ SQLite ช่วยแก้ปัญหาคอขวดของฐานข้อมูล
- บทความนี้มอบมุมมองเชิงลึกเกี่ยวกับวิธีทำให้เว็บแอปพลิเคชันไฟร์วอลล์ดีพลอยง่ายและทำงานได้รวดเร็ว
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สนใจโมเดลที่ให้แต่ละแอปพลิเคชันเซิร์ฟเวอร์คัดลอกไฟล์ฐานข้อมูล SQLite แล้วสลับแทนที่เป็นระยะ
เวลาแฝงการอ่าน/เขียนของ Redis แปรผันตามจำนวนคีย์ที่ถูกคิวรี
ชุดข้อมูลดูเหมือนมี 1.2 ล้านรายการ แต่จริง ๆ แล้วไม่ได้ใหญ่
ใน internal hackathon ของ Neon มีการเขียนเซิร์ฟเวอร์ Node.js ที่แปลงโปรโตคอลของ Redis เป็นคิวรี Postgres
ในงาน RailsWorld 2023 มีบรรยากาศเชิงลบต่อ Redis
SQLite ดูเป็นกรณีใช้งานเฉพาะทางที่ฝั่งเซิร์ฟเวอร์ทำงานได้ดีโดยไม่ต้องมี replication
มีโปรเจกต์ชื่อ Redka ที่นำ Redis ไปทำงานบน SQLite
คำคมที่ดีที่สุด: "SQLite ไม่ได้แข่งขันกับฐานข้อมูลแบบ client/server แต่ SQLite แข่งขันกับ fopen()"
Redis เร็วกว่า RDBMS แบบดั้งเดิม แต่ต้องมีการดูแลจัดการ
การทำ benchmark เป็นศาสตร์มืดของการหลอกตัวเองด้วยตัวเลขที่แม่นยำมาก