一、数据库的主从复制
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重做中继日志中的事件,将改变反映它自己的数据。
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可以获取这些事件并执行它。如下:
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
安装所需要的软件包
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
3、启动数据库服务,日志中会有初始密码的信息
/etc/init.d/mysqld start
grep password /var/log/mysqld.log
4、修改数据库密码,输入上面得到的root初始密码信息,然后更改自己的密码。
注意:这里密码为强加密方式,由大小写字母、数字、字符组成,缺一不可。
5、登陆数据库查看是否成功
6、server3和server2上进行同样的mysql配置
在server3上登陆数据库查看是否配置成功
三、MYSQL主从复制的实现
在主服务器server2上:
1、修改mysql的配置文件
vim /etc/my.cnf
添加:
server-id=2 #数据库中的id号,id取值不能相同
log-bin=mysql-bin #允许slave同步自己的二进制日志
2、重新启动mysql服务
3、进入mysql数据库中对slave(同步端)授权用户同步用户repl,查看复制起始点
mysql -p #登陆数据库
grant replication slave on *.* to repl@'172.25.88.%' identified by 'Hello-224'; #对172.25.88.%有权限同步
创建一个redhat数据库,并创建linux表,插入数据
4、在从服务器server3上:
1)修改mysql的配置文件
vim /etc/my.cnf
添加:server-id=3 #数据库中的id号
2)重新启动数据库服务
3)在从服务器上测试主服务器上建立的用户是否能登陆数据库mysql
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
show slave status #查看slave状态
Slave_IO_Running: Yes和Slave_SQL_Running: Yes即主从复制完成
5、测试:
在server3 slave端登陆数据库查看同步是否成功:
上图表示已经复制了主服务器的数据,在主服务器上再添加user3
在slave端测试同步是否成功
四、gtid方式的主从复制
1、在主服务器server2上
修改配置文件,重启mysql服务
vim /etc/my.cnf
添加:
gtid_mode=ON #开启gtid模式
enforce-gtid-consistency=true
2、在从服务器server3上,修改配置文件,和上面server2的修改相同,重启mysql服务
3、登陆mysql,停止slave,重新配置
4、再次开启slave,查看两个线程的状态是否为yes
5、在主服务器server2上删除linux表中的数据
6、测试:
在从服务器server3上测试从server2上同步过来的数据
即gtid方式的主从复制完成
五、gtid方式的一主两从
即:server2(master)---->server3(slave & master) ----->server4(slave)
server4作为另外一台从服务器,数据库的配置同server2和server3
server3从server2同步数据,server4从server3同步数据,其实也相当于server4从server2上同步数据
1、在server7上:
登陆数据库,查看数据库配置是否成功
进行配置,server2还是主服务器,不改变,配置server3作为server4的主服务器,原先server3作为server2的从服务器的配置不改变。server4作为server3从服务器。
2、在server3上对同网段的用户进行授权
3、在从服务器server4上测试是否可以登陆
4、server3作为主服务器,修改其配置文件
重新启动mysql服务
5、server4作为从服务器和上面一主一从中的从服务器的配置相同,并且重新启动mysql服务
6、在复制之前server2,server3,serevr4上面的数据要高度一致,所以将server2上的数据库拷贝出来,并复制给server4,首先实现复制之前的数据一致
7、在server4上编辑拷贝到的数据库,将数据导入到server4的数据库中
8、登陆mysql数据库,查看信息
9、在server4上:
登陆数据库打开slave
开启slave,查看IO和SQL两个线程是否为yes状态
10、现在三台服务器上的数据均一样。
测试,在server2数据库中添加数据
在server3中查看同步信息
在server4中查看同步信息
即gtid方式的一主两从复制成功