1.理解读写分离的原理
Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql服务器时充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关SQL的到目标数据库、可并发请求多台数据库全并结果的作用。通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用;其版本可在官网进行下载。其工作原理图如下:
2.掌握读写分离配置过程
配置好主从复制
安装java环境,此处安装是jdk-6u14-linux-x64.bin,因为amoeba推荐使用 jdk1.5或 1.6版本,高版本不建议使用
chmod +x /usr/local/jdk-6u14-linux-x64.bin
/usr/local/jdk-6u14-linux-x64.bin #根据提示按回车建完成即可
mv /usr/local/jdk1.6.0_14 /usr/local/jdk1.6
vi /etc/profile #编辑/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
source /etc/profile #使环境变量立即生效
java -version
如上图java环境已配置成
3.安装并配置amoeba软件
mkdir /usr/local/amoeba
tar zxf /root/amoeba-mysql-binary-2.1.0-RC5.tar.gz –C /usr/local/amoeba
chmod –R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
4.配置amoeba读写分离
所有的mysql数据库都要开放给amoeba访问,在主和从数据库上执行以下命令,ip地址应该为amoeba的ip地址,如:
grant all on *.* to test@’106.120.190.%’ identified by ‘123.com’;
vim /usr/local/amoeba/conf/amoeba.xml
……
<!-- Amoeba 账号,密码 -->
<property name="user">amoeba</property> //30行
<property name="password">123456</property>
……
<!-- 默认数据库,主数据库 -->
<property name="defaultPool">master</property> //115行
<!-- 写数据库 -->
<property name="writePool">master</property>
<!-- 读数据库,dbServer.xml 中配置的 虚拟数据库,数据库池 -->
<property name="readPool">slaves</property>
<property name="needParse">true</property>
……
vim /usr/local/amoeba/conf/dbServers.xml
……
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">test</property>
<!-- mysql user -->
<property name="user">test</property>
<!-- mysql password -->
<property name="password">123.com</property>
……
<!-- Master ,Slave1, Slave2 的独立部分,也就只有 IP 了 -->
<dbServer name="master" parent="abstractServer"> //45行
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.233</property> //Master的IP
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> <factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.236</property> //Slave1的IP
</factoryConfig> //如果有多台slave,则可再配置
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">106.120.190.228</property> //Slave2的IP
</factoryConfig>
</dbServer>
<!-- 数据库池,虚拟服务器,实现读取的负载均衡 -->
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1</property> //单台slave的配置格式,多台的配置格式为:<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
启动amoeba软件
/usr/local/amoeba/bin/amoeba
5.测试ameoba
测试的时候和我们平时使用一样,amoeba-mysql对我们应用透明,就是个mysql的代理
在客户端安装mysql客户端,登录mysql使用如下命令(用户名密码和上面配置要一致)
mysql –u amoeba –p123456 –h amoeba的ip –P 8066
登录上去后,为了测试读和写必须,先把mysql的主从复制停掉,才能更清楚地看出读写的服务器是哪台,在从执行用stop slave;登录到amoeba上,然后执行写和读操作,查看写的是哪台服务器,读的是哪台服务器,实验结果显示:写只在主上进行,读在从上进行,但是可通过配置使得主从都可读,比率是1:1
测试步骤:
1.在客户机上安装mysql
yum –y install mysql
mysql –uroot –p123456 –h amoeba的ip地址 –P 8806
2.在master上建一个测试用库,如db_test,并建测试用表,如wg2:
mysql>create database db_test;
mysql>create table a_test(id int(10),addr varchar(20));
3.在从服务器上:
mysql>stop slave;
4.然后在主服务器上:
mysql>use db_test;
mysql>insert into a_test values(‘1’,’master’);
5.在从服务器上:
mysql> use db_test;
mysql>insert into a_test values(‘2’,‘slave’);
6.在客户端上查询数据:
mysql>select * from db_test.a_test;
7.在客户端上:
insert into db_test.a_test values(‘1’,’mrite’);
在主从上分别查询看结果:
select * from db_test.a_test;
6.了解使用amoeba进行数据切分
根据数据的特点,将不同特性的数据纪录存放到不同的数据库服务器中就是数据切分,可以设置规则匹配数据特性以实现数据切分,其实,数据切分就是根据设置规则将数据分别存放到不同的数据库,以减轻数据库服务器的压力和减小单个数据库的大小,可通过设置amoeba的rule.xml文件中的切片规则实现。原理如图: