การจำลองแบบดั้งเดิมของ PostgreSQL เปรียบเทียบกับ MySQL อย่างไร
ฉันรู้ว่าการจำลองแบบอะซิงโครนัสได้รับการสนับสนุนมานานกว่าการซิงค์ซึ่งเร็ว ๆ นี้ ซิงโครนัสน่าเชื่อถือที่จะใช้ในโครงการจริงหรือไม่?
การจำลองแบบดั้งเดิมของ PostgreSQL เปรียบเทียบกับ MySQL อย่างไร
ฉันรู้ว่าการจำลองแบบอะซิงโครนัสได้รับการสนับสนุนมานานกว่าการซิงค์ซึ่งเร็ว ๆ นี้ ซิงโครนัสน่าเชื่อถือที่จะใช้ในโครงการจริงหรือไม่?
คำตอบ:
ใช่มันพร้อมสำหรับการผลิตและใช้กันอย่างแพร่หลาย ผู้ติดตามของ Heroku นั้นอ้างอิงจากการจำลองแบบ async ในตัวของ PostgreSQL เช่นเดียวกับ AWS RDS แสตนด์บายและอ่านเรพลิกา การจำลองแบบการสตรีมถูกใช้อย่างแพร่หลายในระดับสากลกับ PostgreSQL
การติดตั้งการจำลองแบบไม่ได้น่ารักเท่าไหร่แต่เครื่องมืออย่างrepmgr จะช่วยได้บ้างและมันก็ปรับปรุงอย่างช้าๆเมื่อมีการปล่อยรุ่นใหญ่ ๆ ความสามารถในการ pg_basebackup ในการคัดลอกระบบโดยใช้การจำลองแบบการสตรีม (และการทำเช่นนั้นจากสแตนด์บายอื่น) เป็นความช่วยเหลือที่ยิ่งใหญ่
โดยทั่วไปแล้วคุณสมบัติจะไม่ได้รับการเผยแพร่ใน PostgreSQL จนกว่าจะพร้อมการผลิต ข้อบกพร่องเกิดขึ้นเช่นเดียวกับในซอฟต์แวร์ใด ๆ แต่โดยทั่วไปจะมีการแก้ไขไม่นานหลังจากมีการระบุ คุณสมบัติใหม่ที่สำคัญจริงๆบางครั้งมีข้อบกพร่องและปัญหาที่ค้นพบหลังจากการเปิดตัว. 0 แต่ถ้าแก้ไขเช่นนั้นเป็นลำดับความสำคัญสูง; โรคจิตไม่ได้ถูกทิ้งไว้
ฉันไม่ได้ตระหนักถึงปัญหาร้ายแรงใด ๆ กับการจำลองแบบการสตรีม - ซิงค์หรือ async - และฉันไม่เห็นรายงานใด ๆ มาพักหนึ่งแล้ว พวกเขามีความเสถียรน้อยกว่ามาตรฐานปกติของ Pg ในการเผยแพร่เวอร์ชั่นหลักที่พวกเขาเปิดตัว แต่ไม่ได้รับการพัฒนาอย่างรวดเร็วและพร้อมสำหรับการผลิตอย่างละเอียด
(อัปเดต: มีข้อผิดพลาดเฉพาะใน 9.3 รุ่นใหม่ก่อนหน้า 9.3.4 ที่ทำให้เกิดปัญหาการจำลองแบบในบางกรณีผู้ใช้ 9.3 ควรอัปเดตเป็น 9.3.4 ทันทีรุ่นเก่าจะไม่ได้รับผลกระทบ)
ข้อแม้เดียวที่ฉันต้องการพูดถึงคือ aa รายละเอียดเล็กน้อยพร้อมการจำลองแบบซิงโครนัส: ถ้าคุณส่งมอบให้ต้นแบบแล้วยกเลิกแบบสอบถามหลังจากคอมมิชชันในขณะที่รอการจำลองเพื่อยืนยัน คุณได้รับผลกระทบเดียวกันโดยเริ่มต้นแบบใหม่ในขณะที่รอให้แบบจำลองตอบกลับ ในทางปฏิบัตินี่เป็นเรื่องไม่เกี่ยวข้อง แต่มันเกี่ยวกับปัญหาเดียวที่ฉันนึกได้
การจำลองแบบดั้งเดิมของ Pg ค่อนข้างแตกต่างจาก MySQL
MySQL ใช้การจำลองแบบเชิงตรรกะที่จะส่งการเปลี่ยนแปลงเชิงตรรกะที่ทำกับข้อมูลตารางโครงสร้างตารางและแบบจำลองที่ใช้การเปลี่ยนแปลงเหล่านั้น
การจำลองแบบของ PostgreSQL อยู่ในระดับที่ต่ำกว่า (ใน 9.5 และต่ำกว่าเวอร์ชันในอนาคตอาจเพิ่มการจำลองแบบเชิงตรรกะ) มันส่งบล็อกที่เปลี่ยนแปลงในตาราง มันง่ายกว่าง่ายกว่าที่จะได้รับสิทธิและกำหนดภาระที่ต่ำกว่าบนเซิร์ฟเวอร์เรพลิกา แต่ใช้แบนด์วิดท์เครือข่ายมากขึ้นและต้องการพื้นที่เก็บข้อมูลบนต้นแบบเพื่อเก็บการเปลี่ยนแปลงที่ยังไม่ได้ทำซ้ำ เป็นการกำหนดค่าที่ดีที่สุดให้ใช้การจำลองแบบการสตรีมด้วยทางเลือกสำรอง WAL ทำให้การกำหนดค่าซับซ้อนกว่าของ MySQL มันจำลองการเปลี่ยนแปลงในระดับต่ำเช่นกิจกรรม VACUUM ไม่ใช่เพียงแค่การเปลี่ยนแปลงของทูปเปิลทำให้สถานะบนดิสก์ของเรพลิคาเหมือนกันกับของต้นแบบ ไม่สามารถทำซ้ำฐานข้อมูลเดียวเท่านั้น ทั้งระบบจะต้องทำซ้ำซึ่งอาจทำให้คุณหงุดหงิดถ้าคุณมีฐานข้อมูลขนาดใหญ่ที่มีความปั่นป่วนสูงและไม่สำคัญและมีฐานข้อมูลขนาดเล็กที่มีความปั่นป่วนต่ำและมีความสำคัญ
โดยรวมแล้วขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับมัน
ฉันดูการจำลองแบบของ PostgreSQL ว่าดีกว่ามากสำหรับแบบจำลองที่ใช้สำหรับการสำรองข้อมูลความพร้อมใช้งานสูงและการกู้คืนความเสียหาย โดยเฉพาะอย่างยิ่งเมื่อรวมกับจุดในเวลาการกู้คืน (PITR)
ในทางกลับกันมันไม่ดีสำหรับแบบจำลองการรายงานแบบอ่านอย่างเดียวเนื่องจากความจำเป็นในการล่าช้าแอปพลิเคชันข้อมูลที่ทำซ้ำในขณะที่ทำธุรกรรมที่ยาวนานหมายความว่าคุณต้องปล่อยให้มันยกเลิกการสืบค้นที่ยาวมาก ๆ เพิ่มพื้นที่ดิสก์บนต้นแบบและบังคับให้ทำงานหนักขึ้นเพื่อให้ทัน
มีงานอย่างต่อเนื่องเพื่อเปิดใช้งานการเรพลิเคทแบบลอจิคัลใน PostgreSQLโดยที่การเปลี่ยนแปลงเชิงตรรกะของโครงสร้างตารางเนื้อหาตารางและอื่น ๆ จะถูกจำลองแบบมากกว่าสถานะบนดิสก์ การออกแบบแคตตาล็อกของ Pg และการสนับสนุนทุกอย่างที่ผู้ใช้กำหนดเองทำให้งานนี้ค่อนข้างซับซ้อน มีการวางรากฐานบางส่วนสำหรับ 9.4 แต่การจำลองแบบเต็มรูปแบบเชิงตรรกะไม่น่าจะใช้งานได้ก่อนหน้า 9.6 หรือใหม่กว่า