目录
一、读写分离是什么?
二、常见的MySQL读写分离方案
1.基于程序代码内部实现
2.基于中间代理层实现
3.Amoeba
三、分离步骤
1.在主机Amoeba上安装java环境
2.安装并配置Amoeba
3.配置Amoeba读写分离,两个Slave读负载均衡
4.测试
4.1 在Client上进行访问测试
4.2 通过代理访问MySQL
四、验证
1.主服务器操作
2.分别在两台从服务器上操作
3.主从服务器添加
4.操作验证 - 读(负载均衡)
4.1 在测试机上第1次查询结果
4.2 在测试机上第2次查询结果
4.3 在测试机上第3次查询结果
5.操作验证 - 写(读写分离)
一、读写分离是什么?
- 在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。
- 简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
二、常见的MySQL读写分离方案
1.基于程序代码内部实现
在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手
2.基于中间代理层实现
代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:
- mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。
- Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。
-
3.Amoeba-
Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。
-
三、分离步骤
-
1.在主机Amoeba上安装java环境
- 查看现有Java环境
- java -version
- 移除过高版本Java
- which java
- rm -rf /usr/bin/java
-
- chmod +x jdk-6u14-linux-x64.bin
-
./jdk-6u14-linux-x64.bin
-
mv jdk1.6.0_31/ /usr/local/jdk1.6
-
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version
- 注:因为Amoeba是基于jdk1.5版本开发的,所以官方推荐使用1.5或者1.6版本,高版本不建议使用。
-
2.安装并配置Amoeba
- mkdir /usr/local/amoeba
- tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
- chmod -R 755 /usr/local/amoeba/
-
3.配置Amoeba读写分离,两个Slave读负载均衡
-
在Master、Slave1、Slave2服务器中配置Amoeba的访问授权
-
grant all on *.* to 'test'@'192.168.42.%' identified by '123.com';
-
flush privileges;
-
编辑amoeba.xml配置文件
-
vim /usr/local/amoeba/conf/amoeba.xml
-
编辑dbServer.xml配置文件
vim /usr/local/amoeba/conf/dbServers.xml
-
-
配置无误后,启动Amoeba软件,默认端口是TCP协议8066
-
netstat -lnpt | grep 8066
-
4.测试
-
4.1 在Client上进行访问测试
-
yum -y install mariadb mariadb-devel
-
4.2 通过代理访问MySQL
mysql -uamoeba -p123456 -h 192.168.42.138 -P 8066
验证步骤就是在MySQL主服务器上创建一个表,会自动同步到各个从服务器上,然后关掉各个服务器上的Slave功能,在分别插入语句测试。
注:此处命令中的IP是amoeba服务器的IP。
-
四、验证
-
1.主服务器操作
-
create database Rich;
-
use Rich;
-
create table student (id int(10),name varchar(10),address varchar(20));
-
2.分别在两台从服务器上操作
-
show databases;
-
use Rich;
-
show tables;
-
stop slave;
-
3.主从服务器添加
- Master
-
use Rich;
-
insert into student values('1','Rich','this_is_master');
- Slave1
-
insert into student values('2','Rich','this_is_slave1');
- Slave2
-
insert into student values('3','Rich','this_is_slave2');
-
4.操作验证 - 读(负载均衡)
-
4.1 在测试机上第1次查询结果
- use Rich;
-
select * from student;
-
4.2 在测试机上第2次查询结果
select * from student;
-
4.3 在测试机上第3次查询结果
select * from student;
-
5.操作验证 - 写(读写分离)
-
在Client上插入一条语句
insert into student values ('4','Rich','write_test');
但在Client上查询不到,最终只有在Master上才能看到这条语句内容,说明写操作在master服务器上
由此验证,已经实现了MySQL读写分离,目前所有的写操作都在Master主服务器上,用来避免数据的不同步,所有的读操作都平分给了Slave从服务器,用来分担数据库压力。
分别在两台从服务器上启用slave功能
start slave;
现在在Client测试机上查看
select * from student;