การจำลองแบบ ในฐานข้อมูล SQL เป็นกระบวนการคัดลอกข้อมูลจากฐานข้อมูลต้นทางไปยังฐานข้อมูลอื่น (หรือหลายฐานข้อมูล) และในทางกลับกัน ข้อมูลจากเซิร์ฟเวอร์ฐานข้อมูลหนึ่งจะถูกคัดลอกไปยังเซิร์ฟเวอร์อย่างน้อยหนึ่งเซิร์ฟเวอร์อย่างต่อเนื่อง คุณสามารถใช้การจำลองแบบเพื่อแจกจ่ายและสร้างสมดุลให้กับคำขอในกลุ่มเซิร์ฟเวอร์ที่จำลองแบบ ให้เฟลโอเวอร์ และความพร้อมใช้งานสูงของฐานข้อมูล MariaDB MariaDB (และ MySQL) อนุญาตให้ใช้การจำลองฐานข้อมูลสองประเภท:Master-Master และ ปรมาจารย์-ทาส . ในบทความนี้เราจะพิจารณาวิธีกำหนดค่าการจำลองแบบ MariaDB ทั้งสองประเภทบน Linux CentOS 7
กำลังติดตั้ง MariaDB
ก่อนหน้านี้ เราได้เผยแพร่บทความที่อธิบายขั้นตอนการติดตั้ง MariaDB บน CentOS 7 คุณสามารถอ่านได้จากลิงก์:https://woshub.com/mariadb-install-configure-tunning-centos ดังนั้นเราจะไม่เน้นที่การติดตั้ง MariaDB แต่ไปที่วิธีกำหนดค่าการจำลองแบบ
การกำหนดค่า Simple Master-Master Replication บน MariaDB
ในรูปแบบการจำลองแบบ Master-Master เซิร์ฟเวอร์ฐานข้อมูล MariaDB/MySQL ใดๆ อาจใช้ทั้งในการเขียนหรืออ่านข้อมูล การจำลองแบบขึ้นอยู่กับไฟล์ binlog พิเศษ เซิร์ฟเวอร์หลักจะบันทึกการดำเนินการทั้งหมดที่มีฐานข้อมูลไว้ เซิร์ฟเวอร์ Slave จะเชื่อมต่อกับ Master และใช้คำสั่งกับฐานข้อมูล
1. MariaDB:การกำหนดค่าเซิร์ฟเวอร์หลักตัวแรก (Master-1)
เพิ่มบรรทัดต่อไปนี้ใน my.cnf ไฟล์บนเซิร์ฟเวอร์ MariaDB แรกของคุณ:
#replicationserver_id =1report_host =masterlog_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_index =/var/lib/ mysql/relay-bin.index
service mariadb restart
สร้างผู้ใช้เพื่อกำหนดค่าการจำลองแบบ:
mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';
ในการเพิ่ม Slave เราต้องรับข้อมูล bin_log จากเซิร์ฟเวอร์ Master-1:
MariaDB [(none)]> show master status;
2. MariaDB:การกำหนดค่าของเซิร์ฟเวอร์หลักที่สอง (Master-2)
เชื่อมต่อกับเซิร์ฟเวอร์ MariaDB ที่สอง เปิดไฟล์ my.cnf และเพิ่มการกำหนดค่าต่อไปนี้:
#replicationserver_id =2report_host =master2log_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_index =/var/lib/ mysql/relay-bin.index
สร้างผู้ใช้ใหม่บนเซิร์ฟเวอร์ที่สองด้วย:
create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';
รับ bin_log บน Master-2:
MariaDB [(none)]> show master status;
มากำหนดค่าการเชื่อมต่อระหว่างเซิร์ฟเวอร์ MariaDB ในคลัสเตอร์การจำลองซอฟต์แวร์ของเรา:
หยุดทาส:
STOP SLAVE;
เพิ่ม Master-1 ไปยังเซิร์ฟเวอร์ที่สอง:
CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;
เริ่มการจำลองแบบ:
START SLAVE;
เชื่อมต่อกับ Master-1 และทำตามขั้นตอนเดียวกัน แต่ระบุข้อมูลเกี่ยวกับเซิร์ฟเวอร์ที่สองแทน:
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;
ตรวจสอบสถานะเซิร์ฟเวอร์ที่สอง:
show slave status \G
ดังที่คุณเห็นในภาพหน้าจอ มีการเชื่อมต่อระหว่างสองเซิร์ฟเวอร์และไม่มีข้อผิดพลาดเกิดขึ้น
3. จะตรวจสอบการจำลองระหว่างเซิร์ฟเวอร์ MariaDB ได้อย่างไร
จากนั้นเพื่อให้แน่ใจว่าการจำลองแบบระหว่างสองเซิร์ฟเวอร์ MariaDB ทำงานใน master+master เราจะสร้างฐานข้อมูลใหม่บน Master-1 และสร้างตารางในนั้น
MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
ตรวจสอบให้แน่ใจว่าฐานข้อมูลนี้ได้จำลองแบบอัตโนมัติบนต้นแบบที่สองและมีตารางเดียวกัน:
MariaDB [(none)]> show databases;
MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;
ฐานข้อมูลถูกสร้างขึ้นบนต้นแบบที่สองเช่นกัน หากต้องการตรวจสอบวงจรทั้งหมด ให้สร้างตารางในฐานข้อมูล Master1 บนเซิร์ฟเวอร์หลักที่สองและตรวจสอบว่าปรากฏบนเซิร์ฟเวอร์เครื่องแรกหรือไม่
MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
ตาราง hello_master1 ถูกจำลองไปยังเซิร์ฟเวอร์แรก:
MariaDB [master1]> show tables;
อย่างที่คุณเห็น ตารางใหม่ได้ปรากฏบน Master-1 แล้ว การจำลองแบบได้ผล
จะตั้งค่าการจำลอง Master-Slave ใน MariaDB ได้อย่างไร
ในโหมดการจำลองแบบ MariaDB มาสเตอร์-ทาส เซิร์ฟเวอร์หนึ่งทำหน้าที่เป็นทาส และข้อมูลจากเซิร์ฟเวอร์หลักจะถูกเขียนไปยังเซิร์ฟเวอร์นั้นอย่างต่อเนื่อง การเปลี่ยนแปลงทั้งหมดที่คุณทำบนเซิร์ฟเวอร์ Slave จะไม่ถูกโอนไปยังเซิร์ฟเวอร์หลัก ประเภทการจำลองแบบฐานข้อมูลนี้มีความยืดหยุ่นและใช้บ่อยขึ้น ในการกำหนดค่านี้ คุณจะมีเซิร์ฟเวอร์สำรองที่มีฐานข้อมูลที่ทันสมัยอยู่เสมอ และหากเซิร์ฟเวอร์รองล้มเหลว มาสเตอร์จะไม่สูญเสียข้อมูลใดๆ คุณยังสามารถกระจายโหลดฐานข้อมูลสำหรับโครงการของคุณเพื่อให้แอพอ่านข้อมูลจากเซิร์ฟเวอร์ Slave ของคุณและเขียนข้อมูลไปยังเซิร์ฟเวอร์หลักเท่านั้น ดังนั้น คุณจึงทำให้การตอบสนองของฐานข้อมูลเป็นไปอย่างรวดเร็วที่สุด
เมื่อกำหนดค่าการจำลองแบบ master+slave ของฐานข้อมูล MariaDB เซิร์ฟเวอร์หลัก (master1) จะได้รับการกำหนดค่าตามที่อธิบายไว้ข้างต้น
ย้ายไปที่เซิร์ฟเวอร์สเลฟ เพิ่มการกำหนดค่าต่อไปนี้ในไฟล์ทาส my.cnf:
#replicationserver_id =2report_host =slave2log_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_index =/var/lib/ mysql/relay-bin.index
เริ่มบริการ MariaDB ใหม่ รับข้อมูล bin_log จากเซิร์ฟเวอร์แรก:
MariaDB [(none)]> show master status;
รันคำสั่งเหล่านี้ในคอนโซล mariadb บนเซิร์ฟเวอร์สเลฟ:
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;
SET GLOBAL read_only = ON;
คุณต้องสร้างดัมพ์หน่วยความจำฐานข้อมูลและใช้เพื่ออัพโหลดข้อมูลครั้งแรกไปยัง MariaDB บนเซิร์ฟเวอร์สเลฟของคุณ
วิธีตรวจสอบสถานะทาส:SHOW SLAVE STATUS\G;
ในการสร้างฐานข้อมูลบน Master:
MariaDB [(none)]> create database master_hello;
ตรวจสอบให้แน่ใจว่าฐานข้อมูลถูกสร้างขึ้นบนเซิร์ฟเวอร์ Slave ด้วย:
MariaDB [(none)]> show databases;
สร้างฐานข้อมูลบนเซิร์ฟเวอร์ Slave และตรวจสอบว่าฐานข้อมูลถูกจำลองไปยัง Master หรือไม่
อย่างที่คุณเห็น เราได้สร้างฐานข้อมูลและมีอยู่ใน Slave มาดูกันว่ามันปรากฏบนอาจารย์หรือไม่ มันไม่มี ข้อมูลจะไม่ถูกจำลองแบบจากสเลฟเป็นมาสเตอร์
หมายความว่าการจำลองแบบ MariaDB ทำงานในทิศทางเดียวเท่านั้น มาตรวจสอบอีกครั้งและลบ master_hello ฐานข้อมูลจากเซิร์ฟเวอร์ Slave:
ตรวจสอบว่าได้ลบออกจากเซิร์ฟเวอร์หลักหรือไม่:
อย่างที่คุณเห็น ไม่เป็นไรและมีฐานข้อมูล
ป.ล.:เมื่อคุณตั้งค่าคอนฟิกการจำลองแบบ mariadb คุณอาจพบข้อผิดพลาดบางประการ โดยที่ไฟร์วอลล์เป็นช่องโหว่ที่พบบ่อยที่สุด ตามค่าเริ่มต้น ไฟร์วอลล์จะถูกติดตั้งใน CentOS ซึ่งจะบล็อกพอร์ตการจำลองแบบ MariaDB (TCP 3396) คุณสามารถเปิดพอร์ตโดยใช้ iptables หรือปิดใช้งานไฟร์วอลล์ของคุณ (ไม่ใช่ตัวเลือกที่ดีที่สุด)
ที่อยู่ IP ที่ฐานข้อมูลกำลังรอการเชื่อมต่อถูกระบุในพารามิเตอร์ bind-address ใน my.cnf.. หากต้องการอนุญาตการเชื่อมต่อภายในและภายนอก คุณต้องแสดงความคิดเห็นบรรทัดนี้และเพิ่มกฎ iptables ที่อนุญาตการเชื่อมต่อจากต้นแบบ /slave ที่อยู่ IP ไปยังพอร์ต 3306
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
ระหว่างการตั้งค่าเริ่มต้น ฉันพบปัญหานี้ แต่ตรวจพบได้ง่าย หากคุณเรียกใช้การตรวจสอบสถานะทาส SHOW SLAVE STATUS\G
คุณจะเห็นข้อผิดพลาดนี้:
คุณสามารถเพิ่มพารามิเตอร์บางอย่างใน #replication
บล็อกในไฟล์ my.cnf ด้านล่างนี้ฉันจะยกตัวอย่างและคำอธิบายสั้น ๆ เกี่ยวกับพารามิเตอร์ที่มีประโยชน์ ฉันจะยกตัวอย่างของฟังก์ชันอื่นๆ ที่อาจมีประโยชน์เมื่อคุณกำหนดค่าการจำลองฐานข้อมูล mariadb
server_id = 1
— ระบุ ID เซิร์ฟเวอร์ โดยปกติเราจะเริ่มต้นด้วย 1 แต่คุณสามารถใช้หมายเลขใดก็ได้ที่ไม่ตรงกับของเซิร์ฟเวอร์อื่นที่ใช้สำหรับการจำลองแบบ
report_host = master
— โดยปกติคุณจะระบุชื่อโฮสต์ของเซิร์ฟเวอร์ แต่คุณสามารถป้อนที่อยู่ IP แทนได้
log_bin = /var/lib/mysql/mariadb-bin
— คือเส้นทางไปยังบันทึกการอัพเดท (log_bin)
log_bin_index = /var/lib/mysql/mariadb-bin.index
— ช่วยให้คุณทราบได้ว่าบันทึกใดใช้งานอยู่และบันทึกใดถูกใช้ก่อนหน้านี้
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
— เป็นบันทึกการจำลองแบบ
หากคุณต้องการกำหนดค่าแบบจำลองของฐานข้อมูลเฉพาะหรือฐานข้อมูลที่เลือก ให้ใช้พารามิเตอร์ต่อไปนี้:
replicate-do-db = dbname
— หากคุณต้องการหลายฐานข้อมูล ให้ระบุชื่อโดยคั่นด้วยเครื่องหมายจุลภาค
หากต้องการแยกฐานข้อมูลบางส่วนออกจากการจำลองแบบ (ตามปกติ ฐานข้อมูลบริการจะไม่รวมอยู่ในการจำลองแบบ:information_schema, mysql และ performance_schema):
binlog-ignore-db = dbname
ในการตั้งเวลาบันทึกประวัติสำหรับ bin_log ของคุณ:
expire_logs_days = 10
— โดยที่ 10 คือจำนวนวันที่บันทึกจะถูกจัดเก็บ
นอกจากนี้ หากข้อมูลจากเซิร์ฟเวอร์หลักของคุณถูกเขียนไปยังฐานข้อมูลด้วยชื่ออื่น คุณสามารถตั้งค่าในไฟล์ปรับแต่งได้:
replicate-rewrite-db=dbmastername->dbslavename
การกำหนดค่าการจำลองแบบเสร็จสมบูรณ์ ฉันคิดว่าเมื่อใช้บทความนี้ คุณจะสามารถกำหนดค่าการจำลองแบบ MariaDB ได้ทั้งในโหมด Master + Master และ Master + Slave โดยไม่มีปัญหาใดๆ