amoeba

1. amoeba安装

1.1安装JDK

	http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

1.2安装amoeba

	http://sourceforge.net/projects/amoeba/files/
	https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz/download

	tar -zxvf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba
	可使用命令[/usr/local/amoeba/bin/amoeba]验证Amoeba是否安装成功。

1.3配置Mysql主从授权

	设置读写分离的权限
	禁止mysql.user表同步
	主: grant select,insert,update,delete on *.* to r-amoeba@'%' identified by '123456'
	从: grant select on *.* to w-amoeba@'%' identified by '123456'

mysql读写分离的授权方案

	mysql库不同步,再对主从进行授权
	主: web_r 123456 10.204.1.100 3306 (select,insert,delete,update)
	从: web_w 123456 10.204.1.101 3306 (select)
	缺隐:从接替主的时候,没有修改权限,替补方案是,做一台从专门冷备,用来接替主
	binlog-ignore-db=mysql
	binlog-ignore-db=performance_schema
	binlog-ignore-db=information_schema



	mysql库同步,在主上授权同步到从
	主: web_r 123456 10.204.1.100 3306 (select,insert,delete,update)
	如果防止从被写入,设置配置文件参数read-only,
	注意:read-only对root用户不生效

生产环境如何确保从库只读

	1. mysql从服务器中加入read-only参数或者从服务器启动时加该参数
	2. 忽略mysql库及information_schema库同步
	3. 授权从库用户仅授权select权限

3. amoeba配置

	├── bin
	│   ├── amoeba
	├── conf
	│   ├── amoeba.xml
	├── dbServers.xml

	vim amoeba.xml
	配置ameoba访问的用户名和密码 IP 端口提供给web连接
					<!-- service class must implements com.meidusa.amoeba.service.Service -->
						<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
													<!-- port --    绑定的端口>
													<property name="port">8066</property>
													<!-- bind ipAddress --绑定的IP  amoeba对外监听的IP>
													<!--
													<property name="ipAddress">127.0.0.1</property>
													 -->
													<property name="manager">${clientConnectioneManager}</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="authenticator">
																	<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
									# amoeba本地的用户名和密码
																					<property name="user">root</property>
																					<property name="password"></property>
																					<property name="filter">
										 <bean class="com.meidusa.amoeba.server.IPAccessController">
										<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
																									</bean>
																					</property>
																	</bean>
													</property>

									</service>



	查询路由设置
	<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>
					# 设置默认的服务器(此处为master池)
					# 设定可写节点,节点定义见dbServers.xml文件
									<property name="defaultPool">masterPool</property>
									<property name="writePool"> masterPool </property>  #设置写的库
									<property name="readPool"> salvePool </property>    # 设置读的库
									<property name="needParse">true</property>
					</queryRouter>




	修改 vim  dbServers.xml
定义抽象服务器,为每个后端MySQL服务器提供默认连接配置
	★<dbServer name="server1" abstractive="true">
									<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
													<property name="manager">${defaultManager}</property>
													<property name="sendBufferSize">64</property>
													<property name="receiveBufferSize">128</property>
													<!-- mysql port --mysql端口> 
													<property name="port">3306</property>
													<!-- mysql schema -->
													<property name="schema">test</property>
													<!-- mysql user --mysql用户名>
													<property name="user">root</property>
													<!--  mysql password  mysql密码
													<property name="password">password</property>
													-->
用户密码这一段只需要设置一次,下面子服务器共享上面的参数
									</factoryConfig>
	<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
													<property name="maxActive">500</property>
													<property name="maxIdle">500</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>  # 以上多台mysql时,可配置多个<dbServer>… </dbServer>
定义后端MySQL的IP地址,一个master,一个slave
	<dbServer name="master"  parent="abstractServer">
						<factoryConfig>
					<property name="ipAddress">192.168.0.45</property>
						</factoryConfig>
	</dbServer>
	<dbServer name="slave"  parent="abstractServer">
						<factoryConfig>
					<property name="ipAddress">192.168.0.46</property>
	</factoryConfig>
	</dbServer>
定义读池和写池 分别设置server列表,设置负载均衡方式
	master-pool 定义池名和关联服务器
	<dbServer name="masterPool" virtual="true">
				 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
设置负载均衡参数 1=轮询 2=权重 3=Hash
	 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
			<property name="loadbalance">1</property>

  <!-- Separated by commas,such as: server1,server2,server1可以设置多个srever -->
		<property name="poolNames">server1</property>
									</poolConfig>
	 </dbServer>
slave-pool 定义池名和关联服务器
<dbServer name="slavePool" 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 可以设置多个srever -->

<property name="poolNames">server2</property>
</poolConfig>
</dbServer>

amoeba测试

	重台启动
	/usr/local/amoeba/bin/amoeba start &

	连接测试
	mysql -h127.0.0.1 -uroot -p -P8066 # amoeba默认监听端口为8066
	这里连接的是ameoba的IP

4. Amoeba调优

	<?xml version="1.0" encoding="gbk"?>
	<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
	<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
	<proxy>
		<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
		 <!-- proxy server net IO Read thread size -->
		 <property name="readThreadPoolSize">20</property>①
		 <!-- proxy server client process thread size -->
		 <property name="clientSideThreadPoolSize">30</property>②
		 <!-- mysql server data packet process thread size -->
		 <property name="serverSideThreadPoolSize">30</property>③
		 <!-- per connection cache prepared statement size  -->
		 <property name="statementCacheSize">500</property>④
		 <!-- query timeout( default: 60 second , TimeUnit:second) -->
		 <property name="queryTimeout">60</property>⑤ 
	 </runtime>
	</proxy>
	</amoeba:configuration>

	①readThreadPoolSize –用于处理客户端连接发送过来的数据,跟数据库服务器返回的数据的线程数 量这个可以根据客户端连接数量来调整。
	②clientSideThreadPoolSize –在读线程读完客户端的请求数据包以后,这个线程将会接手处理具体 的业务逻辑(比如:解析SQL、SQL 路由)。
	③serverSideThreadPoolSize –在server端读取数据库返回的数据包,合并多数据库返回的数据,将数 据包发送到客户端。
	④statementCacheSize –连接池缓存的Prepared Statement数量。
	⑤queryTimeout –语句执行超时时间设置。



	<?xml version="1.0" encoding="gbk"?>
	<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
	<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
	<proxy>
		<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
		 <property name="connectionFactory">
			<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
			 <property name="sendBufferSize">128</property>①
			 <property name="receiveBufferSize">64</property>②
			 <property name="tcpNoDelay">true</property>③
			</bean>
		 </property>
		</service>
	</proxy>
	</amoeba:configuration>

	①sendBufferSize – 属性设置在SocketChannel.Write 方法的调用中期望发送的字节数。实际上, 此属性的操作对象是为发送操作所分配的网络缓冲区空间。网络缓冲区应至少与应用程序缓冲 区同样大小,这样才能确保在一次操作中就能存储和发送所需的数据。使用 SendBufferSize 属 性设置此大小。如果应用程序要发送批量数据,需为 Write 方法提供足够大的应用程序缓冲区。 如果网络缓冲区小于提供给 Write 方法的数据量,则对 Write 方法的每次调用都将多次执行网 络发送操作。通过确保网络缓冲区至少与应用程序缓冲区同样大小,可获得更大的数据吞吐量。

	②receiveBufferSize–设置你希望在接收缓冲区中为每次读操作存储的字节数。实际上,此属性的操作对象是为 接收传入数据所分配的网络缓冲区空间。网络缓冲区应至少与应用程序缓冲区同样大小,这样才能确保在调用SocketChannel.Read 方法时所需的数据是可用的。使用 ReceiveBufferSize 属性 设置此大小。如果应用程序将要接收批量数据,应为Read方法提供非常大的应用程序缓冲区。 如果网络缓冲区小于在 Read 方法中所请求的数据量,你将无法在一次读取操作中检索到所需的 数据量。这将导致增加对 Read 方法的调用次数,进而增加系统开销。

	③tcpNoDelay–如果禁用延迟,则为 true;否则为 false。默认值为 true。 如果该参数设为 false,则直到 TcpClient 收集到相当数量的输出数据之后,它才会通过网络发 送数据包。由于 TCP 段中系统开销的数量,发送少量数据时效率比较低。但是,也存在这样情 况:你可能要发送极少量的数据或者期望立即从你发送的每个数据包得到响应。你应该在网络效率与应用程序响应要求中取舍。


	Table 5.1. JVM(Java Virtual Machine)内存参数设置

	JVM选项	含义
	-Xms	初始Heap大小
	-Xmx	Java Heap最大值
	-Xmn	Young Generation的Heap大小
	-Xss	每个线程的Stack大小

5.amoeba报错

	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.

	解决方法:
	vim bin/amoeba
	DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
	改成256




	Exception in thread "main" com.meidusa.amoeba.config.ConfigurationException: Initialisation bean=com.meidusa.amoeba.server.MultipleServerPool@6eec8b11 error

MySQL + MMM架构

1.mysql-mmm 概述

 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。

 MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM项目来自Google:http://code.google.com/p/mysql-master-master
官方网站为:http://mysql-mmm.org



 mysql-mmm主要功能由下面三个脚本提供
mmm_mond  负责所有的监控工作的监控守护进程,决定节点的移除等等
mmm_agentd  运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点
mmm_control  通过命令行管理mmm_mond进程



 mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql。
在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。