Mysql主从复制
一、为什么需要主从复制
? 众所周知数据库在对表数据进行修改时会锁表,而我们生产环境中如果锁表,其他用户将无法对表进行修改,所有我们需要两个数据库,主库负责写数据,从库复制读数据,而且数据库存放的数据很关键,如果只有一台数据库容易出现单点故障我们需要一个从数据库作为热备,而且随着业务量增加,I/O的访问频率增高全由一台数据库对服务器I/O负载较高,所有我们需要多台数据库来分担负载
二、什么叫主从复制
? Mysql主从复制数据可以从一个主节点复制到不同的从节点,而且mysql采用的是异步复制方法,这样节点不用一直访问主数据库来更新自己的数据,数据的更新可以在远程连接上完成,从节点可以复制数据库中的所有数据库或者是特定的表
三、主从复制的原理
? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQB3XnQk-1663499396903)(C:/Users/mogu/Desktop/%E6%97%A0%E6%A0%87%E9%A2%98.png)]
? 核心就是两个日志三个进程
? 两个日志:
? (1)binlog日志:二进制文件,主数据库所有的对数据更改的sql语句将存入binlog日志中
? (2)中继日志:I/O进程将二进制文件同步到中继日志中等待被sql进程调用
? 数据流向:
首先 从数据库 执行change master to 命令(主数据库的连接信息+复制的起点)以上信息保存到master.info文件里
从数据库 执行start slave命令开启I/O线程和SQL线程
从数据库 SQL线程读取master.info文件获取IP,PORT,User,Pass,binlog的位置信息(读取我第一步的配置文件)
从数据库 通过I/O与主数据库建立连接,并根据上面的binlog位置信息来判断二进制文件是否更新以及请求
主数据库 起dump进程将最新的binlog传输给 从数据库 的I/O线程
从数据库的 I/O线程接到新的binlog存储到TCP/IP缓存并返回ACK给主库告诉主库收到,然后更新master.info
从数据库的 I/O线程将TCP/IP缓存的数据转存到中继日志中
从数据库的 SQL线程读取relay.info信息获取上次应用过中继日志的位置信息
从数据库的 SQL线程会根具上次应用的中继日志的位置信息来作为开始使用新的二进制文件进行同步,并且再次更新relay.info信息
四、复制方法
? mysql主从同步默认为异步复制,mysql主从复制有以下几个模式:
? 1.异步复制
? 主数据库接受到客户端不请求后立即返回并不会管是否推送成功并处理,如果主数据库挂掉从数据库提升为主的时候有可能并不能完全接受主数据库的义务(有可能没有同步到)
? 2.同步复制
? 主数据库推送给从数据库二进制文件后会等待从数据库执行完事务返回给他结果时才可以返回并运行
? 3.半同步复制
主数据库推送给从数据库,等待到至少一个从库节点返回事务成功后才能可以运行,向对完全同步并不需要等所特有数据库事务返回。
五、主从复制的架构
? 1.一主多备:
? 一般用来做读写分离,master作为写入,其他的slave作为读。这种架构最大的问题是I/O压力集中在Master上多台不同步影响IO。
? 2.M-S-S:
? 为中继,来分担Master的压力,Slave中继需要开启bin-log,并配置log-slave-update,Slave中继可以使用Black-hole存储引擎,不会把数据存储到磁盘,只记录二进制日志。
? 3.M-M(互为主从):
? 4.M-M-M:
? 这个架构有个天生的缺陷就是复制延迟,slave上同步要慢于master,如果大并发的情况那么延迟更严重 mysql在5.6以上自身可以实现failover故障切换。
六、读写分离原理
? 读写分离的原理是让主数据库处理事务的增、删、改、删等会让数据产生变化的操作,而从数据库处理查询操作
七、为什么要读写分离
? 因为数据库的写的操作比较耗时的,而读的操作比较快,而且写入的时候会锁表其他用户将无法读,所以我们要读写分开。
八、常见的Mysql读写分离
1.基于代码内部实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vpa6kSTe-1663499396903)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816151753749.png)]
? 通过SpringController层获取到请求后通过定义好的数据源的AOP切面来判断是走读库还是写库
优缺点
? 在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。 ? 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支; ? 缺点是需要开发人员来实现,运维人员无从下手。 ? 但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
2.基于中间件实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序:
? MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。 ? Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。 ? Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
九、Mysql主从复制和读写分离实验部署
? 实验条件:
主机名 | 地址 | 环境配置 |
---|
主数据库 | 192.168.226.121 | mysql5.7.17+ntp | amoeba | 192.168.226.122 | mysql5.7.17+jdk-6u14 | 从数据库1 | 192.168.226.123 | mysql5.7.17+ntp+ntpdate | 从数据库2 | 192.168.226.124 | mysql5.7.17+ntp+ntpdate |
? 1、对集群内时间同步操作
? (1)配置主数据库时间源
yum -y install ntp
vim /etc/ntp.conf
server 127.127.184.0 #设置本地是时钟源,注意修改网段
fudge 127.127.184.0 stratum 8 #设置时间层级为8(限制在15内)
service ntpd start
? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOdbKJsn-1663499396904)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816161553611.png)] (2)配置从数据库同步主数据库
yum -y install ntp ntpdate #下载安装ntpdate
service ntpd start #开启服务
/usr/sbin/ntpdate 192.168.226.121 #只向主数据库完成时间同步
crontab -e #设置周期性任务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5tHaW7Ra-1663499396904)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816162801239.png)]
? 2.对主数据库进行操作
? (1)编辑mysql配置文件
vim /etc/my.cnf
server-id = 1 #设置服务ID不可以冲突
log-bin=master-bin #打开二进制文件
log-slave-updates = true #允许从服务器更新二进制文件
systemctl restart mysqld #重启服务
mysql -uroot -p2288 #登录数据库
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.226.%' IDENTIFIED BY '2288';
#ON后面的*.*代表所有数据库的所有表
#TO后面接的是允许访问的用户名和网段
#IDENTIFIED BY 后面接访问密码
FLUSH PRIVILEGES;
show master status;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKnjZolv-1663499396905)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816165817951.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKultBaZ-1663499396906)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816171338566.png)]
? 3.对从服务器进行配置
? (1)对my.cnf进行配置
vim /etc/my.cnf
server-id = 2 #slave1的服务号
relay-log=relay-log-bin #开启中继日志,同步主服务器的日志到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
systemctl restart mysqld #重启数据库
mysql -u root -p
change master to master_host='192.168.226.121' , master_user='myslave',master_password='2288',master_log_file='master-bin.000004',master_log_pos=154;
start slave; #启动同步,如有报错执行 reset slave;
show slave status\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes
*****************若UUID相同*****************************
show variables like 'datadir'; //查找到mysql的安装地址
mysql> select uuid() //生成一个新的UUID用于替换
-> ;
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 72a4009d-29a4-11ed-9f27-000c29e04db3 |
+--------------------------------------+
cd /var/lib/mysql/
vi auto.cnf
//修改server-uuid
service mysqld restart
? 4.测试是否成功
grant replication slave on *.* to 'myslave'@'192.168.226.%' identified by '2288';
grant all privileges on *.* to 'mha'@'192.168.226.%' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';
? 主服务器创建一个数据库
create database zhucongfuzhi;
? 两个从数据库
? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtYcqBzm-1663499396906)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816194623925.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lzUZCMeh-1663499396906)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220816194636141.png)]
····································读写分离···················································
? 5.安装JAVA环境
? 6.将Master,和两个Slaver开放给Amoeba
grant all on *.* to test@'192.168.226.%' identified by '2';
····································读写分离···················································
? 5.安装JAVA环境
? 6.将Master,和两个Slaver开放给Amoeba
grant all on *.* to test@'192.168.226.%' identified by '2';
|