Mysql 集群Amoeba读写分离
2016-08-18 15:09
375 查看
一、概述
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。
二、实现原理
客户端连接由amoeba代理的mysql集群,实现读写分离,写操作由一台master负责,读操作由多个slave负载均衡决定,这样大量访问都会集中到多个slave上,而不会影响master写的性能,在内部有写给master的数据会自动同步到多个slave上。这里需要master授权给amoeba登录来进行写操作,还要授权给slave可以同步数据。每个slave需要授权给amoeba来进行读操作,同时amoeba还会负载均衡来协调这些slave主机,原理如下图。企业里典型的架构就是多台web服务器访问多台mysql服务器,在mysql集群上再实现主从分离,即使其中的单台mysql服务器挂了,amoeba也会选择其他的mysql服务器继续服务,master相对而言压力不算太大,master的数据可以同步到其他的slave上
三、实验环境
实验至少需要2台安装mysql的虚拟机,本实验为保证实验效果,能清楚演示工作原理,分开装需要的软件操作系统:rhel6.4 64位
主机名 | IP | 安装软件 |
amoeba | 192.168.111.141 | jdk-7u40-linux-x64.tar.gz,amoeba-mysql-1.3.1-BETA.zip |
master | 192.168.111.142 | mysql-5.1.73 |
slave1 | 192.168.111.143 | mysql-5.1.73 |
四、master、slave1授权给amoeba
在master、slave1上给amoeba授权,用户客户端提交给amoeba的请求处理后提交到对应的mysql上,需要能登录到mysql的权限mysql>grant all privileges on *.* to amoeba@'%' identified by 'amoeba';
在master上操作,开放一个登录名zcfz,密码zcfz的给slave登录主从复制帐号
mysql>grant all privileges on *.* to zcfz@'%' identified by 'zcfz'; mysql>show master status;
然后在slave1上操作,slave1和slave2作为从机登录到master上复制数据,实现主从复制
mysql>change master to master_host='192.168.111.142',master_user='zcfz',master_password='zcfz',master_log_file='mysql-bin.000004',master_log_pos=9003; mysql>start slave; mysql>show slave status\G;
五、amoeba机安装amoeba
amoeba基于JDK运行的,需要事先安装JDKamoeba官网下载
https://sourceforge.net/projects/amoeba/files/Amoeba for mysql/
https://sourceforge.net/projects/amoeba/files/Amoeba for mysql/amoeba-mysql-1.3.1-BETA.zip/download
[root@amoeba ~]# mkdir /usr/local/amoeba <div><p><span style="color:windowtext;"></span><pre name="code" class="plain">[root@amoeba ~]#<span style="color:windowtext;"><span style="color:windowtext;"> </span>unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba </span><div><p><span style="color:windowtext;"></span><pre name="code" class="plain"><pre name="code" class="plain">[root@amoeba ~]#<span style="color:windowtext;"><span style="color:windowtext;"> </span></span><span style="color:windowtext;">chmod -R +x /usr/local/amoeba/bin/ </span>
六、amoeba配置
amoeba的配置都是修改安装目录下的xml文件的,mysql的读写分离主要配置/usr/local/amoeba/conf/amoeba.xml文件vim /usr/local/amoeba/conf/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">8066</property> <!-- proxy server绑定的IP --> <!-- <property name="ipAddress">127.0.0.1</property> --> <!-- 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> <!-- 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">amoeba</property> <!-- 改成mysql客户端连接到amoeba用的用户名 --> <!-- 对外验证的密码 --> <property name="password">amoeba</property> <!-- 密码被注释了, 自己改密码 --> <!-- query timeout( default: 60 second , TimeUnit:second) --> <property name="queryTimeout">60</property> </server> <!-- 每个ConnectionManager都将作为一个线程启动。 manager负责Connection IO读写/死亡检测 --> <connectionManagerList> <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property> <!-- default value is avaliable Processors <property name="processors">5</property> --> </connectionManager> </connectionManagerList> <dbServerList> <!-- 一台mysqlServer 需要配置一个pool, 如果多台 平等的mysql需要进行loadBalance, 平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool 简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig 或者自己写一个ObjectPool。 --> <dbServer name="server1"> <!-- PoolableObjectFactory实现类 --> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真实mysql数据库端口 --> <property name="port">3306</property> <!-- 真实mysql数据库IP --> <property name="ipAddress">192.168.111.142</property> <!-- 填master的IP地址,amoeba写操作的主机 <property name="schema">test</property> <!-- 用于登陆mysql的用户名 --> <property name="user">amoeba</property> <!-- master授权的用户和密码 --> <!-- 用于登陆mysql的密码 --> <property name="password">amoeba</property> <!-- 取消注释,填master的密码 --> </factoryConfig> <!-- ObjectPool实现类 --> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <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="server2"> <!-- 复制一份上面server1的内容粘贴到此处,修改成server2,并改成slave1的配置 --> <!-- PoolableObjectFactory实现类 --> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真实mysql数据库端口 --> <property name="port">3306</property> <!-- 真实mysql数据库IP --> <property name="ipAddress">192.168.111.143</property> <!-- slave1的IP --> <property name="schema">test</property> <!-- 用于登陆mysql的用户名 --> <property name="user">amoeba</property> <!-- slave1的用户名 --> <!-- 用于登陆mysql的密码 --> <property name="password">amoeba</property> <!-- slave1的密码 --> </factoryConfig> <!-- ObjectPool实现类 --> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <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"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- 参与该pool负载均衡的poolName列表以逗号分割 --> <property name="poolNames">server1</property> </poolConfig> </dbServer> <dbServer name="slave" virtual="true"> <!-- 复制上面master内容,粘贴到此处,改名成slave --> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- 参与该pool负载均衡的poolName列表以逗号分割 --> <property name="poolNames">server2</property> <!-- 从机的配置名,多台从机用逗号,隔开--> </poolConfig> </dbServer> </dbServerList> <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> <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> <!-- 修改默认操作为master --> <property name="writePool">master</property> <!-- 取消注释, 写操作用master--> <property name="readPool">slave</property> <!-- 读操作用slave --> <property name="needParse">true</property> </queryRouter> </amoeba:configuration>
修改bin/amoeba启动文件,默认配置的java虚拟机堆栈空间太小,修改大一点
[root@test1 bin]# vim amoeba
#DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
在master 上创建test库,master 会自动同步到slave1上,因为amoeba工作需要一张默认工作库
mysql>create database test;
七、测试
在amoaba主机上到/usr/local/amoeba/bin目录下启动amoaba,注意查看日志[root@test1 bin]# ./amoeba
看到server listening on 0.0.0.0/0.0.0.0:8066信息就是启动成功了,然后mysql客户端就可以连接到amoeba的IP:192.168.111.141的端口8066测试mysql的读写分离了
要测试是否读写分离,使实验效果明显,需要停止主从同步,主从数据差异即可观察到主从分离了
在slave1上操作
mysql>stop slave;
在任意mysql客户端连接amoeba主机,然后创建amoeba表,插入数据
[root@test ~]# mysql -h 192.168.111.141 -uamoeba -pamoeba -P 8066 mysql>use test; mysql>create table amoeba(id int); mysql>insert into amoeba values (1); mysql>select * from amoeba;
结果是没有数据,数据插入到master上,但是slave上没有数据.
原文链接:http://www.waze7.com/?p=81
相关文章推荐
- Mysql高级集群-读写分离Amoeba
- Mysql 分布式集群 主从同步 读写分离 amoeba 中间件配置
- linux上使用amoeba实现MySql集群,以及读写分离,主从复制
- [z]如何利用amoeba构建mysql主从复制集群的读写分离
- Mysql集群读写分离(Amoeba)
- MMM(双主多从)+Amoeba 整合 MySQl读写分离集群架构
- 实现mysql 数据集群的读写分离之 amoeba
- 一步一图搭建-分布式服务器部署之mysql集群-使用amoeba整合mysql实现读写分离
- mysql-mmm+amoeba+keepalived实现mysql高可用和读写分离
- MYSQL--之--amoeba 实现读写分离,负载均衡
- Amoeba for mysql读写分离
- mysql的读写分离amoeba 推荐
- amoeba-mysql的安装使用和读写分离(转)
- mysql-mmm+amoeba+keepalived实现mysql高可用和读写分离(二)
- amoeba-mysql的安装使用和读写分离
- 使用mysql-proxy 快速实现mysql 集群 读写分离
- Amoeba+mysql实现读写分离
- Amoeba for MySQL 非常好用的mysql集群软件
- Amoeba for MySQL 非常好用的mysql集群软件
- Amoeba新版本MYSQL读写分离配置