搭建基于MySQL的读写分离工具Amoeba
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建基于MySQL的读写分离工具Amoeba相关的知识,希望对你有一定的参考价值。
搭建基于MySQL的读写分离工具Amoeba:
Amoeba工具是实现mysql数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的;
实验环境(虚拟机):
主机 角色
10.10.10.20 多实例加主从复制
10.10.10.30 Amoeba服务器
10.10.10.40 客户端(最后测试使用)
1、首先搭建MySQL的主从复制(不在多提);
需要注意的是:在主从库上需要创建一个用户,在主库上创建的用户为amoeba,权限是create,update,insert,delete;
在从库上创建的用户也是amoeba,权限是select;
2、由于Amoeba是基于java的环境去实现的,所以要先安装jdk插件:(先通过windows主机去下载)
http://pan.baidu.com/share/link?shareid=2793927523&uk=1678158691&fid=117337971851932
下载完成后通过xshell自带的ftp软件传到服务器上,然后进行安装:
[[email protected] tools]# tar xf jdk-7u79-linux-x64.tar.gz
[[email protected] tools]# vim /etc/profile ##编辑jdk需要的环境变量;
export JAVA_HOME=/root/tools/jdk1.7.0_79
export JRE_HOME=/root/tools/jdk1.7.0_79/jre
export PATH=/root/tools/jdk1.7.0_79/bin:$PATH
export CLASSAPTH=./:/root/tools/jdk1.7.0_79/lib:/root/tools/jdk1.7.0_79/lib
[[email protected] tools]# java -version ##检测jdk是否安装成功,出现如下信息算安装成功;
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
3、下载并安装Amoeba软件:
[[email protected] tools]# mkdir /usr/local/amoeba ##创建一个目录用来放amoeba的软件;
https://sourceforge.net/projects/amoeba/ ##windows主机登录网址到网页中部的地方下载 Released /OldFiles/amoeba-mysql-0.19.zip,通过xshell自带FTP工具放到服务器上;
[[email protected] amoeba]# cd /usr/local/amoeba/
[[email protected] amoeba]# unzip amoeba-mysql-0.19.zip
[[email protected] amoeba]# ls
LICENSE.txt README.html amoeba-mysql-0.19.zip bin build.xml conf doc lib logs src ##主要用到的目录是conf这个配置目录;
[[email protected] conf]# ls
access_list.conf amoeba.dtd amoeba.xml function.dtd functionMap.xml log4j.dtd log4j.xml rule.dtd rule.xml ruleFunctionMap.xml
[[email protected] conf]# vim amoeba.xml
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<server>
<!-- proxy server°樵???-->
<property name="port">3306</property> ##配置的是Amoeba的服务端口,这里用3306就可以,默认的是8806;
<!-- proxy server°樵éP -->
<property name="ipAddress">10.10.10.30</property> ##配置的是Amoeba服务器的IP地址,默认的是127.0.0.1,改为物理网卡上的IP地址;
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">100</property> ##下面的四个数字可以调大一点;
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">100</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">200</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- ????μ??§? -->
<property name="user">root</property> ##配置客户端通过Amoeba连接数据库的用户,默认的是root;
<property name="password">xyp123123</property> ##配置的是客户端通过Amoeba连接数据库的密码,默认是被注释掉的;
</server>
<dbServer name="server1"> ##定义mysql池的名字;
<!-- PoolableObjectFactory?Ж` -->
<factoryConfig>
<className>com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory</className>
<property name="manager">defaultManager</property>
<!-- ??mysql??????-->
<property name="port">3306</property> ##主库的端口号;
<!-- ??mysql???? -->
<property name="ipAddress">10.10.10.20</property> ##主库的IP地址;
<property name="schema">xyp</property> ##需要进行操作的库;
<!-- ??μ??mysqlμ??§? -->
<property name="user">amoeba</property> ##用于Amoeba连接数据库的用户;
<!-- ??μ??mysqlμ??鞭->
<property name="password">123123</property> ##用于Amoeba连接数据库的密码;
</factoryConfig>
<!-- ObjectPool?Ж` -->
<poolConfig>
<className>com.meidusa.amoeba.net.poolable.PoolableObjectPool</className> ##这里的不用动;
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
<dbServer name="server2"> ##定义从库的池;
<!-- PoolableObjectFactory?Ж` -->
<factoryConfig>
<className>com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory</className>
<property name="manager">defaultManager</property>
<!-- ??mysql??????-->
<property name="port">3307</property> ##从库端口;
<!-- ??mysql???? -->
<property name="ipAddress">10.10.10.20</property> ##从库ip地址;
<property name="schema">xyp</property> ##从库上需要进行操作的库;
<!-- ??μ??mysqlμ??§? -->
<property name="user">amoeba</property> ##amoeba连接从库的用户;
<!-- ??μ??mysqlμ??鞭->
<property name="password">123123</property> ##amoeba连接从库的密码;
</factoryConfig>
<!-- ObjectPool?Ж` -->
<poolConfig>
<className>com.meidusa.amoeba.net.poolable.PoolableObjectPool</className> ##下面的不用动;
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="master" virtual="true"> ##定义操作的池,master为主库
<poolConfig>
<className>com.meidusa.amoeba.server.MultipleServerPool</className>
<!-- ?o???? 1=ROUNDROBIN , 2=WEIGHTBASED -->
<property name="loadbalance">1</property>
<!-- 2??pool?o???poolName±?oo???->
<property name="poolNames">server1</property> ##调用上面主库的池;
</poolConfig>
</dbServer>
<dbServer name="slave" virtual="true"> ##定义从库的池,名字为slave;
<poolConfig>
<className>com.meidusa.amoeba.server.MultipleServerPool</className>
<!-- ?o???? 1=ROUNDROBIN , 2=WEIGHTBASED -->
<property name="loadbalance">1</property>
<!-- 2??pool?o???poolName±?oo???->
<property name="poolNames">server2</property> ##调用上面从库的池;
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter>
<className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property> ##默认的池的名字;
<property name="writePool">master</property> ##写的池的名字;
<property name="readPool">slave</property> ##读的池的名字;
<property name="needParse">true</property>
</queryRouter>
[[email protected] conf]# chmod +x -R /usr/local/amoeba/bin/ ##给启动命令amoeba授权;
[[email protected] amoeba]# /usr/local/amoeba/bin/amoeba & ##后台启动;
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml ##这条信息不是报错,属于正常现象;
[[email protected] amoeba]# jobs ##查看后台启动的服务;
[1]- Running ../bin/amoeba & (wd: /usr/local/amoeba/conf)
4、测试:
[[email protected]~]# mysql -uroot -pxyp123123 -h 10.10.10.30 ##通过客户端去连接amoeba服务器来登录到mysql;
mysql> show databases; ##查看数据库,已经存在需要配置的库xyp;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| xyp |
+--------------------+
5 rows in set (0.02 sec)
去从库上停掉slave,方便测试;
mysql> use xyp
Database changed
mysql> create table student(id int(10) not null,name char(20) not null,age int(2) not null); ##在库里面创建一个表;
mysql> insert into student values(1,‘x‘,23); ##插入一条信息做测试;
mysql> select * from xyp.student; ##先去主库上去查,有数据;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | x | 23 |
+----+------+-----+
1 row in set (0.02 sec)
mysql> select * from xyp.student; ##在amoeba上通过select去查结果没东西,因为从库的状态是停掉的
Empty set (0.01 sec)
mysql> start slave; ##在从库上把状态打开;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from xyp.student; ##在从amoeba上查看,数据已经被同步过来了;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | x | 23 |
+----+------+-----+
1 row in set (0.02 sec)
以上是关于搭建基于MySQL的读写分离工具Amoeba的主要内容,如果未能解决你的问题,请参考以下文章