二进制日志文件内容和中继日志内容的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制日志文件内容和中继日志内容的区别相关的知识,希望对你有一定的参考价值。

二进制日志文件内容和中继日志内容的区别

首先分析下:二进制日志记录的是主库的修改行为,而中继日志记录的是接收自主库的二进制日志,那是否可以认为:从库的中继日志=主库的二进制日志呢?至少Oracle 物理备库的归档=主库的归档 可以这么认为。

以下开始做实验:

以下5.112是主库,5.117是从库,配了半同步。

首先主库上执行flush logs;生成了新的二进制日志,同时从库的中继日志发现也跟着切换了。再执行一条delete操作后,我们来看结果。

我们先登录数据库查现在的二进制日志和中继日志信息。

主库现在的二进制文件是mysql-bin.000058,位置点是335

这个从库上也能查到:

再看物理文件:

主库的二进制日志:

注意到了没有,物理文件的大小跟主从库的POS值(位置点)是一样的!!!

从物理文件来看,主从库的文件大小并不一致,难道主从库的这两个文件内容不一样?我们用mysqlbinlog导出内容来看看。

主库:mysqlbinlog --base64-output=decode-rows -v -v mysql-bin.000058 > binlog

从库:mysqlbinlog --base64-output=decode-rows -v -v mysql-relay-bin.000031 > relaylog

使用工具,对比一下内容:

可以发现:二进制日志和中继日志除了开头注释部分和位置点信息不一样外,其他信息是一样的,而且开头的注释信息无关紧要。注释信息以下,主库的二进制日志位置点是120,从库的中继日志是283,这也是我们每次执行flush logs;查到的第一个位置点。同时注释信息以下,二进制和中继日志的每个位置点都差了163。


所以综上,二进制日志文件内容和中继日志内容的区别是:

1. 两者文件开头的注释内容不一样,两者执行的内容是一样的。

2. 两者主要信息的位置点差了163。

3. 两种文件的位置点值,可认为跟其文件大小一致。

参考技术A 1,最好使用内网或者专线链路传输binlog数据 (千兆网卡、还不够的话,bounding 技术,扩展带宽) 在my.cnf中强制使用内网ip传输数据bind-address=ip
2,将二进制保存在独立的存储介质上(提升I/O)
3,买多核CPU,使用多线程方式传输二进制日志 ()
4,如果二进制日志不是row格式,则尽可能不要再insert 或者update的时候使用select ,statement模式会给master传输二进制时候造成大的压力
5,想尽办法减少master的写I/O(memcached)(既要写自己的二进制日志,也要负责读自己的二进制日志写给slave服务器),master上的I.O越低,越能快的将binlog传输给slave、
加memcached 缓存层,数据库上次做个缓冲池放到内存中,由memcached管理,周期性的将数据同步给数据库,把大并发的写操作,合并成小量的写操作。以此减少master写I/O

架构设计1:
主从服务器可以使用不同的存储引擎,master上使用innodb,利用事务,行锁等高级锁特性,slave上使用MYISAM,读性能更好,节省内存,容易备份。还可以使用不同的数据类型,例如

master上用varchar,slave上用char。不仅节省空间,还可以使用myisam的静态表特性。
M-S--Muti SLAVE方案中,中继slave还可以使用blackhole存储引擎,blackhole存储引擎值记录日志,不写数据,此特性可以让中继日志性能提升很多,但是,这种方案不支持GTIDs模式下的

replication,因为blackhole只能搭配statement格式的二进制日志使用,row和mixed格式都不支持。
在读写分离中,主存服务器采用不同索引采用不同方案,master可以只保留主键或者唯一索引等保证数据关系的索引,而slave针对查询做索引优化、

架构设计2:

让更新频繁,且需要实时的数据查询放到master上,再通过持久化session,让发生修改的用户先看到结果,其他人等待同步完后同步replication,

如果开发做不到,用下面的memcached,在数据之前加上memcached
让用户对数据库的更改先保存到memcached中,memcached是一种内存中的存储引擎(独立第三方技术),由于内存的读写性能很高 ,可以把读写特别频繁的更新数据保存到这里,每隔5分钟

,再把数据同步到master,对于另一个客户端来说,让他优先到master找数据,即在master上的memcached中读数据,在读slave。这样可以优先将更改的数据由内存返回给用户,这样降低了

降低硬盘IO,对于那些已经同步后数据把他分离到slave,这样master就可以转们做有关于的数据更新的写操作,完全分离了master的读。

动态缓存是讲用户请求比较频繁的动态数据缓存到memcached中,使得后续的访问用户可以直接从memcached中取数据

replication容量:
是指:replication延迟程度、
将replication暂停一段时间(M),再重新开启,并观察slave多久可以达到于master一致(N)
replication容量=N:M
建议保持容量在3倍以上,即1:3 (1小时的M,20分钟的N)

多线程传输二进制日志:
mysql5.6开始支持多线程方式传输二进制日志
只能工作在GTIDs 模式下
只有对不同的库执行的操作才能采用多线程传输。同一个库不同表的操作只能单独用单进程传输。
my.cnf
[mysqld]
slave-parallel-workers=N 默认是0 表示不开启 线程数
N 根据CPU的核数来决定,几核就写几,和数据库的数量一一对应,几个库就是几个线程来传输二进制日志 ,qps上万的话,多线程传输会有很明显的性能提升

Centos7配置mysql主从:一主多从

mysql主从复制原理
1.首先master将数据更新记录到二进制binlog文件
2.slave通过I/O线程向master请求binlog日志文件指定位置之后的内容
3.master接收到slave的io请求之后,就会从binlog相应的位置点开始,给slave传日志
4.slave接收到日志后,会写入本地的relay log中继日志中
5.slave通过sql线程读取中继日志的内容,在数据库中执行相应的操作,到此为止,master和slave上的数据一致,之后slave服务器进入等待状态,等待master的后续更新
系统环境

服务器 IP地址 操作系统 安装软件
Mysql_master 192.168.2.217 Centos 7 64位 mysql-5.7.23
Mysql_slave1 192.168.2.218 Centos 7 64位 mysql-5.7.23
Mysql_slave2 192.168.2.219 Centos 7 64位 mysql-5.7.23

mysql是通过源码编译安装,配置文件:/etc/my.cnf,安装目录:/data/mysql,数据存放目录:/data/mysql/data,bin-log日志目录:/data/mysql/bin-log,测试同步数据库:zabbix
在master上操作
(1)创建bin-log日志存放目录

mkdir /data/mysql/bin-log
chown -R mysql:mysql /data/mysql/bin-log

(2)修改master的配置文件,在[mysqld]下面添加如下配置内容

server-id=1   #master ID
log-bin=/data/mysql/bin-log/mysql-bin   #指定binlog日志目录
binlog-do-db=zabbix   #指定生成binlog日志的数据库

(3)如果开启了firewalld防火墙,需要开放mysql端口

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="3306" accept"
firewall-cmd --reload

(4)重启mysql
service mysqld restart
(5)创建zabbix数据库,并导入表结构

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> use zabbix;
mysql> source /tmp/schema.sql;

(6)查看bin-log和master状态

mysql> show variables like "log_bin";
mysql> show master status;

技术分享图片
(7)创建同步用户

mysql> grant replication slave on *.* to ‘xuad‘@‘192.168.2.%‘ identified by ‘xu123456‘;
mysql> select user,host from mysql.user;

技术分享图片
在两台从库上操作
(1)在两台从库上创建zabbix数据库

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> exit

(2)在master上备份一份完整的数据库,在两台slave上导入

mysqldump -uroot -p123456 --single-transaction --master-data=2 zabbix > /tmp/zabbix.sql
scp -P 22 /tmp/zabbix.sql [email protected]:/tmp/
scp -P 22 /tmp/zabbix.sql [email protected]:/tmp/
mysql -uroot -p123456 zabbix < /tmp/zabbix.sql

(3)修改slave的配置文件,在[mysqld]下面添加如下配置内容

server-id=2  #slave ID,另一台配置成3
replicate-do-db=zabbix   #指定同步的数据库

(4)重启两台slave的mysql
service mysqld restart
(5)分别在两台slave上创建主从同步

mysql> change master to  master_host=‘192.168.2.217‘, master_port=3306, master_user=‘xuad‘, master_password=‘xu123456‘, master_log_file=‘mysql-bin.000001‘, master_log_pos=211943;
mysql> start slave;
mysql> show slave statusG

技术分享图片
测试
(1)在master上导入zabbix的数据

mysql -uroot -p123456 zabbix < /tmp/images.sql
mysql -uroot -p123456 zabbix < /tmp/data.sql

(2)查看master和slave状态的Position是否一致
mysql&gt; show master status;
技术分享图片
mysql&gt; show slave statusG
技术分享图片
(3)检查从库上是否已经有数据了

mysql> use zabbix;
mysql> select userid,alias,name,passwd from users;

技术分享图片
至此mysql一主双从配置完成

以上是关于二进制日志文件内容和中继日志内容的区别的主要内容,如果未能解决你的问题,请参考以下文章

binlog日志和中继日志信息查看

图文结合带你搞懂MySQL日志之relay log(中继日志)

关系型数据库之Mysql备份

mysql主从复制

MySQL数据库主主复制

Centos7配置mysql主从:一主多从