Amoeba实现mysql读写分离

时间:2021-03-20 04:02:14

一、关于读写分离

 

读写分离(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

 

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba forMysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前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已经安装

 

4.1 下载

 

wget http://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz

 

4.2 安装amoeba

 

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 

 

4.3 安装JDK

 

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。

 

五、Amoeba配置


 5.1 配置dbServers.xml


cd /usr/local/amoeba/conf

vi dbServers.xml

5.1.1设置mysql默认连接时的端口,数据库,帐号和密码


该配置文件里主从数据库的parent是abstractServer,需要从它继承一些信息,所以这里的信息一定要配置正确。

 Amoeba实现mysql读写分离

需要修改成类似:

Amoeba实现mysql读写分离

mysql schema这里默认是test,需要改成一个存在的数据库。


5.1.2设置连接主从数据库服务器的IP地址和服务器别名,用户名及密码


<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>

--注意:这里写的数据库用户,密码必须是主从允许远程访问的用户,不是主从的本地用户。


5.1.3 定义读写的池


把master节点加入WritePool,把slave节点加入ReadPool

Amoeba实现mysql读写分离

替换为类似于:

Amoeba实现mysql读写分离


5.2 配置amoeba.xml

vi amoeba.xml

5.2.1 修改proxy的端口号,管理帐号及密码

 

客户端和程序只需要连接proxy的帐号密码即可,相当于中间接封装。

Amoeba实现mysql读写分离

替换成类似于:

Amoeba实现mysql读写分离

 #注意,amoeba服务器上也安装了mysql,这里的端口不要和mysql端口冲突了。


5.2.2 设置默认池及读写分离

一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。

我这里将

Amoeba实现mysql读写分离

替换为:

Amoeba实现mysql读写分离

这里记得取消注释writePool和readPool这两行。

--这几行位于文件后面的位置


六、启动Amoeba


[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代理,重新查询:

Amoeba实现mysql读写分离

可以看到,现在能查到数据了。

这充分说明写是在主库进行,查是在丛库执行。

 

本篇文章参考自:http://www.cnblogs.com/lhj588/archive/2012/11/19/2777897.html

http://blog.csdn.net/edwzhang/article/details/8475624