ป้ายกำกับ: Read Replica

Load BalanceLoad Balance

ในโลกของแอปพลิเคชันสมัยใหม่ที่ต้องรองรับปริมาณการเข้าถึง (Traffic) ที่เพิ่มขึ้นอย่างก้าวกระโดด การจัดการภาระงานของระบบฐานข้อมูลจึงเป็นความท้าทายทางสถาปัตยกรรมที่สำคัญที่สุด หัวข้อ Load Balancing ในบริบทของ PostgreSQL จึงไม่ได้หมายถึงเพียงแค่การกระจายคำขอผ่าน Load Balancer ภายนอกเท่านั้น แต่ยังรวมถึงการออกแบบกลไกภายในของระบบฐานข้อมูลเองด้วย

สำหรับ PostgreSQL ซึ่งเป็นระบบที่โดดเด่นด้านความยืดหยุ่นและประสิทธิภาพสูง การทำ Load Balancing ในระดับ Database Architect จึงต้องพิจารณาถึงการแยกภาระงานส่วนการอ่าน (Read) และส่วนการเขียน (Write) อย่างชัดเจน เพื่อให้มั่นใจว่าระบบจะสามารถขยายตัวได้อย่างสมบูรณ์และไม่มีจุดคอขวดใด ๆ เกิดขึ้น

หลักการพื้นฐาน: การแยกภาระงาน Read และ Write Scaling

โดยหลักการแล้ว ปริมาณงานในระบบฐานข้อมูลจะถูกแบ่งออกเป็นสองส่วนหลัก คือ Read Scaling (การขยายการอ่าน) และ Write Scaling (การขยายการเขียน) ซึ่งแต่ละส่วนมีกลไกทางสถาปัตยกรรมที่แตกต่างกันอย่างสิ้นเชิง

1. Read Scaling ด้วย Streaming Replication (หัวใจหลัก)

เมื่อแอปพลิเคชันมีการเรียกดูข้อมูล (SELECT Operations) มากกว่าการบันทึกข้อมูล (INSERT/UPDATE/DELETE) อย่างมาก ภาระงานส่วนใหญ่จะถูกจัดอยู่ในกลุ่ม Read Scaling แนวทางมาตรฐานที่สุดของ PostgreSQL คือการใช้ Streaming Replication

ในสถาปัตยกรรมนี้ ระบบจะกำหนดให้เซิร์ฟเวอร์หลัก (Primary Server) เป็นผู้รับ Write ทั้งหมด (Write Master) เพื่อรักษาความสอดคล้องของข้อมูล (Data Consistency) จากนั้นข้อมูลจะถูกส่งสำเนา (Stream) ไปยังเซิร์ฟเวอร์รอง (Secondary Servers หรือ Read Replicas) หลายตัว

แอปพลิเคชันสามารถกระจายคำขอประเภท SELECT ทั้งหมดไปยัง Read Replicas เหล่านี้ได้ ทำให้สามารถรองรับการอ่านจำนวนมหาศาลโดยไม่ส่งผลกระทบต่อประสิทธิภาพของ Primary Server ที่กำลังรับ Write อยู่

2. Write Scaling (แนวทางขั้นสูง)

การขยายการเขียน (Write Scaling) นั้นมีความซับซ้อนกว่ามาก เนื่องจากข้อมูลทั้งหมดต้องถูกเขียนที่แหล่งเดียวเพื่อป้องกันความขัดแย้ง (Conflict) โดยทั่วไปแล้ว หากต้องการขยาย Write Scaling จะต้องใช้เทคนิคที่เรียกว่า Sharding หรือการแบ่งฐานข้อมูลออกเป็นส่วนย่อย ๆ ตามคีย์บางอย่าง (เช่น แบ่งตามรหัสลูกค้า) ซึ่งต้องใช้การจัดการแอปพลิเคชันที่ซับซ้อนกว่าการทำ Replication ทั่วไป

ตัวอย่างการใช้งานในสถาปัตยกรรม (Conceptual Setup)

สมมติว่าเรามี Primary Server และ Replica หลายตัว การเชื่อมต่อจากแอปพลิเคชันควรถูกจัดการโดย Connection Pooler หรือ Load Balancer ที่ฉลาดพอที่จะส่งคำสั่ง SELECT ไปยัง Replica เสมอ และส่งคำสั่ง DML (Write) ไปยัง Primary เท่านั้น

SQL

-- 1. การตั้งค่า Primary (Master)

SQL

SELECT pg_create_physical_replication_slot('read_slot');

SQL

-- 2. การเชื่อมต่อจากแอปพลิเคชัน (Conceptual Read Query)

SQL

-- คำสั่ง SELECT นี้ควรถูกส่งไปยัง Read Replica

SQL

SELECT * FROM users WHERE user_id = '123';

ในทางปฏิบัติจริง การจัดการ Load Balancing ระหว่าง Replica มักทำผ่านเครื่องมือภายนอก เช่น PgBouncer หรือ ProxySQL เพื่อให้แอปพลิเคชันไม่ต้องรู้ว่ากำลังเชื่อมต่อกับเซิร์ฟเวอร์ตัวใด

บทสรุป: การออกแบบระบบที่ยืดหยุ่น

การทำ Load Balancing ใน PostgreSQL คือการใช้ Streaming Replication เพื่อแยกภาระงาน Read ออกจาก Write อย่างมีประสิทธิภาพ การทำความเข้าใจหลักการ Read/Write Separation นี้จะช่วยให้สถาปนิกสามารถออกแบบระบบที่สามารถขยายตัวได้อย่างยืดหยุ่น รองรับการเติบโตของ Traffic ได้อย่างมหาศาล และลดโอกาสการเกิดจุดคอขวดได้อย่างแท้จริง