Cấu hình MySQL Multi-Master với Keepalived

Tạo cấu trúc multi-master giữa hai máy chủ để đảm bảo tính nhất quán dữ liệu.

192.168.0.176 (Master 1)
192.168.0.179 (Master 2)

Tạo thư mục cần thiết trên cả hai máy:

mkdir mysql
cd mysql
mkdir config
chmod -R +777 /home/admin1/yyx/mysql/

Kéo ảnh Docker cho MySQL trên cả hai máy:

docker pull mysql

Khởi động container trên máy 192.168.0.176:

docker run -d --name db1 -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=secret -e TZ="Asia/Ho_Chi_Minh" \
-v /home/admin1/yyx/mysql/config:/etc/mysql/conf.d mysql \
--authentication_policy=mysql_native_password

Truy cập vào container:

docker exec -it db1 mysql -uroot -psecret

Xóa file auto.cnf để tạo UUID mới:

rm -rf /var/lib/mysql/auto.cnf
show master status;

Tạo tài khoản đồng bộ:

DROP USER IF EXISTS 'sync'@'%';
CREATE USER 'sync'@'%' IDENTIFIED BY 'sync';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'%';
flush privileges;

Kiểm tra plugin và cấu hình my.cnf:

[mysqld]
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
log-bin=mysql-bin-master
server_id=1
log_replica_updates=1
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1

[client]
default-character-set=utf8mb4

Cấu hình tương tự cho máy 192.168.0.179 nhưng thay đổi server_id=2.

Thiết lập replication giữa hai máy:

STOP SLAVE;
RESET SLAVE;

CHANGE MASTER TO
MASTER_HOST='192.168.0.179',
MASTER_USER='sync',
MASTER_PASSWORD='sync',
MASTER_LOG_FILE='mysql-bin-master.000001',
MASTER_LOG_POS=157;

START SLAVE;
SHOW SLAVE STATUS\G;

Lặp lại bước trên cho máy còn lại với MASTER_HOST='192.168.0.176'.

Cài đặt Keepalived:

yum install -y keepalived

Tạo tập tin cấu hình keepalived.conf cho Master 1:

! Configuration File for keepalived
global_defs {
    router_id HA-DB1
}

vrrp_script chk_mysql {
    script "/etc/keepalived/chk_mysql.sh"
    interval 3
    fall 3
    rise 2
}

vrrp_instance VI_DB {
    state MASTER
    interface ens33
    virtual_router_id 50
    priority 150
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    
    virtual_ipaddress {
        192.168.0.200 dev ens33 label ens33:vip
    }
    
    track_script {
        chk_mysql
    }
}

Tập tin kiểm tra trạng thái MySQL:

#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=secret

STATUS=$($MYSQL -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1; echo $?)

if [ $STATUS -ne 0 ]; then
    systemctl stop keepalived
fi

Cấu hình tương tự cho máy Backup nhưng thay đổi state=BACKUP và priority=100.

Kiểm tra hoạt động bằng cách dừng dịch vụ MySQL hoặc Keepalived trên một trong hai máy.

Thẻ: mysql keepalived docker

Đăng vào ngày 29 tháng 6 lúc 22:15