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)实现主从数据一致性,简化故障转移流程,提升复制性能和安全性

相关推荐
python百炼成钢1 小时前
52.Linux PWM子系统
linux·运维·服务器·驱动开发
可可苏饼干1 小时前
ELK(Elastic Stack)日志采集与分析
linux·运维·笔记·elk
wangmengxxw1 小时前
微服务-服务配置
java·运维·微服务·云计算·服务配置
大柏怎么被偷了1 小时前
【Git】基本操作
linux·运维·git
纯粹的热爱1 小时前
Windows 10/11解决“无法访问共享文件夹—组织安全策略阻止未经身份验证的来宾访问”
运维
乾元1 小时前
AI + Jinja2/Ansible:从自然语义到可执行 Playbook 的完整流水线(工程级深度)
运维·网络·人工智能·网络协议·华为·自动化·ansible
python百炼成钢2 小时前
50.linux_USB驱动
linux·运维·服务器·驱动开发
Zsr10232 小时前
MySQL 主从同步与读写分离:构建高性能、高可用数据库架构
数据库·mysql
踢球的打工仔2 小时前
mysql多表关联
数据库·mysql