Replication ใน MariaDB เป็นกระบวนการที่ทำให้ข้อมูลจากฐานข้อมูลหนึ่งถูกคัดลอกไปยังอีกฐานข้อมูลหนึ่งโดยอัตโนมัติ โดยทั่วไปแล้ว MariaDB replication ถูกใช้เพื่อ:
- เพิ่มความทนทานต่อความเสียหาย: ในกรณีที่ฐานข้อมูลหลัก (Master) เกิดปัญหา ฐานข้อมูลสำรอง (Slave) สามารถถูกใช้แทนได้
- กระจายโหลดของการอ่าน: คุณสามารถใช้ฐานข้อมูลสำรองเพื่อกระจายการอ่านข้อมูล (Read Load) ทำให้การทำงานของระบบโดยรวมมีประสิทธิภาพมากขึ้น
- ทำการสำรองข้อมูลแบบเรียลไทม์: ข้อมูลในฐานข้อมูลหลักจะถูกคัดลอกไปยังฐานข้อมูลสำรองอย่างต่อเนื่อง ทำให้สามารถสำรองข้อมูลแบบเรียลไทม์ได้
ขั้นตอนการทำ
โครงสร้างไฟล์
ขั้นตอนที่ 1 สร้างไฟล์ docker-compose.yml แล้วใช้คำสั่งดังต่อไปนี้
version: '3.8' services: master: image: mariadb:10.6 container_name: mariadb-master environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: db_replicate MYSQL_USER: user MYSQL_PASSWORD: password volumes: - master_data:/var/lib/mysql - ./master.cnf:/etc/mysql/conf.d/master.cnf ports: - "3307:3306" networks: - mariadb_network slave1: image: mariadb:10.6 container_name: mariadb-slave1 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: db_replicate MYSQL_USER: user MYSQL_PASSWORD: password volumes: - slave1_data:/var/lib/mysql - ./slave1.cnf:/etc/mysql/conf.d/slave1.cnf ports: - "3308:3306" networks: - mariadb_network depends_on: - master slave2: image: mariadb:10.6 container_name: mariadb-slave2 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: db_replicate MYSQL_USER: user MYSQL_PASSWORD: password volumes: - slave2_data:/var/lib/mysql - ./slave2.cnf:/etc/mysql/conf.d/slave2.cnf ports: - "3309:3306" networks: - mariadb_network depends_on: - master networks: mariadb_network: driver: bridge volumes: master_data: driver: local slave1_data: driver: local slave2_data: driver: local
ขั้นตอนที่ 2 ตั้งค่า ไฟล์ .cnf สำหรับ Master and Slave
ไฟล์ master.cnf
[mysqld] server-id=1 log_bin=mysql-bin binlog_do_db=db_replicate --กำหนดฐานข้อมูลที่จะทำการ Replicate
ไฟล์ slave1.cnf
[mysqld] server-id=2 relay_log=relay-bin log_bin=mysql-bin read_only=1 binlog_do_db=db_replicate --กำหนดฐานข้อมูลที่จะทำการ Replicate
ไฟล์ slave2.cnf
[mysqld] server-id=3 relay_log=relay-bin log_bin=mysql-bin read_only=1 binlog_do_db=db_replicate --กำหนดฐานข้อมูลที่จะทำการ Replicate
ขั้นตอนที่ 3 เปิด Terminal หรือ Comond line ที่โฟลเดอร์โปรเจคแล้วรันคำสั่ง
docker-compose up -d --build
ขั้นตอนที่ 4 ตั้งค่า MariaDB Master
เปิด Terminal หรือ Comond line ที่โฟลเดอร์โปรเจคแล้วรันคำสั่ง
docker exec -it mariadb-master mysql -u root -p
รันคำสั่ง MariaDB shell
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%' IDENTIFIED BY 'replica_password'; FLUSH PRIVILEGES; SHOW MASTER STATUS;
#ตรวจสอบ “File” และ “Position” จากเอาต์พุตคำสั่ง SHOW MASTER STATUS;
ขั้นตอนที่ 5 ตั้งค่า MariaDB Slave 1
เปิด Terminal หรือ Comond line ที่โฟลเดอร์โปรเจคแล้วรันคำสั่ง
docker exec -it mariadb-slave1 mysql -u root -p
รันคำสั่ง MariaDB shell
CHANGE MASTER TO MASTER_HOST='mariadb-master', MASTER_USER='replica_user', MASTER_PASSWORD='replica_password', MASTER_LOG_FILE='*******', -- นำค่า `File` จาก mariadb master มาใส่ตรงนี่ MASTER_LOG_POS=*****; -- นำค่า `Position` จาก mariadb master มาใส่ตรงนี่ START SLAVE;
ขั้นตอนที่ 6 ตั้งค่า MariaDB Slave 2
เปิด Terminal หรือ Comond line ที่โฟลเดอร์โปรเจคแล้วรันคำสั่ง
docker exec -it mariadb-slave2 mysql -u root -p
รันคำสั่ง MariaDB shell
CHANGE MASTER TO MASTER_HOST='mariadb-master', MASTER_USER='replica_user', MASTER_PASSWORD='replica_password', MASTER_LOG_FILE='*******', -- นำค่า `File` จาก mariadb master มาใส่ตรงนี่ MASTER_LOG_POS=*****; -- นำค่า `Position` จาก mariadb master มาใส่ตรงนี่ START SLAVE;
หลังจากที่เราตั้งค่า MariDB เสร็จแล้ว ให้เราตรวจสอบสถานะ MariaDB Slave 1 และ MariaDB Slave 2 สามารถทำงานได้หรือไม่ โดยใช้คำสั่ง MariaDB shell
SHOW SLAVE STATUS \G;
#หลังจากรันคำสั่งแล้วให้ตรวจสอบสถานะ Slave_IO_Running และ Slave_SQL_Running ต้องเป็น สถานะ YES เท่านั้น ดังรูป
ขั้นตอนที่ 7 ทดสอบการทำงานที่ MariaDB Master โดยสร้างตารางที่ ฐานข้อมูล db_replicate
-- On Master CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO test_table (id, name) VALUES (1, 'Replication Test');
เมื่อเราทำการสร้างตารางและเพิ่มข้อมูลเข้าไปใน MariaDB Master แล้ว เราลองไป Query ข้อมูลที่ MariaDB Slave 1 และ MariaDB Slave 2
-- On Slave1 SELECT * FROM test_table; -- On Slave2 SELECT * FROM test_table;
เพียงเท่านี้เราก็จะสามารถทำ Repliation บนฐานข้อมูล MariaDB ได้แล้วครับ และเราสามารถเอาไปประยุกต์ใช้กับงานของเราบน Server ได้ด้วยนะครับ