MySql 主从库配置方案及原理

  本配置是本人在实际项目中根据需求进行的配置操作记录,编写该文过程中可也参考了许多文章,配置过程中可能会有一些不妥之处,还请大家多多指正。

一、原理解析:

1.Replication 线程

  Mysql的 Replication 是一个异步的复制过程(mysql5.1.7 以上版本分为异 步复制和半同步两种模式),从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制 过程主要由三个线程来完成,其中两个线程(Sql线程和 IO 线程)在 Slave 端,另 外一个线程(IO 线程)在 Master 端。要实现 MySQL 的 Replication ,首先必须 打开 Master 端的 Binary Log(mysql-bin.xxxxxx功能,否则无法实现。因为整个 复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全 顺序 的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件 中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。

2.复制过程:

  2.1 Slave 上面的 IO 线程连接上 Master,并请求从指定日志文件的指定位置 (或者从最开始的日志)之后的日志内容;

  2.2 Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线 程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;

  2.3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的 Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的 Master 端 的 bin-log的文件名和位置记录到 master- info 文件中,以便在下一次读取的时候 能够清楚的高速 Master“我需要从某个 bin-log的哪个位置开始往后的日志内容, 请发给我” ;

  2.4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句, 并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同 样的 Query,所以两端的数据是完全一样的。

二、配置准备:

  • 操作系统:windows
  • 数据库 :5.7及以上版本版本
  • 主库(Master):172.21.44.144:3306
  • 从库(Slave):172.21.44.143:3306

1.设置主库信息

备注:本文只对配置主从分离进行讲解,不对数据库本身安装与配置的讲解,如有需要,请在csdn博客中搜索mysql免安装版本的相关配置

1.1、主从库配置方法及信息:

  1.1.1  在主库中创建用于从库访问的用户:

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.12.44.143' IDENTIFIED BY '123456';
#账户名:slave
#地址:172.12.44.143
#password:123456

  1.1.2  (Master主库)修改mysql 中 my.ini文件中的信息:

[mysqld]
server-id = 144;#[必须]服务器唯一ID,默认是1,一般取IP最后一段
login_bin = mysql-bin;#[必须]启用二进制日志
#如有其他需求还可以添加,例如忽略哪些数据库不进行同步等。

  1.1.3  (Slave从库)修改mysql 中 my.ini文件中的信息:

[mysqld]
server-id = 143;#[必须]服务器唯一ID,默认是1,一般取IP最后一段
login_bin = mysql-bin;#[必须]启用二进制日志
#如有其他需求还可以添加,例如忽略哪些数据库不进行同步等。

  1.1.4  重启主库,并检查主库中的运行状态:

mysql>  show master status;
#记录结果中的两个重要信息:

#file:mysql-bin.000024
#position:102791

  1.1.5  启动slave后运行如下命令:

mysql> CHANGE MASTER TO MASTER_HOST = '172.21.44.144', 
mysql> MASTER_USER = 'slave', MASTER_PASSWORD = '123456',
mysql> MASTER_LOG_FILE = 'mysql-bin.000024', 
mysql> MASTER_LOG_POS = 102791; 
#   MASTER_LOG_FILE 和 MASTER_LOG_POS 的值是从show master status;中获取到的;

  1.1.6  查看(从库Slave)是否成功连接并运行:

mysql> show slave status; 
#或者如下命令:
mysql> show slave status \G;

##注意:当你看到
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
#则表示你当前的配置成功,并且数据库备份正常。此时你可以尝试在主库中进行增删改的操作,在从库验证操作是否同步进行。
1.2、异常信息解决方案:

    当然我们说,配置总是有许许多多的大坑在等着你,所以这里笔者总结了一些配置过程中查找异常和解决异常的方法。

    首先我们要明白并且会使用系统给我们做的一些异常记录。那就是windows的“事件查看器”,控制面板->系统和安全->管理工具->查看事件日志。利用这个工具我们就可方便的查看配置过程中的错误与异常,当然也可以通过mysql自带的错误日志。

  1.2.1  主从不能同步,Slave_SQL_Running: NO

mysql> show slave status; 
#或者如下命令:
mysql> show slave status \G;

##注意:当你看到
#Slave_IO_Running: Yes
#Slave_SQL_Running: NO
#可能存在的问题有在从库(Slave)上进行了写入操作,导致mysql停止了线程,此时需要查看事件查看器中的报错信息,我遇到的问题是表不存在,此时你可以通过具体的报错信息添加相应的数据库或者表(空表即可)。

  1.2.2  日志查看报错信息为1062,本人未遇到,但是之前有师兄遇到了,我在这里也总结一下解决方案:

在同步时候,有时候会发现经常 1062 的错误,可以在配置的时候,添加配 置项 skip-error 项。如果修改了连接主库相关信息,重启之前一定要删除 master.info 文件,否则重启之后由于连接信息改变从库而不会自动连接主库,造 成同步失败。此文件是保存连接主库信息的。

2、优化建议

    本次只是记录了一些配置的简单过程,在项目过程中为了避免熊孩子程序猿在数据操作的过程中误操作,例如在从库进行了插入操作,那么整个项目此时就会有比较大的威胁,为了避免这样的事情发生,通常都会给主从库配置不同的读写权限,主库能读能写,从库只能读取,这样就避免了熊孩子程序猿的误操作。具体的配置方式请搜索相关的配置博客,笔者在后续有空的时候也会添加自己的配置方案。


写在最后:
    配置过程中还是需要学会查阅异常信息,学会主动解决问题,一次不行就多次尝试,直到把问题解决。关于mysql的配置有很多的种类方式,也希望大家能找到适合自己项目的配置方案,对于本文中的不妥之处还请大家多多指正,共同进步。