01-MySQL8主从详解

主从原理master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,
当master服务器数据发生变化 , 则slave开始一个I/O Thread请求master二进制事件,同时maser节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件 , 并保存至从节点本地的中继日志Relay_Log_File中 , 从节点将启动SQL Thread从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒 。

注意几点:
1--master将操作语句记录到binlog日志中 , 然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑 , slave也开启binlog功能) 。
2--slave开启两个线程:IO线程和SQL线程 。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了 。
3--Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务 。
4--Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
5--master和slave两节点间时间需同步
1.1 Mysql复制的流程
01-MySQL8主从详解

文章插图
1、第一阶段
【01-MySQL8主从详解】Mysql复制过程的第一部分就是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上并行操作 。
1.2 主从复制的前提条件
  1. 开启binlog功能
  2. 主库master节点建立同步数据账号
  3. 从库要配置master.info(CHANGE MASTER to...相当于配置密码文件和Master的相关信息)
  4. start slave 开启复制功能
主从配置2.1 基础环境操作系统centos7.5 , 
节点名称IP地址master192.168.150.185slave192.168.150.252.2 基础配置关闭selinux
#临时关闭setenforce 0#永久关闭vi /etc/sysconfig/selinux......SELINUX=disabled......关闭防火墙
systemctl stop firewalld&&systemctl stop iptables时钟同步配置
#安装chronyyum install chrony#修改配置文件vi /etc/sysconfig/selinux......server ntp1.aliyun.com iburst......#启动服务systemctl start chronyd2.3 master主节点配置修改配置文件
vim /etc/my.cnf..........[mysqld]#数据库唯一ID , 主从的标识号绝对不能重复 。server-id=1#开启bin-log,并指定文件目录和文件名前缀log-bin=mysql-bin#同步test数据库 。如果同时同步多个库,就以此格式另写几行即可 。如果不指定某个库同步,删除此行 , 表示同步所有库(除了ignore忽略的库)binlog-do-db=test#不同步mysql系统数据库 。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开 。binlog-ignore-db=mysql#设置二进制日志自动删除/过期的天数,避免占用磁盘空间 。默认值为0,表示不自动删除 。expire_logs_days=7#确保binlog日志写入后与硬盘同步sync_binlog=1#bin-log日志文件格式binlog_format=ROW

推荐阅读