ทาสคนหนึ่ง MySql หลายตัว


9

เป็นไปได้ไหมที่จะตั้งค่าการจำลองแบบ MySql เพื่อให้ทาสคนหนึ่งฟังอาจารย์สองคนที่แตกต่างกัน?

คำตอบ:


3

จากการออกแบบกระบวนการ mysqld หนึ่งกระบวนการไม่สามารถฟังอาจารย์สองคนที่แตกต่างกันได้พร้อมกัน

คำสั่ง CHANGE MASTER TO อนุญาตให้คุณตั้ง Master หนึ่งตัวเป็นแหล่งข้อมูลเพื่ออ่าน

เพื่อเลียนแบบสิ่งนี้คุณจะต้องสลับระหว่างสองอาจารย์โดยทางโปรแกรม คุณจะทำอย่างไร

ฉันอธิบายใน StackOverflow วิธีเชื่อมต่อ Slave ด้วยตนเองกับอาจารย์ที่แตกต่างกันโดยที่อาจารย์แต่ละคนเป็นแล็ปท็อปและ Slave เป็นคอมพิวเตอร์ส่วนกลาง

นี่คือแนวคิดพื้นฐาน

  • ปรมาจารย์ M1
  • ปรมาจารย์ M2
  • Slave S1

ตั้งค่าการจำลองแบบ M1 ถึง S1 แล้ว M2 ถึง S1 เช่นนี้

  • 1) ให้ S1 เปลี่ยน MASTER TO ด้วย M1 เป็นแหล่งที่มา
  • 2) เริ่ม SLAVE;
  • 3) เรียกใช้การจำลองแบบสักครู่
  • 4) STOP SLAVE;
  • 5) ให้ S1 เปลี่ยน MASTER TO ด้วย M2 เป็นแหล่งที่มา
  • 6) เริ่ม SLAVE;
  • 7) เรียกใช้การจำลองแบบสักครู่
  • 8) STOP SLAVE;
  • 9) กลับไปที่ขั้นตอนที่ 1

ทุกครั้งที่คุณเปลี่ยนจากปริญญาโทหนึ่งไปเป็นอีกปริญญาหนึ่งคุณต้องบันทึกสองค่าจาก SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

ค่าทั้งสองนี้แสดงถึงคำแถลง SQL ล่าสุดที่มาจาก Master และถัดไปจะถูกเรียกใช้บน Slave

มีข้อควรระวังสำคัญประการหนึ่ง: ตราบใดที่ M1 และ M2 กำลังอัปเดตฐานข้อมูลที่ไม่เกิดร่วมกันร่วมกันอัลกอริทึมนี้น่าจะใช้ได้

เชื่อหรือไม่ว่าฉันได้ตอบคำถามเช่นนี้ใน ServerFault ย้อนกลับไปเมื่อเดือนพฤษภาคม 2554 ฉันอธิบายวิธีเลียนแบบมัลติมัลติมาสเตอร์ / ทาสคนเดียวโดยใช้ BLACKHOLE Storage Engine จากหนังสือ "High Performance MySQL"


แม้ว่าฉันจะไม่ได้ต้องการมันด้วยตัวเอง แต่ฉันก็คิดถึงเรื่องนี้มาก่อน มันจะเป็นไปได้หรือไม่ที่จะส่ง binlog ของเจ้านายคนที่สองไปเป็นทาส mysql? ฉันเดาว่าสิ่งที่ดีที่สุดคือการมีเครื่องมือที่คอยจับตาดูผลลัพธ์ของการสืบค้นแต่ละข้อและหยุดข้อผิดพลาดเช่นเดียวกับเธรดการจำลองแบบทาสทั่วไป แต่โดยพื้นฐานแล้วท่อที่เรียบง่ายควรทำเช่นกัน แน่นอนว่าอาจารย์ทั้งสองที่เขียนไปยังฐานข้อมูล / ตารางเดียวกันจะกลายเป็นเรื่องยากอย่างรวดเร็ว คุณมีผู้เชี่ยวชาญที่จะไตร่ตรองเรื่องอะไรบ้าง?
Jannes

1
ฉันคิดว่ามันคุ้มค่าที่จะเพิ่มคำตอบของคุณว่าแม้ว่า MySQL 5.6 จะไม่ทำเช่นนี้ แต่ 5.7 จะสนับสนุนผู้เชี่ยวชาญหลายคน
Phil Sumner

4

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

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

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

เพียงระบุพอร์ต = 3307 (หรืออะไรก็ตามในไฟล์. cnf)

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

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


ฉันดีใจที่มีคนเข้าใจความโง่เขลาของการทำบัญชี คำตอบที่ดีเช่นกัน +1 !!!
RolandoMySQLDBA


0

MariaDB ซึ่งสามารถใช้แทนการแทนที่สำหรับ MySql สามารถใช้ได้ รองรับจากรุ่น 10.2

ปัญหาเกี่ยวกับการรองรับ Mysql 5.7 นั้นเป็นสิ่งจำเป็นสำหรับ GTID ซึ่งหมายความว่าคุณต้องเปลี่ยนมาสเตอร์เช่นกันในกรณีของ MariaDb กรณีนี้ไม่ได้เป็นเช่นนั้น

ตัวอย่าง / HowTo link: http://www.skysql.com/blogs/dean-ellis/multi-source-replication-mariadb-100

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