mysql主从复制:
mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
===================================================================================
复制如何工作
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
原理图:
主从复制分两种:异步复制和半同步复制,mysql默认是异步复制,在半同步复制下,如果节点出现问题,系统在等待一段时间之后就会重新切到默认的异步复制。
下面介绍异步复制的配置:
环境:RHEL6.5
虚拟机:
172.25.41.1(master)
172.25.41.2(slave)
需要的包:
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-devel-5.7.17-1.el6.x86_64.rpm
mysql-community-embedded-5.7.17-1.el6.x86_64.rpm
mysql-community-embedded-devel-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
===============================================================================================================
准备工作:
master 上的配置:
安装mysql
#yum install mysql-community-* -y
#vim /etc/my.cnf
文件解释:
log-bin=mysql-bin -> 打开日志
server-id=1 -> 用于标示该语句最初是从哪个server写入的
=================================================================================================================
启动mysql
#//etc/init.d/mysqld start
#cat /var/log/mysqld.log |grep pass -> 查看初始密码
#mysql_secure_installation -> 修改mysql密码
注意:mysql的密码要求较高。格式例如:[email protected]
如果不想这么麻烦,我们可以通过命令修改密码强度要求,但是这个设定是暂时的,永久的修改要下载插件。
如何修改密码强度要求呢:
设置密码等级:
mysql> set global validate-password_policy =0;
mysql> set global validate_password_length=0;
后面我们就可以用简单的密码进行操作啦。
================================================================================================================
创建slave复制时使用的身份:
# mysql -uroot [email protected]
mysql> grant replication slave on *.* to 'westos'@'172.25.41.2' identified by '[email protected]';
mysql> show master status;
保存下来file的position的状态,slave端同步的时候要用到。
=================================================================================================================
记得关闭防火墙和查看selinux状态
==================================================================================================================
slave 上:
先和master一样安装mysql
#vim /etc/my.cnf
加上一行:
server_id=2 注意:与主机上的id不能相同。
==============================================================================================================
#/etc/init.d/mysqld start
和master一样修改密码
进入数据库之后
mysql > stop slave;
mysql > change master to master_host='172.25.41.1',master_user='westos',master_password='[email protected]',master_log_file='mysql-bin.000003',master_log_pos=693;
解释:master_host -> 从谁同步来的数据 . master_user->以什么身份同步数据 master_password->密码是什么 master_log_file-> 要同步的文件是哪个 master_log_pos-> 让从节点从主节点的哪个位置开始同步数据
mysql> start slave ->开启slave
===================================================================================================================
测试:
mysql> show slave status\G;
看到两个yes即代表配置成功
代表从节点上两个线程正常运行中。
========================================================================================================================
半同步复制配置:
主节点上:
rpl_semi_sync_master_wait_for_slave_count该变量设置主需要等待多少个slave应答,才能返回给客户端,默认为1。
rpl_semi_sync_master_wait_no_slave ON
默认值,当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status依旧显示为ON。
OFF
当状态变量Rpl_semi_sync_master_clients中的值于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即异步复制。
如果我的架构是1主2从,2个从都采用了半同步复制,且设置的是rpl_semi_sync_master_wait_for_slave_count=2,如果其中一个挂掉了,对于rpl_semi_sync_master_wait_no_slave设置为ON的情况,此时显示的仍然是半同步复制,如果rpl_semi_sync_master_wait_no_slave设置为OFF,则会立刻变成异步复制。
====================================================================================
从节点上:
============================================================================
测试:
主节点上:
可以看到插入数据的等待时间很短,这是因为我们设置主节点在等待到一个从节点给他的应答之后就可以将数据返回给客户端(默认值就是1),这时候从节点的半同步复制是开启的,所以主节点很快等到了从节点的回应并将数据传给了客户端,于是我们可以看到它插入成功!如果这个时候关闭从节点的半同步复制功能会发生什么呢?我们来试一试。
====================================================================================
从节点:
mysql> stop slave io_thread;
====================================================================================
主节点:
可以看到在从节点的半同步复制关闭的情况下,客户端在十秒钟多之后才能接收到返回的数据,比刚才慢了很多,这是因为主节点等不到从节点的回应,超过一定时间之后。就会自动转换为默认的异步复制,然后最终实现数据同步。
===================================================================================
其他数据:
Rpl_semi_sync_master_clients
当前半同步复制从的个数,如果是一主多从的架构,并不包含异步复制从的个数。
Rpl_semi_sync_master_no_tx
The number of commits that were not acknowledged successfully by a slave.
具体到上面的测试中,指的是insert into test.test values(2)这个事务。
Rpl_semi_sync_master_yes_tx
The number of commits that were acknowledged successfully by a slave.
具体到上面的测试中,指的是以下四个事务
create database test;
create table test.test(id int);
insert into test.test values(1);
insert into test.test values(3);
tips:并不是说一主多从情况下从节点全部都要是异步复制,也可以异步复制和半同步复制一起使用。