Cloudflare รายงานถึงการอัพเกรดฐานข้อมูลสำคัญของบริษัท คือฐานข้อมูล DNS ที่ทางบริษัทเป็น Authoritive DNS ขนาดใหญ่ที่สุดในโลก คิดเป็น 14.3% (ที่สองคือ GoDaddy 10.3%) ฐานข้อมูลนี้เก็บ zone file ที่ระบุไอพีต่างๆ โดยเปิดให้ใช้งานผ่านทาง DNS Records API และซิงก์ออกไปยังฐานข้อมูล key-value ทั่วโลกเพื่อให้คนทั่วไปมาคิวรีอีกครั้ง
ฐานข้อมูลนี้เป็น PostgreSQL ที่ไม่ระบุเวอร์ชั่น เรียกว่า cfdb โดยก่อนหน้านี้บริการอื่นๆ ก็เคยอยู่บน PostgreSQL เหมือนกันแต่ย้ายออกไปแล้วก่อนหน้านี้ เหลือบริการ DNS ใช้งานเป็นหลักและมีตารางหลักเหลือเพียงสองตาราง คือ cf_rec
และ cf_archived_rec
แต่เพียงแค่สองตารางนี้ก็มีขนาด 1,700 ล้านแถว ขนาดบนดิสก์ 1.5TB และการใช้งานปกติ มีการเพิ่มข้อมูลวันละ 3-5 ล้านแถว, แก้ไข 1 ล้านแถว, และลบ 3-5 ล้านแถว
แผนการอัพเกรดมีเงื่อนไขสำคัญคือข้อมูลต้องไม่หายเลย และ downtime ต้องสั้นมากๆ ยอมรับได้เพียงไม่กี่วินาทีเท่านั้น โดยการอัพเกรดครั้งนี้จะทำให้ทีมงานสามารถใช้ฟีเจอร์ของ PostgreSQL รุ่นล่าสุดได้ (ไม่ระบุว่าเป็นเวอร์ชั่น 17 ที่เพิ่งออกมาหรือไม่) เรียกชื่อฐานข้อมูลใหม่นี้ว่า dnsdb เพราะเหลือแต่ DNS ที่ใช้งานแล้ว
ทีมงานลอง pgLogical เป็นตัวเลือกแรก แต่พบว่าไม่ตอบโจทย์เงื่อนไขหลายข้อ เช่น ต้องสามารถย้ายฐานข้อมูลกลับได้หากพบปัญหา, ต้องการทำ partition, ตารางอื่นๆ ใน cfdb เดิมต้องเข้าถึงข้อมูลใน dnsdb ได้ด้วย จึงอออกแบบแนวทางการย้ายฐานข้อมูลขึ้นมาใหม่ เพิ่มตารางพิเศษสำหรับติดตามกระบวนการย้ายฐานข้อมูลบน จากนั้นย้ายฐานข้อมูลเริ่มต้น โดยไม่ใช้ pg_dump
เพราะไม่ต้องการให้กระทบงานบน production แต่อาศัยการสั่ง COPY บล็อคละ 1 ล้านแถวแล้วส่งไปยังฐานข้อมูลใหม่เลยโดยตรง จากนั้นรันสคริปต์ส่งข้อมูลที่กำลังแก้ไขเพื่อซิงก์ไปยังฐานข้อมูลปลายทาง ทุกๆ 3 วินาที รันอยู่หลายสัปดาห์เพื่อให้แน่ใจว่าฐานข้อมูลปลายทางตามทันจริง
จังหวะสุดท้ายก่อนย้าย คือการสร้างตาราง cf_migration_manager
เปิดให้ DNS Records API มาตรวจสอบว่ากำลังจะย้ายหรือยัง หรือหากย้ายแล้วพร้อมสำหรับเขียนข้อมูลใหม่หรือไม่ หากยังไม่พร้อมฝั่ง API จะอม request รอไว้ก่อน จากนั้นทีมงานปรับโปรเซสซิงก์ให้รันทุกๆ 0.5 วินาที เมื่อพร้อมแล้วสั่งล็อกฐานข้อมูลให้ API หยุดเขียน ย้ายข้อมูลที่เหลือทั้งหมด และเปิดให้เขียนฐานข้อมูลที่ dnsdb กระบวนการทั้งหมดนี้ใช้เวลาไม่ถึง 2 วินาที หลังจากย้าย DNS Records API เกิด latency สูงขึ้นประมาณ 7 นาทีแล้วก็กลับไปเป็นปกติ
ที่มา - Cloudflare