10 คะแนน โดย xguru 2021-11-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Heap ดำเนินการฐานข้อมูล Postgres สำหรับงานวิเคราะห์ขนาดหลายเพตะไบต์

  • เมื่อเติบโตอย่างรวดเร็ว อัตราการใช้งานโหนดเกิน 80% ทำให้เกิดปัญหาด้านประสิทธิภาพในไปป์ไลน์การเก็บข้อมูล

  • สาเหตุของปัญหาคือ SSD มักมีแนวโน้มที่ประสิทธิภาพจะลดลงเมื่อการใช้งานเข้าใกล้ 100%

  • การใช้ ZFS ซึ่งเป็น CoW (Copy-on-Write) ทำให้ปัญหารุนแรงขึ้น

→ ทุกครั้งที่มีการอัปเดตบล็อก จะต้องเขียนสำเนาใหม่

  • แน่นอนว่า CoW ก็มีข้อดีหลายอย่าง

→ การบีบอัดในระดับไฟล์ซิสเต็มทำได้สะดวกกว่าไฟล์ซิสเต็มอื่น จึงบีบอัดได้ 4-5x และประหยัดพื้นที่

→ มีความทนทานสูงกว่า จึงสามารถปิด full_page_writes ของ Postgres ได้ ส่งผลให้ประสิทธิภาพดีขึ้นและลด IO โดยรวม

→ มี Point-in-time snapshot ที่รับประกันความสอดคล้องได้ — เนื่องจากหน้าเพจไม่สามารถถูกเปลี่ยนแปลงย้อนหลังได้ จึงยังคงเก็บหน้าเดิมไว้ระหว่างการทำ snapshot

  • แต่ไฟล์ซิสเต็มแบบ CoW อย่าง ZFS จะมีประสิทธิภาพลดลงเมื่อพื้นที่ใกล้เต็ม

→ ทุกครั้งที่อัปเดตหน้าเพจ block allocator ต้องหาบล็อกว่างใหม่ จึงยิ่งช้าลงมากเมื่ออัตราการใช้งานสูง

→ ต้องลบบล็อกที่เคยถูก unlink ออก และจัดให้ปะปนกับบล็อกเดิม

→ ยิ่งแย่ลงเพราะตั้งขนาดบล็อกไว้ใหญ่ถึง 64kb เพื่อให้ได้อัตราการบีบอัดที่สูงขึ้น

→ ด้วยเหตุผลเหล่านี้ จึงควรรักษาการใช้งานของ ZFS ไว้ไม่ให้เกิน 80%

  • จึงลองอัปเกรดเป็น ZFS 2.x และเปลี่ยนจากการบีบอัดแบบ lz4 ไปเป็น Zstandard

→ lz4 เร็วมากและให้อัตราการบีบอัดราว ~4.4x

→ Zstandard ให้อัตราการบีบอัดได้ถึง ~5.5x จึงดีขึ้น 20%

→ แต่หลายเบนช์มาร์กบอกว่า Zstandard ช้ากว่า lz4

→ จึงตัดสินใจทดสอบอย่างเข้มงวดในสภาพแวดล้อมจริง

→ ผลการทดสอบพบว่าประสิทธิภาพของคิวรีไม่เปลี่ยนไป การใช้สตอเรจลดลง ~20% และเวลาคิวรีเขียนลดลงครึ่งหนึ่ง

  • DB cluster ของ Heap แบ่งเป็น 5 โหนด และแต่ละโหนดอยู่ใน ASG ของตัวเอง

→ การเปลี่ยนโหนดทำได้ง่าย เพียงแยกออกจาก ASG แล้ว ASG จะสร้างโหนดใหม่ จากนั้นรีสโตร์จากแบ็กอัปล่าสุดและเข้าสู่โหมด warm standby

→ สร้าง AMI ด้วยการตั้งค่าใหม่ แล้วค่อย ๆ ทำทีละโหนด

→ โดยรวมแล้วการใช้งานลดลง ~21% เวลาเขียนลดลง 50% และประสิทธิภาพคิวรีแทบไม่เปลี่ยน

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

 
xguru 2021-11-15

ในบทความไม่ได้พูดถึงการใช้ CPU แต่พอไปดูคอมเมนต์ของผู้เขียนต้นฉบับบน HN ก็เห็นว่ามันเพิ่มขึ้นจากประมาณ ~40% เป็น ~50% (หมายความว่า Zstd ใช้ CPU มากกว่า)