120. MySQL主从复制《进阶版》

主从复制进阶

1. 延时从库企业级应用

1.1 场景介绍
逻辑损坏: 
总数据量200G,误删除12G的库,有备份和日志. 

1.2 配置 
SQL线程延时:
数据已经写入relaylog中了,SQL线程"慢点"运行
一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;


mysql> show slave status \G
SQL_Delay: 300
SQL_Remaining_Delay: NULL


1.3 故障模拟 
主库:
create database delaydb charset utf8mb4;
use delaydb;
create table t1 (id int);
begin;
insert into t1 values(1);
commit;
begin;
insert into t1 values(2);
commit;
begin;
insert into t1 values(3);
commit;
begin;
insert into t1 values(4);
commit;
begin;
insert into t1 values(5);
commit;
drop database delaydb;
1.1 恢复思路(延时从库):
1. 监控到故障,第一时间停掉从库SQL线程
2. 手工模拟SQL线程回放relaylog,停止在drop之前
   起点:读取relay.info信息
   终点:drop之前
3. 恢复业务
1.2 在测试环境中实践:
从库 : 
1. 停止SQL线程
mysql> stop slave sql_thread;
2. 截取relaylog日志 
起点:
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 653
终点: 
db01-relay-bin.000002 | 2366 | Query          |         7 |        4772 | drop database delaydb               

2. 过滤复制的企业级应用

2.1 配置普通复制环境
systemctl start mysqld3309
mysqldump -S /tmp/mysql3307.sock -A --master-data=2 --single-transaction -R -E --triggers >/tmp/full.sql
grep "\-\- CHANGE MASTER TO" /tmp/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=4772;
mysql -S /tmp/mysql3309.sock < /tmp/full.sql
mysql -S /tmp/mysql3309.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=4772,MASTER_CONNECT_RETRY=10;start slave;"
mysql -S /tmp/mysql3309.sock -e "show slave status\G"|grep Running:
2.2 开启过滤复制功能
库级别:
Replicate_Do_DB: world
Replicate_Ignore_DB: 

表级别:
Replicate_Do_Table: world.t1 
Replicate_Ignore_Table: 

模糊过滤:
Replicate_Wild_Do_Table: world.t*
Replicate_Wild_Ignore_Table: 
2.3 库级别白名单演示
[root@db01 ~]# vim /data/mysql/my3309.cnf 
replicate_do_db=oldguo
replicate_do_db=oldboy
[root@db01 ~]# systemctl restart mysqld3309

3. 半同步复制介绍

默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失
在这里插入图片描述

复制过滤器

让从节点仅复制指定的数据库,或指定数据库的指定表

注意:在使用复制过滤器的时候,主服务器需要使用USE DATABASE_NAME,再对表进行操作,否则复制过滤器不起作用。——来自mariadb-server-5.5.60
两种实现方式:

方式1 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件

注意:此项和binlog_format相关

参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db

binlog-do-db = 数据库白名单列表,多个数据库需多行实现

binlog-ignore-db = 数据库黑名单列表

痛点:基于二进制还原将无法实现;不建议使用

方式2 从服务器SQL_THREAD在relay log中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地

痛点:会造成网络及磁盘IO浪费

4. 基于GTID的复制

4.1 GTID复制配置过程:

4.1.1 清理环境

pkill mysqld
\rm -rf /data/*
mkdir -p /data/mysql/data 
mkdir -p /data/binlog
chown -R mysql.mysql /data/*

4.1.2 准备配置文件

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

========================================================================================
2、从库db02

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

3、从库db03
slave2(db03):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql57
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF


4、所有机器初始化数据
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57  --datadir=/data/mysql/data 

5、所有节点启动数据库
/etc/init.d/mysqld start


6、构建主从:
一主--->master:51
两从--->slave:52,53

7、主节点创建专用用户:
grant replication slave  on *.* to repl@'10.0.0.%' identified by '123';

8、从节点构建复制环境52\53:
change master to 
master_host='10.0.0.51',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;

MASTER_AUTO_POSITION参数详细说明:
观察:
(1)SET @@GLOBAL.GTID_PURGED='ac2f392e-2d4f-11ea-abdd-000c292aecb1:1-100';2)relaylog中的最后一个事务的position和gtid的位置点
判断:
(3)自动从101号gtid请求主库日志


9、从节点启动服务线程并查看验证
start slave;
show slave status \G
发布了148 篇原创文章 · 获赞 65 · 访问量 7622

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/103810378
今日推荐