mysql的复制类型:基于语句的复制、基于行的复制、混合类型的复制
只在主服务器上写,只在从服务器上读
客户端将数据写到主的磁盘当中,会写到mysql数据库中,mysql会通知里面有个存储引擎,提交数据事务,将数据以基于行、sql混合保存在二进制日志中,slave会开启IO线程,监听mysql中的二进制文件,当二进制一旦有更新,会响应master,IO发送请求响应master接收到IO请求后会读取里面的二进制文件中更新的数据并且发送给IO线程,从服务器的IO线程保存在自己的节点日志中,同时slave节点中的sql线程会读取中继日志并更新到本地的没有mysql中,最终完成slave复制master的数据,达到主从复制。
主数据库处理事务性查询,从数据库处理select查询;数据库复制用于将事务性查询的变更同步到及群众的从数据库;读写分离方案:基于程序代码内部实现,基于中间代理层实现(mysql-proxy ,amoeba)
master服务器高并发,形成大量事务
网络延迟
主从硬件设备导致 cpu主频、内存io、硬盘io
本来就不是同步复制、而是异步复制
从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。从库使用SSD磁盘
网络优化,避免跨机房实现同步
2、mysql读写分离原理
读写分离基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库
分为以下两种:
在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQL-Proxy。 MySQL-Proxy 为MySQL开源项目,通过其自带的lua脚本进行SQL判断。
(2) Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
360内部使用Atlas运行的mysq1业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支事务和存储过程。
由于使用MySQL Proxy 需要写大量的Lua脚木,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy内置变量和MySQLProtocol的人来说是非常困难的
Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层
Master 服务器: 192.168.2.99 mysql5.7
Slave1 服务器: 192.168.2.66 mysql5.7
Slave2 服务器: 192.168.2.200 mysql5.7
- systemctl stop firewalld
- systemctl disable firewalld
- setenforce 0
-
- ##主从服务器时间同步设置##yum -y install ntp ntpdate
- vim /etc/ntp.conf
-
- ##末行添加
- server 127.127.2.0 #设置本地是时钟源,注意修改