一、数据库的主从复制

1、mysql主从复制基本原理

        mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到的二进制日志,获取日志信息更新。通过设置在Master上的binlog,使其处于打开状态;Slave通过一个I/O线程从Master上读取binlog,然后传输到Slave的中继日志中,然后使用SQL线程读取中继日志,并应用到自身数据库中,从而实现主从数据同步功能。

2、复制的3个步骤:

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

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

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

change mysql 主从复制 mysql实现主从复制_服务器

1)该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日 志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

2)下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中 继日志。

3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数 据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线 程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

3、发送复制事件到其它slave

当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。如下:

change mysql 主从复制 mysql实现主从复制_mysql_02

4、复制配置

有两台MySQL数据库服 务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master 中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

5、复制功能

  • 数据分布
  • 负载均衡(读)
  • 备份
  • 高可用和故障切换
  • MySQL升级测试

6、复制中线程的作用:

从节点:

    I/O Thread:从Master请求二进制日志事件,并保存于中继日志中。
    Sql Thread:从中继日志中读取日志事件,在本地完成重放。

主节点:

    Dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向从节点发送二进制事件。

7、GTID概述

1)全局事物标识:global transaction identifieds。

2)GTID事物是全局唯一性的,且一个事务对应一个GTID。

3)一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

4)GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。

5)MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

6)在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

8、GTID比传统复制的优势:

1)更简单的实现failover,不用以前那样在需要找log_file和log_Pos。

2)更简单的搭建主从复制。

3)比传统复制更加安全。

4)GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

9、GTID的工作原理:

1)master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。

2)slave端的I/O 线程将变更的binlog,写入到本地的relay log中。

3)sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

4)如果有记录,说明该GTID的事务已经执行,slave会忽略。

5)如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

二、MYSQL服务配置

1、环境说明:

mysql主机:server2 172.25.88.2
mysql从机:server3 172.25.88.3        server4  172.25.88.4

2、解压mysql软件包

在server2上:

tar   xf    mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_03

安装所需要的软件包

yum   install   mysql-community-client-5.7.17-1.el6.x86_64.rpm   mysql-community-common-5.7.17-1.el6.x86_64.rpm   mysql-community-libs-5.7.17-1.el6.x86_64.rpm   mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm   mysql-community-server-5.7.17-1.el6.x86_64.rpm   -y

change mysql 主从复制 mysql实现主从复制_mysql_04

3、启动数据库服务,日志中会有初始密码的信息

/etc/init.d/mysqld    start

grep   password    /var/log/mysqld.log

change mysql 主从复制 mysql实现主从复制_数据库_05

4、修改数据库密码,输入上面得到的root初始密码信息,然后更改自己的密码。

注意:这里密码为强加密方式,由大小写字母、数字、字符组成,缺一不可。

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_06

5、登陆数据库查看是否成功

change mysql 主从复制 mysql实现主从复制_数据库_07

6、server3和server2上进行同样的mysql配置

在server3上登陆数据库查看是否配置成功

change mysql 主从复制 mysql实现主从复制_数据库_08

三、MYSQL主从复制的实现

在主服务器server2上:

1、修改mysql的配置文件

vim   /etc/my.cnf

添加:

server-id=2                           #数据库中的id号,id取值不能相同

log-bin=mysql-bin                #允许slave同步自己的二进制日志

change mysql 主从复制 mysql实现主从复制_服务器_09

change mysql 主从复制 mysql实现主从复制_mysql_10

2、重新启动mysql服务

change mysql 主从复制 mysql实现主从复制_mysql_11

3、进入mysql数据库中对slave(同步端)授权用户同步用户repl,查看复制起始点

mysql   -p                   #登陆数据库

grant  replication  slave   on  *.*  to  repl@'172.25.88.%' identified  by  'Hello-224';      #对172.25.88.%有权限同步

change mysql 主从复制 mysql实现主从复制_数据库_12

创建一个redhat数据库,并创建linux表,插入数据

change mysql 主从复制 mysql实现主从复制_服务器_13

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_14

4、在从服务器server3上:

1)修改mysql的配置文件

vim    /etc/my.cnf

添加:server-id=3            #数据库中的id号

change mysql 主从复制 mysql实现主从复制_mysql_15

change mysql 主从复制 mysql实现主从复制_服务器_16

2)重新启动数据库服务

change mysql 主从复制 mysql实现主从复制_数据库_17

3)在从服务器上测试主服务器上建立的用户是否能登陆数据库mysql

change mysql 主从复制 mysql实现主从复制_服务器_18

4)进入数据库,设置从数据库,并开启slave

mysql   -p

change   master   to   master_host='172.25.88.2',master_user='repl',master_password='Hello-224',master_log_file='mysql-bin.000004',master_log_pos=639;                 #在slave指定要复制的master

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_19

show   slave   status                                      #查看slave状态

change mysql 主从复制 mysql实现主从复制_mysql_20

Slave_IO_Running: Yes和Slave_SQL_Running: Yes即主从复制完成

5、测试:

在server3  slave端登陆数据库查看同步是否成功:

change mysql 主从复制 mysql实现主从复制_服务器_21

change mysql 主从复制 mysql实现主从复制_服务器_22

上图表示已经复制了主服务器的数据,在主服务器上再添加user3

change mysql 主从复制 mysql实现主从复制_服务器_23

在slave端测试同步是否成功

change mysql 主从复制 mysql实现主从复制_服务器_24

四、gtid方式的主从复制

1、在主服务器server2上
修改配置文件,重启mysql服务

vim    /etc/my.cnf

添加:

gtid_mode=ON                            #开启gtid模式

enforce-gtid-consistency=true

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_25

change mysql 主从复制 mysql实现主从复制_数据库_26

2、在从服务器server3上,修改配置文件,和上面server2的修改相同,重启mysql服务

change mysql 主从复制 mysql实现主从复制_数据库_27

change mysql 主从复制 mysql实现主从复制_数据库_28

3、登陆mysql,停止slave,重新配置

change mysql 主从复制 mysql实现主从复制_数据库_29

4、再次开启slave,查看两个线程的状态是否为yes

change mysql 主从复制 mysql实现主从复制_数据库_30

5、在主服务器server2上删除linux表中的数据

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_31

6、测试:

在从服务器server3上测试从server2上同步过来的数据

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_32

即gtid方式的主从复制完成

五、gtid方式的一主两从

即:server2(master)---->server3(slave & master) ----->server4(slave)

server4作为另外一台从服务器,数据库的配置同server2和server3

server3从server2同步数据,server4从server3同步数据,其实也相当于server4从server2上同步数据

1、在server7上:

登陆数据库,查看数据库配置是否成功

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_33

进行配置,server2还是主服务器,不改变,配置server3作为server4的主服务器,原先server3作为server2的从服务器的配置不改变。server4作为server3从服务器。

2、在server3上对同网段的用户进行授权

change mysql 主从复制 mysql实现主从复制_数据库_34

3、在从服务器server4上测试是否可以登陆

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_35

4、server3作为主服务器,修改其配置文件

change mysql 主从复制 mysql实现主从复制_数据库_36

change mysql 主从复制 mysql实现主从复制_服务器_37

重新启动mysql服务

change mysql 主从复制 mysql实现主从复制_服务器_38

5、server4作为从服务器和上面一主一从中的从服务器的配置相同,并且重新启动mysql服务

change mysql 主从复制 mysql实现主从复制_数据库_39

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_40

6、在复制之前server2,server3,serevr4上面的数据要高度一致,所以将server2上的数据库拷贝出来,并复制给server4,首先实现复制之前的数据一致

change mysql 主从复制 mysql实现主从复制_数据库_41

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_42

7、在server4上编辑拷贝到的数据库,将数据导入到server4的数据库中

change mysql 主从复制 mysql实现主从复制_数据库_43

change mysql 主从复制 mysql实现主从复制_mysql_44

change mysql 主从复制 mysql实现主从复制_mysql_45

8、登陆mysql数据库,查看信息

change mysql 主从复制 mysql实现主从复制_数据库_46

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_47

9、在server4上:

登陆数据库打开slave

change mysql 主从复制 mysql实现主从复制_服务器_48

 

开启slave,查看IO和SQL两个线程是否为yes状态

change mysql 主从复制 mysql实现主从复制_数据库_49

10、现在三台服务器上的数据均一样。
测试,在server2数据库中添加数据

change mysql 主从复制 mysql实现主从复制_数据库_50

在server3中查看同步信息

change mysql 主从复制 mysql实现主从复制_change mysql 主从复制_51

在server4中查看同步信息

change mysql 主从复制 mysql实现主从复制_数据库_52

即gtid方式的一主两从复制成功