- Streaming Replication ของ PostgreSQL เป็นวิธีที่มีประสิทธิภาพในการคงสำเนาแบบจำลองที่เกือบเรียลไทม์ของ DB หลักไว้บนเซิร์ฟเวอร์สแตนด์บายตั้งแต่หนึ่งเครื่องขึ้นไป
- เซิร์ฟเวอร์หลักจะส่งเรกคอร์ด Write-Ahead Log (WAL) ไปยังเซิร์ฟเวอร์สแตนด์บายอย่างต่อเนื่องทันทีที่ถูกสร้างขึ้น เพื่อลดความหน่วงของกระบวนการจำลองให้เหลือน้อยที่สุด
- ออกแบบมาเพื่อเพิ่มความพร้อมใช้งานสูงและการขยายระบบ โดยสามารถย้ายคำสั่งอ่านไปยังเซิร์ฟเวอร์สแตนด์บายเพื่อลดภาระของเซิร์ฟเวอร์หลักได้
- รองรับทั้งโหมด synchronous และ asynchronous จึงปรับสมดุลระหว่างความสอดคล้องของข้อมูลกับประสิทธิภาพได้อย่างยืดหยุ่น
- ครอบคลุมกระบวนการที่เซิร์ฟเวอร์สแตนด์บายเชื่อมต่อกับเซิร์ฟเวอร์หลักเพื่อร้องขอการสตรีม WAL และนำเรกคอร์ดที่ได้รับไปใช้กับสำเนา DB ของตนเอง
- เมื่อเทียบกับการส่งล็อกแบบอิงไฟล์ จะให้การ failover ที่เร็วกว่าและลดความเสี่ยงของการสูญหายของข้อมูล จึงเหมาะกับสภาพแวดล้อมที่กระจายตัวทางภูมิศาสตร์
Streaming Replication ทำงานอย่างไร?
- ส่งข้อมูล WAL จากเซิร์ฟเวอร์หลักไปยังเซิร์ฟเวอร์สแตนด์บายอย่างต่อเนื่องแบบเรียลไทม์ ทำให้ DB บนสแตนด์บายใกล้เคียงกับเซิร์ฟเวอร์หลักแทบตลอดเวลา
- ทำให้สามารถใช้แบบจำลองเพื่อรับมือการ failover ของมาสเตอร์หรือรองรับงานอ่าน จึงช่วยให้ระบบขยายขนาดได้หลายเท่า
ไฟล์ตั้งค่า PostgreSQL และตำแหน่ง
- ไฟล์คอนฟิกของ PostgreSQL มีบทบาทสำคัญในการจัดการการตั้งค่าและการทำงานของเซิร์ฟเวอร์ฐานข้อมูล
postgresql.conf: ไฟล์ตั้งค่าหลักที่รวมการตั้งค่าเซิร์ฟเวอร์ส่วนใหญ่ไว้ ตำแหน่งอาจแตกต่างกันตามระบบปฏิบัติการ เช่น /etc/postgresql/<version>/main/postgresql.conf (Debian/Ubuntu) หรือ /var/lib/pgsql/<version>/data/postgresql.conf (Red Hat/CentOS)
pg_hba.conf: ควบคุมการยืนยันตัวตนของไคลเอนต์และกำหนดวิธีที่ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ โดยทั่วไปจะอยู่ในไดเรกทอรีเดียวกับ postgresql.conf
pg_ident.conf: ใช้สำหรับการแมปชื่อผู้ใช้ แต่ใช้งานไม่บ่อยนัก
recovery.conf: ใช้ตั้งค่าเซิร์ฟเวอร์สแตนด์บายใน PostgreSQL เวอร์ชันก่อน 12 แต่ในเวอร์ชันหลังจากนั้น เนื้อหาได้ย้ายไปอยู่ใน postgresql.conf และ postgresql.auto.conf
- ตำแหน่งที่แน่นอนอาจแตกต่างกันตามระบบปฏิบัติการ วิธีติดตั้ง และเวอร์ชันของ PostgreSQL
- สามารถใช้คำสั่ง SQL
SHOW config_file; เพื่อค้นหาตำแหน่งของไฟล์เหล่านี้จากภายในอินสแตนซ์ PostgreSQL ได้
ตัวอย่างและโครงสร้างของ WAL (Write Ahead Logs)
- สามารถดู WAL ได้ด้วยคำสั่ง
pg_waldump
- แต่ละบรรทัดแสดงเรกคอร์ด WAL ที่มีข้อมูลเกี่ยวกับการทำงานของ DB
- องค์ประกอบของแต่ละเรกคอร์ด:
- rmgr: ตัวจัดการทรัพยากร เช่น Heap, Btree, Transaction
- len: ความยาวของเรกคอร์ด
- tx: ID ของทรานแซกชัน
- lsn: หมายเลขลำดับของล็อก
- prev: LSN ก่อนหน้า
- desc: คำอธิบายการทำงาน
- ประเภทการทำงานที่มองเห็นได้:
- การทำงานแบบ INSERT (Heap และ Btree)
- การทำงานแบบ MULTI_INSERT (Heap2)
- การ COMMIT ทรานแซกชัน
- การทำงานกับไฟล์ (CREATE)
- Full Page Writes (FPW)
- เอาต์พุตของ WAL แสดงลำดับการไหลของทรานแซกชัน การแก้ไขข้อมูล และกิจกรรมของระบบอย่างละเอียด จึงมีประโยชน์ต่อการวิเคราะห์พฤติกรรมของ DB การแก้ปัญหา และการกู้คืนแบบ point-in-time
วิธีทำงานด้วย Docker
- ค่าตั้งสำคัญที่เกี่ยวข้องกับ Streaming Replication ใน
postgresql.conf:
- wal_level, max_wal_senders, max_replication_slots, hot_standby เป็นต้น
- สิ่งที่ต้องมีสำหรับตัวอย่าง Docker Compose:
init-master.sh: ตั้งค่า PostgreSQL master สำหรับการจำลอง สร้างผู้ใช้และสล็อตสำหรับ replication และอัปเดตค่าตั้งที่เกี่ยวข้องกับ WAL
init-replica.sh: เตรียม PostgreSQL replica ให้เชื่อมต่อกับ master และเริ่มการจำลอง รอจนกว่า master จะพร้อม จากนั้นทำ base backup และตั้งค่า replica
start-replica.sh: เริ่ม PostgreSQL replica ในคอนเทนเนอร์ Docker โดยรันสคริปต์ init-replica.sh ก่อนแล้วจึงเริ่ม PostgreSQL
docker-compose.yml: กำหนด service ของ master และ replica พร้อมตั้งค่า environment variables, volumes, commands ที่จำเป็น
- หลังให้สิทธิ์รันกับสคริปต์แล้ว ให้รัน
docker-compose up -d เพื่อเริ่ม master และ replica
- สามารถเชื่อมต่อกับ master แล้วตรวจสอบสถานะการจำลองได้ด้วย
pg_stat_replication
- สามารถเชื่อมต่อกับ replica แล้วตรวจสอบว่าอยู่ในโหมดกู้คืนหรือไม่ด้วย
pg_is_in_recovery()
ความเห็นของ GN⁺
- Streaming Replication สามารถยกระดับทั้งประสิทธิภาพและความทนทานของโครงสร้างพื้นฐานฐานข้อมูลได้อย่างมาก ไม่ว่าจะเพื่อรองรับสถานการณ์ failover หรือกระจายภาระการอ่านไปยัง replica วิธีนี้ช่วยให้ DB ขยายขนาดได้และคงประสิทธิภาพที่เสถียร
- การแสดงกระบวนการตั้งค่าทั้งหมดและเอาต์พุตที่เกิดขึ้นจริงเป็นสิ่งสำคัญ เพราะช่วยให้เห็นภาพรวมของส่วนประกอบที่เกี่ยวข้องจำนวนมาก และเข้าใจได้ดีขึ้นว่าเกิดอะไรขึ้น
- การเข้าใจวิธีทำงานของ Streaming Replication และตั้งค่าให้ถูกต้องเป็นเรื่องสำคัญมาก หวังว่าบทความนี้จะช่วยทำให้กระบวนการชัดเจนขึ้นและให้มุมมองต่อการทำงานของ replication
- ผลิตภัณฑ์หรือโครงการอื่นที่มีความสามารถคล้ายกัน ได้แก่ Replication ของ MySQL หรือ Data Guard ของ Oracle ซึ่งโซลูชันเหล่านี้ก็ทำงานโดยส่งการเปลี่ยนแปลงจาก master ไปยัง replica เช่นกัน แต่รายละเอียดการนำไปใช้อาจแตกต่างกัน
- เมื่อต้องใช้ Streaming Replication ควรพิจารณาแบนด์วิดท์และ latency ของเครือข่ายด้วย การส่งข้อมูลระหว่าง master กับ replica อาจใช้ทรัพยากรเครือข่ายค่อนข้างมาก ความสามารถในการขยายจำนวน replica ก็เป็นอีกประเด็นสำคัญ
- ควรประเมินข้อกำหนดด้านความสอดคล้องของข้อมูลด้วย การจำลองแบบ synchronous อาจกระทบประสิทธิภาพการเขียน แต่ให้ความสอดคล้องที่แข็งแกร่งกว่า ส่วน asynchronous ให้ประสิทธิภาพดีกว่า แต่มีโอกาสสูญหายของข้อมูลเล็กน้อย
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
มีความเห็นว่าบทความนี้ยอดเยี่ยม แต่ในมุมมองของนักพัฒนาแบบฟูลสแตกที่ต้องการดูแลฐานข้อมูลเอง รู้สึกว่ายังขาดกรณีการใช้งานจริง
cronแบบง่าย ๆ เพื่อเช็กสถานะมีการอ้างว่าโซลูชันที่ง่ายที่สุดสำหรับการทำ replication ของ PostgreSQL คือ Kubernetes operator
มองว่าหนึ่งในเหตุผลที่ใช้ Kubernetes และ Helm คือสามารถแก้ปัญหานี้ได้
แนะนำ StackGres สำหรับผู้ใช้ Kubernetes
สุดท้าย มีความเห็นเชิงสงสัยว่าบทความนี้ดูเหมือนถูกเขียนโดย AI