อ่านประมาณ 8 นาที
ระดับสูง
หมวด: คลาวด์
อ้างอิง: The Cloudflare Blog
เมื่อแก้ระเบียน DNS หรือเปิดฟีเจอร์ของโดเมน ทุกวินาทีที่รอให้ค่าใหม่มีผลคือช่วงที่เว็บอาจชี้ไปผิดที่ Cloudflare ลดเวลานี้ (ค่ามัธยฐาน) จากราว 7.7 วินาทีเหลือ 3.3 วินาที ลดช่วงช้าที่สุดจาก 14.6 นาทีเหลือ 1.2 นาที และลดหน่วยความจำของระบบลง 85% ด้วยหลักคิดเดียว คือสร้างใหม่เฉพาะส่วนที่เปลี่ยน แทนการสร้างข้อมูลทั้งโซนใหม่ทุกครั้ง บทความนี้สรุปว่าออกแบบอย่างไรให้เร็วขึ้นโดยข้อมูลไม่ผิด
ปัญหา: งานเล็กแต่ต้องสร้างใหม่ทั้งก้อน
ทุกการเปลี่ยนแปลง DNS ของลูกค้าจะไหลผ่าน Kafka (ระบบคิวข้อความ) ไปยังบริการชื่อ Zone Builder ที่แปลงข้อมูลเป็นคีย์แล้วเขียนลง Quicksilver ฐานข้อมูลแบบคีย์-ค่าที่กระจายไปทุกศูนย์ข้อมูล การแก้ระเบียนทีละรายการมีทางลัดอยู่แล้ว แต่การเปลี่ยนค่าระดับโซน เช่น เปิดใบรับรอง SSL อัตโนมัติ ยังต้องสร้างข้อมูลใหม่ทั้งโซน ปริมาณงานเพิ่มจากราว 250 เป็น 700 การเปลี่ยนแปลงต่อวินาทีตั้งแต่ปี 2022 และบางโซนมีระเบียนเกิน 20 ล้านรายการ การสร้างใหม่ทั้งโซนจึงทั้งช้าและกินหน่วยความจำมหาศาล
เส้นทางของการเปลี่ยนแปลง DNS จาก API และระบบตั้งค่า ผ่าน Kafka และ Zone Builder ไปยังฐานข้อมูล Quicksilver ที่กระจายทุกศูนย์ข้อมูล (ภาพจาก The Cloudflare Blog)
ทางแก้: แยกงานเป็น 5 แบบ แล้วเลือกแบบที่เล็กที่สุดที่ยังปลอดภัย
ระบบต้นทางส่งรายละเอียดมากับเหตุการณ์ด้วยว่าเปลี่ยนช่องไหน จากค่าอะไรเป็นค่าอะไร ตัววางแผนใช้ข้อมูลนี้เลือกขนาดงาน และมีกติกาสำคัญข้อเดียวคือ ถ้าไม่แน่ใจ ให้ทำงานมากขึ้น ไม่ใช่น้อยลง เหตุการณ์ที่ข้อมูลไม่ครบหรือไม่รู้จักจึงตกไปเป็นการสร้างใหม่ทั้งโซนเสมอ
5 แบบของการสร้างข้อมูลโซนใน Zone Builder ใหม่ แบบ สร้างใหม่อะไร ใช้เมื่อ เฉพาะชื่อ ระเบียนของชื่อที่เปลี่ยน แก้ระเบียนทั่วไป ชื่อ + ข้อมูลกลาง ชื่อที่เปลี่ยนและคีย์ข้อมูลกลางของโซน เปลี่ยน nameserver หรือ wildcard ยอดโซน + ข้อมูลกลาง ชื่อโดเมนหลักและข้อมูลกลาง เปลี่ยนค่าระดับโซน เช่น SSL อัตโนมัติ ลบออก ถอดโซนที่ไม่ควรเผยแพร่แล้ว ยกเลิกหรือย้ายโดเมน ทั้งโซน ทุกระเบียน โซนใหม่ หรือพิสูจน์ไม่ได้ว่างานเล็กกว่าปลอดภัย
ก่อนลงมือจริง ระบบอ่านสถานะล่าสุดจากฐานข้อมูลอีกรอบ ถ้าพบว่าสถานการณ์เปลี่ยนก็ยกระดับเป็นงานใหญ่ขึ้น เปลี่ยนเป็นการลบ หรือข้ามไป และปฏิเสธการอ่านจากฐานข้อมูลสำรองที่ข้อมูลยังตามไม่ทัน ส่วนงานในคิวของโซนเดียวกันจะถูกรวมเป็นงานเดียว โดยงานที่ใหญ่กว่าชนะเสมอ
ไม่ยอมให้ข้อมูลหาย แม้ต้องทำงานซ้ำ
งานแต่ละชิ้นเสร็จไม่เรียงลำดับได้ แต่ตำแหน่งที่ยืนยันกับ Kafka ว่าอ่านแล้ว (commit offset) จะขยับก็ต่อเมื่อทุกข้อความก่อนหน้าทำเสร็จ ถ้าระบบรีสตาร์ต ข้อความที่ยังไม่ยืนยันจะถูกทำซ้ำ ทีมเลือกยอมเสียแรงทำซ้ำ ดีกว่าเสี่ยงให้การเปลี่ยนแปลงของลูกค้าหายไปเงียบ ๆ
พิสูจน์ว่าผลเหมือนเดิมทุกไบต์ก่อนเปิดใช้
การทดสอบเทียบผลของการสร้างทั้งโซนกับแบบเฉพาะส่วนจากข้อมูลชุดเดียวกันแบบไบต์ต่อไบต์ ระหว่างทยอยเปิดใช้ ระบบยังสร้างทั้งโซนคู่ขนานไว้เทียบ และตั้ง Zone Builder ชุดเงาที่อ่านข้อมูลจริงจาก production แต่เขียนไปที่ปลายทางที่ไม่ได้ให้บริการ เทียบตัวอย่าง 20% ของโซน ผลต่างอยู่ที่ 0.31% จาก 234,313 โซน และส่วนใหญ่เกิดจากจังหวะเวลา ไม่ใช่ข้อมูลผิด การเปิดใช้เริ่มจากโซนแบบฟรีก่อนแล้วค่อยไปโซนแบบเสียเงิน
ผลลัพธ์
ก่อนและหลังเปลี่ยนเป็น targeted zone builds (ข้อมูลจาก Cloudflare) ตัววัด ก่อน หลัง เวลารอค่ามีผล (ค่ามัธยฐาน) ราว 7.7 วินาที ราว 3.3 วินาที ช่วงช้าที่สุด (p99) 14.6 นาที 1.21 นาที หน่วยความจำเฉลี่ย 49 GiB 7 GiB หน่วยความจำสูงสุด 79 GiB 12 GiB งานที่ต้องสร้างทั้งโซน เกือบทุกงานระดับโซน 7.04% (อีก 92.95% ใช้งานแบบเล็ก)
หน่วยความจำรวมของ Zone Builder ลดจากช่วง 50 ถึง 79 GiB เหลือราว 7 GiB หลังเปลี่ยนมาใช้ targeted build (ภาพจาก The Cloudflare Blog)
บทเรียนที่ใช้กับระบบทั่วไปได้
ส่งรายละเอียดการเปลี่ยนแปลงไปกับเหตุการณ์ ปลายทางจะรู้ว่าต้องทำงานแค่ไหน แทนที่จะต้องเดาแล้วทำทั้งหมดถ้าไม่แน่ใจ ให้ถอยไปทำแบบเต็ม ความเร็วไม่คุ้มกับข้อมูลที่ผิดแยกการตัดสินว่าทำอะไรออกจากการตัดสินว่าทำเมื่อไร โค้ดแต่ละส่วนจะเข้าใจและทดสอบง่ายขึ้นพิสูจน์ด้วยระบบเงาที่ใช้ข้อมูลจริง ก่อนเปลี่ยนส่วนสำคัญ การทดสอบในห้องแล็บอย่างเดียวไม่พอเมื่องานเบาลงแล้ว ค่อยลดเวลารอที่เผื่อไว้ Cloudflare ลดบัฟเฟอร์ของคิวได้หลังงานแต่ละชิ้นถูกลง จึงได้ค่ามัธยฐานที่ดีขึ้นเท่าตัว
หลักคิดนี้ใช้ได้กับระบบของธุรกิจไทยหลายแบบ เช่น การสร้างดัชนีค้นหาสินค้าใหม่ การล้างแคชหน้าเว็บ หรือการสร้างรายงานจากฐานข้อมูล ที่มักสร้างใหม่ทั้งหมดทุกครั้งที่มีข้อมูลเปลี่ยนเล็กน้อย อ่านอีกตัวอย่างของการลดหน่วยความจำในระบบ DNS ได้ที่บทความเรื่องแคช DNS ทีมงาน Smart Cyber Tech ออกแบบระบบคลาวด์ที่อัปเดตเร็วและใช้ทรัพยากรคุ้มค่า ปรึกษาได้ที่ แบบฟอร์มติดต่อ
สรุปสาระสำคัญ ปัญหา: งานเล็กแต่ต้องสร้างใหม่ทั้งก้อน ทางแก้: แยกงานเป็น 5 แบบ แล้วเลือกแบบที่เล็กที่สุดที่ยังปลอดภัย ไม่ยอมให้ข้อมูลหาย แม้ต้องทำงานซ้ำ
แหล่งอ้างอิง เรียบเรียงจาก The Cloudflare Blog —
อ่านบทความต้นฉบับ ภาพปกและแผนภาพ: The Cloudflare Blog · ลิขสิทธิ์ภาพเป็นของเจ้าของต้นฉบับ ใช้ประกอบการรายงานพร้อมอ้างอิงแหล่งที่มา
มีคำถามเพิ่มเติมเกี่ยวกับบทความนี้? เขียนหาเราได้ที่
info@smart-cyber-tech.com
บริการที่เกี่ยวข้องจากทีมงาน Smart Cyber Tech
แบ่งปันบทความนี้:
LINE
Facebook
X
คัดลอกลิงก์
ปรึกษาทีมของเรา