คุณจะซิงค์ Master MySQL DB กับ Slave DB ใหม่ได้อย่างไรถ้า Master ทำการออฟไลน์


11

MySQL Server 1 ทำงานเป็น Master
MySQL Server 2 ทำงานเป็น Slave

ด้วยฐานข้อมูลออนไลน์ทั้งคู่พวกเขาอยู่ใน "ซิงค์ที่สมบูรณ์แบบ" หาก Slave ออฟไลน์จะไม่มีปัญหาหาก Master ยังคงออนไลน์ พวกเขาจะกลับไปซิงค์อีกครั้งเมื่อ Slave ออนไลน์อีกครั้ง

นอกเหนือจากการกำหนดค่าเซิร์ฟเวอร์ฉันเปลี่ยนเส้นทางการเชื่อมต่อ (ด้วยรหัส JSP) สำหรับฐานข้อมูล Slave ถ้าเจ้านายเป็นออฟไลน์ (ฉันทดสอบแน่นอนด้วย /etc/init.d/mysqld หยุด)

เมื่อ Master กลับมาออนไลน์จะมีวิธีการใดในการซิงค์ Master กับการอัพเดต Slave โดยอัตโนมัติหรือไม่?

คำตอบ:


8

วิธีที่ดีวิธีหนึ่งในการดึงบางสิ่งบางอย่างในลักษณะนั้นออกมาคือการตั้งค่าการจำลองแบบอาจารย์ - ปริญญาโทหรือการจำลองแบบวงกลม นี่ไม่ควรสับสนกับ MultiMaster Replciation

การตั้งค่าการจำลองแบบวนซ้ำทำได้ง่ายมากถ้าคุณตั้งค่าการจำลองแบบ Master-Slave นี่คือสิ่งที่คุณต้องทำเพื่อกำหนดค่า

สำหรับตัวอย่างนี้เราจะสมมติว่า Master-Slave Replication แอ็คทีฟ แต่คุณจะได้รับการหยุดทำงานเล็กน้อย (1-2 นาที):

ขั้นตอนที่ 1) เพิ่มบรรทัดนี้ไปยัง /etc/my.cnf บน Master

เข้าสู่ระบบทาสการปรับปรุง

ขั้นตอนที่ 2) เพิ่มบรรทัดเหล่านี้ใน /etc/my.cnf บน Slave:

log-bin = mysql-bin (หรือมีสิ่งที่ต้นแบบมีสำหรับเรื่องนี้) log-slave-updates

คำเตือน: นี่คือช่วงเวลาสั้น ๆ ของการหยุดทำงาน !!!

ขั้นตอนที่ 3) ใน Slave บริการ mysql เริ่มต้นใหม่

นี่จะเป็นการเปิดใช้งานบันทึกไบนารีบน Slave

ขั้นตอนที่ 4) ในหลักบริการ mysql หยุด

ขั้นตอนที่ 5) ใช้ rsync เพื่อคัดลอกโฟลเดอร์ / var / lib / mysql ของ Slave to the Master

คำเตือน: นี่คือช่วงเวลาที่หยุดทำงานนานขึ้น !!!

ขั้นตอนที่ 6) ใน Slave บริการ mysql หยุด

ขั้นตอนที่ 7) บน Slave ค้นหาบันทึกไบนารีสุดท้าย

ขั้นตอนที่ 8) บน Slave ค้นหาขนาดไฟล์ของไฟล์บันทึกไบนารีสุดท้าย

ขั้นตอนที่ 9) ใช้ rsync เพื่อคัดลอกโฟลเดอร์ / var / lib / mysql ของ Slave to the Master นี่ควรเป็นสำเนาที่เร็วกว่า

ขั้นตอนที่ 10) ใน Master แก้ไข
Line 2 ของ master.info ด้วยบันทึกไบนารีสุดท้ายของ Slave
บรรทัดที่ 3 ของ master.info พร้อมด้วยขนาดไฟล์ของบันทึกไบนารีสุดท้ายของ Slave
บรรทัดที่ 4 ของ master.info ด้วย IP ของ Slave
บรรทัดที่ 5 คือรหัสผู้ใช้ของผู้ใช้การจำลองแบบ (ห้ามสัมผัส)
บรรทัดที่ 6 เป็นรหัสผ่านของผู้ใช้การจำลองแบบ (ห้ามสัมผัส)

ขั้นตอนที่ 11) ลบบันทึกไบนารีทั้งหมดและไฟล์ดัชนีบันทึกไบนารีของ Master

ขั้นตอนที่ 12) ใน Slave ให้เริ่ม mysql รอ 15 วินาที

ขั้นตอนที่ 13) ใน Master ให้บริการ mysql เริ่มต้น

ขั้นตอนที่ 14) ใน Master รัน STOP SLAVE; แสดงสถานะหลัก;

ขั้นตอนที่ 15) บน Slave ให้เปลี่ยน CHANGE MASTER_HOST = 'IP of Slave', MASTER_USER = 'หมายเลขผู้ใช้ของผู้ใช้การจำลองแบบจากขั้นตอนที่ 10', MASTER_PASSWORD = 'รหัสผ่านของผู้ใช้การจำลองแบบจาก Step10', MASTER_LOG_FILE MASTER_LOG_POS = LogPos จากขั้นตอนที่ 14

ขั้นตอนที่ 16) บน Slave ให้รัน START SLAVE;

ขั้นตอนที่ 17) บนมาสเตอร์ให้รัน START SLAVE;

ผมดำเนินการตามขั้นตอนที่คล้ายกันนี้อีกฉันคำถาม StackExchange ตอบ

ให้มันลอง !!!


ดีมาก! เป็นไปได้หรือไม่ที่จะมีฐานข้อมูลสลาฟมากกว่าหนึ่งฐานข้อมูลเชื่อมต่อกับมาสเตอร์เช่นโซลูชัน "Master-Master-Master"
Herberth Amaral

นี่ทำให้การตั้งค่าของฉันเสียหายเกินกว่าจะซ่อม จำเป็นต้องติดตั้ง VPS ของฉันใหม่ทั้งหมด ฉันเดาว่าฉันจะถ่ายรูปก่อนที่จะอ่านคำแนะนำหลบในครั้งต่อไป
Vasili Syrakis

@ VasiliSyrakis ฉันขอโทษคุณรู้สึกว่าคำแนะนำของฉันคือหลบ อย่างไรก็ตามใน 10 ปีของฉันในฐานะ MySQL DBA ฉันไม่เคยทำลาย VPS หรือ MySQL ที่ติดตั้งมาก่อนเมื่อปรับตำแหน่งของบันทึกไบนารีเพื่อจำลองแบบ ฉันทำสิ่งนี้เพื่อลูกค้า Drupal และ Wordpress มาหลายปีโดยไม่มีเหตุการณ์เกิดขึ้น ขอโทษสำหรับคำแนะนำของฉัน
RolandoMySQLDBA

อืมมม ฉันจะไม่แนะนำให้ใช้ rsync เพื่อคัดลอกอินสแตนซ์ที่กำลังทำงานอยู่ ฉันต้องการใช้Percona XtraBackup เพื่อเตรียมใช้งานใหม่หลักจากทาส นอกจากนี้คุณไม่จำเป็นต้องใช้log-slave-updatesเว้นแต่ว่าเจ้านายจะมีทาสเพิ่มขึ้น
Bill Karwin

2

ไม่ใช่การจำลองแบบอะซิงโครนัสซึ่งเป็นสิ่งที่ MySQL นำเสนอ คุณเพียงแค่ตะโกนว่าทำไมการเลียนแบบ MySQL 'out of the box' (pre 5.5) ไม่ใช่โซลูชันที่มีความพร้อมใช้งานสูงในตัวของมันเอง สิ่งต่าง ๆ จะดีขึ้นเล็กน้อยเมื่อใช้ 5.5 พร้อมการจำลองแบบซิงโครนัส (http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html) แต่ใช้เวลาในการทำธุรกรรมช้าลงขณะที่มาสเตอร์รอ รับจากทาส

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

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


1
ฉันรัก DRBD ด้วยตัวเอง ฉันทำงานกับมันเป็นประจำกับลูกค้าจำนวนมากที่ใช้ ucarp เป็นกลไกการทำงานล้มเหลวของฉัน DRBD นั้นดีมากและเป็นที่นิยมสำหรับ HA หากฐานข้อมูลนั้นเป็น InnoDB ทั้งหมด ตาราง MyISAM ใด ๆ ที่เปิดระหว่างการล้มเหลวถูกทำเครื่องหมายว่าขัดข้องแม้ใน DRBD Secondary InnoDB เพิ่งผ่านการกู้คืนความผิดพลาดเมื่อล้มเหลวไปยัง DRBD Primary ใหม่ ดังนั้นฉันเห็น DRBD และ InnoDB ถูกใช้ร่วมกัน ขอบคุณสำหรับความรู้สึกที่ดีในการเพิ่ม DRBD +1 สำหรับคำตอบของคุณ
RolandoMySQLDBA

ขอบคุณ :) และผมคิดว่าในคำตอบของฉันฉันทำข้อสันนิษฐานที่ว่าถ้าคุณสนใจมากเกี่ยวกับความสอดคล้องของข้อมูลระหว่างแบบจำลองของคุณคุณแล้วทั้งหมดหรือส่วนใหญ่ InnoDB :)
TechieGurl

1

IMHO ก่อนอื่นเลยในการกำหนดค่าที่ไม่ใช่หลายหลัก (master / slave) ทาสของคุณไม่ควรเขียน ควรกำหนดค่า slave my.cnf และเซิร์ฟเวอร์เริ่มต้นด้วย:

# Flag to not take writes from network
read-only

ถัดไปในการแก้ปัญหาของข้อมูลไม่สอดคล้องกันกับทาสที่เขียนได้โดยไม่ตั้งใจคุณต้องทำการกระจายข้อมูลบนโฮสต์ทั้งสอง หากไม่มีการชนกันของคีย์คุณควรเลื่อนตำแหน่งอดีตทาสของคุณเป็นมาสเตอร์และรูปภาพต้นแบบเก่าของคุณใหม่เป็นโฮสต์ทาสจำลองจากต้นแบบใหม่ (อาจมี / อาจเป็นปัญหาข้อมูลที่นี่)

ในที่สุดหากสถานการณ์ของการหยุดทำงาน / การหยุดทำงานนี้อาจเป็นไปได้ในอนาคตให้ใช้เวลาในการตั้งค่าโฮสต์ทั้งสองให้เป็นมัลติมาสเตอร์ (log-bin, server-id, ออฟเซ็ต ฯลฯ ) สิ่งนี้จะช่วยคุณลดการหยุดทำงานและหยุดทำงานในระดับหนึ่ง

หากคุณต้องใช้งาน master / slaveอย่างน้อยจะได้รับคะแนนโบนัสบางส่วนสำหรับการแยกการเชื่อมต่อผู้ใช้แบบอ่านและเขียนใน ACL และแอปพลิเคชันของคุณ

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