Amoeba数据库代理 实现mysql读写分离

转载 2016年08月30日 15:10:52

Amoeba   依赖jdk centons7安装jdk8

目前Amoeba for Mysql最新版本为amoeba-mysql-3.0.5-RC-distribution.zip。

安装过程很简单,只需要将zip压缩包解压至/usr/local/即可。若没有安装zip和unzip,可以通过centOS yum安装。

接下来,解压Amoeba压缩包。

[root@chenllcentos ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip 
[root@chenllcentos ~]# cp -rf amoeba-mysql-3.0.5-RC /usr/local

启动Amoeba。

[root@chenllcentos ~]# /usr/local/amoeba-mysql-3.0.5-RC/bin/launcher

但是提示出现fatal exception:

The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

从错误文字上看,应该是由于stack size太小,导致JVM启动失败,要如何修改呢?
其实Amoeba已经考虑到这个问题,并将JVM参数配置写在属性文件里。现在,让我们通过该属性文件修改JVM参数。
修改jvm.properties文件JVM_OPTIONS参数。

[root@chenllcentos ~]# vi /usr/local/amoeba-mysql-3.0.5-RC/jvm.properties

将内容:

JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"

替换为:

JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"

再次启动Amoeba。

[root@chenllcentos ~]# /usr/local/amoeba-mysql-3.0.5-RC/bin/launcher

若使用Amoeba完成读写分离,需要分别对dbServers.xml和amoeba.xml两个配置文件进行配置。与在应用层实现读写分离不同,使用Amoeba实现读写分离只需要修改配置文件,并不会产生硬编码耦合,有利于系统扩展和维护。

首先是配置dbServers.xml,主要是配置真实Mysql数据库连接信息。

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

		<!-- 
			Each dbServer needs to be configured into a Pool,
			If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
			 add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
			 such as 'multiPool' dbServer   
		-->
		
	<dbServer name="abstractServer" abstractive="true">
		<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
			<property name="connectionManager">${defaultManager}</property>
			<property name="sendBufferSize">64</property>
			<property name="receiveBufferSize">128</property>
				
			<!-- mysql port -->
			<property name="port">3306</property>
			
			<!-- mysql schema -->
			<property name="schema">itcast</property>
			
			<!-- mysql user -->
			<property name="user">root</property>
			
			<property name="password">root</property>
		</factoryConfig>

		<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
			<property name="maxActive">500</property>
			<property name="maxIdle">500</property>
			<property name="minIdle">1</property>
			<property name="minEvictableIdleTimeMillis">600000</property>
			<property name="timeBetweenEvictionRunsMillis">600000</property>
			<property name="testOnBorrow">true</property>
			<property name="testOnReturn">true</property>
			<property name="testWhileIdle">true</property>
		</poolConfig>
	</dbServer>

	<dbServer name="master"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.96.130</property>
		</factoryConfig>
	</dbServer>
	
	<dbServer name="slave1"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.96.131</property>
		</factoryConfig>
	</dbServer>
	
	<dbServer name="slave2"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.96.132</property>
		</factoryConfig>
	</dbServer>

	<dbServer name="readPool" 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,slave2</property>
		</poolConfig>
	</dbServer>
		
</amoeba:dbServers>

可以看出,对dbServers.xml文件的配置,主要就是对dbServer节点的配置。其中,readPool节点需要特别注意,因为Amoeba实现读写分离就是根据它来实现。接下来是amoeba.xml,主要是配置代理数据库连接信息。

<span style="font-size:18px;"><?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

	<proxy>
	
		<!-- service class must implements com.meidusa.amoeba.service.Service -->
		<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
			<!-- port -->
			<property name="port">8066</property>
			
			<!-- bind ipAddress -->
			<!-- 
			<property name="ipAddress">127.0.0.1</property>
			 -->
			
			<property name="connectionFactory">
				<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
					<property name="sendBufferSize">128</property>
					<property name="receiveBufferSize">64</property>
				</bean>
			</property>
			
			<property name="authenticateProvider">
				<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
					
					<property name="user">root</property>
					
					<property name="password">root</property>
					
					<property name="filter">
						<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
							<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
						</bean>
					</property>
				</bean>
			</property>
			
		</service>
		
		<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
			
			<!-- proxy server client process thread size -->
			<property name="executeThreadSize">128</property>
			
			<!-- per connection cache prepared statement size  -->
			<property name="statementCacheSize">500</property>
			
			<!-- default charset -->
			<property name="serverCharset">utf8</property>
			
			<!-- query timeout( default: 60 second , TimeUnit:second) -->
			<property name="queryTimeout">60</property>
		</runtime>
		
	</proxy>
	
	<!-- 
		Each ConnectionManager will start as thread
		manager responsible for the Connection IO read , Death Detection
	-->
	<connectionManagerList>
		<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
			<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
		</connectionManager>
	</connectionManagerList>
	
		<!-- default using file loader -->
	<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
		<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
	</dbServerLoader>
	
	<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
		<property name="ruleLoader">
			<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
				<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
				<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
			</bean>
		</property>
		<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
		<property name="LRUMapSize">1500</property>
		<property name="defaultPool">master</property>
		
	
		<property name="writePool">master</property>
		<property name="readPool">readPool</property>
		
		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>
</span>

在amoeba.xml中,主要完成连接信息和SQL路由配置。在queryRouter节点中,通过配置writePool和readPool可以实现读写分离。
配置完成后,重启Amoeba。
[root@chenllcentos ~]# /usr/local/amoeba-mysql-3.0.5-RC/bin/shutdown
[root@chenllcentos ~]# /usr/local/amoeba-mysql-3.0.5-RC/bin/launcher

至此,Mysql主从复制和使用Amoeba实现数据库读写分离全部配置完成。

读写分离验证

接下来,进行简单测试,验证以上配置是否能够正确运行。
登录master主数据库。

[root@chenllcentos ~]# mysql -uroot -proot -h192.168.96.130 -P8066

额外说明下,此处的yourpassword是连接Amoeba的密码,也就是在amoeba.xml配置文件中配置的密码,与Mysql密码不同,需要注意。
登陆后,此时会提示以下信息。

Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA Source distribution

说明已经成功连接Mysql代理Amoeba。
为了验证Amoeba读写分离配置是否生效,我们做一个简单的测试。
先在181服务器master服务器上创建一个表。

mysql> create table sxit (id int(10) ,name varchar(10));

而后,分别停止服务器B和服务器C两个从数据库的主从复制,便于数据库操作观察。
登陆服务器B从数据库。

[root@chenllcentos ~]# mysql -uroot -proot

停止从数据库主从复制。

mysql> slave stop;

登陆服务器C从数据库。

[root@chenllcentos ~]# mysql -uroot -proot

停止从数据库主从复制。

mysql> slave stop;

在主数据库插入。

mysql> insert into sxit values('1','zhangsan');

在从数据库B插入。

mysql> insert into sxit values('2','lisi');

在从数据库C插入。

mysql> insert into sxit values('3','john');

登陆到amoeba服务器,进行读写分离的测试:

[root@chenllcentos ~]# mysql -uroot -proot -h192.168.96.130 -P8066
mysql> use test;
mysql> select * from sxit;
+------+------+
| id   | name |
+------+------+
|    2 | lisi |
+------+------+
mysql> select * from sxit;
+------+------+
| id   | name |
+------+------+
|    3 | john |
+------+------+

重复执行多次,发现始终只显示从数据库的数据,说明如果进行数据库读操作,Amoeba只将读数据SQL命令路由至从数据库。
登录主数据库。

[root@chenllcentos ~]# mysql -uroot -proot 
mysql> use test;
mysql> select * from sxit;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+

可以验证,使用Amoeba对Mysql读写分离成功。若此时开启从数据库主从复制,则可以进行Mysql集群和负载均衡。

小结

使用Amoeba做数据库代理,对于应用层来说是透明的。所谓透明,可以这么简单理解,是否使用代理,在应用层编码上是没有任何区别的,即使用代理的情况下,应用层和数据层能够保持高度解耦


基于MyCat的MySQL高可用读写分离集群

本课程使用HAProxy和MyCat结合MySQL主从复制功能实现MySQL数据库的高可用读写分离集群。课程内容包括Linux环境下的MySQL数据库安装、MySQL主从复制配置、基于MyCat的读写分离配置、HAProxy+Keepalived实现MyCat的高可用负载均衡集群。
  • 2016年06月13日 15:23

Centos 6.5 Mysql amoeba读写分离

环境依赖JDK ============================================================================================...
  • hanzheng260561728
  • hanzheng260561728
  • 2016-10-13 15:42:21
  • 416

amoeba-mysql-3.0.5-RC-distribution

  • 2016年12月15日 00:18
  • 5.49MB
  • 下载

amoeba-mysql-3.0.5

  • 2014年09月16日 11:08
  • 5.49MB
  • 下载

【Amoeba】amoeba实现mysql读写分离

centos7:amoeba实现mysql读写分离。
  • sds15732622190
  • sds15732622190
  • 2017-04-05 17:07:20
  • 1099

MySQL Proxy和 Amoeba 工作机制浅析

MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的。代理服务器是和T...
  • longniao
  • longniao
  • 2012-06-20 15:04:25
  • 1744

Amoeba for MySQL---分布式数据库Proxy解决方案

Amoeba for MySQL 位于Client、Database Server(s)之间,具有负载均衡、高可用性、sql过滤、可承受高并发、读写分离、Query Route(解析sql query...
  • u010282707
  • u010282707
  • 2014-07-08 23:10:27
  • 544

Amoeba数据库代理 实现mysql读写分离

目前Amoeba for Mysql最新版本为amoeba-mysql-3.0.5-RC-distribution.zip。 安装过程很简单,只需要将zip压缩包解压至/usr/local/即可。若...
  • lexang1
  • lexang1
  • 2016-08-30 15:10:52
  • 665

Mysql 读写分离实现及代理Amoeba的使用

1.主从复制 实现读写分离的基础是先行搭建MySQL主从复制关系,这里注意MySQL5.1~5.5的复制功能是异步的。主从复制的具体过程不再做描述,具体在实践过程中出现最多的问题就是:      ...
  • qq_29675447
  • qq_29675447
  • 2016-01-24 22:32:22
  • 245

<em>Amoeba</em>:分布式数据库<em>Proxy</em>解决方案

<em>amoeba</em>-<em>mysql</em> 立即下载 上传者: xst896 时间: 2013-06-28 综合评分: 0 积分/C币:3 分布式数据库<em>Proxy</em>解决方案(<em>mysql</em>负载均衡) 立即下载 上传者: bugx ...
  • 2018年04月18日 00:00
收藏助手
不良信息举报
您举报文章:Amoeba数据库代理 实现mysql读写分离
举报原因:
原因补充:

(最多只允许输入30个字)