在实际的生活环境中,如果对数据库的读和写都在同一个数据库服务中操作,无论是在安全性,高可用还是高并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提升数据的高并发负载能力这样的方案来进行部署。
读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
目前较为常见的MySQL读写分离方案有两种:
1.基于程序代码内部实现:
根据select,insert进行路由分类,是目前生产环境应用最广泛的,优点是性能好,因为在代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手。
2.基于中间代码层实现:
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,代表性程序:
(1)mysql-proxy 为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。
(2)Amoeba (变形虫)由陈思儒开发,曾就职与阿里巴巴,该程序由java语言进行开发,阿里巴巴将其应用于生成环境,它不支持事物和存储过程。
通过程序代码实现mysql读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的java应用,如果在程序代码中实现读写分离对代码改动就较大,像这种应用一般会考虑使用代理层来实现。
MySQL Master IP: 192.168.96.6
MySQL Slave1 IP: 192.168.96.7
MySQL Slave2 IP: 192.168.96.5
MySQL Amoeba IP: 192.168.96.4
MySQL Client IP: 192.168.96.9
在主机Amoeba上安装Java环境(因为Amoeba是基于jdk1.5版本开发的,所以官方推荐使用1.5或1.6版本)
rz
将bin格式的安装包传进来(jdk-6u14-linux-x64.bin)
chmod +x jdk-6u14-linux-x64.bin //添加可执行权限
./jdk-6u14-linux-x64.bin //执行后会生成一个文件夹(jdk1.6.0_14 )
mv jdk1.6.0_14/ /usr/local/jdk1.6 //将文件夹移动到/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 //查看版本号
如果Java版本号过高请执行一下操作:
rm -rf /usr/bin/java
source /etc/profile
java -version
将amoeba-mysql-binary-2.2.0.tar.gz 传入
mkdir /usr/local/amoeba //创建一个amoeba的文件夹
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba //解压
chmod -R 755 /usr/local/amoeba //给文件夹一个755权限
配置Amoeba读写分离,两个Slave读负载均衡
在Master、Slave1、Slave2服务器中配置Amoeba的访问授权
grant all on *.* to 'test'@'192.168.96.%' identified by '123.com'; //三台机器都做
修改amoeba配置文件
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak //给要修改的文件做一个备份
vim amoeba.xml
cp dbServers.xml dbServers.xml.bak //做备份
vim dbServers.xml
配置无误后,启动Amoeba软件,默认端口是TCP协议8066
nohup /usr/local/amoeba/bin/amoeba start & //开启Amoeba在后台
netstat -lnpt //查看一下有没有8066端口
在Client上进行访问测试
mysql -u amoeba -p123456 -h 192.168.96.6 -P 8066 //IP为主机IP 123456为设置amoeba的密码
master上操作:
create database db_test; //创建新库
use db_test
create table student (id int(10),name varchar(10),address varchar(20)); //创建新数据,查看每个服务器都有新的数据
start slave; //关闭主从复制,所有的都关闭
在master上:
use db_test
insert into student values('1','crushlinux','this_is_master');
在slave1上:
use db_test
insert into student values('2','crushlinux','this_is_slave1');
在slave2上:
use db_test
insert into student values('3','crushlinux','this_is_slave2');
测试读操作:均在在测试机上操作
select * from student;
测试写操作:
在client上插入语句:
use db_test
insert into student values('4','crushlinux','write_test');
select * from student;
在Slave上
start slave;
show slave status\G
再次测试(测试过程略)