一、Mysql复制简介

    使用mysql复制功能可以将主数据的数据复制到多台从服务器上。默认情况下,采用异步传输方式,数据复制可以在各种不同的网路环境中进行。主从复制技术在企业生产中得到了广泛应用,它避免了数据库的单点故障,当一台服务器宕机,其他服务器一样可以提供稳定可靠的数据服务。


1 mysql 复制原理

    Mysql复制功能是将数据分布在多个系统上,这种机制是通过将Mysql的某一台服务器(master)的数据复制到其它服务器(slaves)上来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,从服务器接收到这些更新的日志内容,就按照日志内容在本机执行一遍,由此实现主从数据复制。主服务器写入日志时也维护着文件的一个索引以跟踪日志循环,当一个从服务器连接主服务器时,它通知主从服务器在日志中读取的最后一次成功更新的位置,从服务器接收那个时间点起发生的任何更新,然后封锁并等待主服务器通知新的更新。


2 mysql 复制优点

    高性能:通过将请求分配给多台不同的从服务器,提高性能及速度,在此种环境中,所有写操作必须在主服务器进行,读操作可以平均分配给多台从服务器。

    数据安全:数据通过主从复制,把主服务器的数据复制的一份或者多份,即实现了数据的安全备份

    数据分享:对于大型企业,各个地区的分公司也需要共享总部的数据资源,只需要用主从复制即可实现数据的共享,而且可以仅仅在需要时进行复制。


3 mysql 复制格式

    基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。

    基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

    混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。


4 mysql 复制步骤

整体上来说,复制有3个步骤:

(1)  master将改变记录到二进制日志(binary log)中(二进制日志事件,binary log events);

(2)  slave将master的binary log events拷贝到它的中继日志(relay log);

(3)  slave重做中继日志中的事件,将改变反映它自己的数据。

Mysql高可用复制原理及主从实例测试解析_第1张图片

5 主从复制形式

    一主一从

    主主复制

    一主多从---扩展系统读取的性能,因为读是在从库读取的;

    多主一从---5.7开始支持

    联级复制---

Mysql高可用复制原理及主从实例测试解析_第2张图片


半同步复制

    5.5版本集成到mysql,以插件的形式存在,需要单独安装

    确保事务提交后binlog至少传输到一个从库

    不保证从库应用完这个事务的binlog

    性能有一定的降低,响应时间会更长

    网络异常或从库宕机,卡主主库,直到超时或从库恢复

半同步原理图:

Mysql高可用复制原理及主从实例测试解析_第3张图片


二、Mysql主从复制实例解析


首先了解数据库的主从复制部署注意要点

>>在主服务器上开启二进制日志,并设置唯一的服务器ID编号,设置后重启mysql生效。

>>在所有从服务器上设置唯一服务器ID编号,重启后生效。

>>在主服务器上创建让从服务器读取日志文件的账号,或者使用统一账户。

>>在进行数据复制前,需要记录主服务器上二进制日志的位置标记。


下面对整个主从复制过程详细解析


1 主服务器设置数据复制环境

在已安装或者使用过的数据库上创建数据库和数据表,演示如何对已经存在的数据进行数据同步备份

[root@master ~]# mysql -u root -p

mysql> create database hr;

mysql> use hr;

mysql> create table employees(

-> employee_id INT NOT NULL AUTO_INCREMENT,

-> name char(20) NOT NULL,

-> e_mail varchar(50),

-> PRIMARY KEY(employee_id));

mysql> INSERT INTO employees values

->(1,'TOM','[email protected]'),

->(2,'Jerry','[email protected]');

mysql> exit

在主服务器上开启二进制日志并设置服务器编号,服务器唯一编号必须是1至232-1之间的整数,根据自己的实际情况进行设置。进行这些设置需要关闭MySQL数据库并编辑my.cnf或my.ini文件,并在[mysqld]设置段添加相应的配置选项。

[root@master ~]# vim /etc/my.cnf

[mysqld]

log-bin=Jacob-bin        #启用二进制日志,并设置二进制日志文件前缀

server-id=25           #设置服务器编号

[root@master ~]# service mysqld restart

[root@master ~]# service iptables stop


2 从服务器设置数据复制环境

在已安装或者使用过的数据库机器上设置,服务器ID必须设置为集群中唯一编号。对于从服务器而言,二进制日志功能无需开启,当然,根据业务需要也可以开启,比如主主复制中互为主从时需要都开启。

[root@slave ~]# vim /etc/my.cnf

[mysqld]

server-id=24

[root@slave ~]# service mysqld restart

[root@slave ~]# service iptables stop


3 创建数据复制账号

主服务器上必须至少有一个账户供从服务器连接使用。这个账户必须具有REPLICATION SLAVE权限,你可以为不同的从服务器创建不同的账户与密码,也可以使用统一的账户与密码。使用CREATE USER语句创建用户,使用GRANT语句为账户赋权。

[root@master ~]# mysql -u root -p

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

mysql> exit


4 读取主服务器二进制日志信息

在进行主从数据复制之前首先查看主服务器的二进制日志文件的基本信息,主服务器二进制文件名称及当前日志记录位置在对从服务器的设置中需要用到。

[root@master ~]# mysql -u root -p

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;

+--------------------------------+------------+---------------------+-------------------------+-------

| File|Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+--------------------------------+------------+---------------------+-------------------------+-------

| jacob-log.000001|1226        |                                |                                |

+--------------------------------+------------+---------------------+--------------------------+------

mysql> UNLOCK TABLES;


5 对现有数据库备份并导入从服务器

如果在使用数据复制以前,数据库系统中已经存在数据资源,使用mysqldump工具对这些资料进行数据备份,在主服务器上使用该工具对数据备份后即可在从服务器上进行数据还原操作。当数据达到主从一致后,就可以使用数据复制功能进行自动从此同步操作。

[root@master ~]# mysqldump --all-databases --lock-all-tables > /tmp/dbdump.sql

[root@master ~]# scp /tmp/dbdump.sql 192.168.1.8:/tmp/

[root@slave ~]# mysql -u root -p < dbdump.sql


配置从服务器连接主服务器进行数据复制

数据复制的关键操作是配置从服务器去连接主服务器进行数据复制,需要配置从服务器建立网络连接所有必要的信息。使用CHANGE MASTER TO语句即可完成该项工作,MASTER_HOST指定主服务器主机名或IP地址,MASTER_USER为主服务器上创建的拥有复制权限的账户名称,ASTER_PASSWORD为该账户的密码,MASTER_LOG_FILE指定主服务器二进制日志文件名称,MASTER_LOG_POS为主服务器二进制日志当前记录的位置。START SLAVE开启从服务器功能进行主从连接,SHOW SLAVE STATUS查看从服务器状态。

[root@slave ~]# mysql -u root -p

mysql> CHANGE MASTER TO

-> MASTER_HOST='192.168.1.7',

-> MASTER_USER='slave',

-> MASTER_PASSWORD='123456',

-> MASTER_LOG_FILE='jacob-log.000001',

-> MASTER_LOG_POS=1226;

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G;


7 数据同步测试验证

在主数据库上创建数据库及表,然后去从服务器查看是否同步。

[root@master ~]# mysql -u root -p

mysql> create database test2;

mysql> use test2;

mysql> create table t_table(

->name char(20),

-> age int,

-> note varchar(50));

mysql> INSERT INTO t_table values

-> ('linda',23, 'Beijing'),

-> ('jerry',33, 'shanghai'),;

mysql> exit

[root@slave ~]# mysql -u root -p

mysql> select * from test2.t_table;

mysql> exit



三、主从复制存在的问题及解决方法

mysql主从复制存在的问题:

    主库宕机后,数据可能丢失

    从库只有一个sql Thread,主库写压力大,复制很可能延时

解决方法:

    半同步复制---解决数据丢失的问题

    并行复制----解决从库复制延迟的问题


复制出错处理:

    常见:1062(主键冲突),1032(记录不存在)

解决方法:

    手动处理

    跳过复制错误设置:set global sql_slave_skip_counter=1