您的位置:首页 > 数据库 > MySQL

剖析 mysql 主从同步

2017-01-17 16:17 489 查看

一、前言

mysql 提供一套操作十分简便的方案来实施主从数据库进行数据同步,使得开发人员能够十分快速的构造一套高可用的主从数据库环境。这里主要探讨一下mysql的同步过程,以及出现的一些概念、和简单的原理做一下解释。

二、binlog日志

1.描述

  如果想了解 mysql 主从数据库之间是如何进行同步的,不可避免的就需要了解一下 binlog 日志。 binlog 日志又称二进制日志,从字面上的意思就知道 binlog 日志存储的形式为二进制。 Binlog 日志包含了所有针对数据库的修改,包含了所有更新的数据以及潜在更新的数据(例如:没有匹配任何行的update操作),除非 binlog 是基于行的日志级别。此外,每个binlog日志还包括了每个语句更新的时间长度信息。binlog的作用主要有以下两点:

主要目的在于:

○ 第一:用于主从数据库之间数据的同步

○ 第二:用于数据库的数据的备份以及恢复

在启用了binlog日志之后,mysql所在服务器的性能会随之下降。但是相比binlog提供的复制数据以及恢复数据的功能,这点的性能的下降不足挂齿。

2.日志格式

binlog日志格式类型分为三种

-i.row-based

基于行的格式类型,记录该条记录在变更前以及变更后数据。需要特别注意的是一般要求相应的表拥有能标识该行记录的主键。

配置方式:binlog-format=row

ii.statement-based

基于语句的格式类型,记录了所有的记录的执行语句。配置方式:binlog-format=statement

iii.mixed-base

以上两种的混合方式记录日志,在master进行记录时自动的切换模式。配置方式:binlog-format=mixed

在mysql 5.7.7 之前默认的方式为statement-based,在这之后默认为row-based方式。基于statement的方式可能出现一些不安全的问题,所以推荐使用基于行的方式。

3.配置binlog日志

i.启用binlog日志

linux 环境下:

Vim /etc/my.cnf

[mysqld]

Log-bin=hostname[必须配置,但是可以不配置name。默认情况下,为当前主机的host名称,但是在生产环境中还是建议配置hostname。这是为了在你不知情的情况下,修改了主机名称,造成日志文件不利于维护。]

Windows 环境下:

编辑 config 下面的my.ini 文件,配置如上

ii.查看binlog日志

因为binlog日志的形式为二进制为鉴, Mysql 提供mysqlbinlog 来查看binlog日志。直接进入到 mysql bin 文件目录,shell>mysqlbinlog hostname.XXXX

三、主从同步

在了解了binlog的日志之后,我们来正式了解一下mysql 主从同步的一些情况。

1.配置

i:对于master,需要配置基于行的方式记录binlog日志,配置server-id=1[需要保证在整个局域网内唯一即可]。并且在启 用这些配置之后,需要重启mysql实例。

ii:在master服务器新建一个用于读取binlog日志权限的mysql用户。

GRANT REPLICATION SLAVE ON . TO ‘username’@’host’ IDENTIFIED BY ‘mysql’;

iii:对于slave来说,在配置完以上的配置之后。并且需要配置一些信息用来与master进行交互,

master_host:master主机的地址;
master_user:主机上拥有binlog日志读取权限的用户名;
master_password:主机上拥有binlog日志读取权限的用户名对应的密码;
master_log_file:binlog日志文件名;
master_log_pos:开始进行binlog日志同步的位置。


2.基本原理



在master服务器上,binlogdump线程主要负责两个任务。

i.binlogdump线程写入binlog日志文件。binlog文件大小超过配置的最大值之后,binlog日志文件

重新另起文件,同时在文件的名上自动加1。

ii.binlogdump线程将binlog日志发送到slave。

在slave服务器,读取binlog和执行binlog是分开执行的,分别由 I/O 线程与 SQL DATA 线程分别进行操作。

i.I/O 线程读取从master发过来的binlog数据,写入中继文件[relaylog]。

ii.SQL DATA 线程读取中继文件,读取binlog日志内容同步到slave服务器。

四、查看master、slave 状态





在master服务上,可以看到mysqlbinlog 正在同步的文件,当前同步的数据的日志位置。

binlog_ignore_db:binlog日志忽略的数据库,也就是不记录binlog日志的数据库。

binlog_do_db:记录binlog日志的数据库。

slave_io_state: slave服务器I/O 线程读取binlog日志的状态。有一些状态:

trying to connect to the master

waiting for events from the master

reconnecting to the master。

一般在运行稳定的情况下,为waiting for events from the master 这个状态。

master_host:主机的地址。

master_user:主机服务器上用于读取binlog日志的mysql用户。

master_post: 主机mysql实例的端口号.

connect_retry:slave连接master时长。默认情况下为一分钟,可以配置。

master_log_file:当前读取masterbinlog日志文件名。

read_master_log_pos:当前读取masterbinlog日志位置。

relay_log_file:当前服务器 sql 线程读取的relay_log 日志文件名。

relay_log_pos:当前服务器sql线程读取位置

relay_master_log_file:当前读取中继日志文件名。

slave_io_running: slave I/O 线程的状态。

slave_sql_running: SQL 线程的状态。

以上两个状态用来标志slave日志同步的状态,当前如果状态标志为 NO 的情况下。就表明该slave服务器运行没有问题。

replicat_ignore_table:无需进行同步的数据库。

五、总结

 经过这些了解,我们已经能够整体上了解mysql 主从同步的一些基本的概念和原理。binlog 日志是整个mysql同步的核心内容,加上主从服务器各自的三个进程binlog dump 以及sql 进程以及 I/O 进程来辅助整个binloog从主服务器到从服务器的数据同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: