ฉันยังใหม่กับการจัดการฐานข้อมูล
ฉันประสบปัญหามากมายในขณะตั้งค่าการจำลองแบบ master-slave ของ mysql
ฉันยังประสบปัญหาการแก้ไขปัญหาการจำลองแบบ mysql ปกติ
ใครช่วยได้เข้าใจว่าฉันควรจัดการกับสิ่งเหล่านี้อย่างไร
ฉันยังใหม่กับการจัดการฐานข้อมูล
ฉันประสบปัญหามากมายในขณะตั้งค่าการจำลองแบบ master-slave ของ mysql
ฉันยังประสบปัญหาการแก้ไขปัญหาการจำลองแบบ mysql ปกติ
ใครช่วยได้เข้าใจว่าฉันควรจัดการกับสิ่งเหล่านี้อย่างไร
คำตอบ:
ฉันให้ลิงค์ไปยังบทเรียน เพียงจำไว้ว่าใน 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/
นี่คือการกำหนดค่าที่ฉันใช้:
กำหนดค่าเซิร์ฟเวอร์หลัก:
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/
แก้ไขการกำหนดค่า 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
Mysqldump นั้นเร็ว แต่การกู้คืนทิ้งอาจช้ามากสำหรับฐานข้อมูลขนาดใหญ่และการล็อคตารางไม่เป็นที่ยอมรับในไซต์สด วิธีที่ดีมากขึ้นและเร็วขึ้นของการตั้งค่าทาสคือการใช้Percona ของ XtraBackup XtraBackup กำหนดให้โหลดเล็กน้อยบนมาสเตอร์ไม่จำเป็นต้องล็อคและการคืนค่าบน slave นั้นเร็วมาก กลไกนี้สร้างโคลนที่สมบูรณ์ของฐานข้อมูลทั้งหมดรวมถึงสิ่งต่าง ๆ เช่นตารางผู้ใช้ซึ่งจะทำให้บางสิ่งที่กำหนดโดยการติดตั้งหุ้นเช่นผู้ใช้ debian-sys-maint ซึ่งไม่จำเป็นต้องเป็นสิ่งที่ไม่ดี !
เป็นโบนัสเมื่อคุณรู้วิธีการทำเช่นนี้คุณสามารถใช้กลไกเดียวกันกับการสำรองข้อมูลรายวันของคุณ การสำรองข้อมูลช้ากว่า mysqldump แต่การคืนค่านั้นเร็วกว่าซึ่งเป็นสิ่งที่คุณต้องการหากคุณอยู่ในสถานการณ์ที่คุณอยู่ในสถานการณ์หวาดกลัวและจำเป็นต้องกู้คืนข้อมูลสำรอง! หากคุณเคยได้รับข้อผิดพลาดการจำลองแบบที่สำคัญเพียงแค่ใช้ขั้นตอนนี้เพื่อถังขยะทาสและสร้างใหม่; ใช้เวลาไม่นานจริงๆ
คุณจะต้องตั้งค่าapt / yum repo ของ Perconaสำหรับ distro ของคุณจากนั้นติดตั้งxtrabackup
แพ็กเกจทั้งบน master และ slave ฉันขอแนะนำให้ใช้ยูทิลิตี้การบีบอัดpigz (gzip แบบขนานพร้อมใช้งานใน repos มาตรฐานส่วนใหญ่) เนื่องจากมันสร้างความแตกต่างอย่างมากต่อความเร็วในการสำรองข้อมูล
กระบวนการดังกล่าวเป็นเช่นนี้ (บน Ubuntu, distros อื่น ๆ อาจแตกต่างกันเล็กน้อย) และสมมติว่าคุณได้ติดตั้ง MySQL บนทาสของคุณ:
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
(ปรับแต่งค่าเค้นเพื่อ จำกัด ผลกระทบของการสำรองข้อมูลในบริการสด)scp -l 400000
เพื่อไม่ให้ต้นแบบของแบนด์วิดท์เครือข่ายสำหรับไคลเอนต์สด)service mysql stop
mv /var/lib/mysql /var/lib/mysql2
(หรือบีบอัดที่ใดที่หนึ่งถ้าคุณมีพื้นที่ดิสก์สั้น)mkdir /var/lib/mysql; cd /var/lib/mysql
tar xvzif /path/to/backup/mysql.tgz
. หมายเหตุi
ตัวเลือกในการดำเนินงาน tar - มันจะไม่ทำงานโดยไม่ได้ ขั้นตอนนี้จะใช้เวลาสักครู่ถ้าคุณมีฐานข้อมูลขนาดใหญ่/usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql
ในแฟ้มที่แยก: สิ่งนี้จะทำการกู้คืนความเสียหายของไฟล์จากบันทึกไบนารีได้อย่างมีประสิทธิภาพ ใช้เวลาเพียงไม่กี่วินาที ใช้จำนวนหน่วยความจำที่น้อยกว่าหากบนเซิร์ฟเวอร์ที่เล็กกว่าrm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
service mysql start
cat xtrabackup_binlog_info
ที่: มันจะพูดอะไรบางอย่างเช่นmysql-bin.000916 13889427
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;
(เปลี่ยนเพื่อให้ตรงกับรายละเอียดเซิร์ฟเวอร์ฐานข้อมูลจริง)START SLAVE;
SHOW SLAVE STATUS\G
ตอนนี้ทาสของคุณพร้อมแล้ว หากจำเป็นตอนนี้คุณสามารถตั้งค่าการจำลองแบบวงกลม:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
สลาฟ: จดชื่อไฟล์บันทึกและตำแหน่ง (เช่น mysql-bin.000031 และ 17244785)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;
แทรกค่าจากบ่าวที่เราเพิ่งดูSTART SLAVE;
UNLOCK TABLES;
ตอนนี้คุณควรจะตั้งค่าทั้งหมดด้วยการจำลองแบบวงกลม
เท่าที่การแก้ไขปัญหาดำเนินไปชุดเครื่องมือของ Perconaมีทุกสิ่งที่จะช่วยได้เช่นการตรวจสอบเพื่อตรวจสอบการทุจริตอย่างเงียบ ๆ การวัดความล่าช้าและอื่น ๆ รูปแบบที่พบบ่อยที่สุดของความเสียหายของการจำลองแบบสามารถหลีกเลี่ยงได้โดยการตั้งค่าbinlog_format = MIXED
ใน my.cnf ของคุณ ที่กล่าวว่าในการจำลองประสบการณ์ของฉันโดยทั่วไปจะไม่ลำบาก