springboot结合Mybatis基于mysql实现读写分离和主从同步
(⼆)
⼀:主从复制
上⽂说到spring boot结合mybatis实现读写分离 ,本⽂围绕着数据库层⾯实现主从复制。
软考希赛mysql主从复制原理
0、为什么需要主从复制?
1、在业务复杂的系统中,有这么⼀个情景,有⼀句sql语句需要锁表,导致暂时不能使⽤读的服务,那么就很影响运⾏中的业务,使⽤主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2、做数据的热备
3、架构的扩展。业务量越来越⼤,I/O访问频率过⾼,单机⽆法满⾜,此时做多库的存储,降低磁盘I/O访问的频率,提⾼单个机器的I/O 性能。
1、什么是mysql的主从复制?
MySQL 主从复制是指数据可以从⼀个MySQL数据库服务器主节点复制到⼀个或多个从节点。MySQL 默认采⽤异步复制⽅式,这样从节点不⽤⼀直访问主服务器来更新⾃⼰的数据,数据的更新可以在远程连接上进⾏,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
2、mysql复制原理
原理:
(1)master服务器将数据的改变记录⼆进制binlog⽇志,当master上的数据发⽣改变时,则将其改变写⼊⼆进制⽇志中;
自学黑客第一步(2)slave服务器会在⼀定时间间隔内对master⼆进制⽇志进⾏探测其是否发⽣改变,如果发⽣改变,则开始⼀个I/OThread请求master ⼆进制事件
(3)同时主节点为每个I/O线程启动⼀个dump线程,⽤于向其发送⼆进制事件,并保存⾄从节点本地的中继⽇志中,从节点将启动SQL线程从中继⽇志中读取⼆进制⽇志,在本地重放,使得其数据和主节点的保持⼀致,最后I/OThread和SQLThread将进⼊睡眠状态,等待下⼀次被唤醒。
也就是说:
从库会⽣成两个线程,⼀个I/O线程,⼀个SQL线程;
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继⽇志)⽂件中;
主库会⽣成⼀个log dump线程,⽤来给从库I/O线程传binlog;
SQL线程,会读取relay log⽂件中的⽇志,并解析成sql语句逐⼀执⾏;
注意:
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、从库通过⼿⼯执⾏change master to 语句连接主库,提供了连接的⽤户⼀切条件(user 、password、port、ip),并且让从库知道,⼆进制⽇志的起点位置(file名 position 号); start slave
2、从库的IO线程和主库的dump线程建⽴连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的⽅式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中
6、从库SQL线程应⽤relay-log,并且把应⽤过的记录到relay-log.info中,默认情况下,已经应⽤过的relay 会⾃动被清理purge
3、mysql主从形式
⼀主⼀从
主主复制
⼀主多从—扩展系统读取的性能,因为读是在从库读取的
多主⼀从—5.7开始⽀持
联级复制
4、mysql主从同步延时分析
mysql的主从复制都是单线程的操作,主库对所有DDL和DML产⽣的⽇志写进binlog,由于binlog是顺序写,所以效率很⾼,slave的sql thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序,所以成本要⾼很多,另⼀⽅⾯,由于sql thread也是单线程的,当主库的并发较⾼时,产⽣的DML数量超过slave的SQL thread所能处理的速度,或者当slave中有⼤型query语句产⽣了锁等待,那么延时就产⽣了。
解决⽅案:
1.业务的持久化层的实现采⽤分库架构,mysql服务可平⾏扩展,分散压⼒。
2.单个库读写分离,⼀主多从,主写从读,分散压⼒。这样从库压⼒⽐主库⾼,保护主库。
3.服务的基础架构在业务和mysql之间加⼊memcache或者redis的cache层。降低mysql的读压⼒。
4.不同业务的mysql物理上放在不同机器,分散压⼒。
5.使⽤⽐主库更好的硬件设备作为slave,mysql压⼒⼩,延迟⾃然会变⼩。
6.使⽤更加强劲的硬件设备
mysql主从复制安装配置
1、基础设置准备
#操作系统:centos7.1
#mysql版本:5.7
#两台虚拟机:
娱乐新闻网站源码node1:192.168.85.111(主)
mysql语句的执行顺序node2:192.168.85.112(从)
2、安装mysql数据库
3、在两台数据库中分别创建数据库
4、在主(node1)服务器进⾏如下配置:
#修改配置⽂件,执⾏以下命令打开mysql配置⽂件
vi /etc/myf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #⼆进制⽂件名称
binlog-format=ROW #⼆进制⽇志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,⽽不是把命令在从服务器上执⾏⼀遍,statement指server-id=1 #要求各个服务器的id必须不⼀样
binlog-do-db=msb #同步的数据库名称
5、配置从服务器登录主服务器的账号授权
###授权操作
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by '123456';
###刷新权限
c语言基础的书flush privileges;
6、从服务器的配置
#修改配置⽂件,执⾏以下命令打开mysql配置⽂件
vi /etc/myf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #⼆进制⽂件的名称
十进制转换十六进制的方法binlog-format=ROW #⼆进制⽂件的格式
server-id=2 #服务器的id 和主服务器必须不同
7、重启主服务器的mysqld服务
#重启mysql服务
service mysqld restart
#登录mysql数据库
mysql -uroot -p
#查看master的状态
show master status;
8、重启从服务器并进⾏相关配置(根据上述来配置)
#重启mysql服务
service mysqld restart
#登录mysql
mysql -uroot -p
#连接主服务器
#根据主数据库中的实际情况来填写相应字段,如上图所⽰
change master to master_host='192.168.85.11',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000003',master_l #启动slave
start slave
#查看slave的状态
show slave status\G(注意没有分号)
若有图上框框内都是YES则表⽰主从同步成功.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论