认识复制及原理

blob.png

今天的作业:整理一下传统复制的搭建方式

整理一下GTID的复制搭建方式

mysql replication = 异步的复制

blob.png

半同步的复制

有没有完全同步的复制?

PXC 是同步的复制

slave数据的镜象

特别在GTID环境更不能在Slave上做写入操作

如果非要在slave上写操作可以set sql_binary_log =0;忽略session

slave拿到master上的日志,在slave重放

是并发还是串行呢?串行

5.6多了新特性基于库的并行同步

IO是线程是一个, SQL线程和DB一样多

binarylog里面放的什么东西?

用户写入的数据的语句包括变更记录到binarylog里

那么拿到日志重放之后可以还原这部分数据等于说还原了这部分操作

blob.png

mysql cluster : 基本都是指复制结构

升级是说把从库升级到高版本然后把从库升级为主库

percona-xtradb-cluster

blob.png

statement base replication 

基于SQL 语句的复制

binary log 只会记录用户写入的log

select就不会记入了

blob.png

service-id不能相同,主库要有log-bin

blob.png

blob.png

blob.png

日志的格式在配置文件里设置

[mysqld]

binlog_format=statement|row|mixed

记录binlog 的最小单位是什么

Event

header event

table_map_event

query_event

begin

write_rows

update_rows

等写数据的_event

commit

mysql-bin.xxxxxx

binary log index

mysql-bin.index

blob.png

blob.png是已经落伍掉的

如果开了gtad 就不用管这个(statement)了

基于语句数据安全没有保证

load file 

在语句下是不能复制的

从库上找不到文件

在主库上产生的uuid()和从库上产生的不一样

blob.png

行级复制

主库delete 删除了1W行 通过范围条件

就会在binerlog里记录1W行

delete from tb where @1=xx , @2=xxx ,,,isdel = 1;

binerlog过大 导致从库卡住了 造成延迟

打开binerlog一看就知道怎么回事了

从库上如果只有20条 发现数据少了好多 那么从库会报错

row : 1032 错误,找不到记录了

如果用statement最多智能看到 1062 错误 ,主建冲突

主库:where sed_index=xxx;

binnerlog:

update tb set 

@1=xxx,
@2=xxx,

where 
@1=xxx,
@2=xxx,

blob.png

如何记录用户的sql

general log

set long_query_time=0; 慢日志设置时间,让说有sql都记录到慢日志里

行级别复制ddl操作是以语句进行记录的

blob.png

查询binerlog

show binerlog events in 'mybinlog.00008' from 686;

 

blob.png

【补充】ndb cluster ,gtid模型下所有的mixed格式都是转成row格式的


DDL 数据操作语言  (Data Definition Language statements.)

Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言
1.CREATE – to create objects in the database 创建
2.ALTER – alters the structure of the database 修改
3.DROP – delete objects from the database 删除
4.TRUNCATE – remove all records from a table, including all spaces allocated for 

DML 数据操作语言 

1.insert into 

2.update 

3.delete 

等等

row格式现在是主流

gtid,ndb cluster,pxc

blob.png

help change master to ;

blob.png

delete操作再从库上没有找到记录


blob.png

全局的事务标志

crash recover还没支持的太好

blob.png

blob.png

master_auto_position=1;

mysql-5.6.9 以后的mysqldump

set @@GLOBAL.GTID_PUREGE

 

xtrabackup

set global gtid_purged需要gtid_purged是空的

如果不是空的不能执行命令 要reset master;

但这样binerlog就会都被清空


blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

slave1 到了100 但slave2只到90

blob.png

mha 补数据

blob.png

blob.png

blob.png

blob.png

用户写的操作用不用保证传到slave上?

不能保证 所以有半同步

半同步模型图:

blob.png

官方的半同步:在写入Storage之后是否响应用户的写入成功,是要等待日志传到slave上

收到slave ok之后才会响应客户端,我的日志已经传输完成了。

可能客户还没有收到Commit ok 其他客户访问就已经能看到客户commit的数据了(我觉得还好吧)

5.7之前都是这样

增强版半同步:

blob.png

write往slave上传输移到往storage上提交之前,只有传输到slave上之后才往storage上提交

5.7之后官方提供storage之前提交还是storage之后提交可参数配置

半同步要求日志提交之后slave必须给一个响应,

如果压力过大半同步基本上出现丢数据的问题

所以在业界使用并不是很多

性能上不去 大家没有太多使用

blob.png

blob.png

官方的5.7之前一个从库一个只能从一个主库同步

mariadb 10 引入了多通道复制

一个slave可以从多个主库上复制

mysql复制结构

任何节点都有一份数据造成了数据损坏切数据非常占用时间