【mysql|MySQL主从复制 读写分离】读写分离概述
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysq1主从复制是对数据库中的数据、语句做备份。
mysql支持的复制类型
STATEMENT:基于语句的复制。在服务器上执行sq1语句,在从服务器上执行同样的语句,mysq1默认采用基于语句的复制,执行效率高。
ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
主从复制的工作过程
文章图片
首先主节点开启二进制日志,从节点开启中继日志。
当客户端对mysql数据库进行增删改查时,则将其改变写入二进制日志中
从节点会在一定时间间隔内对主节点的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/o线程请求主节点的二进制事件。
同时主节点为每个I/o线程启动一个dump线程,用于向其发送二进制事件,从节点会将其保存至s从节点本地的中继日志(Relaylog)中
最后从节点将启动sQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和主节点的数据同步,最后I/o线程和sQL线程将进入睡眠状态,等待下一次被唤醒。
搭建Mysql主从复制
一主两从结构图
文章图片
master 服务器:192.168.239.20 Mysql5.7初始环境
slave1 服务器: 192.168.239.30 Mysql5.7
slave2 服务器: 192.168.239.60 Mysql5.7
#关闭防火墙Mysql主从服务器时间同步
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
主服务器设置
master 服务器:192.168.239.20
yum install ntp -y #安装ntp服务用来完成时间同步
vim /etc/ntp.conf #修改配置文件
#末行添加以下两行
server 127.127.239.0 #设置本地为时钟源,注意修改网段
fudge 127.127.239.0 stratum 8 #设置时间层级为8
service ntpd start #重启服务
文章图片
文章图片
文章图片
从服务器设置
slave1 服务器: 192.168.239.30
slave2 服务器: 192.168.239.60
yum install ntp ntpdate -y #安装ntpdate同步
service ntpd start #开启服务
/usr/sbin/ntpdate 192.168.239.20 #使用 ntpdate同步本地时钟源
crontab -e #编辑计划性任务
*/30 * * * * /usr/sbin/ntpdate 192.168.239.20 #没三十分组同步一次时间
crontab -l #查看计划性任务
systemctl status crond.service #查看服务是否开启
文章图片
文章图片
文章图片
主服务器mysql配置
master 服务器:192.168.239.20
vim /etc/my.cnf
log-bin = mysql-bin #添加,主服务器开启二进制日志
binlog_format = MIXED
log-slave-updates = true #添加,允许slave从master复制数据时可以写入到自己的二进制日志
expire_logs_days = 7 #设置二进制日志文件过期时间,默认值为0,表示logs不过期
max_binlog_Size = 500M #设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB
systemct1 restart mysqld #重启mysql服务
mysql -uroot -p123456
grant replication slave on . to ‘gb’@‘192.168.239.%’ identified by ‘1999612’; #同步权限所有用户所有表指定登录地址网段设置密码为1999612
flush privileges; #刷新权限
show master status; #查看二进制文件
文章图片
文章图片
文章图片
修改从服务器配置
slave1 服务器: 192.168.239.30
slave2 服务器: 192.168.239.60
vim /etc/my.cnf
server-id = 2 #另外一台从服务器id值则不能为1、2
relay-log = relay-log_bin #添加、从服务器开启中继日志文件
relay-log-index = slave-relay-bin.index #添加定义中继日志文件位置与名称一般与二进制文件在同一目录
relay_log_recovery = 1 #选配项建议开启是优化的一部份
systemctl restart mysqld.service
文章图片
文章图片
从服务器mysql配置
slave1 服务器: 192.168.239.30一般Slave_IO_Running:No的可能性
slave2 服务器: 192.168.239.60
mysql -u root -p1999612
change master to
-> master_host=‘192.168.239.20’,
-> master_user=‘gb’,
-> master_password=‘1999612’,
-> master_log_file=‘mysql-bin.000002’,
-> master_log_pos=843;
#配置同步,注意master_log_file和master_log_pos的值要与master查询值一致
start slave; #启动同步,如果有报错执行reset alsve;
show slave status\G; #查看slave状态确保io和sql线程都是yes,代表同步正常
Slave_IO_Running: Yes #负责与主机 io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
网络不通
my.cnf配置有问题
密码、file文件名、pos偏移量不对
防火墙没有关闭
测试主从复制
在主表创建库
文章图片
文章图片
在库内创建表并添加数据记录
文章图片
从表验证
文章图片
文章图片
MySQL主从复制延迟
master服务器高并发,形成大量事务
网络延迟
主从硬件设备导致cpu主频、内存io、硬盘io
是同步复制、而不是异步复制
从库优化Mysq1参数。比如增大innodb buffer pool size,让更多操作在Mysq1内存中完成,减少磁盘操作。
从库使用高性能主机。包括cpu强悍、内存加天。避免使用虚拟云主机,使用物理主机,这样提升了i/o万面性。
从库使用SSD磁盘
对络优化,避免跨机房实现同步
MySQL读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理select查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。
搭建Mysql读写分离
在之前的主从复制上进行配置读写分离
文章图片
master 服务器:192.168.239.20 Mysql5.7
slave1 服务器: 192.168.239.30 Mysql5.7
slave2 服务器: 192.168.239.60 Mysql5.7
amoeba 服务器:192.168.239.50 jdk1.6、amoeba
客户端 服务器:192.168.239.10 mysql
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
文章图片
Amoeba服务器配置
amoeba 服务器:192.168.239.50安装Java环境
文章图片
文章图片
文章图片
文章图片
安装Amoeba软件
mkdir /usr/local/amoeba配置Amoeba读写分离,两个slave 读负载均衡
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba #如显示amoeba startlstop说明安装成功
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
客户机配置
客户端 服务器:192.168.239.10
yum install -y mariadb mariadb-server #安装mariadb
systemctl restart mariadb.service #开启服务
测试
mysql -u bo -p1999612 -h 192.168.239.50 -P 8066 #登入并查看数据库
show databases;
use yjx;
show tables;
select * from ky18 ;
测试同步
insert into ky18 values (4,‘geng’,18); 插入数据记录
insert into ky18 values (5,‘bo’,18);
select * from ky18;
从服务器查看
select * from ky18;
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
读写分离测试
停掉从服务器同步两台都停轮询测试
stop slave;
此时在客户机插入数据只有主可以看到数据
insert into ky18 values (6,‘gb’,18);
select * from ky18;
分别在两台从服务器创建不同的数据记录
从1添加
insert into ky18 values (6,‘wang’,25);
从2添加
insert into ky18 values (7,‘xie’,26);
客户机查看实现轮询
select * from ky18 ;
此时开启从同步则可以同步gb那条数据记当客户机访问时从服务器添加的数据记录任然还是轮询
start slave;
客户机查看表数据记录
select * from ky18 ;
文章图片
文章图片
文章图片
此时客户机查询实现轮询
文章图片
文章图片
文章图片
推荐阅读
- 技术总结|mysql 索引使用与优化
- 数据库|计算机毕业设计ssm基于b_s架构的实习管理系统
- MySQL|MySQL 学习
- 开源|Google 为造芯再掀“抢人大战”,英特尔 17 年老将加入
- mysql|mysql 分区表 归档_详解 MySQL 数据库冷数据归档
- 技术干货系列|【详细教程】一文参透MongoDB聚合查询
- golang|Go操作Mysql数据库居然如此丝滑
- 技术干货系列|【超详细】手把手教你搭建MongoDB集群搭建
- 白帽子讲Web安全|【白帽子讲Web安全】第一章 我的安全世界观