主从复制原理核心在于2个日志文件,3个线程
①STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
②ROW(基于行):
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update…set…where true 那么binlog的数据量会越来越大
③MIXED 推荐使用:
一般的语句使用statement,函数使用ROW方式存储
读写分离就是只在主服务器上写,只在从服务器上读
基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。
常见的MysQL读写分离分为以下两种:
基于程序代码内都实现
在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
①MySQI-Proxy。MySQI-Proxy为 MySQL 开源项目,通过其自带的lua脚本进行SQL 判断。
② Atlas是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy
0.8 .2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
③ Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
Amoeba: 是一 个以MySQL为底层数据存储,并对应提供MySQL协议接口的proxy(代理),外号变形虫。
读取请求发送给从服务器是,采用轮询调度算法。
amoeba使用的java语言编写,配置文件为xml。
amoeba主要负责对外的一个代理IP。
访问这个IP时,发送的请求为“写"请求,则会转给主服务器。
当发送的请求为“读"时,会通过调度转发给从服务器,使用轮询算法,轮流分配给两台从服务器。
amoeba可以视为调度器,如果主服务器挂掉(单点故障),则会有MHA解决这个问题。
下面为5台实验用虚拟机(防火墙、安全防护已关闭):
master:192.168.220.30
slave1:192.168.220.35
slave2:192.168.220.40
amoeba:192.168.220.45
client:192.168.220.50
主从时间同步阿里云时钟服务器:
创建一个定时任务,每10分钟同步一次时间:
配置主从同步:
从服务器配置:
master上配置:
给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456;然后刷新权限表(flush privileges)
从数据库:
slave同步主服务器:
同理slave2上进行同样操作
下面进行测试:
主数据库进行操作:
然后到从服务器上验证:
可以看到有同步成功
下面进行读写分离实验:
首先安装java环境,安装jdk,将amoeba-mysql-binary-2.2.0.tar.gz和jdk-6u14-linux-x64.bin上传到opt目录下
cp jdk-6u14-linux-x64.bin /usr/local/ chmod +x jdk-6u14-linux-x64.bin ./jdk-6u14-linux-x64.bin #一直往下翻页--yes--enter mv jdk1.6.0_14/ /usr/local/jdk1.6 #重命名以便于环境变量的设置
export JAVA_HOME=/usr/local/jdk1.6 #指定jdk的位置 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib #指定执行文件的位置 export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin #指定环境位置 export AMOEBA_HOME=/usr/local/amoeba #amoeba文件的位置 export PATH=$PATH:$AMOEBA_HOME/bin #调用家目录识别amoeba的bin文件
安装amoeba软件
配置amoeba读写分离,两个slave读负载均衡:
下面用client端进行验证:
下面进行测试:
测试一:client上创建一个表,三台MySQL服务器都能看到
client上:
三台mysql服务器:
master上的:
slave上:
测试二:测试读写分离
slave1,2上执行以下操作:
关闭主从同步
然后在client上插入数据:
master上验证:
slave1,2上验证:
可以发现slave1,2上查看不到了
测试三:读写分离中轮询读的操作
slave1操作:
slave2操作:
client上查看:可发现是以轮询的方式查看的