Mysql主从复制+动静分离(2)amoeba实现

相关链接:

amoeba官网下载:amoeba - Browse Files at SourceForge.net(网站不是很稳定)

amoeba网盘下载:链接:https://pan.baidu.com/s/1GoA-WsiHAy_ooEAy8OxHYg 提取码:p1o7

jdk下载:Java Downloads | Oracle

一、实现效果

通过代理机器实现master和slave的读写分离,在amoeba服务器上写入或者读取,amoeba会自动将写入任务由master完成,读取任务由slave完成。原理都是相同的,不管用mysql-proxy还是amoeba或者是其他中间件。

二、准备工作

三台服务器:

10.0.0.10(master)

10.0.0.100(slave)

10.0.0.101*(amoeba)

运行amoeba需要先安装java环境,需要在10.0.0.101服务器下载对应的jdk进行安装,注意安装完成后需要在/etc/profile里添加环境路径。在/etc/profile文末添加java环境变量,这里我把jdk安装在/usr/local/java/里面,注意第二行有个bin要注意。

export JAVA_HOME=/usr/local/java/jdk1.8.0_321
export PATH=$JAVA_HOME/bin:$PATH

(不会安装jdk参考我的博客:?)

 注意jdk不要下载错,还有Centos7自带的open java和我们需要的java环境是不一样的,还是需要下载jdk安装。

下载安装amoeb安装(5.5M那个),解压即可。unzip用于解压zip压缩包,tar用来解压tar.gz压缩包。

unzip amoeba-mysql-3.0.5-RC-distribution.zip

三、实例配置

1、更改dbServers.xml

文件位置:../amoeba-mysql-3.0.5-RC/conf/dbServers.xml

更改的位置有7处:数据库名、用户名、用户密码、主服务器名、主服务器ip、从服务器名、从服务器ip。

<?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 configu
ration:			 add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with n
ame 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">msb</property> #需要同步的数据库,数据库名为msb
			
			<!-- mysql user -->
			<property name="user">root</property> #mysql数据库用户名为root
			
			<property name="password">rootroot</property> #数据库用户密码为rootroot
		</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"> #主服务器名为master
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">10.0.0.10</property> #主服务器ip为10.0.0.10
		</factoryConfig>
	</dbServer>
	
	<dbServer name="slave"  parent="abstractServer"> #主服务器名为slave
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">10.0.0.100</property> #主服务器ip为10.0.0.100
		</factoryConfig>
	</dbServer>
	<dbServer name="myslave" 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">slave</property>
#这里可以写多个从服务器用逗号隔开,但是这里只有一个从服务器,所以只写了一个slave。
		</poolConfig>
	</dbServer>
</amoeba:dbServers>

2、更改amoeba.xml

文件位置:../amoeba-mysql-3.0.5-RC/conf/amoeba.xml

需要更改有5处:中间件用户名、中间件密码、默认服务器池、写入服务器池、读取服务器池。

<?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">rootroot</property> #中间件amoeba的用户与密码,与mysql数据库无关,可以随意设置,这里方便记忆,设置成一样的。
					
					<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">myslave</property> #读取服务器池myslave,slave是myslave中的一个。
		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>

 启动amoeba,提前关闭三台服务器的防火墙systemctl stop firewalld。(多次出错不知道是不是这样原因)

在/opt/amoeba-mysql-3.0.5-RC/bin下,./launcher启动amoeba

四、效果测试

在第四台机器上,可以是任何一台机器,(amoeba启动后似乎终端就用不了了,需要重新开一个终端)模仿客户机访问数据库,远程连接amoeba服务器。

mysql -h10.0.0.101 -uroot -prootroot -P8066

master和slave均存活时,写入读写均正常。

 

当slave正常,master停止mysqld服务时,写入失败,读取正常。

当master正常,slave停止mysqld服务时,写入失败,读取正常。

 

 当master、slave均停止mysqld后,写入、读写均失败。

 测试成功。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Amoeba:分布式数据库Proxy解决方案 随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用 已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:集中式处理,势必造成性 能瓶颈;应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性 不高;集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数 据库将向分布式数据库发展。 分布式数据库系统的优点: 1、降低费用。分布式数据库在地理上可以式分布的。其系统的结构符合这种分布的要求。允许用 户在自己的本地录用、查询、维护等操作,实行局部控制,降低通信代价,避免集中式需要更高要求 的硬件设备。而且分布式数据库在单台机器上面数据量较少,其响应速度明显提升。 2、提高系统整体可用性。避免了因为单台数据库的故障而造成全部瘫痪的后果。 3、易于扩展处理能力和系统规模。分布式数据库系统的结构可以很容易地扩展系统,在分布式数 据库中增加一个新的节点,不影响现有系统的正常运行。这种方式比扩大集中式系统要灵活经济。在 集中式系统中扩大系统和系统升级,由于有硬件不兼容和软件改变困难等缺点,升级的代价常常是昂 贵和不可行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值