读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
虽然大多数都是从程序里直接实现读写分离的,但对于分布式的部署和水平和垂直分割,一些代理的类似中间件的软件还是挺实用的,Amoeba for Mysql 与MySQL Proxy比较在MySQL proxy 6.0版本上面如果想要读写分离并且读集群、写集群 机器比较多情况下,用mysqlproxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件, lua脚本就是它的全部,当然lua是相当方便的。那么同样这种东西需要编写大量的脚本才能完成一个复杂的配置。而Amoeba for Mysql只需要进行相关的配置就可以满足需求。
Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba forMysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用。
场景描述:
Amoeba服务器:192.168.1.21
主数据库服务器:双主复制:192.168.1.22(active),192.168.1.21(passive)。
已配置Keepalive高可用,虚拟IP 192.168.1.60 #注意,这里双主复制并不是必须的。
从数据库服务器:192.168.1.23,MySQL已经安装
wget http://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
mkdir /usr/local/amoeba
mv amoeba-mysql-binary-2.1.0-RC5.tar.gz/usr/local/amoeba
tar xvf amoeba-mysql-binary-2.1.0-RC5.tar.gz
wget http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm?AuthParam=1452665963_7ae34dd55d5d4c1b2a7297acd2135e73
这是适用于linux-64位机器的安装包,若想下载其他版本,请在网页http://www.oracle.com/technetwork/java/javase/downloads/index.html上进行下载。
rpm -ivhjdk-8u65-linux-x64.rpm\?AuthParam\=1452665963_7ae34dd55d5d4c1b2a7297acd2135e73
vi/etc/profile
在末尾添加:
export AMOEBA_HOME=/usr/local/amoeba
export JAVA_HOME=/usr/java/jdk1.8.0_65
export CLASSPATH=$JAVA_HOME/lib/tools.jar
exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$AMOEBA_HOME/bin
验证是否安装成功:
java -version
注意:1.4 和1.7的命令不一样, 1.4中是java --version 查看版本,1.7 执行错误的命令就是报上面那个错误,1.7的命令格式是java -version。
该配置文件里主从数据库的parent是abstractServer,需要从它继承一些信息,所以这里的信息一定要配置正确。
需要修改成类似:
mysql schema这里默认是test,需要改成一个存在的数据库。
将
<dbServername="server1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <propertyname="ipAddress">127.0.0.1</property> </factoryConfig> </dbServer>
<dbServername="master" parent="abstractServer"> <factoryConfig> <propertyname="ipAddress">192.168.1.60</property> <propertyname="user">root </property> <propertyname="password">dandan </property> </factoryConfig> </dbServer> <dbServername="slave1" parent="abstractServer"> <factoryConfig> <propertyname="ipAddress">192.168.1.23</property> <propertyname="user">root </property> <propertyname="password">dandan </property> </factoryConfig> </dbServer>
把master节点加入WritePool,把slave节点加入ReadPool
将
替换为类似于:
客户端和程序只需要连接proxy的帐号密码即可,相当于中间接封装。
将
替换成类似于:
#注意,amoeba服务器上也安装了mysql,这里的端口不要和mysql端口冲突了。
一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。
我这里将
替换为:
这里记得取消注释writePool和readPool这两行。
--这几行位于文件后面的位置
[root@PC lib]#/usr/local/amoeba/bin/amoeba start &
开机自动启动可加入到 /etc/rc.local内
echo"/usr/local/amoeba/bin/amoeba start &" >> /etc/rc.local
日志文件在/usr/local/amoeba/logs下
连接前,需要开放防火墙端口。
mysql -u root -p123456 -h 192.168.1.21 --port 3308
mysql> use dba;
Reading tableinformation for completion of table and column names
You can turn offthis feature to get a quicker startup with -A
Database changed
mysql> select *from t;
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.03sec)
为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能。
#在slave上执行:
mysql> stop slave;
Query OK, 0 rowsaffected (0.03 sec)
#连接amoeba代理,执行:
mysql> insert into t(id) values(3),(4);
Query OK, 2 rowsaffected (0.09 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select *from t;
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.00sec)
并没有查看到新增的两条数据。
而直接登录master,可以看到新增数据:
mysql> use dba;
Reading tableinformation for completion of table and column names
You can turn offthis feature to get a quicker startup with -A
Database changed
mysql>select * from t;
+------+
| id |
+------+
| 2 |
| 1 |
| 3 |
| 4 |
+------+
4 rows in set (0.00sec)
现在再开始启动复制
mysql> start slave;
Query OK, 0 rowsaffected (0.02 sec)
连接amoeba代理,重新查询:
可以看到,现在能查到数据了。
这充分说明写是在主库进行,查是在丛库执行。
本篇文章参考自:http://www.cnblogs.com/lhj588/archive/2012/11/19/2777897.html,
http://blog.csdn.net/edwzhang/article/details/8475624