การจำลองแบบ MySQL Master-Master ของฐานข้อมูลทั้งหมด อย่างไร?


16

ความเป็นมา : ฉันมีการติดตั้งเซิร์ฟเวอร์ MySQL 5.1 สองตัวในการจำลองแบบแถวตามแถวต้นแบบ (Master-Master-replication) (RBR) ตามแนวทางที่ยอดเยี่ยมนี้ ฉันต้องการให้จำลองฐานข้อมูลทั้งหมดและจะเพิ่มฐานข้อมูลใหม่เป็นประจำ

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

คำถาม : จากสิ่งที่ฉันได้อ่านฉันคิดว่าฉันสามารถทำเช่นนี้โดยเพียงแค่การละเว้นใด ๆbinlog-do-db, binlog-ignore-db, replicate-do-dbและreplicate-ignore-dbการตั้งค่าในการกำหนดค่าเซิร์ฟเวอร์แต่ละ แต่ฉันไม่สามารถตรวจสอบ เอกสารของ MySQL เกี่ยวกับวิธีการประเมินตัวเลือกการจำลองแบบฐานข้อมูลและระดับตารางทำให้ฉันคิดว่าอาจจะไม่มีทางทำสิ่งนี้ให้สำเร็จได้

บางส่วนของ/etc/mysql/my.cnfไฟล์ที่เกี่ยวข้องจะถูกคัดลอกด้านล่าง ฉันกำลังติดตามใช่ไหม? เป็นสิ่งที่ฉันต้องการแม้เป็นไปได้?

ปรมาจารย์ 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

ปรมาจารย์ 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

1
สร้าง DB บนเครื่องที่คุณกำลังนำการเขียนไป
Martin

config แบบเต็มของคุณคืออะไร? ฉันลองตอบคำถามเหล่านี้ด้านล่างมันใช้งานไม่ได้ :-(
zx1986

คำตอบ:


17

นี่คือวิธีที่ฉันทำกับทั้งสองคน

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin

คุณสามารถเพิ่มฐานข้อมูลให้กับทั้งมาสเตอร์และทำให้พวกมันถูกเรพลิเคตโดยอัตโนมัติหรือไม่?
Andrew Ensley

ใช่พวกเขาทำ .. ฉันเพียงแค่ตั้งค่าสิ่งที่ไม่สนใจ
Mike

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

3
ใช่ใช่ใช่ใช่ :) :)
Mike

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

4

สำหรับการสร้างฐานข้อมูลยังมีรายงานบั๊กเกี่ยวกับการใช้ CREATE DATABASE ด้วยการจำลองแบบแถว

รายงานนี้ถูกปิด แต่ข้อผิดพลาดปรากฏขึ้นอีกครั้งใน MySQL 5.1.47
รายงานนี้ขึ้นอยู่กับ MySQL Cluster ( เอ็นจิ้นการจัดเก็บ NDB) รายงานนี้ขึ้นอยู่กับ replicate-wild-ละเว้น-table

การจำลองแบบแถว ๆ ทำให้การบันทึกแบบไบนารีเติบโตในอัตราพิเศษซึ่งสามารถขัดขวางการรับส่งข้อมูลเครือข่ายเพียงแค่จัดส่งข้อมูลบันทึกแบบไบนารีไปยังบันทึกการถ่ายทอดของสลาฟ

@ Mike กล่าวว่าเขาได้สร้างฐานข้อมูลให้ทำงานและทำซ้ำได้ดี ฉันไม่สงสัยเลย สิ่งที่ฉันเป็นเล็กน้อยของ MySQL (eh Oracle) ไม่ได้รับ kinks ทั้งหมดออกจากการจำลองแบบแถวเมื่อฐานข้อมูลเป็นอินสแตนซ์

คุณอาจต้องการเปลี่ยนไปใช้ row_format MIXED หากคุณยังต้องการรายการตามแถวในบันทึกไบนารี ภายในรูปแบบบันทึกไบนารีมีแนวโน้มที่จะลอยระหว่างคำสั่งและแก้ไขต่อไป: (ดูhttp://bugs.mysql.com/bug.php?id=40146 ) รายงานข้อบกพร่องเพิ่มเติมถูกปิดโดยใช้แบบผสมและแยกออกจากแถวตาม ( http://bugs.mysql.com/bug.php?id=39701 ) แต่ยังคงมีปัญหาอยู่เป็นระยะ

หมายเหตุสุดท้าย

สำหรับสติของคุณเองโปรดย้อนกลับไปใช้การจำลองแบบตามคำสั่งและทำให้ CREATE DATABASE (ซึ่งเป็นคำสั่ง SQL) มีความเสถียรและสอดคล้องกันสำหรับ SQL ที่ตามมากับฐานข้อมูลที่สร้างขึ้น ในความเป็นจริงรายงานข้อผิดพลาดล่าสุดแสดงให้เห็นว่ามันเป็นการดีที่สุดที่จะใช้การจำลองแบบตามคำสั่งโดยไม่คำนึงถึงสิ่งที่เอกสารพูดเกี่ยวกับตัวเลือกระดับฐานข้อมูลและระดับตาราง


ขอบคุณสำหรับข้อมูลทั้งหมด ปัญหาเดียวของฉันกับการทำซ้ำคำสั่งคือการเปลี่ยนแปลงการระบุฐานข้อมูล (เช่น "INSERT INTO db1.table1 (col1) ค่า ('hi');") จะไม่ทำงานยกเว้นว่าฐานข้อมูลนั้นเป็นฐานข้อมูลปัจจุบันที่ใช้งานอยู่ ฉันคิดว่ามันอาจจะถึงเวลาที่จะเปลี่ยนไปใช้คำสั่งที่ใช้จำลองและทำความสะอาดรหัสบางอย่าง ...
แอนดรู Ensley

กลับกลายเป็นว่ามันไม่ยากที่จะแก้ไขรหัสที่จำเป็น ตอนนี้ฉันกำลังใช้การจำลองแบบข้อความแจ้ง ขอบคุณสำหรับคำแนะนำ.
Andrew Ensley

0

อืม ... คุณจะต้องหาวิธีจัดการ / แยกคีย์และฟิลด์ที่เพิ่มขึ้นโดยอัตโนมัติ นี่ดูน่าสนใจ .. http://mysql-mmm.org/


สิ่งนี้ได้รับการจัดการในauto-increment-incrementและauto-increment-offsetการตั้งค่าในไฟล์กำหนดค่าของฉัน ดูหน้านี้: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley

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

@ ทั้งหมด: โอ๊ะโอ .. ขออภัย ฉันสาบานได้ว่าฉันอ่านมันเสร็จแล้ว แต่ไม่ต้องมีไขมันต่ำแทน ...
Nandhini Anand

-1

cmiiw ฉันคิดว่าคุณควรจะสามารถสร้างฐานข้อมูลบน master1 และ master2 โดยไม่เปลี่ยน conf หรือหยุดการเป็นทาส แต่ให้แน่ใจว่าการจำลองแบบต้นแบบ - ต้นแบบทำงานอยู่ เนื่องจากคุณไม่ได้กำหนดว่าฐานข้อมูลใดที่จำเป็นต้องทำซ้ำหมายความว่าฐานข้อมูลทั้งหมดจะถูกทำซ้ำหากคุณไม่ได้กำหนดไว้ใน my.cnf


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