在企业中,大量数据请求下,单台数据库将无法承担所有读写操作。解决方法:配置多台数据服务器以实现主从复制+读写分离
用的代理服务器是 Amoeba
特点是:1负载均衡,2高可用,3SQL过滤,4读写分离,5高并发请求多台数据库。
试验环境
amoeba: 192.168.100.123
mysql-master: 192.168.100.111
mysql-slave1: 192.168.100.222
mysql-slave2: 192.168.100.250
client: 192.168.100.22
首先实现主从复制 主 从 从,这里就不多说了,略
先配置amoeba:192.168.100.123
1:安装Amoeba上安装java环境(推荐安装jdk1.5/1.6,不建议安装1.7)
我用的是jdk-6u14-linux-x64.bin
chmod +x jdk-6u14-linux-x64.bin
bash jdk-6u14-linux-x64.bin 一路空格,输入yes,回城完成
mv jdk1.6.0_14/ /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/bin:$JAVA_HOME/jre/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin 添加到变量里 注意不要写错
. /etc/profile 执行
java -version 查看 注意如果有自带的openjava 删掉或者转移
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/
/usr/local/amoeba/bin/amoeba amoeba start |stop //出现此行说明配置无误
3:配置amoeba实现mysql-slave1、slave2读负载均衡
在三台MYSQL服务器上对amoeba授权
mysql>grant all on *.* to 'amoeba'@'192.168.100.%' identified by '123123'; //测试环境给的权限最大 生产环境根据需要
mysql>flush privileges; //刷新一下
编辑amoeba.xml配置文件,设置读写分离(amoeba服务器)
cd /usr/local/amoeba/conf/
vim amoeba.xml //修改任何文件时,养成习惯备份。 cp amoeba.xml amoeba.xml.$(date +%F)
118066 //默认端口8066,无需更改
30 amoeba //设置一个用户,后面客户端访问时使用,切勿打错,要不然后期测试会进去不mysql
32 123123 //设置登录密码
115 master //默认的服务器池
117 master //写服务器池
118 slaves //读服务器池
有注释删掉
编辑dbServer.xml配置文件,设置登录MYSQL服务器的用户及密码、MYSQL服务器节点的IP地址、负载均衡算法/usr/local/amoeba/conf/
vim dbServers.xml
20 3306 //设置MYSQL连接端口,默认3306
26 amoeba //设置访问MYSQL服务器所用的用户名
27 123123 //设置访问MYSQL服务器的密码
43 //设置MYSQL服务器的IP地址
46 192.168.100.111 主的
50 从的IP
53 192.168.100.222
56 从2的IP
59 192.168.100.250
63 //在amoeba.xml文件中设置的readPool
69 slave1,slave2 //前面定义的服务器节点
4:启动amoeba
/usr/local/amoeba/bin/amoeba start &
jobs 可以查看后台
5:测试
在主MYSQL服务器上创建db_test及库下的test表
mysq>create database db_test;
mysq> use db_test;
mysq>create table test(id int(10),name varchar(20));
可以在slave1和slave2上查看
mysq>show databases;
在slave1和slave2服务上停止主从备份
mysq>stop slave;
在master上添加表内容
mysql>insert into test values(1,'master');
此前在服务器上同步了表,所以在从服务器上可以直接手动插入其他内容
在slave1上
mysql>use db_test;
mysql>insert into test values(2,'slave1');
在slave2上
mysql>use db_test;
mysql>insert into test values(3,'slave2');
在客户机上进行读测试
client上
yum -y install mysql mysql-devel
进入mysql
mysql -uamoeba -p123123 -h 192.168.100.123 -P8066 //注意 这是进入amoeba服务器的mysql。
读测试
mysql>select * from db_test.test; //来两遍 会发现轮询
此时读取数据时,轮询的方式从slave1,slave2上读取
(2)写入测试
mysql>insert into db_test.test values(4,'client');
mysq>select * from db_test.test; //会多出一个
此时写入数据到数据库时,会写到主服务器,不会写到从服务器上,实现了读写分离。