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

ภูมิหลัง

  • 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 ความคิดเห็น

 
GN⁺ 2024-09-26
ความคิดเห็นบน Hacker News
  • สนใจโมเดลที่ให้แต่ละแอปพลิเคชันเซิร์ฟเวอร์คัดลอกไฟล์ฐานข้อมูล SQLite แล้วสลับแทนที่เป็นระยะ

    • ใช้กับกฎของ web application firewall
    • อาจใช้กับการตั้งค่า feature flag ได้ด้วย
    • feature flag ใช้เวลาหลายวินาทีในการอัปเดตก็ยังยอมรับได้
  • เวลาแฝงการอ่าน/เขียนของ Redis แปรผันตามจำนวนคีย์ที่ถูกคิวรี

    • แอปแบบ monolith ที่ใช้ Postgres และ Redis ทำงานได้ดี
    • Redis เป็น single-threaded ดังนั้นความสามารถในการอ่านปริมาณมากอาจทำให้งานอื่นช้าลงได้
    • Redis เหมาะกับการอ่านและเขียนคีย์เดียว หรือชุดคีย์คงที่ขนาดเล็ก
    • น่าสนใจที่ SQLite ให้ประสิทธิภาพดีเมื่อเทียบกับ Redis instance แบบ local
  • ชุดข้อมูลดูเหมือนมี 1.2 ล้านรายการ แต่จริง ๆ แล้วไม่ได้ใหญ่

    • ที่อยู่ IPv4 มีขนาด 4.8MB และอาจเล็กลงได้อีกด้วยการบีบอัดแบบง่าย
    • ถ้า Ruby รองรับ mmap การใช้รายการ IP โดยตรงน่าจะดีกว่า
  • ใน internal hackathon ของ Neon มีการเขียนเซิร์ฟเวอร์ Node.js ที่แปลงโปรโตคอลของ Redis เป็นคิวรี Postgres

    • เป็นโปรเจกต์แฮ็กที่สนุกดี
  • ในงาน RailsWorld 2023 มีบรรยากาศเชิงลบต่อ Redis

    • มีสมมติฐานว่าจำเป็นต้องมี Redis server
    • มีประสบการณ์ใช้ Redis ไม่มาก จึงสงสัยว่าระบบนิเวศปัจจุบันกำลังต่อต้าน Redis หรือไม่
  • SQLite ดูเป็นกรณีใช้งานเฉพาะทางที่ฝั่งเซิร์ฟเวอร์ทำงานได้ดีโดยไม่ต้องมี replication

    • ทางเลือกอื่นอาจเป็น static file ที่โหลดเข้า memory
    • SQLite เป็นทางเลือกที่ดี
  • มีโปรเจกต์ชื่อ Redka ที่นำ Redis ไปทำงานบน SQLite

  • คำคมที่ดีที่สุด: "SQLite ไม่ได้แข่งขันกับฐานข้อมูลแบบ client/server แต่ SQLite แข่งขันกับ fopen()"

  • Redis เร็วกว่า RDBMS แบบดั้งเดิม แต่ต้องมีการดูแลจัดการ

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