主从复制进阶
1. 延时从库企业级应用
1.1 场景介绍
逻辑损坏:
总数据量200G,误删除1个2G的库,有备份和日志.
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