การเตรียมตัวสำหรับการอัปเกรด Postgres
- การประเมินความเสี่ยง: จัดทำรายการความเสี่ยงที่อาจเกิดขึ้นระหว่างกระบวนการอัปเกรด และจัดลำดับตามความสำคัญ
- การหาแนวทางแก้ไขความเสี่ยง: พิจารณาวิธีแก้ไขที่สามารถกำจัดความเสี่ยงได้ทั้งหมด หรือกระจายผลกระทบออกไปตามช่วงเวลา
- อัปเดตรายการความเสี่ยง: หากพบความเสี่ยงใหม่ระหว่างดำเนินโครงการ ให้ปรับปรุงรายการอยู่เสมอ
เกี่ยวกับการมอนิเตอร์และเมตริก
- การมอนิเตอร์ระบบ: ใช้เครื่องมือที่รัดกุมเพื่อมอนิเตอร์สุขภาพของฐานข้อมูลและระบบ
- การติดตามเมตริกสำคัญ: มอนิเตอร์เมตริกหลัก เช่น transaction ID, การใช้ CPU, session ที่รออยู่, query latency, API response latency เป็นต้น
ตัวเลือกในการอัปเกรด Postgres
การอัปเกรดในระบบเดิม (ไม่เหมาะกับการอัปเกรดแบบ zero downtime)
- ข้อจำกัดของการอัปเกรดในระบบเดิม: หากรันบน AWS RDS จำเป็นต้องรีบูตฐานข้อมูล และใช้เวลาตามปริมาณข้อมูล
การอัปเกรดแบบอิงการทำสำเนา
- การเลือกอัปเกรดแบบอิงการทำสำเนา: ช่วยให้ทำขั้นตอน migration แบบค่อยเป็นค่อยไป ทดสอบฐานข้อมูลใหม่ด้วย workload และข้อมูลจริง และควบคุมการอัปเกรดได้มากขึ้น
- การตั้งค่าฐานข้อมูลต้นทางและปลายทาง: ตั้งค่า replication slot และตั้งค่า
wal_level เป็น logical
การเลือกวิธีทำสำเนาตาราง
การทำสำเนาตาราง "ขนาดเล็ก"
- การทำสำเนาตารางขนาดเล็ก: สามารถทำสำเนาได้ด้วยการเพิ่มอย่างง่ายและรีเฟรช subscription
ตารางขนาดใหญ่ที่มีแต่การเพิ่มข้อมูล
- การทำสำเนาตารางแบบ append-only: ตั้งค่าออปชัน
copy_data เป็น false เพื่อทำสำเนาเฉพาะการเปลี่ยนแปลงในอนาคต แล้วค่อย backfill ข้อมูลเก่าจาก backup
ตารางขนาดใหญ่ที่มีการอัปเดตจำนวนมาก
- การทำสำเนาตารางขนาดใหญ่ที่มีการอัปเดตมาก: ลดขนาดตาราง รัน
VACUUM และพิจารณาแบ่งพาร์ทิชันตาราง
การตรวจสอบสถานะการทำสำเนาตาราง
- การมอนิเตอร์สถานะการทำสำเนา: ตรวจสอบสถานะการทำสำเนาผ่านตารางระบบ
pg_subscription_rel และแนะนำให้ทำสำเนาทีละหนึ่งตาราง
การหยุดการทำสำเนา
- วิธีหยุดการทำสำเนา: หากจำเป็น สามารถหยุดการทำสำเนาตารางและย้อนกลับได้ด้วยการรีเฟรช subscription
ข้อควรระวังก่อนย้าย replication slot
- ปัญหาในการย้าย replication slot: LSN ของ replication slot มีความเฉพาะกับฐานข้อมูลต้นทาง จึงไม่สามารถคัดลอกไปยังฐานข้อมูลใหม่ได้โดยตรง
การปิดงาน migration
- การตรวจสอบความสอดคล้องของตาราง: ตรวจสอบว่าจำนวนแถวของตารางตรงกันระหว่างฐานข้อมูลทั้งสอง และหากจำเป็นให้ใช้การสุ่มตัวอย่างเพื่อตรวจสอบความตรงกันของข้อมูล
การเปลี่ยนแปลงในระดับแอปพลิเคชัน
- การเปลี่ยนการเชื่อมต่อฐานข้อมูล: เปลี่ยนให้แอปพลิเคชันเชื่อมต่อกับฐานข้อมูลใหม่ และวางกลยุทธ์การสลับทราฟฟิก
หมายเหตุเพิ่มเติมเกี่ยวกับ sequence
- การซิงก์ sequence: ค่า sequence จะไม่ถูกซิงก์ระหว่างกระบวนการทำสำเนา จึงต้องตั้งค่าด้วยตนเอง
เช็กลิสต์การตรวจสอบขั้นสุดท้าย
- การตรวจสอบขั้นสุดท้าย: ตรวจสอบความสอดคล้องของตาราง, สถานะ subscription, ความตรงกันของ schema, ขนาดฐานข้อมูล, การเพิ่ม replica, การสร้างดัชนีใหม่, การทดสอบประสิทธิภาพ, การประเมินความเสี่ยง และการซ้อมในสภาพแวดล้อม staging
การสลับใช้งานครั้งสุดท้าย
- การสลับใช้งานครั้งสุดท้าย: ทำการทำสำเนาตารางในช่วงเย็น ซ้อมหลายครั้งในสภาพแวดล้อม staging จากนั้นตรวจสอบรอบสุดท้ายและสลับ flag
ความเห็นของ GN⁺
- ความสำคัญ: Knock ดำเนินกระบวนการซับซ้อนในการอัปเกรดจาก Postgres 11.9 ไปเป็น 15.3 แบบ zero downtime ได้สำเร็จ นี่เป็นหมุดหมายสำคัญด้านการบริหารฐานข้อมูลและความพร้อมใช้งานของบริการ
- ความน่าสนใจ: แนวทางการอัปเกรดแบบอิงการทำสำเนาช่วยให้ผู้ดูแลฐานข้อมูลเปลี่ยนผ่านไปยังฐานข้อมูลใหม่ได้อย่างราบรื่น ซึ่งอาจดึงดูดความสนใจอย่างมากจากชุมชนเทคนิค
- ความสนุก: กระบวนการอัปเกรดของ Knock แสดงให้เห็นถึงแนวปฏิบัติที่ดีในการเอาชนะความท้าทายทางเทคนิคที่ซับซ้อน ผ่านการจัดการความเสี่ยงและการแก้ปัญหาอย่างเป็นระบบ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีวิธีที่ดีกว่าการคัดลอกตารางขนาดใหญ่อยู่
แนวทางที่นำเสนอที่นี่น่าสนใจและมีเอกสารดี แต่ไม่เห็นด้วยกับประโยคที่ว่า "ลูกค้าสมัยใหม่คาดหวังความพร้อมใช้งาน 100%"
ตอนนี้ AWS รองรับการทำ blue-green deployment แล้ว
ได้เขียนเครื่องมือที่ช่วยทำหลายปัญหาให้เป็นอัตโนมัติ
กำลังย้ายระบบที่ hava.io จาก AWS RDS PostgreSQL 11.13 ไปเป็น 15.5
มีข้อสงสัยต่อคำกล่าวที่ว่า downtime ใด ๆ ก็ยอมรับไม่ได้สำหรับบริการของ Knock
รู้สึกแปลกใจที่ไม่สามารถเริ่มต้น replication จาก backup ได้
ถามว่ามีใครสนใจเครื่องมือแบบ all-in-one ที่เพียงใส่ credentials ของฐานข้อมูลแล้วอัปเดต Postgres แบบ zero downtime ได้หรือไม่
ประเด็นเรื่องการใช้ sequence น่าสนใจ
พูดติดตลกว่า ปัญหาที่เกิดใน distributed system แก้ได้ด้วยการใส่ sleep(1000) อย่างเหมาะสม