mysql 主从复制学习
什么是主从复制
MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
主从复制的过程
1、首先client端(tomcat)将数据写入到master节点的数据库中,master节点会通知存储引擎提交事务,同时会将数据以(基于行、基于sql、基于混合)的方式保存在二进制日志中
2、SLAVE节点会开启I/O线程,用于监听master的二进制日志的更新,一旦发生更新内容,则向master的dump线程发出同步请求
3、master的dump线程在接收到SLAVE的I/O请求后,会读取二进制文件中更新的数据,并发送给SLAVE的I/O线程
4、SLAVE的I/O线程接收到数据后,会保存在SLAVE节点的中继日志中
5、同时,SLAVE节点钟的SQL线程,会读取中继日志钟的数据,更新在本地的mysql数据库中
6、最终,完成slave——>复制master数据,达到主从同步的效
记住两个日志和三个线程:
两个日志:二进制日志(bin log) 、中继日志(Relay log)
三个线程:I/O线程、dump线程、SQL线程
注意:中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行 更新操作不能在 Slave上并行操作。
半同步复制,会多一个ack确认线程(ack collector thread),专门用于接收slave 的反馈 信息(收集slave节点返回的ack信息)。
mysql 主从复制延迟原因
- master服务器高并发,形成大量事务
- 网络延迟
- 主从硬件设备导致
- cpu主频、内存io、硬盘io
- 本来就不是同步复制、而是异步复制
- 从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完 成,减少磁盘操作。
- 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
- 从库使用SSD磁盘
- 网络优化,避免跨机房实现同步
mysql 主从复制模式
- 异步复制(Asynchronous replication): MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整
- 全同步复制(Fully synchronous replication):指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
- 半同步复制(Semisynchronous replication):介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
主从架构 (这里使用了一出一从)
master: 192.168.1.239
slave: 192.168.1.238
master
- 安装mysql
- 关闭防火墙
- 修改 /etc/my.cnf 文件,添加如下两行
log_bin=mysql-bin #启用二进制文件
server-id=1 # 服务器唯一ID。唯一即可
- 然后重启mysql
- 进入mysql,然后使用grant语句配置slave访问master的权限,ip 为slave的ip
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'IP' identified by 'slave'; #语法
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'192.168.1.238' identified by '123456';
flush privilages; # 刷新权限
- 执行成功后,使用
show master status;
即可查看二进制日志和偏移量
slave
- 按照同样的步骤对slave的机器安装mysql,关闭防火墙。
- 修改 /etc/my.cnf
server-id=2 # 不要和 master 一样
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1
- 重启登录mysql
- 设置主库地址及同步位置
change master to master_host='192.168.1.239',master_user='xiaoming',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=120;
flush privilages;
#参数说明
A. master_host : 主库的IP地址
B. master_user : 访问主库进行主从复制的用户名(上面在主库创建的)
C. master_password : 访问主库进行主从复制的用户名对应的密码
D. master_log_file : 从哪个日志文件开始同步(上述查询master状态中展示的有)
E. master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中展示的有)
- 查看从数据库的状态
show slave status;
- 当看到两个yes的时候表示主从数据库创建成功