MySQL主从复制高级进阶

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL主从复制高级进阶

屏幕截图 2023-08-28 195743.png

1. 延时从库

1.1 介绍及配置

SQL线程延时:数据已经写入relaylog中了,SQL线程"慢点"运行

一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间

mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY =60;
mysql>start slave;
mysql> show slave status \G
SQL_Delay: 60
SQL_Remaining_Delay: NULL

1.2 延时从库处理逻辑故障

1.2.1 延时从库的恢复思路

(1) 监控到数据库逻辑故障

(2) 停从库SQL线程,记录已经回放的位置点(截取日志起点)

stop slave sql_thread ;
    show slave status \G
    Relay_Log_File: mysql-relay-bin.000002
    Relay_Log_Pos: 320

 (3) 截取relaylog

   起点:    

   show slave status \G

   Relay_Log_File ,Relay_Log_Pos  

   终点: drop之前的位置点

   show relaylog events in ''    

   进行截取

(4) 模拟SQL线程回访日志

   从库  source

(5) 恢复业务

   情况一: 就一个库的话

   从库替代主库工作

   情况二:

   从库导出故障库,还原到主库中.

1.2.2 故障演练

主库 :

create database delay charset utf8mb4;
use delay;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;

#等60秒后,再执行删除操作

drop database delay;

从库:

# 1.停止 从库SQL 线程,获取relay的位置点

mysql> stop slave sql_thread;
mysql> show slave status \G
Relay_Log_File: mysql-relay-bin.000002                                                                             Relay_Log_Pos: 479

# 2. 找到relay的截取终点

mysql> show relaylog events in 'slave-relay-bin.000002';

# 3. 截取relay

cd /usr/local/mysql/data 
mysqlbinlog --start-position=912 --stop-position=1520 slave-relay-bin.000002 >/tmp/relay.sql

# 4. 恢复relay到从库

mysql> start slave sql_thread;
mysql> set sql_log_bin=0;
mysql> source /tmp/relay.sql
mysql> set sql_log_bin=1;

# 5.从库mysqldump,主库source

2. 过滤复制   *****

2.0 快速恢复测试环境

从库 :

stop slave;

reset slave all;

主库:

reset master;

从库:

CHANGE MASTER TO 
MASTER_HOST='192.168.8.10',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;

2.1 过滤复制应用

主库:

show master status ;

从库:

mysql> show slave status \G
Replicate_Do_DB:     #仅复制某库    
Replicate_Ignore_DB:    #仅拒绝某库
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table:

例1:从库仅复制repl

vim /etc/my.cnf

replicate_do_db=repl

systemctl restart mysqld

验证:主库创建多个库(repl,repl1,repl2),查看从库同步数据情况。

例2:从库仅拒绝hehe

vim /etc/my.cnf

replicate_ignore_db=hehe

systemctl restart mysqld

验证:主库创建多个库(hehe,hehe1,hehe2),查看从库同步数据情况。

2.3 GTID复制       *****

2.3.1 介绍

GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号。

它的官方定义如下:

GTID = source_id :transaction_id

7E11FA47-31CA-19E1-9E56-C43AA21293967:29

什么是sever_uuid,和Server-id 区别?

核心特性: 全局唯一,具备幂等性

2.3.2 GTID核心参数

重要参数:

gtid-mode=on                        --启用gtid类型,否则就是普通的复制架构

enforce-gtid-consistency=true       --强制GTID的一致性

log-slave-updates=1                 --slave更新是否记入日志

2.3.3 GTID复制配置过程:

db01: 192.168.8.10

db02: 192.168.8.20

db03: 192.168.8.30

(1)修改配置文件

主库db01:

cat > /etc/my.cnf <
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=1
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01>
EOF

slave1(db02):

cat > /etc/my.cnf <
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=2
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02>
EOF

slave2(db03):

cat > /etc/my.cnf <
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=3
port=3306
secure-file-priv=/tmp
autocommit=1
log_bin=mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03>
EOF

(3) 启动数据库

systemctl restart mysqld

(4) 构建主从:

master:db01
slave:db02,db03
db01:
grant replication slave  on *.* to repl@'192.168.8.%' identified by '123';
db02\db03:
change master to 
master_host='192.168.8.10',
master_user='repl',
master_port=3306,
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

2.3.4  GTID 复制和普通复制的区别

(0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover(故障恢复)

(1)额外功能参数(3个)

(2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;

(3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号

(4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式

  ####  SET @@GLOBAL.GTID_PURGED='gc498ec-7e78-11e8-9u78-000cdde345d:1-9';

   告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。

4. 半同步     ***

解决主从复制数据一致性问题.

从库relay落地,IO线程会返回一个ACK,主库的 ACK_reciver .主库事务才能提交.

如果一直ACK没收到,超过10秒钟会切换为异步复制.

注:半同步是通过主库延迟commit事务来实现主从一致性的。

加载插件

主:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

从:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

查看是否加载成功:

show plugins;

启动:

主:

SET GLOBAL rpl_semi_sync_master_enabled = 1;

从:

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

重启从库上的IO线程

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

查看是否在运行

主:

show status like 'Rpl_semi_sync_master_status';

从:

show status like 'Rpl_semi_sync_slave_status';

5. MHA高可用  *****

5.1 搭建体验

(1)配置关键程序软连接

ln -s /usr/local/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog

ln -s /usr/local/mysql/bin/mysql          /usr/bin/mysql

(2)配置互信

db01:

rm -rf /root/.ssh 
ssh-keygen
cd /root/.ssh 
mv id_rsa.pub authorized_keys
scp  -r  /root/.ssh  192.168.8.20:/root 
scp  -r  /root/.ssh  192.168.8.30:/root

各节点验证

ssh 192.168.8.10 hostname

ssh 192.168.8.20 hostname

ssh 192.168.8.30 hostname

(3)所有节点安装软件包

yum install perl-DBD-MySQL -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

(4) 在db01主库中创建mha需要的用户

grant all privileges on *.* to mha@'192.168.8.%' identified by 'mha';

(5) Manager软件安装(db03)

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum install -y perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

(6) 配置文件准备(db03)

   创建配置文件目录

mkdir -p /etc/mha

   创建日志目录

mkdir -p /var/log/mha/app1

   编辑mha配置文件

cat > /etc/mha/app1.cnf <
[server default]
manager_log=/var/log/mha/app1/manager        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/usr/local/mysql       
user=mha                                   
password=mha                               
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root                               
[server1]                                   
hostname=192.168.8.10
port=3306                                  
[server2]            
hostname=192.168.8.20
port=3306
[server3]
hostname=192.168.8.30
port=3306
EOF

(7)  状态检查(db03)

### 互信检查

masterha_check_ssh  --conf=/etc/mha/app1.cnf

masterha_check_repl  --conf=/etc/mha/app1.cnf

(8) 开启MHA(db03):

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

(9)  查看MHA状态

masterha_check_status --conf=/etc/mha/app1.cnf

(10) 模拟主库故障

主库:

systemctl stop mysqld

从库:

show slave status \G


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
1月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
121 1
|
25天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
4月前
|
存储 SQL 关系型数据库
MySQL语句详解:从基础到进阶的全面指南
MySQL语句详解:从基础到进阶的全面指南
|
25天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
101 6
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
65 1
|
2月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
3月前
|
SQL 关系型数据库 MySQL
说一下MySQL主从复制的原理?
【8月更文挑战第24天】说一下MySQL主从复制的原理?
63 0
|
3月前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
68 2