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.