主从复制同步机制实现的过程及详解:
master sever—>数据更新—>写入BinLog—>开启dump线程—>(slave sever)io线程—>写入relay log—>SQL线程—>数据更新
主从复制的过程中会开启三个线程,其中主节点要想把自己的二进制日志同步到从节点,需要在主机点上开启一个专门用来同步二进制日志的线程,这个线程的功能就是把主节点上的二进制日志copy出来通过网络发送给从节点,这个线程叫做dump线程,有几个从节点,就要同步几次,一个从节点对应一个dump线程,所以分别各自要打开各自对应的dump线程,理论上来讲,开的dump线程越多,对主节点来讲也是增加了一种资源消耗,服务器压力也比较大,所以在日常生产中2-3个从节点还是比较常见的
那么从节点接收日志也会有相对应的io线程,io线程负责连接到主节点上接收二进制日志,然后临时存放在relay log(中继日志)中,但是放在relay log中是没有起到同步作用的,还需要SQL线程把relay log中的内容读进来应用到真正的数据库里去,这样的话就实现了主从的数据同步。
主从复制依赖于二进制日志,机制实现的必要条件是主节点上必须开启二进制日志,否则主从复制将无法实现,因为二进制日志里记录的是对数据库所有的增删改操作,当对数据库主节点的服务器数据更新的时候,更新的信息就会写到二进制日志里,主从实现同步的过程很简单,就是把主节点更新的二进制日志copy到从节点,然后把二进制的日志信息更新到数据库里,最终达成主从复制的目的,当然除了性能能起到负载均衡的功能,读写分离,而且还可以数据备份,相当于时刻把主服务器的数据在做备份同步到从节点上,以防主服务器异常之后数据的丢失。
MySQL的主从复制不管是一主一从或者一主多从背后依赖的机制都是一样的,实现主从复制的主节点和从节点的版本原则上来讲需一致,如果不能保证版本一致也可以,需要主节点的版本低于从节点的版本,因为从节点要从主节点同步数据版本要兼容,其实这也是一种升级策略,如果主从节点想升级高版本,应该先升级从节点,再升级主节点。
(新建)主从复制架构实现:
主节点配置:
1.开启二进制日志,MySQL8.0默认已开启
2.定义mysql当前节点唯一server id的标识(建议设为当前节点ip地址的最后的一位或者两位数字)
3.查看二进制日志的文件和位置并进行复制 show master status;
4.创建有复制权限的用户帐号,分两步,先创建帐号再授权,replication slave权限就可以
从节点配置:
1.开启中继日志,指定server id((建议设为当前节点ip地址的最后的一位或者两位数字)
虽然从节点对启动二进制日志并无硬性要求,但是建议启用二进制日志,假如主节点挂了,从节点将来有可能被提升为新主节点,还有一个好处就是也可以在从节点上利用二进制做数据备份,从而减轻主服务器的压力
2.使用有复制权限的用户帐号连接至主服务器,并启动复制线程
确认主从节点二进制日志是否开启log_bin和sql_log_bin都必须开启,缺一不可。
建文件夹,放二进制日志
[14:04:56 root@master ~]$mkdir -p /data/mysql/logbin/
更改文件夹属性
[14:08:15 root@master ~]$chown -R mysql.mysql /data/mysql/
修改配置文件,指定二进制日志路径,约定文件前缀
[14:13:57 root@master ~]$vim /etc/my.cnf
重启mysqld服务
[14:22:14 root@master ~]$systemctl restart mysqld
查看确认一下二进制日志文件
[14:23:30 root@master ~]$ll /data/mysql/logbin/
登录mysql查看当前二进制日志的位置(必须要在授权命令之前查看二进制日志状态,如果在建立帐号之后看日志状态,位置已经变化,之前的数据是更新不过去的,也就意味着帐号复制不过去了,从节点没有这个帐号,将来想把从节点提升为主节点时,没有此帐号,还需要重新创建)
[14:25:47 root@master ~]$mysql -uroot -p'#'
创建帐号
授权,赋予权限
从节点更改配置文件,指定server id,加上read only只读,
[14:45:48 root@slave1 ~]$vim /etc/my.cnf
重启mysqld服务
[15:00:27 root@slave1 ~]$systemctl restart mysqld
登录mysql数据库执行同步配置
查看从节点状态,并开启线程
除了观察这两个线程之外,还有一个指标是seconds_behind_master的值,是主节点和从节点数据延迟差
帐号已同步
查看主节点的dump线程
查看从节点的io线程和sql线程
新增从节点服务器
先在主节点上做完全数据库备份
[15:50:17 root@master ~]$mysqldump -uroot -p'Smilehan123~' -A -F --single-transaction --master-data=1 > /opt/full.sql
把完全备份文件copy到新的从节点上
[15:59:20 root@master ~]$scp /opt/full.sql 10.0.0.28:
更改配置文件,指定server id
[15:37:37 root@slave2 ~]$vim /etc/my.cnf
重新启动数据库
[16:04:41 root@slave2 ~]$systemctl restart mysqld
修改备份文件,change master to部分内容缺失,把缺失内容补上
登录数据库直接导入备份文件
开启线程
帐号已同步,线程正常,添加新从节点完成