利用amoeba实现mysql读写分离

参考:

http://my.oschina.net/u/1169079/blog/390726

http://douya.blog.51cto.com/6173221/1607493

一 安装环境:

三台centos6.7 64位的系统

192.168.127.130   从数据库

192.168.127.131   主数据库

192.168.127.134  amoeba

二 安装过程 (下面的1-3的所以操作都在amoeba服务器上面)

1 首先安装jdk环境,下载,安装,设置环境变量

vim /etc/profile
export JAVA_HOME=/usr/local/jdk  (java安装路径)
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba  (amoeba安装路径)
export PATH=$PATH:$AMOEBA_HOME/bin


source /etc/profile

查看 java -version

java version "1.6.0_14"

Java(TM) SE Runtime Environment (build 1.6.0_14-b08)

Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

java 环境配置成功

2  安装并配置amoeba软件

下载 wget  http://120.52.73.44/jaist.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz

mkdir /usr/local/amoeba

tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
amoeba start|stop


启动的时候会报错


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.


解决办法是:

定义amoeba内存参数,我这里定义了最大2G的并发占用连接

# vim /usr/local/amoeba/bin/amoeba

将 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"

修改为 DEFAULT_OPTS="-server -Xms1024m -Xmx2048m -Xss512k"

然后再次启动就成功了

启动文件,最好以后台方式启动

nohup /usr/local/amoeba/bin/amoeba start &


3 更改配置文件 dbServers.xml和amoeba.xml两个配置文件


amoeba.xml配置

amoeba本地配置或者对外的配置:

<!-- 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>  
 默认是8066,可以更改
<!-- bind ipAddress -->
<property name="ipAddress">192.168.127.134</property>
 对外提供程序访问的IP地址,也就是amoeba机器对外访问的IP地址
<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>

amoeba对外连接验证配置:

<property name="authenticator">
  <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
  <property name="user">amoeba</property> 
   **** 对外提供访问的用户
  <property name="password">123</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>

amoeba.xml读写分离配置:

<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
 <property name="readPool">readPool</property>

##这里的server1,readpool和dbsever.xml里面配置有关

注意:默认的下面两行是注释掉的,需要把注释去掉

defaultPool:配置了默认的数据库节点,一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。

writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。

readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的readpool数据库池。

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 port -->
          <property name="port">3306</property>
           <!-- mysql schema -->
         <property name="schema">zabbix</property> ##必须是一个存在的database主和从上面都有的
          <!-- mysql user -->
          <property name="user">amoeba</property>  ##用户名
          <!--  mysql password -->
          <property name="password">123</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>
。
接下来配置主从定义:
<dbServer name="master"  parent="abstractServer">
     <factoryConfig>
      <!-- mysql ip -->
     <property name="ipAddress">192.168.127.131</property>  ** master-IP
     </factoryConfig>
     </dbServer>
<dbServer name="Slave1"  parent="abstractServer">
     <factoryConfig>
     <!-- mysql ip -->
     <property name="ipAddress">192.168.127.130</property> ****slave1的
     </factoryConfig>
     </dbServer>
     <dbServer name="readPool" virtual="true">     ##这里的readpool要和amoeba.xml里面相同
     <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">server1,server2</property>    ##读和写的比例是1:1,也可以写成只读server2
     </poolConfig>
     </dbServer>

此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码 就是上面的

abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限 ,这里是先安装,完了在授权

4 在主从数据库上面同时授权

grant all on *.* to ‘amoeba‘@‘192.168.127.%‘ identified by "123";


5 验证  在任意客户端登录amoeba

mysql -uamoeba -p -h 192.168.127.134 -P 8066  (端口的这个P是大写的)回车,密码就是123

然后show databases;看能否查看

如果出现ERROR 2013 (HY000): Lost connection to MySQL server during query,这个错误,可以查看日志 /usr/local/amoeba/logs/root.log

经过排查发现密码被注释了 查看dbServer.xml配置文件,改成下面这样子,把 -->去掉即可

    - <!-- mysql password -->-  
      <property name="password">123</property>
    • 再次查看,正常了。
    • 6 读写分离验证

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

      [root@chenllcentos ~]# mysql -uroot -pyourpassword -h192.168.127.134 -P8066

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

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

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

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

      而后,停止从数据库上面的主从复制,便于数据库操作观察。
      登陆服务器从数据库。

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

      停止从数据库主从复制。

      mysql> slave stop;

      在主数据库插入。

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

      在从数据库插入。

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

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

      [[email protected] ~]# mysql -uroot -pyourpassword -h192.168.127.134 -P8066
      mysql> use test;
      mysql> select * from sxit;
      +------+------+| id   | name |
      +------+------+|    2 | lisi |
      +------+------+mysql> select * from sxit;
      +------+------+| id   | name |
      +------+------+|    3 | john |
      +------+------+

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

      [[email protected] ~]# mysql -uroot -pyourpassword 
      mysql> use test;
      mysql> select * from sxit;
      +------+----------+| id   | name     |
      +------+----------+|    1 | zhangsan |
      +------+----------+

      那么在amoeba服务器上插入一条数据,再次验证insert into sxit values(‘3‘,‘hu‘);

    • 然后分别登陆到master和slave上面查看,主上面有,从上面没有,说明写的是主数据库(前提是主从复制没有打开)
    • 可以验证,使用Amoeba对Mysql读写分离成功。若此时开启从数据库主从复制,则可以进行Mysql集群和负载均衡。
    时间: 2025-01-16 18:21:39

    利用amoeba实现mysql读写分离的相关文章

    Amoeba实现Mysql读写分离部署文档

    以下所有理解纯属个人理解,如若有误欢迎指出,不胜感激--o(∩_∩)o 两台服务器配置MYSQL主从复制实现数据高可用,这时读与写操作都有由master服务器来完成的,而从服务器只是复制了mster服务器的数据,这时可以利用一台服务器配置Amoeba实现mysql读写分离, master负责写,slave负责读取,当然 也可以有多个salve-- 从而减轻master服务器的压力,实现负载分摊: 拓扑图: Mysql主从复制原理: 两台mysql服务器一个作为master一个为slave:mas

    Amoeba实现Mysql读写分离

    环境规划 Amoeba读写分离器 172.16.254.144/16 Mysql服务器(master) 172.16.254.150/16 Mysql服务器(slave) 172.16.254.151/16 一.先实现mysql主从复制,在master上使用yum安装mysql [[email protected] mysql]# yum -y install mysql mysql-server 启用二进制日志,编辑/etc/my.cnf在[mysqld]下添加如下行: log-bin = /

    使用amoeba实现mysql读写分离

    使用amoeba实现mysql读写分离 amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便 amoeba使用java所研发,但是amoeba不支持分布式事物(据说现在最新版本已经支持事物),如果用到分布式事物的话不建议使用amoeba. mys

    使用Amoeba实现mysql读写分离机制

    Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实现是指在应用程序内部及连接器中实现读写分离. 例如: com.mysql.jdbc.replicationdriver mysqlnd_ms 优点: 程序内部实现读写分离,安装即可使用 减少部署难度. 访问压力在一定级别以下,性能很好. 缺点: 架构一旦调整,代码要更这变, 不够灵活. 难以实现高级

    mysql中间件amoeba实现mysql读写分离

    Amoeba是一个以MySQL为底层数据存储,并相应用提供MySQL协议接口的proxy.它集中地响应应用的请求,根据用户事先设置的规则.将SQL请求发送到特定的数据库上运行.基于此能够实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单).本文就来实现一个简单的amoeba的配置 实验环境: 192.168.1.121为amoeba

    使用amoeba配置mysql读写分离

    一,背景介绍: Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离.可路由相关的query到目标数据库.可并发请求多台数据库合并结果.要想搭建Amoeba读写分离,首先需要知道MySQL的主从配置.具体的架构图如下图: 二,配置所需的环境: Amoeba for mysql:192.168.1.28 Master : 192.168.1.247 Slave : 192.16

    Amoeba for MySQL读写分离配置

    一.      安装和运行Amoeba 1. Amoeba for MySQL 架构: 2. 验证Java的安装Amoeba框架是基于Java SE1.5开发的,建议使用Java SE1.5以上的版本.#  java  -versionjava version "1.6.0_35"Java(TM) SE Runtime Environment (build 1.6.0_35-b10)Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01,

    Amoeba for mysql 读写分离

    Amoeba(变形虫)项目 http://docs.hexnova.com/amoeba/ ,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发.座落与 Client.DB Server(s)之间,对客户端透明.具有负载均衡.高可用性.SQL 过滤.读写分离.可路由相关的到目标数据库.可并发请求多台数据库合

    amoeba实现mysql读写分离+主从复制架构

    一.环境 系统:centos6.5 mysql版本:mysql5.6 master服务器:192.168.1.21 slave服务器: 192.168.1.100 master写 slave读 二.实现mysql主从复制 在master的/etc/my.cnf中[mysqld]字段下加入如下内容: server_id=1 log_bin=mysql-bin binlog_format=mixed relay-log=relay-bin relay-log-index=slave-relay-bi