การจำลองแบบ MySQL เป็นกระบวนการที่ช่วยให้สามารถคัดลอกข้อมูลจากเซิร์ฟเวอร์ฐานข้อมูล MySQL (ตัวหลัก) ไปยังเซิร์ฟเวอร์ฐานข้อมูล MySQL อย่างน้อยหนึ่งเซิร์ฟเวอร์ (ทาส) โดยอัตโนมัติ โดยปกติจะใช้เพื่อกระจายการเข้าถึงแบบอ่านบนเซิร์ฟเวอร์หลายเครื่องเพื่อความสามารถในการปรับขยายแม้ว่าจะสามารถใช้เพื่อวัตถุประสงค์อื่น ๆ เช่นสำหรับการเฟลโอเวอร์หรือวิเคราะห์ข้อมูลบนทาสเพื่อไม่ให้มาสเตอร์โอเวอร์โหลด
เนื่องจากการจำลองแบบ Master-Slave เป็นการจำลองแบบทางเดียว (จากต้นแบบไปยังทาส) ฐานข้อมูลหลักเท่านั้นที่ใช้สำหรับการดำเนินการเขียนในขณะที่การดำเนินการอ่านอาจกระจายไปบนฐานข้อมูล Slave หลายฐานข้อมูล สิ่งนี้หมายความว่าหากใช้การจำลองแบบ Master-Slave เป็นโซลูชันการขยายขนาดคุณต้องมีแหล่งข้อมูลอย่างน้อยสองแหล่งที่กำหนดแหล่งข้อมูลหนึ่งสำหรับการดำเนินการเขียนและแหล่งที่สองสำหรับการดำเนินการอ่าน
นักพัฒนา MySQL โดยปกติจะทำงานบนเครื่องเดียวและมีแนวโน้มที่จะมีสภาพแวดล้อมการพัฒนาทั้งหมดในเครื่องนั้นโดยมีตรรกะที่ว่าพวกเขาไม่ได้ขึ้นอยู่กับเครือข่ายหรือการเชื่อมต่ออินเทอร์เน็ต หากจำเป็นต้องมีการจำลองแบบ master-slave เนื่องจากตัวอย่างเช่นพวกเขาจำเป็นต้องทดสอบการจำลองแบบในสภาพแวดล้อมการพัฒนาก่อนที่จะปรับใช้การเปลี่ยนแปลงที่อื่นพวกเขาจะต้องสร้างในเครื่องเดียวกัน แม้ว่าการตั้งค่าอินสแตนซ์ MySQL เดียวนั้นค่อนข้างง่าย แต่เราจำเป็นต้องใช้ความพยายามเป็นพิเศษในการตั้งค่าวินาทีจากนั้นจึงทำการจำลองแบบ Master-Slave
สำหรับบทแนะนำทีละขั้นตอนนี้ฉันได้เลือก Ubuntu Linux เป็นระบบปฏิบัติการโฮสต์และคำสั่งที่มีให้สำหรับระบบปฏิบัติการนั้น หากคุณต้องการตั้งค่าการจำลอง MySQL master-slave บนระบบปฏิบัติการอื่นคุณจะต้องทำการแก้ไขสำหรับคำสั่งเฉพาะของมัน อย่างไรก็ตามหลักการทั่วไปของการตั้งค่าการจำลองแบบ Master-Slave MySQL บนเครื่องเดียวกันจะเหมือนกันสำหรับระบบปฏิบัติการทั้งหมด
ac กับ s corp ต่างกันอย่างไร
หากคุณมี ฐานข้อมูล MySQL ติดตั้งบนเครื่องของคุณคุณสามารถข้ามขั้นตอนนี้ได้
วิธีที่ง่ายที่สุดในการติดตั้ง MySQL บน Ubuntu คือเรียกใช้คำสั่งต่อไปนี้จากพรอมต์เทอร์มินัล:
sudo apt-get install mysql-server
ในระหว่างขั้นตอนการติดตั้งคุณจะได้รับแจ้งให้ตั้งรหัสผ่านสำหรับ MySQL root
ผู้ใช้
mysqld_multi
ในการจัดการอินสแตนซ์ MySQL สองอินสแตนซ์บนเครื่องเดียวกันอย่างมีประสิทธิภาพเราจำเป็นต้องใช้ mysqld_multi
.
ขั้นตอนแรกในการตั้งค่า mysqld_multi
คือการสร้างสองแยก [mysqld]
กลุ่มใน my.cnf
ที่มีอยู่ ไฟล์. ตำแหน่งเริ่มต้นของ my.cnf
ไฟล์บน Ubuntu คือ /etc/mysql/
. ดังนั้นเปิด my.cnf
ไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและเปลี่ยนชื่อ [mysqld]
ที่มีอยู่ รวมกลุ่มเพื่อ [mysqld1]
. กลุ่มที่เปลี่ยนชื่อนี้จะใช้สำหรับการกำหนดค่าอินสแตนซ์ MySQL แรกและจะถูกกำหนดค่าเป็นอินสแตนซ์หลักด้วย เช่นเดียวกับในการจำลองแบบ Master-Slave MySQL แต่ละอินสแตนซ์ต้องมีเอกลักษณ์ของตัวเอง server-id
เพิ่มบรรทัดต่อไปนี้ใน [mysqld1]
กลุ่ม:
server-id = 1
เนื่องจากเราต้องแยก [mysqld]
กลุ่มสำหรับอินสแตนซ์ MySQL ที่สองคัดลอก [mysqld1]
จัดกลุ่มที่มีการกำหนดค่าปัจจุบันทั้งหมดและวางไว้ด้านล่างด้วย my.cnf
ไฟล์. ตอนนี้เปลี่ยนชื่อกลุ่มที่คัดลอกเป็น [mysqld2]
และทำการเปลี่ยนแปลงต่อไปนี้ในการกำหนดค่าสำหรับทาส:
server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1
ในการตั้งค่าอินสแตนซ์ MySQL ที่สองเป็นทาสให้ตั้งค่า server-id
เป็น 2 เนื่องจากต้องแตกต่างกับรหัสเซิร์ฟเวอร์ของหลัก
เนื่องจากทั้งสองอินสแตนซ์จะทำงานบนเครื่องเดียวกันให้ตั้งค่า port
สำหรับอินสแตนซ์ที่สองเป็น 3307
เนื่องจากจะต้องแตกต่างจากพอร์ตที่ใช้สำหรับอินสแตนซ์แรกซึ่งก็คือ 3306
โดยค่าเริ่มต้น.
ในการเปิดใช้งานอินสแตนซ์ที่สองนี้เพื่อใช้ไบนารี MySQL เดียวกันเราจำเป็นต้อง ตั้งค่าที่แตกต่างกัน สำหรับ socket
, pid-file
, datadir
และ log_error
.
เราต้องเปิดใช้งาน relay-log
เพื่อใช้อินสแตนซ์ที่สองเป็นทาส ( พารามิเตอร์ relay-log
, relay-log-index
และ relay-log-info-file
) รวมถึงการตั้งค่า master-info-file
สุดท้ายเพื่อทำให้อินสแตนซ์ทาสเป็นพารามิเตอร์แบบอ่านอย่างเดียว read_only
ถูกตั้งค่าเป็น 1
. คุณควรระมัดระวังกับตัวเลือกนี้เนื่องจากไม่ได้ป้องกันการเปลี่ยนแปลงในทาสอย่างสมบูรณ์ แม้ในขณะที่ read_only
ถูกตั้งค่าเป็น 1
การอัปเดตจะได้รับอนุญาตจากผู้ใช้ที่มี SUPER
เท่านั้น สิทธิพิเศษ. MySQL เพิ่งเปิดตัวพารามิเตอร์ใหม่ super_read_only
เพื่อป้องกัน SUPER
ผู้ใช้ทำการเปลี่ยนแปลง ตัวเลือกนี้สามารถใช้ได้กับเวอร์ชัน 5.7.8
นอกเหนือจาก [mysqld1]
และ [mysqld2]
กลุ่มเราต้องเพิ่มกลุ่มใหม่ด้วย [mysqld_multi]
ไปที่ my.cnf
ไฟล์:
[mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass
เมื่อเราติดตั้งอินสแตนซ์ MySQL ที่สองและเราเริ่มต้นทั้งสองเราจะให้สิทธิ์ที่เหมาะสมกับ multi_admin
ผู้ใช้เพื่อให้สามารถปิดอินสแตนซ์ MySQL ได้
ในขั้นตอนก่อนหน้านี้เราเตรียมไฟล์คอนฟิกูเรชันสำหรับอินสแตนซ์ MySQL ที่สอง ในไฟล์คอนฟิกูเรชันนั้นจะใช้โฟลเดอร์ใหม่สองโฟลเดอร์ ควรใช้คำสั่ง Linux ต่อไปนี้เพื่อสร้างโฟลเดอร์เหล่านั้นด้วยสิทธิ์ที่เหมาะสม:
mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave
ในสภาพแวดล้อม Linux บางอย่าง AppArmor จำเป็นต้องมีการตั้งค่าความปลอดภัยเพื่อเรียกใช้อินสแตนซ์ MySQL ที่สอง อย่างน้อยก็จำเป็นต้องใช้บน Ubuntu
ในการตั้งค่า AppArmor อย่างถูกต้องให้แก้ไข /etc/apparmor.d/usr.sbin.mysqld
ไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบเพิ่มบรรทัดต่อไปนี้:
/var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,
หลังจากที่คุณบันทึกไฟล์แล้วให้รีบูตเครื่องเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล
อาจใช้วิธีการต่างๆมากมายสำหรับการติดตั้งอินสแตนซ์ MySQL ที่สอง แนวทางที่นำเสนอในบทช่วยสอนนี้ใช้ไบนารี MySQL เดียวกันกับแบบแรกโดยมีไฟล์ข้อมูลแยกต่างหากที่จำเป็นสำหรับการติดตั้งครั้งที่สอง
เนื่องจากเราได้เตรียมไฟล์คอนฟิกูเรชันและโฟลเดอร์ที่จำเป็นและการเปลี่ยนแปลงความปลอดภัยในขั้นตอนก่อนหน้าแล้วขั้นตอนการติดตั้งขั้นสุดท้ายของอินสแตนซ์ MySQL ที่สองคือการเริ่มต้นไดเร็กทอรีข้อมูล MySQL
ดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มต้นไดเร็กทอรีข้อมูล MySQL ใหม่:
วิธีการสร้างภาพข้อมูล
mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave
เมื่อเริ่มต้นไดเรกทอรีข้อมูล MySQL แล้วคุณสามารถเริ่มต้นอินสแตนซ์ MySQL ทั้งสองได้โดยใช้ mysqld_multi
บริการ:
mysqld_multi start
ตั้งค่า root
รหัสผ่านสำหรับอินสแตนซ์ MySQL ที่สองโดยใช้ mysqladmin
ด้วยโฮสต์และพอร์ตที่เหมาะสม โปรดทราบว่าหากไม่ได้ระบุโฮสต์และพอร์ต mysqladmin
จะเชื่อมต่อกับอินสแตนซ์ MySQL แรกโดยค่าเริ่มต้น:
mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd
ในตัวอย่างด้านบนฉันตั้งรหัสผ่านเป็น“ rootpwd” แต่ขอแนะนำให้ใช้รหัสผ่านที่ปลอดภัยกว่านี้
mysqld_multi
ในตอนท้ายของส่วน“ การตั้งค่า mysqld_multi” ฉันเขียนว่าเราจะให้สิทธิพิเศษที่เหมาะสมกับ multi_admin
ผู้ใช้ในภายหลังดังนั้นตอนนี้ถึงเวลาแล้ว เราจำเป็นต้องให้สิทธิ์ที่เหมาะสมแก่ผู้ใช้นี้ในทั้งสองกรณีดังนั้นก่อนอื่นมาเชื่อมต่อกับอินสแตนซ์แรก:
mysql --host=127.0.0.1 --port=3306 -uroot -p
เมื่อเข้าสู่ระบบแล้วให้ดำเนินการสองคำสั่งต่อไปนี้:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
ออกจากไคลเอนต์ MySQL และเชื่อมต่อกับอินสแตนซ์ที่สอง:
mysql --host=127.0.0.1 --port=3307 -uroot -p
เมื่อเข้าสู่ระบบแล้วให้ดำเนินการสองคำสั่งเดียวกันกับด้านบน:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
ออกจากไคลเอนต์ MySQL
ขั้นตอนสุดท้ายของการตั้งค่า mysqld_multi
คือการติดตั้งสคริปต์การบูตอัตโนมัติใน init.d
ในการทำเช่นนั้นให้สร้างไฟล์ใหม่ชื่อ mysqld_multi
ใน /etc/init.d
และให้สิทธิ์ที่เหมาะสม:
cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi
เปิดไฟล์ใหม่นี้ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและคัดลอกสคริปต์ต่อไปนี้:
#!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi='$bindir/mysqld_multi'; else echo 'Can't execute $bindir/mysqld_multi'; exit; fi case '' in 'start' ) '$mysqld_multi' start ;; 'stop' ) '$mysqld_multi' stop ;; 'report' ) '$mysqld_multi' report ;; 'restart' ) '$mysqld_multi' stop '$mysqld_multi' start ;; *) echo 'Usage: MySQL Master-Slave Replication บนเครื่องเดียวกัน
การจำลองแบบ MySQL เป็นกระบวนการที่ช่วยให้สามารถคัดลอกข้อมูลจากเซิร์ฟเวอร์ฐานข้อมูล MySQL (ตัวหลัก) ไปยังเซิร์ฟเวอร์ฐานข้อมูล MySQL อย่างน้อยหนึ่งเซิร์ฟเวอร์ (ทาส) โดยอัตโนมัติ โดยปกติจะใช้เพื่อกระจายการเข้าถึงแบบอ่านบนเซิร์ฟเวอร์หลายเครื่องเพื่อความสามารถในการปรับขยายแม้ว่าจะสามารถใช้เพื่อวัตถุประสงค์อื่น ๆ เช่นสำหรับการเฟลโอเวอร์หรือวิเคราะห์ข้อมูลบนทาสเพื่อไม่ให้มาสเตอร์โอเวอร์โหลด
เนื่องจากการจำลองแบบ Master-Slave เป็นการจำลองแบบทางเดียว (จากต้นแบบไปยังทาส) ฐานข้อมูลหลักเท่านั้นที่ใช้สำหรับการดำเนินการเขียนในขณะที่การดำเนินการอ่านอาจกระจายไปบนฐานข้อมูล Slave หลายฐานข้อมูล สิ่งนี้หมายความว่าหากใช้การจำลองแบบ Master-Slave เป็นโซลูชันการขยายขนาดคุณต้องมีแหล่งข้อมูลอย่างน้อยสองแหล่งที่กำหนดแหล่งข้อมูลหนึ่งสำหรับการดำเนินการเขียนและแหล่งที่สองสำหรับการดำเนินการอ่าน
นักพัฒนา MySQL โดยปกติจะทำงานบนเครื่องเดียวและมีแนวโน้มที่จะมีสภาพแวดล้อมการพัฒนาทั้งหมดในเครื่องนั้นโดยมีตรรกะที่ว่าพวกเขาไม่ได้ขึ้นอยู่กับเครือข่ายหรือการเชื่อมต่ออินเทอร์เน็ต หากจำเป็นต้องมีการจำลองแบบ master-slave เนื่องจากตัวอย่างเช่นพวกเขาจำเป็นต้องทดสอบการจำลองแบบในสภาพแวดล้อมการพัฒนาก่อนที่จะปรับใช้การเปลี่ยนแปลงที่อื่นพวกเขาจะต้องสร้างในเครื่องเดียวกัน แม้ว่าการตั้งค่าอินสแตนซ์ MySQL เดียวนั้นค่อนข้างง่าย แต่เราจำเป็นต้องใช้ความพยายามเป็นพิเศษในการตั้งค่าวินาทีจากนั้นจึงทำการจำลองแบบ Master-Slave
สำหรับบทแนะนำทีละขั้นตอนนี้ฉันได้เลือก Ubuntu Linux เป็นระบบปฏิบัติการโฮสต์และคำสั่งที่มีให้สำหรับระบบปฏิบัติการนั้น หากคุณต้องการตั้งค่าการจำลอง MySQL master-slave บนระบบปฏิบัติการอื่นคุณจะต้องทำการแก้ไขสำหรับคำสั่งเฉพาะของมัน อย่างไรก็ตามหลักการทั่วไปของการตั้งค่าการจำลองแบบ Master-Slave MySQL บนเครื่องเดียวกันจะเหมือนกันสำหรับระบบปฏิบัติการทั้งหมด
หากคุณมี ฐานข้อมูล MySQL ติดตั้งบนเครื่องของคุณคุณสามารถข้ามขั้นตอนนี้ได้
วิธีที่ง่ายที่สุดในการติดตั้ง MySQL บน Ubuntu คือเรียกใช้คำสั่งต่อไปนี้จากพรอมต์เทอร์มินัล:
sudo apt-get install mysql-server
ในระหว่างขั้นตอนการติดตั้งคุณจะได้รับแจ้งให้ตั้งรหัสผ่านสำหรับ MySQL root
ผู้ใช้
mysqld_multi
ในการจัดการอินสแตนซ์ MySQL สองอินสแตนซ์บนเครื่องเดียวกันอย่างมีประสิทธิภาพเราจำเป็นต้องใช้ mysqld_multi
.
ขั้นตอนแรกในการตั้งค่า mysqld_multi
คือการสร้างสองแยก [mysqld]
กลุ่มใน my.cnf
ที่มีอยู่ ไฟล์. ตำแหน่งเริ่มต้นของ my.cnf
ไฟล์บน Ubuntu คือ /etc/mysql/
. ดังนั้นเปิด my.cnf
ไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและเปลี่ยนชื่อ [mysqld]
ที่มีอยู่ รวมกลุ่มเพื่อ [mysqld1]
. กลุ่มที่เปลี่ยนชื่อนี้จะใช้สำหรับการกำหนดค่าอินสแตนซ์ MySQL แรกและจะถูกกำหนดค่าเป็นอินสแตนซ์หลักด้วย เช่นเดียวกับในการจำลองแบบ Master-Slave MySQL แต่ละอินสแตนซ์ต้องมีเอกลักษณ์ของตัวเอง server-id
เพิ่มบรรทัดต่อไปนี้ใน [mysqld1]
กลุ่ม:
server-id = 1
เนื่องจากเราต้องแยก [mysqld]
กลุ่มสำหรับอินสแตนซ์ MySQL ที่สองคัดลอก [mysqld1]
จัดกลุ่มที่มีการกำหนดค่าปัจจุบันทั้งหมดและวางไว้ด้านล่างด้วย my.cnf
ไฟล์. ตอนนี้เปลี่ยนชื่อกลุ่มที่คัดลอกเป็น [mysqld2]
และทำการเปลี่ยนแปลงต่อไปนี้ในการกำหนดค่าสำหรับทาส:
server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1
ในการตั้งค่าอินสแตนซ์ MySQL ที่สองเป็นทาสให้ตั้งค่า server-id
เป็น 2 เนื่องจากต้องแตกต่างกับรหัสเซิร์ฟเวอร์ของหลัก
เนื่องจากทั้งสองอินสแตนซ์จะทำงานบนเครื่องเดียวกันให้ตั้งค่า port
สำหรับอินสแตนซ์ที่สองเป็น 3307
เนื่องจากจะต้องแตกต่างจากพอร์ตที่ใช้สำหรับอินสแตนซ์แรกซึ่งก็คือ 3306
โดยค่าเริ่มต้น.
ในการเปิดใช้งานอินสแตนซ์ที่สองนี้เพื่อใช้ไบนารี MySQL เดียวกันเราจำเป็นต้อง ตั้งค่าที่แตกต่างกัน สำหรับ socket
, pid-file
, datadir
และ log_error
.
เราต้องเปิดใช้งาน relay-log
เพื่อใช้อินสแตนซ์ที่สองเป็นทาส ( พารามิเตอร์ relay-log
, relay-log-index
และ relay-log-info-file
) รวมถึงการตั้งค่า master-info-file
สุดท้ายเพื่อทำให้อินสแตนซ์ทาสเป็นพารามิเตอร์แบบอ่านอย่างเดียว read_only
ถูกตั้งค่าเป็น 1
. คุณควรระมัดระวังกับตัวเลือกนี้เนื่องจากไม่ได้ป้องกันการเปลี่ยนแปลงในทาสอย่างสมบูรณ์ แม้ในขณะที่ read_only
ถูกตั้งค่าเป็น 1
การอัปเดตจะได้รับอนุญาตจากผู้ใช้ที่มี SUPER
เท่านั้น สิทธิพิเศษ. MySQL เพิ่งเปิดตัวพารามิเตอร์ใหม่ super_read_only
เพื่อป้องกัน SUPER
ผู้ใช้ทำการเปลี่ยนแปลง ตัวเลือกนี้สามารถใช้ได้กับเวอร์ชัน 5.7.8
นอกเหนือจาก [mysqld1]
และ [mysqld2]
กลุ่มเราต้องเพิ่มกลุ่มใหม่ด้วย [mysqld_multi]
ไปที่ my.cnf
ไฟล์:
[mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass
เมื่อเราติดตั้งอินสแตนซ์ MySQL ที่สองและเราเริ่มต้นทั้งสองเราจะให้สิทธิ์ที่เหมาะสมกับ multi_admin
ผู้ใช้เพื่อให้สามารถปิดอินสแตนซ์ MySQL ได้
ในขั้นตอนก่อนหน้านี้เราเตรียมไฟล์คอนฟิกูเรชันสำหรับอินสแตนซ์ MySQL ที่สอง ในไฟล์คอนฟิกูเรชันนั้นจะใช้โฟลเดอร์ใหม่สองโฟลเดอร์ ควรใช้คำสั่ง Linux ต่อไปนี้เพื่อสร้างโฟลเดอร์เหล่านั้นด้วยสิทธิ์ที่เหมาะสม:
mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave
ในสภาพแวดล้อม Linux บางอย่าง AppArmor จำเป็นต้องมีการตั้งค่าความปลอดภัยเพื่อเรียกใช้อินสแตนซ์ MySQL ที่สอง อย่างน้อยก็จำเป็นต้องใช้บน Ubuntu
ในการตั้งค่า AppArmor อย่างถูกต้องให้แก้ไข /etc/apparmor.d/usr.sbin.mysqld
ไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบเพิ่มบรรทัดต่อไปนี้:
/var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,
หลังจากที่คุณบันทึกไฟล์แล้วให้รีบูตเครื่องเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล
อาจใช้วิธีการต่างๆมากมายสำหรับการติดตั้งอินสแตนซ์ MySQL ที่สอง แนวทางที่นำเสนอในบทช่วยสอนนี้ใช้ไบนารี MySQL เดียวกันกับแบบแรกโดยมีไฟล์ข้อมูลแยกต่างหากที่จำเป็นสำหรับการติดตั้งครั้งที่สอง
เนื่องจากเราได้เตรียมไฟล์คอนฟิกูเรชันและโฟลเดอร์ที่จำเป็นและการเปลี่ยนแปลงความปลอดภัยในขั้นตอนก่อนหน้าแล้วขั้นตอนการติดตั้งขั้นสุดท้ายของอินสแตนซ์ MySQL ที่สองคือการเริ่มต้นไดเร็กทอรีข้อมูล MySQL
ดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มต้นไดเร็กทอรีข้อมูล MySQL ใหม่:
mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave
เมื่อเริ่มต้นไดเรกทอรีข้อมูล MySQL แล้วคุณสามารถเริ่มต้นอินสแตนซ์ MySQL ทั้งสองได้โดยใช้ mysqld_multi
บริการ:
mysqld_multi start
ตั้งค่า root
รหัสผ่านสำหรับอินสแตนซ์ MySQL ที่สองโดยใช้ mysqladmin
ด้วยโฮสต์และพอร์ตที่เหมาะสม โปรดทราบว่าหากไม่ได้ระบุโฮสต์และพอร์ต mysqladmin
จะเชื่อมต่อกับอินสแตนซ์ MySQL แรกโดยค่าเริ่มต้น:
mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd
ในตัวอย่างด้านบนฉันตั้งรหัสผ่านเป็น“ rootpwd” แต่ขอแนะนำให้ใช้รหัสผ่านที่ปลอดภัยกว่านี้
mysqld_multi
ในตอนท้ายของส่วน“ การตั้งค่า mysqld_multi” ฉันเขียนว่าเราจะให้สิทธิพิเศษที่เหมาะสมกับ multi_admin
ผู้ใช้ในภายหลังดังนั้นตอนนี้ถึงเวลาแล้ว เราจำเป็นต้องให้สิทธิ์ที่เหมาะสมแก่ผู้ใช้นี้ในทั้งสองกรณีดังนั้นก่อนอื่นมาเชื่อมต่อกับอินสแตนซ์แรก:
mysql --host=127.0.0.1 --port=3306 -uroot -p
เมื่อเข้าสู่ระบบแล้วให้ดำเนินการสองคำสั่งต่อไปนี้:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
ออกจากไคลเอนต์ MySQL และเชื่อมต่อกับอินสแตนซ์ที่สอง:
mysql --host=127.0.0.1 --port=3307 -uroot -p
เมื่อเข้าสู่ระบบแล้วให้ดำเนินการสองคำสั่งเดียวกันกับด้านบน:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
ออกจากไคลเอนต์ MySQL
ขั้นตอนสุดท้ายของการตั้งค่า mysqld_multi
คือการติดตั้งสคริปต์การบูตอัตโนมัติใน init.d
ในการทำเช่นนั้นให้สร้างไฟล์ใหม่ชื่อ mysqld_multi
ใน /etc/init.d
และให้สิทธิ์ที่เหมาะสม:
cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi
เปิดไฟล์ใหม่นี้ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและคัดลอกสคริปต์ต่อไปนี้:
#!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi='$bindir/mysqld_multi'; else echo 'Can't execute $bindir/mysqld_multi'; exit; fi case '$1' in 'start' ) '$mysqld_multi' start $2 ;; 'stop' ) '$mysqld_multi' stop $2 ;; 'report' ) '$mysqld_multi' report $2 ;; 'restart' ) '$mysqld_multi' stop $2 '$mysqld_multi' start $2 ;; *) echo 'Usage: $0 start' >&2 ;; esac
เพิ่ม mysqld_multi
บริการเป็นค่าเริ่มต้น runlevels
ด้วยคำสั่งต่อไปนี้:
update-rc.d mysqld_multi defaults
รีบูตเครื่องของคุณและตรวจสอบว่าอินสแตนซ์ MySQL ทั้งสองกำลังทำงานโดยใช้คำสั่งต่อไปนี้:
mysqld_multi report
ตอนนี้เมื่อเรามีอินสแตนซ์ MySQL สองอินสแตนซ์ที่ทำงานบนเครื่องเดียวกันเราจะตั้งค่าอินสแตนซ์แรกเป็นมาสเตอร์และอันที่สองเป็นทาส
ส่วนหนึ่งของการกำหนดค่าได้ดำเนินการไปแล้วในบท“ การตั้งค่า mysqld_multi” การเปลี่ยนแปลงเดียวที่เหลืออยู่ใน my.cnf
ไฟล์คือการตั้งค่าการบันทึกไบนารีบนต้นแบบ ในการดำเนินการนี้ให้แก้ไข my.cnf
ไฟล์ที่มีการเปลี่ยนแปลงและเพิ่มเติมต่อไปนี้ใน [mysqld1]
กลุ่ม:
log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW
รีสตาร์ทอินสแตนซ์ MySQL หลักเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล:
mysqld_multi stop 1 mysqld_multi start 1
เพื่อให้ทาสเชื่อมต่อกับต้นแบบด้วยสิทธิ์การจำลองแบบที่ถูกต้องควรสร้างผู้ใช้ใหม่บนต้นแบบ เชื่อมต่อกับอินสแตนซ์หลักโดยใช้ไคลเอนต์ MySQL กับโฮสต์และพอร์ตที่เหมาะสม:
mysql -uroot -p --host=127.0.0.1 --port=3306
สร้างผู้ใช้ใหม่สำหรับการจำลองแบบ:
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
ออกจากไคลเอนต์ MySQL
ดำเนินการคำสั่งต่อไปนี้เพื่อสร้างดัมพ์ของข้อมูลหลัก:
mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql
ที่นี่เราใช้ตัวเลือก --master-data=2
เพื่อให้มีความคิดเห็นที่มี CHANGE MASTER
คำสั่งภายในไฟล์สำรอง ความคิดเห็นนั้นระบุพิกัดการจำลองในขณะที่ทำการสำรองข้อมูลและเราจะต้องใช้พิกัดเหล่านั้นในภายหลังสำหรับการอัปเดตข้อมูลหลักในอินสแตนซ์ทาส นี่คือตัวอย่างของความคิดเห็นนั้น:
-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;
อิมพอร์ตดัมพ์ที่คุณสร้างในขั้นตอนก่อนหน้าลงในอินสแตนซ์ทาส:
mysql -uroot -p --host=127.0.0.1 --port=3307 สุดท้ายเพื่อให้อินสแตนซ์ทาสเชื่อมต่อกับอินสแตนซ์หลักข้อมูลหลักบนทาสจำเป็นต้องได้รับการอัปเดตด้วยพารามิเตอร์การเชื่อมต่อที่เหมาะสม
เชื่อมต่อกับอินสแตนซ์ทาสโดยใช้ไคลเอนต์ MySQL กับโฮสต์และพอร์ตที่เหมาะสม:
mysql -uroot -p --host=127.0.0.1 --port=3307
ดำเนินการคำสั่งต่อไปนี้เพื่ออัปเดตข้อมูลหลัก (ใช้พิกัดการจำลองแบบจากไฟล์ดัมพ์ replicationdump.sql
ตามที่อธิบายไว้ข้างต้น):
mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;
ดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มทาส:
mysql> START SLAVE;
ดำเนินการคำสั่งต่อไปนี้เพื่อตรวจสอบว่าการจำลองแบบพร้อมใช้งาน:
mysql> SHOW SLAVE STATUS G
ยินดีด้วย. การจำลอง MySQL master-slave ของคุณบนเครื่องเดียวกันได้รับการตั้งค่าเรียบร้อยแล้ว

สรุป
การมีการจำลองแบบ Master-Slave ที่กำหนดค่าไว้ในสภาพแวดล้อมการพัฒนาของคุณจะมีประโยชน์หากคุณต้องการสำหรับโซลูชันแบบขยายขนาดในสภาพแวดล้อมการผลิต ด้วยวิธีนี้คุณจะมีแหล่งข้อมูลแยกต่างหากที่กำหนดค่าสำหรับการเขียนและการอ่านเพื่อให้คุณสามารถทดสอบในเครื่องได้ว่าทุกอย่างทำงานตามที่คาดไว้ก่อนที่จะนำไปใช้งานต่อ
นอกจากนี้คุณอาจต้องการกำหนดค่าอินสแตนซ์ทาสหลายรายการบนเครื่องเดียวกันเพื่อทดสอบตัวโหลดบาลานเซอร์ที่กระจายการดำเนินการอ่านไปยังทาสหลายตัว ในกรณีนี้คุณสามารถใช้คู่มือเดียวกันนี้เพื่อตั้งค่าอินสแตนซ์ทาสอื่น ๆ โดยทำซ้ำขั้นตอนเดียวกันทั้งหมด
เพิ่ม mysqld_multi
บริการเป็นค่าเริ่มต้น runlevels
ด้วยคำสั่งต่อไปนี้:
update-rc.d mysqld_multi defaults
รีบูตเครื่องของคุณและตรวจสอบว่าอินสแตนซ์ MySQL ทั้งสองกำลังทำงานโดยใช้คำสั่งต่อไปนี้:
mysqld_multi report
ตอนนี้เมื่อเรามีอินสแตนซ์ MySQL สองอินสแตนซ์ที่ทำงานบนเครื่องเดียวกันเราจะตั้งค่าอินสแตนซ์แรกเป็นมาสเตอร์และอันที่สองเป็นทาส
ส่วนหนึ่งของการกำหนดค่าได้ดำเนินการไปแล้วในบท“ การตั้งค่า mysqld_multi” การเปลี่ยนแปลงเดียวที่เหลืออยู่ใน my.cnf
ไฟล์คือการตั้งค่าการบันทึกไบนารีบนต้นแบบ ในการดำเนินการนี้ให้แก้ไข my.cnf
ไฟล์ที่มีการเปลี่ยนแปลงและเพิ่มเติมต่อไปนี้ใน [mysqld1]
กลุ่ม:
log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW
รีสตาร์ทอินสแตนซ์ MySQL หลักเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล:
mysqld_multi stop 1 mysqld_multi start 1
เพื่อให้ทาสเชื่อมต่อกับต้นแบบด้วยสิทธิ์การจำลองแบบที่ถูกต้องควรสร้างผู้ใช้ใหม่บนต้นแบบ เชื่อมต่อกับอินสแตนซ์หลักโดยใช้ไคลเอนต์ MySQL กับโฮสต์และพอร์ตที่เหมาะสม:
mysql -uroot -p --host=127.0.0.1 --port=3306
สร้างผู้ใช้ใหม่สำหรับการจำลองแบบ:
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
ออกจากไคลเอนต์ MySQL
ดำเนินการคำสั่งต่อไปนี้เพื่อสร้างดัมพ์ของข้อมูลหลัก:
mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql
ที่นี่เราใช้ตัวเลือก --master-data=2
เพื่อให้มีความคิดเห็นที่มี CHANGE MASTER
คำสั่งภายในไฟล์สำรอง ความคิดเห็นนั้นระบุพิกัดการจำลองในขณะที่ทำการสำรองข้อมูลและเราจะต้องใช้พิกัดเหล่านั้นในภายหลังสำหรับการอัปเดตข้อมูลหลักในอินสแตนซ์ทาส นี่คือตัวอย่างของความคิดเห็นนั้น:
-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;
อิมพอร์ตดัมพ์ที่คุณสร้างในขั้นตอนก่อนหน้าลงในอินสแตนซ์ทาส:
mysql -uroot -p --host=127.0.0.1 --port=3307 สุดท้ายเพื่อให้อินสแตนซ์ทาสเชื่อมต่อกับอินสแตนซ์หลักข้อมูลหลักบนทาสจำเป็นต้องได้รับการอัปเดตด้วยพารามิเตอร์การเชื่อมต่อที่เหมาะสม
เชื่อมต่อกับอินสแตนซ์ทาสโดยใช้ไคลเอนต์ MySQL กับโฮสต์และพอร์ตที่เหมาะสม:
วิธีการเรียกใช้การจำลองมอนติคาร์โล
mysql -uroot -p --host=127.0.0.1 --port=3307
ดำเนินการคำสั่งต่อไปนี้เพื่ออัปเดตข้อมูลหลัก (ใช้พิกัดการจำลองแบบจากไฟล์ดัมพ์ replicationdump.sql
ตามที่อธิบายไว้ข้างต้น):
mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;
ดำเนินการคำสั่งต่อไปนี้เพื่อเริ่มทาส:
mysql> START SLAVE;
ดำเนินการคำสั่งต่อไปนี้เพื่อตรวจสอบว่าการจำลองแบบพร้อมใช้งาน:
mysql> SHOW SLAVE STATUS G
ยินดีด้วย. การจำลอง MySQL master-slave ของคุณบนเครื่องเดียวกันได้รับการตั้งค่าเรียบร้อยแล้ว

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