Mysql读写分离(Read/Write Splitting)
原理:让主数据库处理增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。这样能有效地减轻数据库压力,也能减轻io压力。
实现方法:
1.通过更改PHP页面代码.
2.通过软件在数据库前面搭建一个分发器.
在这里主要介绍通过amoeba这款软件搭建分发器的方法.
amoeba的工作原理
amoeba在apache与Mysql之间起到一个承上启下的作用
将apache发送过来的请求进行分类如果是增、删、改的操作则交给主Mysql服务器,如果是查询操作则交给从Mysql服务器.
apache只会以为amoeba是Mysql服务器并将数据发给amoeba,并不知道后方真正的Mysql服务器的地址和帐号,那么这就需要amoeba为前端apache开通一个用户以便apache连接了.
同理amoeba还需要连接后方真实Mysql数据库,也需要每一台真实数据库为amoeba开通一个用户以便连接.
实验环境:
在此首先要搭建一个Mysql AB复制的环境.主服务器用来进行增、删、改的操作,从服务器用来进行查询操作
其次还需要一台机器安装amoeba作为Mysql读写分离的分发器.
另外需要一台apache服务器提供网页.
实验流程:
Mysql的AB复制具体如何配置请参考我之前所写的文章<Mysql AB复制>
http://kys1230.blog.51cto.com/990812/1184551
1.保证自己的JAVA版本在1.5.0以上
查看命令
[root@localhost amoeba]# java -version
java version "1.5.0"
如果不是1.5.0则需要升级.
安装以后需要重新配置JAVA路径等参数
#vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.5.0/
export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH JAVA_HOME CALSSPATH
让/etc/profile文件修改后立即生效,可以使用以下命令
#. /etc/profile
注: .和/etc/profile中间有空格.
2.安装amoeba软件
我所使用的是一个绿色软件解压即可使用.
所以先为amoeba创建一个目录;
[root@localhost ~]# ls /usr/local/amoeba
将amoeba解压到指定目录中;
[root@localhost ~]# tar fvxz amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba/
3.配置amoeba
amoeba的两个配置文件amoeba.xml与dbServers.xml
3.1需要在amoeba.xml文件中定义端口以及前端apache连接amoeba的用户名密码与地址,还需要告诉amoeba哪台用来进行增、删、改的操作,哪些用来进行查询的操作.
<property name="port">3306</property>
#设置端口
<property name="ipAddress">192.168.18.53</property>
#设置本机IP地址
<property name="k1">root</property>
#设置前端apache连接所用的用户名
<property name="123"></property>
#设置前端apache连接所用的密码
<property name="defaultPool">Master</property>
#设置默认池为Master
<property name="writePool">Master</property>
#设置写入池为Master
<property name="readPool">SlavePool</property>
#设置读取池为SlavePool池
3.2需要在db Servers.xml文件中定义连接后方真是Mysql的用户名密码以及Mysql的IP地址
<property name="k2">root</property>
#设置amoeba连接后端Mysql所用的用户名
<property name="123">password</property>
#设置amoeba连接后端Mysql所用的密码
<dbServer name="Master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.18.51</property>
</factoryConfig>
</dbServer>
#设置Master服务器IP地址为192.168.18.51
<dbServer name="Slave1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.18.52</property>
</factoryConfig>
</dbServer>
#设置Slave1服务器IP地址为192.168.18.52
<dbServer name=" SlavePool " virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">Slave1</property>
</poolConfig>
</dbServer>
#建立一个SlavePool池其中包含Slave1这台服务器
##此功能用于多台Mysql群集提供读取操作可以设置多个Slave服务器并且添加到SlavePool池中.
例如:
<dbServer name=" SlavePool " virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">Slave1,Slave2,Slave3</property>
</poolConfig>
</dbServer>
4.启动amoeba
/usr/local/amoeba/bin/amoeba start
5.配置apache服务器的PHP页面
将所有需要连接数据库的PHP代码修改一下
连接地址改成amoeba的地址
用户名,密码使用amoeba在amoeba.xml文件中定义的即可.
OK.到这里基本就完事了..
希望对大家有所帮助吧!
附件1:jdk1.5.0安装包
http://down.51cto.com/data/765329
附件2:amoeba
http://down.51cto.com/data/765330