MySQL รองรับการจำลองแบบทางเดียวและแบบอะซิงโครนัส ในระหว่างกระบวนการจำลองแบบหนึ่งทาง เซิร์ฟเวอร์ทำหน้าที่เป็นเซิร์ฟเวอร์หลัก เซิร์ฟเวอร์หลักเขียนการอัปเดตไปยังไฟล์บันทึกไบนารีและรักษาดัชนีของไฟล์บันทึกเพื่อติดตามการหมุนเวียนบันทึก เมื่อทาสเชื่อมต่อกับต้นแบบ มันจะแจ้งให้ต้นแบบทราบตำแหน่งของการอัปเดตที่สำเร็จครั้งล่าสุดที่ทาสอ่านในบันทึก เซิร์ฟเวอร์ทาสได้รับการอัพเดตใด ๆ ที่เกิดขึ้นตั้งแต่นั้นมา จากนั้นจะบล็อกและรอให้เซิร์ฟเวอร์หลักแจ้งการอัพเดตครั้งถัดไป
เหตุใดจึงใช้การจำลองแบบ master-slave
1. การตั้งค่าเซิร์ฟเวอร์หลัก/เซิร์ฟเวอร์รองจะเพิ่มความคงทน เมื่อมีสิ่งผิดปกติเกิดขึ้นกับเซิร์ฟเวอร์หลัก คุณสามารถสลับไปใช้เซิร์ฟเวอร์ทาสเพื่อสำรองข้อมูลได้
2. ด้วยการแบ่งภาระการประมวลผลคำร้องขอของลูกค้าระหว่างเซิร์ฟเวอร์หลักและเซิร์ฟเวอร์รอง คุณจะได้รับเวลาตอบสนองลูกค้าที่ดีขึ้น แต่อย่าอัปเดตบนเซิร์ฟเวอร์หลักและเซิร์ฟเวอร์ทาสพร้อมกัน เนื่องจากอาจทำให้เกิดข้อขัดแย้งได้
3. ข้อดีอีกประการหนึ่งของการใช้การจำลองแบบคือ คุณสามารถใช้เซิร์ฟเวอร์ทาสเพื่อทำการสำรองข้อมูลได้โดยไม่รบกวนเซิร์ฟเวอร์หลัก เซิร์ฟเวอร์หลักสามารถดำเนินการอัปเดตต่อได้ในระหว่างกระบวนการสำรองข้อมูล
MySQL ใช้ 3 เธรดเพื่อทำหน้าที่จำลองแบบ (1 เธรดบนเซิร์ฟเวอร์หลักและอีก 2 เธรดบนเซิร์ฟเวอร์ทาส เมื่อมีการออก START SLAVE เซิร์ฟเวอร์ทาสจะสร้างเธรด I/O เพื่อเชื่อมต่อกับเซิร์ฟเวอร์หลัก และปล่อยให้เซิร์ฟเวอร์หลักส่งไบนารี่ log เซิร์ฟเวอร์หลักจะสร้างเธรดเพื่อส่งเนื้อหาของบันทึกไบนารีไปยังเซิร์ฟเวอร์ทาส เธรด I/O ของเซิร์ฟเวอร์ทาสจะอ่านเนื้อหาที่ส่งโดยเธรด Binlog Dump ของเซิร์ฟเวอร์หลักและคัดลอกข้อมูลไปยังไฟล์ภายในเครื่องในทาส ไดเร็กทอรีข้อมูลเซิร์ฟเวอร์ นั่นคือ บันทึกการถ่ายทอด เธรดที่สามคือเธรด SQL เซิร์ฟเวอร์ทาสใช้เธรดนี้เพื่ออ่านบันทึกการถ่ายทอดและดำเนินการอัปเดตที่มีอยู่ในบันทึกเพื่อสอบถามการจำลองแบบที่เกิดขึ้นบนเซิร์ฟเวอร์หลักและ ข้อมูลเซิร์ฟเวอร์สลาฟ
บันทึกการถ่ายทอดเริ่มต้นใช้ชื่อไฟล์ในรูปแบบ host_name-relay-bin.nnnnnn โดยที่ host_name คือชื่อโฮสต์ของเซิร์ฟเวอร์สลาฟ และ nnnnnn คือหมายเลขลำดับที่เริ่มต้น ด้วย 000001 ติดตามไฟล์ดัชนีบันทึกการถ่ายทอดเพื่อระบุบันทึกการถ่ายทอดที่ใช้งานอยู่ในปัจจุบัน ชื่อไฟล์ดัชนีบันทึกการถ่ายทอดเริ่มต้นคือ host_name-relay-bin.index โดยค่าเริ่มต้น ไฟล์เหล่านี้จะถูกสร้างขึ้นในไดเร็กทอรีข้อมูลของเซิร์ฟเวอร์ทาส มีรูปแบบเดียวกับบันทึกไบนารีและสามารถอ่านได้ด้วย mysqlbinlog เมื่อเธรด SQL ดำเนินการเหตุการณ์ทั้งหมดในบันทึกการถ่ายทอด บันทึกการถ่ายทอดจะถูกลบออก
จากเซิร์ฟเวอร์โดยอัตโนมัติ และไฟล์สถานะเพิ่มเติมอีกสองไฟล์จะถูกสร้างขึ้นในไดเร็กทอรีข้อมูล
.--master.info และ Relay-log.info ไฟล์สถานะจะถูกบันทึกไว้ในฮาร์ดดิสก์และไม่สูญหายเมื่อเซิร์ฟเวอร์ทาสถูกปิดในครั้งถัดไปที่เซิร์ฟเวอร์ทาสเริ่มทำงาน ไฟล์เหล่านี้จะถูกอ่านเพื่อกำหนดจำนวนไบนารี ได้อ่านจากเซิร์ฟเวอร์หลักแล้ว และขอบเขตที่พวกเขาจัดการบันทึกการถ่ายทอดของตนเอง
ในการตั้งค่าการจำลองแบบมาสเตอร์-สเลฟ:
1. ตรวจสอบให้แน่ใจว่าเวอร์ชัน MySQL ที่ติดตั้งบนเซิร์ฟเวอร์หลักและเซิร์ฟเวอร์ทาสเหมือนกัน และควรใช้ MySQL เวอร์ชันเสถียรล่าสุด
บนเซิร์ฟเวอร์หลัก บัญชีนี้จะต้องได้รับสิทธิ์ REPLICATION SLAVE หากบัญชีนั้นใช้สำหรับการจำลองแบบเท่านั้น (แนะนำ) ไม่จำเป็นต้องให้สิทธิ์
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'replication'. @'%.yourdomain.com' ระบุโดย 'slavepass';
3. ดำเนินการคำสั่ง FLUSH TABLES พร้อม READ LOCK เพื่อล้างตารางทั้งหมดและคำสั่งบล็อกการเขียน:
mysql> FLUSH ตารางที่มีการล็อคการอ่าน
ป้องกันไม่ให้โปรแกรมไคลเอนต์ mysql ออก เทอร์มินัลจะถ่ายภาพไดเร็กทอรีข้อมูลเซิร์ฟเวอร์หลัก
shell> cd /usr/local/mysql/
shell> tar -cvf /tmp/mysql-snapshot.tar ./data
หากบัญชีผู้ใช้ของเซิร์ฟเวอร์ทาสแตกต่างจากเซิร์ฟเวอร์หลัก คุณอาจไม่ต้องการคัดลอก ฐานข้อมูล mysql ในกรณีนี้ ฐานข้อมูลควรถูกแยกออกจากไฟล์เก็บถาวร คุณไม่จำเป็นต้องรวมไฟล์บันทึกหรือไฟล์ master.info หรือ Relay-log.info ไว้ในไฟล์เก็บถาวร
เมื่อล็อคการอ่านที่ตั้งค่าโดย FLUSH TABLES พร้อม READ LOCK นั้นถูกต้อง (นั่นคือ โปรแกรมไคลเอนต์ mysql ไม่ออก) ให้อ่านชื่อบันทึกไบนารีปัจจุบันและค่าออฟเซ็ตบนเซิร์ฟเวอร์หลัก:
mysql > SHOW MASTER STATUS
; --- ---------+----------+--------------+---------- --- ----+
| . ไฟล์ | .Binlog_Do_DB |
. ---------------------+
|. mysql-bin.003 |. ทดสอบ |
. --- --------+----------+--------------+------------- --- --+
คอลัมน์ไฟล์จะแสดงชื่อบันทึก และตำแหน่งจะแสดงออฟเซ็ต ในตัวอย่างนี้ ค่าบันทึกไบนารีคือ mysql-bin.003 ที่ออฟเซ็ต 73 บันทึกค่านี้ จะต้องใช้ค่าเหล่านี้ในภายหลังเมื่อตั้งค่าเซิร์ฟเวอร์ทาส พวกเขาแสดงถึงพิกัดการจำลองที่สเลฟควรเริ่มการอัพเดตใหม่จากต้นแบบ
หากไม่ได้เปิดใช้งาน --logs-bin เมื่อเซิร์ฟเวอร์หลักทำงาน ชื่อบันทึกและค่าตำแหน่งที่แสดงโดย SHOW MASTER STATUS จะว่างเปล่า ในกรณีนี้ค่าที่ต้องใช้เมื่อระบุไฟล์บันทึกและตำแหน่งของเซิร์ฟเวอร์ทาสในอนาคตคือสตริงว่าง ('') และ 4
หลังจากถ่ายภาพสแน็ปช็อตและบันทึกชื่อบันทึกและออฟเซ็ตแล้ว ให้ส่งคืน ไปที่ระดับกลางก่อนหน้าแล้วรีสตาร์ทเปิดใช้งานกิจกรรมการเขียน:
mysql> UNLOCK TABLES;
4. ตรวจสอบให้แน่ใจว่าส่วน [mysqld] ของไฟล์ my.cnf บนโฮสต์เซิร์ฟเวอร์หลักมีตัวเลือก log-bin ส่วนนี้ควรมีตัวเลือก server-id=Master_id โดยที่ master_id ต้องเป็นค่าจำนวนเต็มบวกระหว่าง 1 ถึง 232–1 ตัวอย่างเช่น:
[mysqld]
log-bin
server-id=1
หากไม่มีตัวเลือกเหล่านั้น คุณควรเพิ่มและรีสตาร์ทเซิร์ฟเวอร์
5. หยุดบริการ mysqld บนเซิร์ฟเวอร์ทาสและเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ my.cnf:
[mysqld]
server-id=2
ค่าทาส _id เหมือนกับค่า Master_id และต้องเป็นจำนวนเต็มบวกระหว่าง 1 ถึง 232 –1. ค่า นอกจากนี้ ID ของเซิร์ฟเวอร์ทาสจะต้องแตกต่างจาก ID ของเซิร์ฟเวอร์หลัก
6. บันทึกข้อมูลลงในไดเร็กทอรีสำรอง ตรวจสอบให้แน่ใจว่าการอนุญาตในไฟล์และไดเรกทอรีเหล่านี้ถูกต้อง ผู้ใช้ที่เซิร์ฟเวอร์ MySQL ทำงานอยู่จะต้องสามารถอ่านและเขียนไฟล์ได้ เช่นเดียวกับบนเซิร์ฟเวอร์หลัก
เชลล์> chown -R mysql:mysql /usr/local/mysql/data
7. เริ่มเซิร์ฟเวอร์ทาส ดำเนินการคำสั่งต่อไปนี้บนเซิร์ฟเวอร์ทาสโดยแทนที่ค่าตัวเลือกด้วยค่าจริงสำหรับระบบของคุณ:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
- > MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
8. เริ่มเธรด
เซิร์ฟเวอร์ทาส:
mysql> START SLAVE;
การอัปเดตที่เกิดขึ้นตั้งแต่สแน็ปช็อต
9. หากเกิดข้อผิดพลาดในการจำลองแบบ ข้อความแสดงข้อผิดพลาดจะปรากฏในบันทึกข้อผิดพลาด (HOSTNAME.err) ของเซิร์ฟเวอร์ทาสด้วย
10. เมื่อคัดลอกจากเซิร์ฟเวอร์ ไฟล์ master.info และ HOSTNAME-relay-log.info จะอยู่ในไดเร็กทอรีข้อมูล สเลฟใช้ทั้งสองไฟล์นี้เพื่อติดตามว่าบันทึกไบนารีของมาสเตอร์ได้รับการประมวลผลมากน้อยเพียงใด อย่าลบหรือแก้ไขไฟล์เหล่านี้ เว้นแต่คุณจะรู้แน่ชัดว่าคุณกำลังทำอะไรอยู่และเข้าใจถึงความสำคัญของไฟล์นั้นอย่างถ่องแท้ ถึงกระนั้น ควรใช้คำสั่ง CHANGE MASTER TO จะดีกว่า