Replication ใน MariaDB เป็นกระบวนการที่ทำให้ข้อมูลจากฐานข้อมูลหนึ่งถูกคัดลอกไปยังอีกฐานข้อมูลหนึ่งโดยอัตโนมัติ โดยทั่วไปแล้ว MariaDB replication ถูกใช้เพื่อ:

  1. เพิ่มความทนทานต่อความเสียหาย: ในกรณีที่ฐานข้อมูลหลัก (Master) เกิดปัญหา ฐานข้อมูลสำรอง (Slave) สามารถถูกใช้แทนได้
  2. กระจายโหลดของการอ่าน: คุณสามารถใช้ฐานข้อมูลสำรองเพื่อกระจายการอ่านข้อมูล (Read Load) ทำให้การทำงานของระบบโดยรวมมีประสิทธิภาพมากขึ้น
  3. ทำการสำรองข้อมูลแบบเรียลไทม์: ข้อมูลในฐานข้อมูลหลักจะถูกคัดลอกไปยังฐานข้อมูลสำรองอย่างต่อเนื่อง ทำให้สามารถสำรองข้อมูลแบบเรียลไทม์ได้

ขั้นตอนการทำ

โครงสร้างไฟล์

ขั้นตอนที่ 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 ได้ด้วยนะครับ

Related Post