- ส่วนขยาย active-active replication สำหรับ PostgreSQL ที่ AWS สร้างและเปิดเผยเป็นโอเพนซอร์ส
- เมื่อต้องมีการเขียนและแก้ไขข้อมูลจากหลาย PostgreSQL อินสแตนซ์ แทนที่จะใช้โมเดล active-standby แบบเดิมที่ให้อินสแตนซ์หนึ่งรับการเปลี่ยนแปลงเพียงลำพัง ก็สามารถสร้างสถาปัตยกรรมที่รองรับ การเปลี่ยนแปลงพร้อมกันจากหลายอินสแตนซ์ และการจำลองแบบได้
- เหมาะกับสถานการณ์อย่าง การออกแบบฐานข้อมูลที่มีความพร้อมใช้งานสูง ข้ามหลายรีเจียน, การลด latency ของการเขียน, blue/green update ของแอปพลิเคชัน, และ การย้ายข้อมูลแบบสองทิศทาง
- ใช้ logical replication เพื่อรองรับการตรวจจับความขัดแย้ง, การแก้ไข write conflict และการแปลงฟอร์แมตของฐานข้อมูลเป้าหมาย เป็นต้น
แนวคิดของการจำลองแบบ Active-Active
- การจำลองแบบ (Replication) คือเทคโนโลยีสำหรับซิงก์การเปลี่ยนแปลงระหว่างฐานข้อมูล
- โครงสร้าง active-standby แบบเดิมของ PostgreSQL อนุญาตให้มีเพียงอินสแตนซ์เดียวที่รับการเปลี่ยนแปลงได้ ส่วนที่เหลือจะเป็นแบบอ่านอย่างเดียว จึงมีแหล่งข้อมูลหลักเพียงจุดเดียว
- pgactive มอบ topology การจำลองแบบแบบ active-active ทำให้หลายอินสแตนซ์สามารถเขียนข้อมูลได้พร้อมกัน
- วิธีนี้เหมาะกับสภาพแวดล้อมที่ต้องการหลายจุดสำหรับการเขียน เช่น การปรับใช้แบบ multi-region หรือการย้ายข้อมูลแบบสองทิศทาง
- ในโมเดล active-active จำเป็นต้องมีการจัดการเพิ่มเติมสำหรับความขัดแย้ง, ความล่าช้า และข้อจำกัดของบางฟีเจอร์
เทคโนโลยีหลัก: Logical Replication
- Logical Replication คือการส่งข้อมูลในรูปแบบที่ระบบภายนอกสามารถตีความได้
- ด้วย logical replication สามารถเพิ่มความสามารถเสริมต่าง ๆ บนฐานข้อมูลปลายทางได้ เช่น การตรวจจับความขัดแย้ง, การแก้ไข write conflict และการแปลงคิวรี
- PostgreSQL ได้เพิ่ม logical replication พื้นฐาน มาตั้งแต่เวอร์ชัน 10 ในปี 2017 แต่สำหรับ active-active replication ยังต้องมีความสามารถเพิ่มเติม
- ด้วยลักษณะการออกแบบของ PostgreSQL ฟังก์ชันเหล่านี้จึงสามารถพัฒนาและนำไปใช้ได้ในรูปแบบ ส่วนขยาย (extension)
- ชุมชนนักพัฒนาของ PostgreSQL เองก็กำลังทยอยเพิ่มความสามารถเหล่านี้เข้าสู่โปรเจกต์หลักเช่นกัน
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ตัวที่ออกมาตัวแรกและยังเป็นโอเพนซอร์สอยู่จนถึงตอนนี้คือ BDR1 (ลิงก์) และ pgactive ก็สร้างขึ้นบนพื้นฐานนี้
BDR2 เป็นการเขียน BDR1 ใหม่แบบปิดซอร์ส และสุดท้ายก็ถูกยกเลิกไป
จากนั้นมี pglogical v1 และ v2 (ทั้งคู่เป็นโอเพนซอร์ส, ลิงก์) ออกมา โดย v1 ถูกปรับแก้อย่างมากแล้วถูกรวมเข้าไปใน Postgres 10
อาศัยประสบการณ์จากฟีเจอร์ logical replication ของ Postgres 10 ทำให้ 2nd Quadrant เริ่มพัฒนา pglogical v2 และจากจุดนี้ pgEdge ก็ถือกำเนิดขึ้นมา
หลังจากนั้น 2nd Quadrant ก็สร้าง pglogical v3 และ BDR v3 แบบปิดซอร์ส แล้วรวมทั้งสองอย่างเป็น BDR v4
ต่อมาชื่อผลิตภัณฑ์ BDR ก็เปลี่ยนเป็น Postgres Distributed(PGD, ลิงก์)
และหลังจาก 2ndQuadrant ถูก EDB เข้าซื้อกิจการ EDB ก็ออก PGD v6
ถ้าเกิด conflict จะใช้วิธีให้ค่าที่ถูกเขียนล่าสุดตาม timestamp เป็นค่าที่มีผลสุดท้าย
ประวัติของ conflict ที่เกิดขึ้นจะถูกเก็บไว้ในตารางพิเศษชื่อ pgactive_conflict_history จึงสามารถตรวจสอบประวัติหรือแก้ไขด้วยตนเองได้
รายละเอียดเพิ่มเติมและเอกสารดูได้ที่นี่
ถ้าสามารถนำความสามารถนี้เข้าไปเป็นส่วนหนึ่งของ Postgres อย่างเป็นทางการได้ก็น่าสนใจดี
เช่น อยากใช้ฐานข้อมูลรองที่อ่านข้อมูลจาก production หรือ staging ได้ แต่แก้ไขได้เฉพาะในเครื่อง local และผลลัพธ์จะไม่ถูกส่งกลับขึ้นไปยัง upstream
ตอนนี้วิธีที่ใช้กันมากคือคอยรันสคริปต์เป็นระยะ ๆ (เช่น cron) เพื่อ dump หรือ query ข้อมูลมาสร้าง snapshot แล้วเก็บไว้ใน S3 จากนั้นก็ดึงมาลงเครื่องเพื่อ restore ข้อมูล
วิธีนี้ส่วนใหญ่ใช้ได้ผล แต่บางครั้งการสร้างดัชนีกินเวลานานเกินไป
เพราะมีประเด็นทางกฎหมายและจริยธรรมใหญ่พอสมควร บริษัทส่วนใหญ่จึงไม่แนะนำวิธีนี้
แบบนี้จะทำให้แก้ไขเฉพาะตารางในเครื่องได้โดยไม่กระทบ primary
แนะนำคำสั่ง
createdb --templateนึก merge strategy ที่ใช้ได้กับทุกสถานการณ์ไม่ออก
ไม่ได้ห้ามเขียนบน replica เพียงแต่ผลลัพธ์นั้นจะไม่กระจายไปที่อื่น
ทางที่ดีที่สุดคือออกแบบสถาปัตยกรรมไม่ให้ช่วงข้อมูลที่เขียนจากทุก active instance ซ้อนทับกัน
ในกรณีแบบนี้เครื่องมืออย่าง pgactive ก็พอใช้งานได้
ไม่เช่นนั้นก็ควรใช้ distributed database อย่าง Yugabyte ไปตั้งแต่แรก
ทุก master ยังอ่านทุก schema ได้ แต่ตอนเขียนจะเขียนเฉพาะส่วนที่ตัวเองรับผิดชอบ
สงสัยว่านอกจาก schema แล้ว จะใช้ partition หรือวิธีอื่นในการกระจายความรับผิดชอบได้หรือไม่
นึกไม่ออกว่าพวกเขาจะใช้ฟีเจอร์นี้ในผลิตภัณฑ์ของตัวเองตรงไหน
RDS ใช้ block replication ส่วน Aurora ใช้ SAN replication แบบเฉพาะของตัวเอง
เดาว่าอาจตั้งใจเอาไปใช้กับ DMS
เลยสงสัยว่าทำไมถึงต้องทำแบบนี้กับ relational database ที่เน้น ACID แบบเข้มแข็ง
แต่เพิ่งมีข่าวเมื่อ 1 เดือนก่อนว่าเปิดซอร์สและเผยแพร่สู่ชุมชนอย่างเป็นทางการ (ข่าวทางการ)
ถ้าอยากนอนหลับสบายตอนกลางคืนก็ควรหลีกเลี่ยงให้มากที่สุด
เห็นมีคนแนะนำชุด patroni+etcd+haproxy กันเยอะ และจากที่เห็นคนเคยใช้พูดถึงกันอย่างตื่นเต้นก็คงมีเหตุผลของมัน
แต่พอดูไฟล์ตัวอย่าง docker compose แล้วก็รู้สึกว่ามันหนักพอตัว
ส่วน pgpool ดูเหมือนแค่วางไว้หน้า postgres แต่ละตัวก็พอ เลยดูง่ายกว่า
เลยอยากรู้คำแนะนำหรือประสบการณ์จากคนที่ชอบใช้ Postgres ในงานจริง
เป้าหมายคือสร้างคลัสเตอร์บนพื้นฐาน docker compose ให้เรียบง่ายที่สุด แต่ยังได้ high availability, (อย่างน้อย) การไม่สูญเสียข้อมูล และ point-in-time recovery
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
โพสต์ใน Hacker News (โพสต์เมื่อเดือนตุลาคม 2023, 1 ความคิดเห็น)
กล่าวคือแต่ละคนต้องยอมรับข้อดีข้อเสียตามสถานการณ์ของตัวเอง