ทำซ้ำบางตารางจากฐานข้อมูลหนึ่งไปยังอีก postgres


9

ฉันมีสถานการณ์ต่อไปนี้: ฉันมีเครื่องสามเครื่องที่ใช้ฐานข้อมูล postgresql เครื่องหนึ่งเก็บข้อมูลบัญชีลูกค้า (เรียกเครื่องนี้ C) อีกสองเครื่องเก็บข้อมูลบันทึกลูกค้า (เรียก L1 และ L2 เหล่านี้) สาเหตุของการแยกคือการแยกโหลดผ่านเครื่องหลายเครื่อง (ดังนั้นลูกค้าบางรายส่งข้อมูลการบันทึกไปที่ L1, บางเครื่องไปที่ L2 ... และอาจใช้เวลาสักครู่ L3, L4, ... )

เมื่อดึงข้อมูลการบันทึกในหลักการฉันต้องการที่จะสามารถเข้าร่วมระหว่างการเข้าสู่ระบบตารางใน Ln และตารางบัญชีลูกค้าใน C. ในความเป็นจริงฉันไม่สามารถเข้าร่วมแบบนี้ (และแม้ว่าฉันจะทำได้ฉันต้องการ เพื่อหลีกเลี่ยงการโหลด C)

ความคิดของฉันคือการทำซ้ำตารางบน C ไปยังแต่ละ L1, L2, ... เพื่อให้ฉันสามารถรวม เท่าที่ตารางจาก C เกี่ยวข้อง C คือ master และ L1, L2, ... เป็นทาส แต่สำหรับตารางอื่น ๆ ใน L1, L2, ... เครื่องเหล่านี้เป็นผู้เชี่ยวชาญ มันไม่ได้เป็นการจำลองแบบต้นแบบที่แท้จริงและมันไม่ได้เป็นทาสต้นแบบ

สามารถ postgres (ฉันใช้ 9.1) การจำลองแบบสามารถชักชวนให้ทำเช่นนี้หรือถ้าไม่มีแพ็คเกจอื่นที่จะทำงาน ในทางเลือกสุดท้ายฉันสามารถเขียนโค้ดที่ซิงค์เป็นระยะ ๆ ของตาราง (ฉันสามารถทนต่อความล่าช้า) แต่มันจะดีไม่!

ขอบคุณล่วงหน้า.


1
อาจใช้FDWบนเครื่องบันทึกเพื่อเข้าถึง C หรือไม่? แม้ว่านั่นจะทำให้เกิดประสิทธิภาพในการทำงานของ C. Materialized Viewsอาจลดประสิทธิภาพการทำงาน แต่ฉันไม่แน่ใจว่า PostgreSQL ตรวจพบการอัปเดตในตารางต่างประเทศได้อย่างไร ถ้ามันทำโดยอัตโนมัติ (ซึ่งตอนท้ายของเอกสาร Materialized View ดูเหมือนว่าจะแนะนำ) สิ่งนี้อาจแก้ปัญหาของคุณได้ทั้งหมด สิ่งเหล่านี้คือคุณสมบัติ 9.3 รายชื่อผู้รับจดหมายที่ใช้งานอยู่อาจช่วยได้เช่นกัน
jpmc26

คำตอบ:


4

บน PostgreSQL 9.3 คุณสามารถใช้postgres_fdwเพื่อสอบถามตารางต่างประเทศบนเครื่องอื่นได้อย่างโปร่งใส

ในเวอร์ชันที่เก่ากว่าdblinkอาจเป็นตัวเลือกตามที่ Andrew พูดถึง

อีกทางเลือกหนึ่งคือการใช้เครื่องมือเช่น Londiste หรือ Slony-I เพื่อทำซ้ำตารางที่คุณต้องการ ฉันแนะนำให้ใช้ Londiste สำหรับสิ่งนี้มันจะง่ายกว่านี้มาก มันสร้างทริกเกอร์บนโต๊ะเพื่อตรวจจับการแทรก / อัปเดต / ลบและทำซ้ำสิ่งเหล่านี้โดยใช้ไคลเอ็นต์ / เซิร์ฟเวอร์ของตัวเองและระบบการจัดคิวไปยังฐานข้อมูลอื่นซึ่งจะทำการแทรก / อัพเดต / ลบที่สอดคล้องกัน ฉันใช้มันในการผลิตบนเว็บไซต์ลูกค้าหลายแห่งและใช้งานได้ดีมาก

ตัวเลือกในอนาคต (หวังว่าใน PostgreSQL 9.5) จะเป็นการล็อกโลจิคัลการเรพลิเคทโลจิคัลการแยกเซ็ตอัพเชิงตรรกะและการเรพลิเคตแบบสองทิศทางซึ่งจะอนุญาตให้ฐานข้อมูลหรือตารางแต่ละตัว ส่วนหนึ่งของงานนี้มุ่งมั่นที่จะ PostgreSQL 9.4 แต่ไม่เพียงพอที่จะทำให้มีประโยชน์สำหรับสิ่งที่คุณต้องการทำ


3

คุณควรใช้ dblinks และมุมมองที่ปรากฏขึ้นเพื่อให้บรรลุเป้าหมายนี้ คุณสมบัติทั้งสองนี้สร้างขึ้นใน Postgres เวอร์ชันล่าสุด:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

โดยพื้นฐานแล้วคุณสร้าง Mview ในแต่ละฐานข้อมูล L1, L2 ... ด้วยข้อมูลที่ดึงมาจากตารางบน C จากนั้นใช้ Mview refresh เพื่ออัพเดท Mviews เป็นระยะบ่อยเท่าที่ต้องการ ข้อมูลถูกจัดเก็บไว้ในเครื่องเพื่อให้เข้าถึงได้อย่างรวดเร็ว สิ่งนี้จะเหมาะสมก็ต่อเมื่อข้อมูลค่อนข้างคงที่และคุณไม่สนใจฐานข้อมูลท้องถิ่นที่มีข้อมูลล้าสมัยเล็กน้อย คุณควรกำหนดความถี่ในการรีเฟรชเพื่อจัดการสิ่งนี้อย่างเหมาะสมและหากไม่เป็นที่ยอมรับคุณควรใช้ลิงค์ฐานข้อมูลและจัดการกับความล่าช้าที่เกิดขึ้น

หากคุณต้องการฟังก์ชั่นเพิ่มเติมโครงการสแน็ปช็อตมีคุณสมบัติขั้นสูงเช่นการรีเฟรชอย่างรวดเร็วและบันทึกสแน็ปช็อต:

http://pgfoundry.org/projects/snapshot/

ด้วยวิธีนี้คุณสามารถสร้างการรีเฟรชเฉพาะแถวที่จำเป็นต้องอัปเดตซึ่งสามารถทำให้พวกเขาเร็วมากสำหรับชุดข้อมูลขนาดใหญ่ไม่ยืดหยุ่นลดการหยุดชะงักของแอปของคุณ ตามค่าเริ่มต้น Mviews จะถูกทิ้งและสร้างใหม่ใน Postgres ซึ่งอาจไม่ดีต่อประสิทธิภาพด้วยเหตุผลที่ชัดเจน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.