mysql主从主备回顾

一、主从模式

(通过二进制日志实现同步数据,包含默认:异步复制;半同步复制:至少一个从库确认事务;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)实现主从数据一致性,简化故障转移流程,提升复制性能和安全性

相关推荐
翼龙云_cloud9 分钟前
阿里云国际代理商:阿里云 ECS 全维度监控配置教程
运维·阿里云·云计算·监控
笑锝没心没肺25 分钟前
fail2ban工具安装配置及使用
linux·运维·服务器
zt1985q2 小时前
本地部署开源智能家居集成平台 ioBroker 并实现外部访问( Windows 版本)
运维·服务器·智能家居
万亿少女的梦1682 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
万亿少女的梦1682 小时前
基于SpringBoot与Vue的历史博物馆展品展示与游客管理系统设计
spring boot·mysql·vue·系统设计·博物馆管理系统
大卡片2 小时前
linux内核驱动开发
linux·运维·驱动开发
心心喵3 小时前
[linux] nohup和pm2的区别 进程保活
linux·运维·服务器
NGINX开源社区4 小时前
F5 NGINX Ingress Controller 5.3.0 新增功能
运维
灯澜忆梦5 小时前
MySQL 完整学习路线
学习·mysql
ClouGence5 小时前
保障公共安全,一线治安机构实时数据应用与实践
数据库·mysql·postgresql