参考:https://www.cnblogs.com/liuyisai/p/6009379.html

  一,Amoeba是什么

  Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

  主要解决:

  • 降低 数据切分带来的复杂多数据库结构

  • 提供切分规则并降低 数据切分规则 给应用带来的影响

  • 降低db 与客户端的连接数

  • 读写分离

  二,为什么要用Amoeba

  目前要实现mysql的主从读写分离,主要有以下几种方案:

  1、  通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

  2、  通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

  3、  自己开发接口实现,这种方案门槛高,开发成本高,不是一般的小公司能承担得起。

  4、  利用阿里巴巴的开源项目Amoeba来实现,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单。

  三,Amoeba的安装

  测试环境

  amoeba:172.16.20.31

  masterDB:172.16.20.180

  slaveDB:172.16.20.188

  主从配置已经配置好

  安装jave版本1.8(安装过程不详述)

  参考版本

  安装amoeba

  可以从https://sourceforge.net/projects/amoeba/下载amoeba-mysql-3.0.5-RC-distribution.zip

  无需安装解压即可使用解压目录为/usr/local/amoeba

[root@test-cobbler amoeba]# pwd
/usr/local/amoeba
[root@test-cobbler amoeba]# ll
总用量 12
-rw-r--r-- 1 root root 5 1月 24 10:05 Amoeba-MySQL.pid
drwxrwxrwx 2 root root 63 7月 5 2013 benchmark
drwxrwxrwx 2 root root 166 7月 5 2013 bin
drwxrwxrwx 2 root root 243 1月 24 10:04 conf
-rwxrwxrwx 1 root root 729 1月 24 09:13 jvm.properties
drwxrwxrwx 2 root root 4096 7月 5 2013 lib
drwxr-xr-x 2 root root 152 1月 24 09:13 logs

  配置文档位于目录/usr/local/amoeba/conf下配置读写分离仅需配置两个文件dbServers.xml和amoeba.xml

  dbServers.xml

<?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 configuration:
add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name 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"></property> #设置Amoeba要连接的mysql数据库的端口,默认是3306 <!-- mysql schema -->
<property name="schema">testdb</property>#设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver <!-- mysql user -->
<property name="user">test1</property>#设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接 <property name="password"></property>
</factoryConfig> <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive"></property>#最大连接数,默认500
<property name="maxIdle"></property>#最大空闲连接数 <property name="minIdle"></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="writedb" parent="abstractServer">#设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到 <factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">172.16.20.180</property>
</factoryConfig>
</dbServer> <dbServer name="slave" parent="abstractServer">#设置后端可写dbserver <factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">172.16.20.188</property>
</factoryConfig>
</dbServer> <dbServer name="myslave" virtual="true">#设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance"></property>#选择调度算法,1表示负载均衡,2表示权重,3表示HA, 这里选择1 <!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave</property> #myslave组成员
</poolConfig>
</dbServer> </amoeba:dbServers>

  另一个配置文件amoeba.xml

<?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>#默认监听端口8066 <!-- bind ipAddress --> #下面配置监听的接口,如果不设置,默认监听所有的IP <!--
<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">
# 提供客户端连接amoeba时需要使用这里设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关) <property name="user">root</property> <property name="password">123456</property> <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">writedb</property> #设置amoeba默认的池,这里设置为wrutedb <property name="writePool">writedb</property> #这两个选项默认是注释的,需要取消注释,这里用来指定前面两个定义好的读写池
<property name="readPool">myslave</property> <property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>

  在masterdb上创建数据库testdb

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| testdb |
+--------------------+
6 rows in set (0.00 sec)

  查看slavedb是否复制成功

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| testdb |
+--------------------+
6 rows in set (0.00 sec)

  在masterdb上为访问amoedb授权,从会复制用户

 GRANT ALL ON testdb.* TO 'test1'@'172.16.20.31' IDENTIFIED BY '111111';

  启动amoeba

/usr/local/amoeba/bin/launcher

  启动报错需要设置好java环境变量及jvm参数

vim /usr/local/amoeba/jvm.properties
改成:JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"
原为:JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"

  测试

  远程登陆mysql客户端通过指定amoeba配置文件中指定的用户名、密码、和端口以及amoeba服务器ip地址链接mysql数据库

mysql -uroot -p123456 -h172.16.20.31 -P8066

  在testdb中创建表test并插入数据

mysql> use testdb
Database changed
mysql> create table test_table(id int);
Query OK, 0 rows affected (0.02 sec) mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| test_table |
+------------------+
1 row in set (0.01 sec) mysql> insert into test_table values(1);
Query OK, 1 row affected (0.00 sec) mysql> select * from test_table;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

  分别登录masterdb和salvaedb查看数据

  masterdb

mysql> select * from testdb.test_table;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

  slavedb

mysql> select * from testdb.test_table;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

  停掉masterdb分别在客户端插入和查询

mysql> insert into test_table values(2);
ERROR 1053 (08S01): Server shutdown in progress
mysql> select * from test_table;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.01 sec)

  关掉master以后写报错读取正常

  开启masterdb关闭slavedb再测试

mysql> insert into test_table values(2);
Query OK, 1 row affected (0.01 sec) mysql> select * from test_table;
ERROR 1044 (42000): poolName=myslave, no valid pools

  关掉slavedb以后写正常读取失败

  启动slavedb再查询读取也正常,可以直接登录slave查看数据是否同步

mysql> select * from testdb.test_table;
+------+
| id |
+------+
| 1 |
| 2 |
+------+

  MySQL数据库读写分离配置完毕,应用只需要连接只amobe的8066端口即可实现读写分离

  

  配置文件说明

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+Amoeba实现数据库读写分离的更多相关文章

  1. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  2. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...

  3. MySQL主从复制技术与读写分离技术amoeba应用

    MySQL主从复制技术与读写分离技术amoeba应用 前言:眼下在搭建一个人才站点,估计流量会非常大,须要用到分布式数据库技术,MySQL的主从复制+读写分离技术.读写分离技术有官方的MySQL-pr ...

  4. Mysql 实现数据库读写分离

    Amoeba+Mysql实现数据库读写分离 一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明. ...

  5. 161220、使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  6. MySQL数据库读写分离、读负载均衡方案选择

    MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...

  7. 170301、使用Spring AOP实现MySQL数据库读写分离案例分析

    使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...

  8. 使用Spring AOP实现MySQL数据库读写分离案例分析

    一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量. 在进行数据库读写分离的时候,我们首先要进行数据库 ...

  9. Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置

    1. Mycat简介 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一 ...

随机推荐

  1. .Net学习资料

    1.博客系列文章 (1)设计模式 吕震宇 设计模式 张逸:晴窗笔记 Design & Pattern 梦幻Dot Net  .Net设计模式 李会军          .NET设计模式系列文章 ...

  2. Mongodb 笔记 - 性能及Java代码

    性能 以下数据都是在千兆网络下测试的结果 写入 数据量的增大会导致内存占满, 因为mongodb会将数据尽可能地载入内存, 索引占用的空间也很可观非安全模式下, 速度取决于内存是否占满能差一个数量级, ...

  3. NodeJs相关系列文章

    1.图片上传之FileAPI与NodeJs 2.NodeJs之调试 3.CentOS下使用NVM 4.NodeJs之进程守护 5.Ubuntu下使用nvm 6.NodeJs之pm2 7.NodeJs之 ...

  4. docker镜像、容器以及命令操作

    docker image docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7 docker image是 ...

  5. 1.关于Swift

    关于SwiftSwift是一种新的编程语言,用于iOS和OS X的应用程序,建立在最佳的C和Objective-C之上,没有C兼容性的限制.Swift采用的安全模式设计,并增加了现代的功能,使编程更简 ...

  6. Mac下不显示设备

    使用命令行adb devices 试了下,没设备列表. 第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 ...

  7. VIM空格和TAB转换

    在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)set expandtab 对于已保存的文件,可以使用下 ...

  8. CodeCombat编程游戏

    一. 介绍 官方网站:http://cn.codecombat.com/ 项目地址:https://github.com/codecombat/codecombat CodeCombat 是一个通过玩 ...

  9. Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置

    上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html). 今天主要是说说Launcher里 ...

  10. ambari安装 QA

    1.在安装时 出现Public key for ambari-server-2.4.2.0-136.x86_64.rpm is not installed 安装ambari报错 在安装HST服务时也报 ...