一、前言
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从主服务器到从服务器的数据同步。