主从复制-高级进阶(延时,过滤,GTID复制)+MHA

1. 延时从库

1.1 延时从库

1.1 作用
处理逻辑损坏
1.2 怎么实现的
SQL线程延时:数据已经写入relaylog中了,SQL线程"慢点"运行
一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间

mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;

>>查看
mysql[(none)]>show slave status\G;
SQL_Delay: 86400                    延迟多少秒执行
SQL_Remaining_Delay: NULL           最近的一次操作还有多少秒执行

1.3 怎么处理逻辑损坏
drop操作
(1)感知到故障
(2)停先关业务,挂维护页,停延时从SQL线程
(3)停延时从库SQL线程
(4)手工模拟SQL线程恢复后续的relaylog

  • 起点:relaylog.info
  • 终点:drop

(5)直接解除从库状态替代主库工作(或者导出故障数据库,倒回到生产)
演练:

>> (1) 模拟数据
create database oldboy charset utf8mb4;
use oldboy ;
create table t1 (id int);
insert into t1 values(1);
insert into t1 values(11);
insert into t1 values(111);
insert into t1 values(1111);
insert into t1 values(11111);

(2) 模拟误操作 
drop database oldboy;

(3) 停止数据库线程
stop slave;

(4) 截取relay_log日志
起点:
mysql[(none)]>show slave status\G;
Relay_Log_Pos: 320
终点: 
mysql[(none)]>show relaylog events in 'db01-relay-bin.000002';
| db01-relay-bin.000002 | 1700 | Query          |         7 |        2606 | drop database xinxinxin 

(5) 导出数据
[root@db01 ~]$ mysqlbinlog  --start-position=320 --stop-position=1700 /data/3308/data/db01-relay-bin.000002 > /tmp/relay.sql

(6) 恢复
source /tmp/relay.sql
导出从库数据备份到主库
[root@db01 ~]$ mysqldump -uroot -S /data/3308/mysql.sock -B xinxinxin > /backup/xinxinxin.sql
mysql[(none)]>source /backup/xinxinxin.sql

2. 过滤复制

2.1 主库

vim /etc/my.cnf
binlog_do_db                   白名单
binlog_ignore_db               黑名单

2.2 从库

Replicate_Do_DB:
Replicate_Ignore_DB

Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table

2.3 过滤复制实现

例子:只复制oldguo库的数据

vim /data/3308/my.cnf
replicate_do_db=oldguo
systemctl restart mysqld3308

reolicate_do_db可以添加表,格式为relicate_do_db=database_name.table_name

3. GTID复制

3.1 GTID介绍

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
enforce-gtid-consistency=true
log-slave-updates=1

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

3.3 实现GTID复制

3.3.1 环境准备

>> 清理环境
pkill mysqld
 \rm -rf /data/mysql/data/*
 \rm -rf /data/binlog/*

准备配置文件

>> 主库db01:
cat > /etc/my.cnf <
EOF

>> slave1(db02):

cat > /etc/my.cnf <
EOF

>> slave2(db03):

cat > /etc/my.cnf <
EOF

>> 初始化数据
mkdir -p /data/mysql/data 
chown -R mysql.mysql /data/*
mysqld --initialize-insecure --user=mysql --basedir=/application/mysql  --datadir=/data/mysql/data

3.3.2 构建主从

master:db-51
slave:db-52,db-53

db-51:
grant replication slave  on *.* to repl@'10.0.0.%' identified by '123';

db-52\53:
change master to 
master_host='10.0.0.51',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;

start slave;

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

CHANGE MASTER TO
MASTER_HOST='10.0.0.51',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=444,
MASTER_CONNECT_RETRY=10;

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

(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='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
    告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。

4. 半同步复制

在IO线程把数据全部落入到relay.log中在给服务器返回ack,性能极差
ACK_receiver线程

5. 需要补充

MGR
PXC

6. MHA

6.1 环境准备

MHA软件下载地址

搭建MHA之前先构建主从(本章节-3.3.2)

>>1. 配置关键程序软连接
ln -s /application/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql          /usr/bin/mysql
<安装的时候程序写死不走PATH变量所以只能软件到/bin下>

>>2. 配置各节点互信
db01:
rm -rf /root/.ssh 
ssh-keygen
cd /root/.ssh 
mv id_rsa.pub authorized_keys
scp  -r  /root/.ssh  10.0.0.52:/root 
scp  -r  /root/.ssh  10.0.0.53:/root

各节点验证
db01:

ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date

db02:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date

db03:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
<或者ssh-keygen -t dsa+ssh-copy-id一台一台弄>

>>3. 所有节点安装Node软件依赖包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

>>4. 在db01主库中创建mha需要的用户
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';

>>5. Manager软件安装(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

>>6. 配置文件准备(db03)
创建配置文件目录
 mkdir -p /etc/mha
创建日志目录
 mkdir -p /var/log/mha/app1
编辑mha配置文件
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/data/binlog       
user=mha                                   
password=mha                               
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root                               
[server1]                                   
hostname=10.0.0.51
port=3306                                  
[server2]            
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306

>>7. 状态检查
互信检查
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状态
[root@db03 ~]$ masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4719) is running(0:PING_OK), master:10.0.0.51

>>10. 启动MHA命令

你可能感兴趣的:(主从复制-高级进阶(延时,过滤,GTID复制)+MHA)