一、主从模式
(通过二进制日志实现同步数据,包含默认:异步复制;半同步复制:至少一个从库确认事务;GTID复制:全局事务标识符)
1、开启主库binlog日志,将变更写入binlog日志;
2、从库与主库开启i/o线程连接到主库,并实时读取主库binlog写入从库中继日志relay log;
3、从库sql线程读取relay log日志,并在本地执行相同的sql,实现数据同步;
1.主服务配置:
my.cnf
mysqld
server-id = 1
log-bin = mysql-bin
binlog_format = ROW #此行一主多从时配置,设置日志格式为行模式(binlog_format=ROW)
2.重启mysql: systemctl restart mysqld
3.从服务器配置
my.cnf
mysqld
server-id = 2
relay-log = mysql-relay-bin
read-only = 1 #1只读模式(主备则不设置此参数)
4.重启mysql:systemctl restart mysqld
5.创建mysql同步账号
CREATE USER 'replication_user'@'从服务器IP' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'从服务器ip';
FLUSH PRIVILEGES;
6.SHOW MASTER STATUS;
7.配置主从同步SQL在slave服务执行:
CHANGE MASTER TO
MASTER_HOST='主服务器IP',
MASTER_USER='replication_user',
MASTER_PASSWORD='密码',
MASTER_LOGFILE='mysql-bin.000001',#主服务器正在写入的二进制的文件名,与主服务mysql-bin日志文件File: mysql-bin.000001
MASTER_LOG_POS=1234;#与主服务Position: 168一致
START SLAVE;
8.验证同步状态
检查从库状态:
SHOW MASTER STATUS\G;
SHOW SLAVE STATUS\G;
关键字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
9.测试数据同步
主库:CREATE DATABASE test_db;
从库:SHOW DATABASES;
*也可通过半同步复制(semi-synchronous Replication)减少数据丢失风险,适用于对一致性要求较高的系统;
*实时监控:使用 pt-heartbeat 或 SHOW SLAVE STATUS 监控延迟
*性能分析:通过 SHOW PROCESSLIST 检查SQL执行状态
*启用半同步复制(rpl_semi_sync_master_enabled=1)提升数据一致性
====================================================
优化数据延迟:
1、慎用,5.7+,在延迟追平时将 innodb_flush_log_at_trx_commit=0 和 sync_binlog=0 临时设置为0,追平后恢复为1。
SET GLOBAL innodb_flush_log_at_trx_commit = 0; -- 设置为0
SET GLOBAL sync_binlog = 1000; -- 设置为1000
innodb_flush_log_at_trx_commit=0
事务提交时不主动刷新日志到磁盘,而是每秒执行一次刷新操作,显著提升写性能,减少磁盘I/O操作
主库崩溃时可能丢失最近1秒的事务数据
sync_binlog=0
二进制日志(binlog)写入后不立即刷新到磁盘,依赖操作系统缓存
主库崩溃时可能丢失部分binlog数据
2、配置并行复制(多线程复制)
-- 停止从库复制线程
STOP SLAVE;
-- 设置并行复制参数
SET GLOBAL slave_parallel_workers = 16; -- 根据CPU核心数设置(如32核建议16-24)
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK'; -- 逻辑时钟并行模式
SET GLOBAL slave_preserve_commit_order = 1; -- 保持事务提交顺序
-- 启动从库复制线程
START SLAVE;
===================================
##############故障转移工具:###########
MHA(Master High Availability)
安装MHA
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Test-TCP perl-Test-Simple perl-Time-HiRes perl-IO-Socket-SSL perl-Net-Telnet perl-Net-OpenSSH perl-Net-SSH2 perl-Net-SSLeay perl-IO-Socket-SSL perl-Net-Telnet perl-Net-OpenSSH perl-Net-SSH2 perl-Net-SSLeay
配置MHA管理节点
vi /etc/masterha/app1.cnf
配置文件示例:
server default
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
remote_workdir=/var/log/masterha/app1
ssh_user=root
repl_user=repl_user
repl_password=password
server1
hostname=master_ip
server2
hostname=slave_ip
或MySQL Group Replication 多主从复制模式自动选举主库
mysqld
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
group_replication_start_on_boot=ON
group_replication_local_address=192.168.1.100:33061
group_replication_group_seeds=192.168.1.100:33061,192.168.1.101:33061
MHA故障转移流程:
启动MHA监控
masterha_manager --conf=/etc/masterha/app1.cnf
手动故障转移
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=dead
Orchestrator:
安装Orchestrator
docker run -d --name orchestrator -p 3000:3000 -e MYSQL_USER=root -e MYSQL_PASSWORD=password -e MYSQL_HOST=mysql_host -e MYSQL_PORT=3306 -e ORCHESTRATOR_USER=orchestrator -e ORCHESTRATOR_PASSWORD=orchestrator_password -e ORCHESTRATOR_LISTEN_ADDRESS=0.0.0.0 -e ORCHESTRATOR_LISTEN_PORT=3000 -e ORCHESTRATOR_RECOVERY_USER=repl_user -e ORCHESTRATOR_RECOVERY_PASSWORD=password percona/orchestrator
#故障转移流程:
自动故障转移
curl -X POST http://orchestrator_ip:3000/api/switch-master?from=master_ip
#监控与报警 Prometheus + Grafana
安装Prometheus
docker run -d --name prometheus -p 9090:9090 prom/prometheus
配置Prometheus抓取MySQL指标(yaml文件)
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['mysql_ip:9104']
配置Grafana面板
======================================================
=====================================================
===========================================================
GTID复制配置:
1、主库配置my.cnf
mysqld
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
2、从库配置my.cnf:
mysqld
server-id=2
relay-log=mysql-relay-bin
read-only=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=mysql-bin #GTID从服务也必须开启
3、从库配置同步
CHANGE MASTER TO
MASTER_HOST='主服务器IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='密码',
MASTER_AUTO_POSITION=1; -- 自动匹配GTID断点
START SLAVE;
4.GTID作用:
4.1自动匹配GTID断点,无需手动指定binlog文件和位置(如 mysql-bin.000001:168)
4.2确保事务全局唯一,避免主从数据不一致(如主库重启后,从库自动跳过已执行的GTID)
4.3也支持多线程并行执行事务(如 slave_parallel_workers=16),提升复制性能
4.4主从数据冲突时,通过空事务跳过冲突GTID
5.监控与验证
-- 主库
SHOW MASTER STATUS;
-- 从库
SHOW SLAVE STATUS\G
-- 检查GTID状态
SELECT @@gtid_executed; -- 已执行的GTID
SELECT @@gtid_purged; -- 已删除的GTID
***GTID复制通过全局唯一事务ID(GTID)实现主从数据一致性,简化故障转移流程,提升复制性能和安全性