1.MySQL 主庫執行
容器化安裝:
mkdir -p /data/mysql/{conf,log,data} #創建數據和配置目錄,下面適用於mysql 8.0.25
生成配置文件/data/mysql/my.cnf #調整容器中my.cnf中參數[client]和!includedir的位置
cat > /data/mysql/my.cnf <<'EOF'
[client]
socket=/var/run/mysqld/mysqld.sock
[mysqld]
user=mysql
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names=1
skip-host-cache
skip-name-resolve
bind-address=0.0.0.0
secure-file-priv=/var/lib/mysql-files
# ----------------- 主從複製 -----------------
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
sync_binlog=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
# ----------------- 性能 -----------------
max_connections=2000
innodb_buffer_pool_size=3G # 機器 7GB 內存可分配 ~3G 給 InnoDB
innodb_log_file_size=512M
sort_buffer_size=2M
open_files_limit=65535
max_allowed_packet=128M
# ----------------- 日誌 -----------------
log-error=/var/log/error.log
slow-query-log=1
slow-query-log-file=/var/log/mysql/slow-query.log
long_query_time=3
!includedir /etc/mysql/conf.d/
EOF
擴展-後續修改mysql容器配置如下案例(新增*.conf寫入配置參數即可):
vim /data/mysql/conf/extra.cnf
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
啓動:
docker run -p 3306:3306 --name mysql8 --restart always -v /etc/localtime:/etc/localtime \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/log:/var/log/ \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=tcbnYaGLGkz8dnxx -d mysql:8.0.25
開啓遠程權限
docker exec -it mysql8 bash
mysql -uroot -ptcbnYaGLGkz8dnxx
ALTER USER 'root'@'%' IDENTIFIED BY 'tcbnYaGLGkz8dnxx';
FLUSH PRIVILEGES;
主庫執行同步賬號
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'VjFSJhuDLTVRwx3Q';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec
從庫執行一下,其他的步驟和主庫一樣
root@ansible:/data/mysql# cat my.cnf
[client]
socket=/var/run/mysqld/mysqld.sock
[mysqld]
user=mysql
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names=1
skip-host-cache
skip-name-resolve
bind-address=0.0.0.0
secure-file-priv=/var/lib/mysql-files
# ----------------- 主從複製 -----------------
server-id=2
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
sync_binlog=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
read_only=1 #只讀
super_read_only=1 #super用户也只能讀
# ----------------- 性能 -----------------
max_connections=2000
innodb_buffer_pool_size=3G # 機器 7GB 內存可分配 ~3G 給 InnoDB
innodb_log_file_size=512M
sort_buffer_size=2M
open_files_limit=65535
max_allowed_packet=128M
# ----------------- 日誌 -----------------
log-error=/var/log/error.log
slow-query-log=1
slow-query-log-file=/var/log/slow-query.log
long_query_time=3
從庫執行GTID模式
如果是 GTID 模式,改成:
CHANGE MASTER TO
MASTER_HOST='10.0.8.25',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='VjFSJhuDLTVRwx3Q',
MASTER_AUTO_POSITION=1;
- 啓動從庫複製線程
START SLAVE;
. 查看從庫複製狀態
SHOW SLAVE STATUS\G
io線程和sql線程都是yes説明同步成功
部署keepalive
yum install -y keepalived
主庫
root@web:/etc/keepalived# cat keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.8.100/24
}
}
root@web:/etc/keepalived# cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.8.100/24
}
}
從庫
root@web:~# cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
preempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.8.100/24
}
}
啓動keepalive
systemctl enable keepalived
systemctl start keepalived
數據庫手動主從切換
Step 1️⃣:凍結所有從庫
STOP SLAVE;
SHOW SLAVE STATUS\G
確認:
Slave_IO_Running: No
Slave_SQL_Running: No
Step 2️⃣:選最新的從庫
查看:
SHOW SLAVE STATUS\G
關注:
Executed_Gtid_Set
Retrieved_Gtid_Set
👉 Executed_Gtid_Set 最大的那個,從理論上數據最全
Step 3️⃣:提升從庫為新主(核心)
在新主上執行:
STOP SLAVE;
RESET SLAVEALL;
關閉只讀:
SETGLOBAL read_only= OFF;
SETGLOBAL super_read_only= OFF;
驗證:
SHOW MASTER STATUS;
你會看到:
Executed_Gtid_Set: xxxxx
Step 4️⃣:其他從庫指向新主(重點)
在其他從庫執行:
STOP SLAVE;
RESET SLAVEALL;
CHANGE MASTERTO
MASTER_HOST='新主IP',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_AUTO_POSITION=1;
START SLAVE;
檢查:
SHOW SLAVE STATUS\G
必須是:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主庫關閉keepalive
完畢