揭秘MySQL主从复制:打造高可用性与数据冗余的强效引擎(二)

  •  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-CSDN博客

目录

正文:

主从复制高级进阶

1. 延时从库   *****

1.1 介绍及配置

1.2 延时从库处理逻辑故障

1.2.1 延时从库的恢复思路

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

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

(3) 截取relaylog

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

(5) 恢复业务

1.2.2 故障演练

主库 : 

从库:

2. 过滤复制   *****

2.0 快速恢复测试环境

从库 :

主库: 

从库: 

2.1 过滤复制应用

主库: 

从库: 

例1:从库仅复制repl

例2:从库仅拒绝hehe

3. GTID复制       *****

3.1 介绍

它的官方定义如下:

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

3.2 GTID核心参数

重要参数:

3.3 GTID复制配置过程:

(1)修改配置文件

(2) 启动数据库

(3) 构建主从:

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

4. 半同步     ***

加载插件

主:

从:

查看是否加载成功:

启动:

主:

从:

重启从库上的IO线程

查看是否在运行

主:

从:


正文:

主从复制高级进阶

1. 延时从库   *****

1.1 介绍及配置

SQL线程延时:数据已经写入relaylog中了,SQL线程"慢点"运行
一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间
从:
 

stop slave;
CHANGE MASTER TO MASTER_DELAY =30;
start slave;
show slave status \G

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的位置点

stop slave sql_thread;
show slave status \G


# 2.从库mysqldump

mysqldump -uroot -B delay > /tmp/delay.sql
scp /tmp/delay.sql root@192.168.8.9:/tmp

主库source还原:

mysql 
source  /tmp/delay.sql 

# 3.从库开启sql_thread 

start slave  sql_thread;

2. 过滤复制   *****

2.0 快速恢复测试环境

从库 :
stop slave;
reset slave all;
主库: 
reset master;
从库: 
CHANGE MASTER TO 
MASTER_HOST='192.168.8.9',
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),查看从库同步数据情况。


3. GTID复制       *****

3.1 介绍

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

它的官方定义如下:

GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
 

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

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

3.2 GTID核心参数

重要参数:

gtid-mode=on                        --启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true       --强制GTID的一致性
log-slave-updates=1                 --slave更新是否记入日志

3.3 GTID复制配置过程:

db01: 192.168.8.10
db02: 192.168.8.20
db03: 192.168.8.30

(1)修改配置文件

主库db01:

cat > /etc/my.cnf <<EOF
[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 <<EOF
[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 <<EOF
[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

(2) 启动数据库
systemctl restart mysqld
(3) 构建主从:

master:db01
slave:db02,db03

db01:

mysql
grant replication slave  on *.* to repl@'192.168.8.%' identified by '123';

db02\db03:

change master to 
master_host='192.168.8.9',
master_user='repl',
master_port=3306,
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;

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';


期待您的关注~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值