首页 > 代码库 > 基于amoeba实现mysql数据库的读写分离/负载均衡
基于amoeba实现mysql数据库的读写分离/负载均衡
一、Amoeba的简述:[来自百度百科]
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。目前 Amoeba 已在很多 企业的生产线上面使用。
二、Amoeba解决的问题及目前存在的劣势:
1.主要解决的问题:
(1). 数据切分后复杂数据源整合
(2). 提供数据切分规则并降低数据切分规则给数据库带来的影响
(3). 降低数据库与客户端连接
(4). 读写分离路由
2.劣势:
(1).目前还不支持事务
(2).暂时不支持存储过程(近期会支持)
(3).不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
(4).暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致
三、基于 Amoeba 实现mysql数据库读写分离的配置
1.测试环境,amoeba的要求,软件提供,简要原理图:
(1).测试环境:
红帽6.3系统
amoeba服务器地址:192.168.1.104
mysql数据库:192.168.1.102:3306(master -- rw)/192.168.1.100:3306(slave -- r)
注:为了方便测试读写分离,我这里是不配置主从。
(2).amoeba的要求:
Amoeba 是基于 java 开发,所以如果要运行 Amoeba,必须先安装 jdk 以便可以运行
(3).软件下载:[大家可以到http://www.oschina.net/p/amoeba (开源中国)下载]
当前测试环境使用的amoeba软件下载地址:http://www.kuaipan.cn/file/id_119710994921422890.htm
amoeba参考手册:http://docs.hexnova.com/amoeba/
amoeba项目代码:http://sourceforge.net/projects/amoeba/files/
(4).简要原理图:
2.我们这里将amoeba相关软件放在/tmp目录下,这里我们先配置JDK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 解压JDK软件到/usr/local目录下 [root @centos tmp] # tar -xf jdk-7u15-linux-x64.tar.gz -C /usr/local/ # 进入相应目录,并建立java目录 [root @centos tmp] # cd /usr/local/ [root @centos local ] # mkdir java # 将解压出来的内容移到java目录 [root @centos local ] # mv jdk1.7.0_15/* java # 设置java环境变量 [root @centos local ] # echo ‘export JAVA_HOME=/usr/local/java‘ >> ~/.bashrc [root @centos local ] # . ~/.bashrc # 测试jdk是否正确安装 [root @centos local ] # java -version # ******************************* # 以下这个方法设置JDK[在下面设置amoeba时,会覆盖,所以这里的配置文件,以最下面amoeba的配置为准] [root @centos java] # echo $JAVA_HOME [root @centos java] # vim /etc/profile # 在末尾添加 export JAVA_HOME=/usr/locla/java export PATH= $JAVA_HOME /bin: $JAVA_HOME /jre/bin: $PATH [root @centos java] # source /etc/profile # ******************************* |
3.配置amoeba中的dbServer.xml(后端mysql 服务器连接配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | [root@centos java] # cd /tmp/ # 建立相应amoeba目录 [root@centos tmp] # mkdir /usr/local/amoeba # 将压缩包解压到指定目录 [root@centos tmp] # tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba [root@centos tmp] # cd /usr/local/amoeba/ [root@centos amoeba] # cd conf/ # 准备修改配置文件 #/* 以下部分为注解 #/* Amoeba总共有7个配置文件,分别如下: #/* Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用来配置Amoeba服务的基本参数,如Amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。 #/* 数据库服务器配置文件($AMOEBA_HOME/conf/dbServers.xml),用来存储和配置Amoeba所代理的数据库服务器的信息,如:主机IP、端口、用户名、密码等。 #/* 切分规则配置文件($AMOEBA_HOME/conf/rule.xml),用来配置切分规则。 #/* 数据库函数配置文件($AMOEBA_HOME/conf/functionMap.xml),用来配置数据库函数的处理方法,Amoeba将使用该配置文件中的方法解析数据库函数。 #/* 切分规则函数配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用来配置切分规则中使用的用户自定义函数的处理方法。 #/* 访问规则配置文件($AMOEBA_HOME/conf/access_list.conf),用来授权或禁止某些服务器IP访问Amoeba。 #/* 日志规格配置文件($AMOEBA_HOME/conf/log4j.xml),用来配置Amoeba输出日志的级别和方式。 # 配置后端mysql 服务器连接[dbServer.xml] [root@centos conf] # vim dbServers.xml .........................(省略) <dbServer name= "abstractServer" 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 数据库的端口 <!-- mysql port --> <property name= "port" >3306< /property > # 设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式, # 不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver <!-- mysql schema --> <property name= "schema" >kongzhong< /property > # 设置amoeba连接后端数据库服务器的账号和密码,需在后端数据库器上创建该用户,并授权amoeba连接 <!-- mysql user --> <property name= "user" >kongzhong123< /property > <!-- mysql password --> <property name= "password" >kongzhong123< /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= "testOnReturn" > true < /property > <property name= "testWhileIdle" > true < /property > < /poolConfig > < /dbServer > # 设置一个后端的dbServer,名为master ,这个可以随便取,但是为了明确其含义,最好给予特殊含义的单词,这里是主DB SERVER <dbServer name= "master" parent= "abstractServer" > <factoryConfig> # 设置这台DB server 的ip地址 <!-- mysql ip --> <property name= "ipAddress" >192.168.1.102< /property > < /factoryConfig > < /dbServer > # 再设置一台后端mysql数据库,这里叫slave,名字需要唯一[这里可以创建N个后端数据库,只要复制下面<dbServer>...</dbServer>] <dbServer name= "slave" parent= "abstractServer" > <factoryConfig> # 设置这台DB server 的ip地址 <!-- mysql ip --> <property name= "ipAddress" >192.168.1.100< /property > < /factoryConfig > < /dbServer > # 指定一个虚拟的dbServer,将上面定义的dbserver加入这个虚拟的dbserver,相当于组成一个组[这里我们将读的数据库组成一个组] # 这里 需要将 name="mul..." 改成自己想要取的名字,这个名字也需要有含义,后面会用到 <dbServer name= "ReadPool" virtual= "true" > <poolConfig class= "com.meidusa.amoeba.server.MultipleServerPool" > <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> # 选择调度算法 1 是轮询 2 是权重 3 是HA 这里选择1 轮询 <property name= "loadbalance" >1< /property > <!-- Separated by commas,such as: server1,server2,server1 --> # 负载均衡,slave1,slave2当成2个服务器进行调度,这模拟量加权的调度算法。 # 注意这里使用的dbserver必须是已经定义了的,可以写多个,如slave1,slave2 <property name= "poolNames" >slave< /property > < /poolConfig > < /dbServer > < /amoeba :dbServers> |
4. 配置 Amoeba 监听端口[amoeba.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | [root @centos conf] # vim amoeba.xml .........................(省略) <proxy> <!-- service class must implements com.meidusa.amoeba.service.Service --> <service name= "Amoeba for Mysql" class= "com.meidusa.amoeba.net.ServerableConnectionManager" > <!-- port --> # 设置amoeba监听的端口(这里如果默认,后面测试需要指定端口,就是这里的端口) <property name= "port" >3306</property> <!-- bind ipAddress --> <!-- # 设置监听的接口,如果不设置,则监听所有的IP[选择默认] <property name= "ipAddress" >127.0.0.1</property> --> .........................(省略) <property name= "authenticator" > <bean class= "com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator" > # 提供客户端连接amoeba时需要使用这里设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关) <property name= "user" >kongzhong</property> # 提供客户端连接amoeba时需要使用这里设定的密码 <property name= "password" >kongzhong</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> <property name= "defaultPool" >master</property> <!-- --> # 把默认注释掉的读写分离选项,把注释去掉并readpool修改成ReadPool(这个名字,我们前面在dbServer.xml里设置一个读数据库组,这里是作为只读池) <property name= "writePool" >master</property> <property name= "readPool" >ReadPool</property> <property name= "needParse" >true</property> </queryRouter> |
5. 配置amoeba及JAVA的环境变量
1 2 3 4 5 | [root @centos conf] # vim /etc/profile JAVA_HOME=/usr/locla/java AMOEBA_HOME=/usr/ local /amoeba export PATH= $PATH : $AMOEBA_HOME /bin: $JAVA_HOME /bin: $JAVA_HOME /jre/bin [root @centos conf] # source /etc/profile |
6.启动amoeba测试
1 2 3 4 5 6 | # 如果确认能够正常启动,就加>>/dev/null 否则还是看一下提示信息 [root @centos conf] # amoeba start & >>/dev/null # 检测启动情况 [root @centos conf] # netstat -tulnp |grep java # 停止amoeba测试指令是否可用 [root @centos conf] # amoeba stop |
7.在两台数据库做刚才设置中的相应操作
(1).在主DB server上操作
1 2 3 4 5 6 7 8 9 10 | # 建立配置文件指定的数据库 mysql> create database kongzhong; mysql> use kongzhong # 创建用于测试的表 mysql> create table t1(name varchar(10)); # 插入测试数据 mysql> insert into t1 values ( ‘102‘ ); # 授予amoeba用户连接数据库的权限 mysql> grant all privileges on kongzhong.* to ‘kongzhong123‘ @ ‘192.168.1.104‘ identified by ‘kongzhong123‘ ; mysql> flush privileges; |
(2).在从DB server上操作
1 2 3 4 5 6 7 8 9 10 | # 建立配置文件指定的数据库 mysql> create database kongzhong; mysql> use kongzhong # 创建用于测试的表 mysql> create table t1(name varchar(10)); # 插入测试数据 mysql> insert into t1 values ( ‘100‘ ); # 授予amoeba用户连接数据库的权限 mysql> grant all privileges on kongzhong.* to ‘kongzhong123‘ @ ‘192.168.1.104‘ identified by ‘kongzhong123‘ ; mysql> flush privileges; |
8.在任何一台机器上登陆测试,这里的ip地址指向amoeba所在服务器的ip地址
1 2 3 4 | # 登陆相应数据库,查询当前所在数据库(相应大家都应该懂的,就不详细演示了) [root @client102 ~] # mysql -ukongzhong -p -h192.168.1.104 [root @client100 ~] # mysql -ukongzhong -p -h192.168.1.104 [root @client104 ~] # mysql -ukongzhong -p -h192.168.1.104 |
9.遇到的问题
(1).报错1:
1 2 3 4 5 6 7 8 9 10 11 | The stack size specified is too small, Specify at least 160k Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit . 解决方法: [root @centos bin] # cd /usr/local/amoeba/ # 修改配置文件 [root @centos amoeba] # vim bin/amoeba 将下面这行 DEFAULT_OPTS= "-server -Xms1024m -Xmx1024m -Xss128k" 修改为: DEFAULT_OPTS= "-server -Xms256m -Xmx256m -Xss256k" |
(2).报错2:
1 2 3 4 | Error: JAVA_HOME environment variable is not set. 解决方法: [root @centos local ] # echo ‘export JAVA_HOME=/usr/local/java‘ >> ~/.bashrc [root @centos local ] # . ~/.bashrc |
10.需要注意的问题,思路延伸
(1).取消日志生成,不然磁盘容易爆满
1 2 3 4 5 | [root @centos conf] # vim log4j.xml [此文件在amoeba目录下的conf目录下] 修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满) <param name= "file" value=http://www.mamicode.com/ "${amoeba.home}/logs/project.log" /> 改成 <param name= "file" value=http://www.mamicode.com/ "<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>" /> |
(2).性能优化
1 2 3 4 | [root @centos amoeba] # vim bin/amoeba DEFAULT_OPTS= "-server -Xms256m -Xmx256m -Xss128k" 改成 DEFAULT_OPTS= "-server -Xms512m -Xmx512m -Xmn100m -Xss1204k" |
基于amoeba实现mysql数据库的读写分离/负载均衡
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。