MySQL读写分离原理
- 只再主服务器上写,只在从服务器上读
- 主数据库处理事务性查询,从数据库处理SELECT查询
- 数据库复制用于将事务性查询的变更同步到集群中的从数据库
- 读写分离方案
基于程序代码内部实现
基于中间代理层实现
MySQL-Proxy
Amoeba (功能:1、实现读写分离 2、隐藏数据库真实IP)
读写分离实现方式
常见的读写分离分为一下两种
- 基于程序代码内部实现
在代码中根据select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的
优点是性能比较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型负责的Java应用,如果在程序代码中实现读写分离对代码改动就比较大 - 基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQI-Proxy。MySQI-Proxy 为MysQ开源项目,通过其自带的1ua脚本进行sor判断。
(2) Atlas是由奇虎360的web平台部基础架构团队开发维护的一个基于MysQ协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
( 3) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。 - Amoeba:是一个以Mysql为底层数据存储,并对应提供MySQI协议接口的proxy(代理),外号变形虫读取请求发送给从服务器是,采用轮询调度算法
amoeba使用的java语言编写,配置文件为xmlamoeba主要负责对外的一个代理工
访问这个IP时,发送的请求为"写"请求,则会转给主服务器
当发送的请求为"读"时,会通过调度转发给从服务器,使用轮询算法,轮流分配给两台从服务器amoeba可以视为调度器,如果主服务器挂掉(单点故障),则会有MHA解决这个问题
搭建MySQL读写分离
- 安装Java环境
因为Amoeba基于是jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下
[root@amoeba opt]#cd /opt
[root@amoeba opt]#cp jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba opt]#cd /usr/local
[root@amoeba local]#chmod +x jdk-6u14-linux-x64.bin
[root@amoeba local]#./jdk-6u14-linux-x64.bin 出现more ,按空格 然后yes 回车
[root@amoeba local]#mv jdk1.6.0_14/ jdk1.6
- 添加环境变量
[root@amoeba local]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
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
export PATH=$PATH:$AMOEBA_HOME/bin
- 加载、查看版本
[root@amoeba local]# source /etc/profile
[root@amoeba local]# java -version
- 安装Amoeba软件
[root@amoeba local]# mkdir /usr/local/amoeba
[root@amoeba local]# cd /opt
[root@amoeba opt]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeb
[root@amoeba opt]# /usr/local/amoeba/bin/amoeba
已安装成功
- 配置Amoeba读写分离,两个slave读负载均衡
先在Master,Slave1,Slave2的myswl上开放权限给Amoeba访问
grant all on *.* to 'test'@'192.168.112.%' identified by '123.com';
flush privileges;
- 再回到amoeba服务器配置amoeba服务
[root@amoeba opt]# cd /usr/local/amoeba/conf
- 修改配置文件
[root@amoeba conf]# vim /usr/local/amoeba/conf/amoeba.xml
#以下配置的是第三个账户(客户端找amoeba的用户身份)
#30行修改账户名(这里是数据库访问amoeba服务器时使用的账号)
amoeba
#32行修改账户密码(这里是数据库访问amoeba服务器时使用账号时用的密码)123123
#115行修改默认池
<propertyname=“defaultPoo1”>master
#117行取消注释
//取消下面的注释符号–>,改到这里
#118-119修改"读池"和"写池"
118 <propertyname=“writePool”>master119 <propertyname=“readPool”>slaves
- 修改数据库配置文件
[root@amoeba conf]# vim dbServers.xml
#23行将text修改为mysql (5,6)
mysql schema:Mysql所有数据库信息(show databases)
<property name="schema" >mysql</property>
#26行,amoeba访问三台mysq1数据库的账户和密码(账户为test)
<property name="user">test</property>
#29行,修改访问数据库的密码
<property name="password">123.com</property>
#45行,修改数据库主服务器名/地址
<dbServer name="master" parent="abstractServer">#48行,修改master服务器ip
<property name="ipAddress">192.168.80.3</property>
#52行修改从服务器名
<dbServer name="server1"parent="abstractServer">
#55行修改从服务器地址
<property name="ipAddress">192.168.80.3</property>
#复制52-57行,粘贴,添加第二台服务器名
<dbServer name="slave2" parent="abstractServer">#修改第二台服务器IP
<property name="ipAddress">192.168.80.4</property>
#66行,修改多个服务器池(multiPoo1)的名称(修改为slaves)<dbServer name="slaves"virtual-"true">
#72行,添加两个从服务器的服务器名(slave1 slave2)<property
name="poolNames">slave1,slave2</property>
- 启动
[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start
- 另开一个终端,查看是否开启成功
测试:打开一个client端
下载mariadb 客户端
[root@client ~]# yum -y install mariadb
远程登录amoeba服务器
[root@client ~]# mysql -u amoeba -p123123 -h 192.168.112.140 -P 8066
- 测试一
amoeba服务器是否关联后端mysql
客户端进入数据库创建表,在三台mysql服务器中查看是否由此表(amoeba关联)