การผลิตการจำลองแบบ PostgreSQL พร้อมหรือยัง


16

การจำลองแบบดั้งเดิมของ PostgreSQL เปรียบเทียบกับ MySQL อย่างไร

ฉันรู้ว่าการจำลองแบบอะซิงโครนัสได้รับการสนับสนุนมานานกว่าการซิงค์ซึ่งเร็ว ๆ นี้ ซิงโครนัสน่าเชื่อถือที่จะใช้ในโครงการจริงหรือไม่?

คำตอบ:


31

การผลิตพร้อมหรือยัง

ใช่มันพร้อมสำหรับการผลิตและใช้กันอย่างแพร่หลาย ผู้ติดตามของ Heroku นั้นอ้างอิงจากการจำลองแบบ async ในตัวของ PostgreSQL เช่นเดียวกับ AWS RDS แสตนด์บายและอ่านเรพลิกา การจำลองแบบการสตรีมถูกใช้อย่างแพร่หลายในระดับสากลกับ PostgreSQL

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

โดยทั่วไปแล้วคุณสมบัติจะไม่ได้รับการเผยแพร่ใน PostgreSQL จนกว่าจะพร้อมการผลิต ข้อบกพร่องเกิดขึ้นเช่นเดียวกับในซอฟต์แวร์ใด ๆ แต่โดยทั่วไปจะมีการแก้ไขไม่นานหลังจากมีการระบุ คุณสมบัติใหม่ที่สำคัญจริงๆบางครั้งมีข้อบกพร่องและปัญหาที่ค้นพบหลังจากการเปิดตัว. 0 แต่ถ้าแก้ไขเช่นนั้นเป็นลำดับความสำคัญสูง; โรคจิตไม่ได้ถูกทิ้งไว้

ฉันไม่ได้ตระหนักถึงปัญหาร้ายแรงใด ๆ กับการจำลองแบบการสตรีม - ซิงค์หรือ async - และฉันไม่เห็นรายงานใด ๆ มาพักหนึ่งแล้ว พวกเขามีความเสถียรน้อยกว่ามาตรฐานปกติของ Pg ในการเผยแพร่เวอร์ชั่นหลักที่พวกเขาเปิดตัว แต่ไม่ได้รับการพัฒนาอย่างรวดเร็วและพร้อมสำหรับการผลิตอย่างละเอียด

(อัปเดต: มีข้อผิดพลาดเฉพาะใน 9.3 รุ่นใหม่ก่อนหน้า 9.3.4 ที่ทำให้เกิดปัญหาการจำลองแบบในบางกรณีผู้ใช้ 9.3 ควรอัปเดตเป็น 9.3.4 ทันทีรุ่นเก่าจะไม่ได้รับผลกระทบ)

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

เปรียบเทียบกับ MySQL หรือไม่

การจำลองแบบดั้งเดิมของ Pg ค่อนข้างแตกต่างจาก MySQL

MySQL ใช้การจำลองแบบเชิงตรรกะที่จะส่งการเปลี่ยนแปลงเชิงตรรกะที่ทำกับข้อมูลตารางโครงสร้างตารางและแบบจำลองที่ใช้การเปลี่ยนแปลงเหล่านั้น

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

โดยรวมแล้วขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับมัน

ฉันดูการจำลองแบบของ PostgreSQL ว่าดีกว่ามากสำหรับแบบจำลองที่ใช้สำหรับการสำรองข้อมูลความพร้อมใช้งานสูงและการกู้คืนความเสียหาย โดยเฉพาะอย่างยิ่งเมื่อรวมกับจุดในเวลาการกู้คืน (PITR)

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

มีงานอย่างต่อเนื่องเพื่อเปิดใช้งานการเรพลิเคทแบบลอจิคัลใน PostgreSQLโดยที่การเปลี่ยนแปลงเชิงตรรกะของโครงสร้างตารางเนื้อหาตารางและอื่น ๆ จะถูกจำลองแบบมากกว่าสถานะบนดิสก์ การออกแบบแคตตาล็อกของ Pg และการสนับสนุนทุกอย่างที่ผู้ใช้กำหนดเองทำให้งานนี้ค่อนข้างซับซ้อน มีการวางรากฐานบางส่วนสำหรับ 9.4 แต่การจำลองแบบเต็มรูปแบบเชิงตรรกะไม่น่าจะใช้งานได้ก่อนหน้า 9.6 หรือใหม่กว่า


คำตอบที่ดีสำหรับคำถามที่ฉันมี ขอบคุณเครก
swasheck

6
มีสิ่งหนึ่งที่เกี่ยวกับการซิงค์ตัวแทนซึ่งทำให้ผู้ใช้บางคนประหลาดใจ แต่จริงๆแล้วสมเหตุสมผลถ้าคุณคิดเกี่ยวกับมัน: การกระทำของการทำธุรกรรมซึ่งอยู่ภายใต้การจำลองแบบซิงโครนัสจะไม่กลับมาจนกว่าจะมีการทำธุรกรรม . คนที่มาจากระบบอื่น ๆ รู้สึกว่าควรจะเกิดขึ้นเว้นแต่ความพยายามในการทำซ้ำจะใช้เวลานานเกินไปซึ่งหมายความว่า "มันเป็นแบบซิงโครนัสเว้นแต่จะไม่ใช่" ซึ่งไม่ใช่การรับประกันที่ยอมรับได้สำหรับชุมชน PostgreSQL ใช้เป้าหมายการซิงค์หลายครั้งเพื่อหลีกเลี่ยงแผงลอยหากการจำลองล้มเหลวหรือใช้ async
kgrittn

1
@kgrittn จุดที่ดีอีกหลายเป้าหมาย ฉันตกใจเล็กน้อยที่ทุกคนต้องการ / คาดว่าจะส่งคืนก่อนที่การทำธุรกรรมจะถูกจำลองในการจำลองแบบซิงโครนัส ; ฟังดูเหมือนว่าพวกเขาต้องการการจำลองแบบ async จริง ๆ โดยมีขีด จำกัด ของผู้ติดตามสูงสุดที่หยุดเขียนบนต้นแบบจนกว่าผู้ติดตามจะติดตามเพียงพอหรือไม่ สิ่งที่สมเหตุสมผลอย่างสมบูรณ์แบบที่ต้องการ แต่ไม่ใช่ซิงค์ตัวแทน
Craig Ringer

1
@CraigRinger: สิ่งที่ฉันได้เห็นคนถามหาไม่ใช่สิ่งที่คุณพูดพวกเขาขอ "ใช้ตัวแทนการซิงค์ แต่กลับไปที่ตัวแทน async โดยอัตโนมัติหากการซิงค์ใช้เวลานานเกินไป" ดังนั้นพวกเขาไม่ต้องการหยุดต้นแบบชั่วคราวหากมันอยู่ด้านหลังของแบบจำลองมากเกินไป - นั่นคือกรณีที่พวกเขาต้องการให้ยืนยันการกระทำอย่างรวดเร็วโดยไม่ต้องเขียนไปยังเว็บไซต์อื่น สำหรับฉันแล้วดูเหมือนว่าจะมีการส่งมอบมากกว่าที่สัญญาไว้ พวกเขาต้องการหน้า "ใช่คุณมีซิงค์ตัวแทนคุณปลอดภัย" และหลังจากเกิดความผิดพลาด "ข้อมูลที่ได้รับมอบหมายนั้นหมดไปมันไม่ได้ถูกเขียนขึ้นที่อื่นเลย"
kgrittn

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