วิธีที่ดีที่สุดในการสร้างการติดตั้งการจำลองแบบ MySQL Master-Slave และแก้ไขปัญหาคืออะไร


14

ฉันยังใหม่กับการจัดการฐานข้อมูล

ฉันประสบปัญหามากมายในขณะตั้งค่าการจำลองแบบ master-slave ของ mysql

ฉันยังประสบปัญหาการแก้ไขปัญหาการจำลองแบบ mysql ปกติ

ใครช่วยได้เข้าใจว่าฉันควรจัดการกับสิ่งเหล่านี้อย่างไร


คำถามสองสามข้อ: ทำไมคุณต้องจำลองแบบคุณพยายามจะทำอะไร ระบบปฏิบัติการของคอมพิวเตอร์แต่ละเครื่องที่เข้าร่วมในการจำลองข้อมูลคืออะไร MySQL รุ่นใดในคอมพิวเตอร์แต่ละเครื่อง? ตาราง MyISAM, InnoDB เป็นอย่างอื่นหรือไม่
Craig Efrein

@CraigEfrein ฉันต้องตั้งค่าการจำลองแบบเนื่องจากเซิร์ฟเวอร์เหล่านี้จะต้องใช้ในการผลิตฉันใช้ Debian / ubuntu บนเครื่องแต่ละเครื่อง mysql5.1 เป็น vaersion ตารางพื้นฐานคือ InnoDB
Abdul Manaf

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

คำตอบ:


19

ฉันให้ลิงค์ไปยังบทเรียน เพียงจำไว้ว่าใน Ubuntu ไฟล์ my.cnf อยู่ใน /etc/mysql/my.cnf และไม่ได้อยู่ใน /etc/my.cnf เหมือนในบทสอน howtoforge ในการตั้งค่าของฉันฉันไม่ได้ใช้ตารางล้างด้วยล็อกการอ่าน บนต้นแบบ หากเซิร์ฟเวอร์หลักของคุณมีกิจกรรมการเขียนจำนวนมากคุณอาจต้องล็อคตารางโดยเรียกใช้คำสั่งนั้นก่อนสำรองข้อมูล หากคุณใช้แท็บล้างด้วย READ LOCK; จากนั้นหลังจากการสำรองข้อมูลของคุณคุณจะต้องเรียกใช้ UNLOCK TABLES หากคุณพบปัญหาใด ๆ แจ้งให้เราทราบ

นี่คือการสอนที่ฉันพบในวิธีการเคลื่อนทำเพื่อ Redhat / CentOS: http://www.howtoforge.com/mysql_database_replication

อีกบทช่วยสอนที่ดูดีสำหรับ Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

นี่คือการกำหนดค่าที่ฉันใช้:

บนเซิร์ฟเวอร์ MASTER

กำหนดค่าเซิร์ฟเวอร์หลัก:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

รีสตาร์ท MySQL:

/etc/init.d/mysql restart

เชื่อมต่อกับคอนโซลของ mysql: mysql -u root -ppassword

สร้างและให้สิทธิ์แก่ผู้ใช้การจำลองแบบ

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

ตรวจสอบให้แน่ใจว่าได้คัดลอกข้อมูลนี้ไปไว้ที่อื่นหรือไม่

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

ดัมพ์ฐานข้อมูลไปยังไฟล์:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

คัดลอกดัมพ์ฐานข้อมูลไปยังเซิร์ฟเวอร์ทาสโดยใช้ scp หรือใช้ ftp หากคุณต้องการ:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

บนเซิร์ฟเวอร์ SLAVE

แก้ไขการกำหนดค่า mysql:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

รีสตาร์ท MySQL: /etc/init.d/mysql restart

คืนค่าการสำรองข้อมูล:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

เชื่อมต่อกับ MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

วิ่งSHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 17324288
            Relay_Log_Space: 17324425
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
          Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.02 sec)

หลังจากนั้นโปรดทราบว่าการจำลองแบบอาจล้มเหลวได้จากหลายสาเหตุ บนทาสคุณสามารถตรวจสอบสถานะได้โดยการรันคำสั่ง SHOW SLAVE STATUS \ G; หรือตั้งค่างาน cron เพื่อตรวจสอบสถานะและส่งอีเมลหากล้มเหลว รับความคุ้นเคยกับผลลัพธ์จากคำสั่งนี้ หากการจำลองแบบทำงานอย่างถูกต้องคุณควรเห็น "Slave_IO_State: กำลังรอให้นายส่งเหตุการณ์"

เมื่อคุณตั้งค่านี้ถูกต้องฉันสามารถให้สคริปต์เพื่อตรวจสอบการจำลองแบบนั้นได้

นี่คือสคริปต์ในการตรวจสอบบันทึกข้อผิดพลาดใน MySQL หากคุณเพิ่มสาย

[mysqld]

log-error = /var/log/mysql/mysql.err

รีสตาร์ท mysql: /etc/init.d/mysql รีสตาร์ท

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

นี่คือสคริปต์ตัวอย่าง: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

เพื่อเพิ่มลงใน crontab

ทำให้สคริปต์เรียกใช้งานได้:

chmod +x /somepath/monitor_mysql_log.sh

อัปเดต crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

และสคริปต์จะทำงานทุกนาที

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


ขอบคุณมากฉันทำเช่นนี้และฉันสามารถตั้งค่าการจำลอง ...
Abdul Manaf

คุณช่วยให้ฉันสคริปต์สำหรับการตรวจสอบการจำลองแบบ
Abdul Manaf

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

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

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

7

Mysqldump นั้นเร็ว แต่การกู้คืนทิ้งอาจช้ามากสำหรับฐานข้อมูลขนาดใหญ่และการล็อคตารางไม่เป็นที่ยอมรับในไซต์สด วิธีที่ดีมากขึ้นและเร็วขึ้นของการตั้งค่าทาสคือการใช้Percona ของ XtraBackup XtraBackup กำหนดให้โหลดเล็กน้อยบนมาสเตอร์ไม่จำเป็นต้องล็อคและการคืนค่าบน slave นั้นเร็วมาก กลไกนี้สร้างโคลนที่สมบูรณ์ของฐานข้อมูลทั้งหมดรวมถึงสิ่งต่าง ๆ เช่นตารางผู้ใช้ซึ่งจะทำให้บางสิ่งที่กำหนดโดยการติดตั้งหุ้นเช่นผู้ใช้ debian-sys-maint ซึ่งไม่จำเป็นต้องเป็นสิ่งที่ไม่ดี !

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

คุณจะต้องตั้งค่าapt / yum repo ของ Perconaสำหรับ distro ของคุณจากนั้นติดตั้งxtrabackupแพ็กเกจทั้งบน master และ slave ฉันขอแนะนำให้ใช้ยูทิลิตี้การบีบอัดpigz (gzip แบบขนานพร้อมใช้งานใน repos มาตรฐานส่วนใหญ่) เนื่องจากมันสร้างความแตกต่างอย่างมากต่อความเร็วในการสำรองข้อมูล

กระบวนการดังกล่าวเป็นเช่นนี้ (บน Ubuntu, distros อื่น ๆ อาจแตกต่างกันเล็กน้อย) และสมมติว่าคุณได้ติดตั้ง MySQL บนทาสของคุณ:

  1. ก่อนอื่นทำการสำรองข้อมูลบนต้นแบบ: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz(ปรับแต่งค่าเค้นเพื่อ จำกัด ผลกระทบของการสำรองข้อมูลในบริการสด)
  2. คัดลอกไฟล์สำรองข้อมูลไปยังสลาฟ (ใช้scp -l 400000เพื่อไม่ให้ต้นแบบของแบนด์วิดท์เครือข่ายสำหรับไคลเอนต์สด)
  3. หยุด mysql บนทาส: service mysql stop
  4. ย้ายไดเรกทอรีข้อมูล MySQL เก่าออกไป: mv /var/lib/mysql /var/lib/mysql2(หรือบีบอัดที่ใดที่หนึ่งถ้าคุณมีพื้นที่ดิสก์สั้น)
  5. สร้างไดเรกทอรีข้อมูลใหม่และย้ายไปที่: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. ยกเลิกการสำรองไฟล์ลงในโฟลเดอร์ใหม่: tar xvzif /path/to/backup/mysql.tgz. หมายเหตุiตัวเลือกในการดำเนินงาน tar - มันจะไม่ทำงานโดยไม่ได้ ขั้นตอนนี้จะใช้เวลาสักครู่ถ้าคุณมีฐานข้อมูลขนาดใหญ่
  7. เรียกใช้เครื่องมือ Innobackupex /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysqlในแฟ้มที่แยก: สิ่งนี้จะทำการกู้คืนความเสียหายของไฟล์จากบันทึกไบนารีได้อย่างมีประสิทธิภาพ ใช้เวลาเพียงไม่กี่วินาที ใช้จำนวนหน่วยความจำที่น้อยกว่าหากบนเซิร์ฟเวอร์ที่เล็กกว่า
  8. สมมติว่าเสร็จสมบูรณ์แล้วให้ลบข้อมูลสำรองและตั้งค่าความเป็นเจ้าของไฟล์: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. เริ่ม mysql: service mysql start
  10. ได้รับชื่อบันทึกไฟล์หลักและตำแหน่งของการสำรองข้อมูล (หมายเหตุไม่ข้อมูลใน xtrabackup_slave_info) cat xtrabackup_binlog_infoที่: มันจะพูดอะไรบางอย่างเช่นmysql-bin.000916 13889427
  11. เชื่อมต่อกับ MySQL และตรวจสอบว่ามีอะไร
  12. รีเซ็ตการตั้งค่าการจำลองแบบโดยใช้รายละเอียดที่คุณได้รับเกี่ยวกับบันทึก: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(เปลี่ยนเพื่อให้ตรงกับรายละเอียดเซิร์ฟเวอร์ฐานข้อมูลจริง)
  13. รีสตาร์ททาส: START SLAVE;
  14. ตรวจสอบสถานะของการเป็นทาสขณะที่ถูกจับกับเจ้านายจนกระทั่ง 'seconds_behind_master' เป็น 0: SHOW SLAVE STATUS\G

ตอนนี้ทาสของคุณพร้อมแล้ว หากจำเป็นตอนนี้คุณสามารถตั้งค่าการจำลองแบบวงกลม:

  1. บนFLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;สลาฟ: จดชื่อไฟล์บันทึกและตำแหน่ง (เช่น mysql-bin.000031 และ 17244785)
  2. บนหลัก: การCHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;แทรกค่าจากบ่าวที่เราเพิ่งดู
  3. บนหลัก: START SLAVE;
  4. บนทาส: UNLOCK TABLES;

ตอนนี้คุณควรจะตั้งค่าทั้งหมดด้วยการจำลองแบบวงกลม

เท่าที่การแก้ไขปัญหาดำเนินไปชุดเครื่องมือของ Perconaมีทุกสิ่งที่จะช่วยได้เช่นการตรวจสอบเพื่อตรวจสอบการทุจริตอย่างเงียบ ๆ การวัดความล่าช้าและอื่น ๆ รูปแบบที่พบบ่อยที่สุดของความเสียหายของการจำลองแบบสามารถหลีกเลี่ยงได้โดยการตั้งค่าbinlog_format = MIXEDใน my.cnf ของคุณ ที่กล่าวว่าในการจำลองประสบการณ์ของฉันโดยทั่วไปจะไม่ลำบาก


ความจงรักภักดีของคุณคืออะไร?
Pacerier

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