一 Amoeba简介

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba forMysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用。
主要解决:
• 降低 数据切分带来的复杂多数据库结构
• 提供切分规则并降低 数据切分规则 给应用带来的影响
• 降低db 与客户端的连接数
• 读写分离

二 前期规划

1.1 主机规划

1.2 虚拟IP规划

 

1.3 用户列表

 
提示:以上角色需要在所有节点添加。
 

1.4 整体架构

三 MySQL-MMM基础部署

略,具体可参考《002.MMM双主-双从读写分离部署》。

四 基础JDK安装

4.1 JDK下载

下载链接:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JDK版本:jdk-8u144-linux-x64.rpm

4.2 JDK安装及配置

  1 [root@Amoeba tmp]# rpm -ivh jdk-8u144-linux-i586.rpm
2 [root@Amoeba ~]# vi /etc/profile
3 #set java environment
4 JAVA_HOME=/usr/java/jdk1.8.0_144/
5 JRE_HOME=/usr/java/jdk1.8.0_144/jre/
6 CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
7 PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
8 export JAVA_HOME JRE_HOME CLASS_PATH PATH
9 [root@Amoeba ~]# source /etc/profile
10 [root@Amoeba ~]# java -version #验证是否安装成功
 

五 Amoeba安装

5.1 Amoeba下载

  1 [root@Amoeba tmp]# wget https://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-RC-distribution.zip
2 [root@Amoeba tmp]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
3 [root@Amoeba ~]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
 

5.2 Amoeba-dbServers配置

  • dbServers.xml:读写分离配置文件
  • access_list.conf:IP访问列表控制配置文件
  • Amoeba的配置文件路径:/usr/local/amoeba/conf
  1 [root@Amoeba ~]# vi /usr/local/amoeba/conf/dbServers.xml
2 ……
3 <property name="port">3306</property> #设置Amoeba要连接的mysql数据库的端口,默认是3306。
4 <property name="schema">testdb</property>
5 #设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持use dbname指定缺省库,因为操作会调度到各个后端dbserver。
6 <property name="user">test1</property>
7 <property name="password">x12345678</property>
注意:设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接。
  1 ……
2 <property name="maxActive">500</property> #最大连接数,默认500
3 <property name="maxIdle">500</property> #最大空闲连接数
4 <property name="minIdle">1</property> #最新空闲连接数
5 ……
6 <dbServer name="writedb" parent="abstractServer">
7 #设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到。
8 <factoryConfig>
9 <property name="ipAddress">172.24.8.100</property>
10 #设置后端可写dbserver ip。
11 </factoryConfig>
12 </dbServer>
13
14 <dbServer name="slave01" parent="abstractServer">
15 <factoryConfig>
16 <property name="ipAddress">172.24.8.101</property>
17 </factoryConfig>
18 </dbServer>
19
20 <dbServer name="slave02" parent="abstractServer">
21 <factoryConfig>
22 <property name="ipAddress">172.24.8.102</property>
23 </factoryConfig>
24 </dbServer>
25
26 <dbServer name="slave03" parent="abstractServer">
27 <factoryConfig>
28 <property name="ipAddress">172.24.8.103</property>
29 </factoryConfig>
30 </dbServer>
31
32 <dbServer name="slave04" parent="abstractServer">
33 <factoryConfig>
34 <property name="ipAddress">172.24.8.104</property>
35 </factoryConfig>
36 </dbServer> #以上设置四台后端可读节点信息。
37 <dbServer name="myslave" virtual="true">
38 #设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave。
39 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
40 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
41 <property name="loadbalance">1</property> #选择调度算法,1表示负载均衡,2表示权重,3表示HA, 这里选择1。
42
43 <!-- Separated by commas,such as: server1,server2,server1 -->
44 <property name="poolNames">slave01,slave02,slave03,slave04</property> #myslave组成员。
45 </poolConfig>
46 </dbServer>
 

5.3 Amoeba-amoeba配置

  1 [root@Amoeba ~]# vi /usr/local/amoeba/conf/amoeba.xml
2 ……
3 <property name="port">8066</property> #设置amoeba监听的端口,默认是8066
4 ……
5 <property name="ipAddress">127.0.0.1</property> #配置监听的接口,如果不设置,默认监听所以的IP
6 ……
7 <property name="user">root</property>
8 <property name="password">x120952576</property>
 
注意:
  • 以上配置客户端连接amoeba时需要使用这里设定的账号;
  • 此处账号密码和amoeba连接后端数据库服务器的密码无关;
  • 前端应用程序连接数据库的地址就是Amoeba服务器的值,连接用户名和密码即为此处配置的用户名和密码。
  1 ……
2 <property name="defaultPool">writedb</property> #设置amoeba默认的池,这里设置为writedb
3 <property name="writePool">writedb</property>
4 <property name="readPool">myslave</property>
5 <property name="needParse">true</property> #取消注释,则指定前面定义好的俩个读写池。
 

六 数据库配置

6.1 创建数据库

  1 [root@Client ~]# mysql -ummm_test -px120952576 -h172.24.8.100        #从客户端使用可写vip连接数据库
2 mysql> create database testdb; #曾经testdb数据库
3 [root@Master02 ~]# mysql -uroot -px120952576 #使用Master02进入
4 mysql> show databases; #验证是否复制成功
 
提示:其他节点测试略。

6.2 授权Amoeba用户

  1 [root@Master01 ~]# mysql -uroot -px120952576
2 mysql> grant all on testdb.* to 'test1'@'172.24.8.14' identified by 'x12345678';
 
注意:其他所有节点均需要授权此用户。

七 启动Amoeba

  1 [root@Amoeba ~]# /usr/local/amoeba/bin/launcher
可能会出现以下报错,原因是stack size太小,导致JVM启动失败
可执行如下修复操作:
  1 [root@Amoeba ~]# vim /usr/local/amoeba/jvm.properties
2 JVM_OPTIONS="-server -Xms2048m -Xmx2048m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"
 
提示:原为:JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"
  1 [root@Amoeba ~]# /usr/local/amoeba/bin/launcher &	#建议直接放入后台启动
2 [root@Amoeba ~]# echo "/usr/local/amoeba/bin/launcher &" >> /etc/rc.local
 
[root@Amoeba ~]# netstat -unlpt | grep java #查看进程

八 测试

8.1 打开日志记录

  1 [root@Master01 ~]# touch /var/log/mysql_query_log
2 [root@Master01 ~]# chown mysql:mysql /var/log/mysql_query_log
3 [root@Master01 ~]# vi /etc/my.cnf
4 general_log=ON
5 general_log_file=/var/log/mysql_query_log.log
 
注意:
打开MySQL日志记录,必须存在log文件,且同时对MySQL具有权限;
所有节点均需要打开日志记录,方便记录测试情况。

8.2 新增对应数据

  1 [root@Master01 ~]# mysql -uroot -px120952576
2 mysql> use testdb;
3 mysql> create table mmm_test(id int,email varchar(60));
4 mysql> insert into mmm_test (id,email) values (100,'ip is 172.24.8.10');
 
提示:
创建用于测试的表mmm_test,并插入含该节点IP的条目,方便之后测试;
所有节点均需要执行以上操作,但ip更换为对应的ip节点即可。

8.3 读写分离测试

  1 [root@Client ~]# mysql -uroot -h172.24.8.14 -px120952576 -P8066
2 mysql> select * from testdb.mmm_test;
 
提示:
  • 此处在Client端使用的是Amoeba的IP连接,端口为Amoeba服务的8066端口;
  • 多次执行查询,可知select请求均衡的分配在MMM集群中的4个节点,由于Master01和Master02同步复制,因为有两条相同结果。
  1 [root@Master01 ~]# tail -f /var/log/mysql_query_log | grep mmm_test
2 #所有节点执行此命令,观察log信息。
3 [root@Client ~]# mysql -uroot -h172.24.8.14 -px120952576 -P8066
4 mysql> create table mmm_test1(id int,email varchar(60));
5 mysql> insert into mmm_test1 (id,email) values (104,'ip is 172.24.8.14');
 
提示:所有写操作均在Master01上执行,其他节点的均由复制而来,由此可知已实现读写分离。

九 其他附加

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输出日志的级别和方式。
 

001.Amoeba读写分离部署的更多相关文章

  1. amoeba读写分离

    第一单元   高性能mysql读写分离的实现 5.1      mysql读写分离 5.1.1  mysql读写分离概述 5.1.2  mysql读写分离原理 5.2      mysql读写分离配置 ...

  2. windows下Redis 主从读写分离部署

    原文:windows下Redis 主从读写分离部署 1.可直接下载window下的运行文件(下面这个链接) 也可以浏览github 查看相应的版本说明文档 https://github.com/Ser ...

  3. 基于Amoeba读写分离

    Amoeba 原理:amoeba相当于业务员,处理client的读写请求,并将读写请求分开处理.amoeba和master以及slave都有联系,如果是读的请求,amoeba就从slave读取信息反馈 ...

  4. ProxySQL实现Mysql读写分离 - 部署手册

    ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.ProxySQL是用C++语言开发的,也是percona推的一款中间件,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数 ...

  5. 003.MMM双主-双从读写分离部署

    一 前期规划 1.1 主机规划 1.2 虚拟IP规划 1.3 用户列表 提示:以上角色需要在所有节点添加. 1.4 整体架构 1.4 hosts修改 1 [root@localhost ~]# vi ...

  6. Amoeba读写分离(MySQL)

    实验操作环境: centos服务器  三台机器 role: 192.168.189.129  master-主 192.168.189.130  master-从 192.168.189.131    ...

  7. MMM双主-双从读写分离部署

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 前期规划 1.1 主机规划 1.2 虚拟IP规划 1.3 用户列表 1.4 整 ...

  8. Mysql读写分离方案-Amoeba环境部署记录

    Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...

  9. Linux下Mysql主从复制(Master-Slave)与读写分离(Amoeba)实践

    一.为什么要做Mysql的主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...

随机推荐

  1. Confluence 6 查看一个任务的执行历史

    希望查看一个计划任务最后运行的时间和这个计划任务最后一次运行花费了多长时间.单击计划任务边上的 历史(History )连接. 如果一个计划任务从来没有运行的胡啊,那么这个历史的链接是不会显示的. 屏 ...

  2. ios消息机制

    ios消息机制介绍 ios 调用每一个方法的时候其实是走的ios的消息机制 举例介绍一下 创建一个Pserson类 有一个eat 对象方法 那么下面的代码可以用消息机制实现  导入消息头文件    # ...

  3. AD9361寄存器配置顺序,循环模式,自收自发

    :] cmd_data; :] index; begin case(index) 'h000,8'h00};//set spi -- 'h3df,8'h01};//set init -- 'h037, ...

  4. bzoj 1222

    比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可 本题卡空间,需要滚动数组优化 本题卡时间,稍微卡下常就行 #inc ...

  5. CF1065D

    如果不喜欢过长代码的看官,请移步其他题解... 这题其实思想极其简单: 棋盘问题常见的算法都比较暴力,常用的有搜索和状压dp 而这道题显然没啥能状压的,所以我们考虑搜索 但是仅仅搜索是不够的,因为有极 ...

  6. 制作linux下的.run安装包

    前言 之前往linux上安装一个软件,都是以压缩包或者压缩包+shell的方法,这每次安装,都是先scp到某个目录, 解压,安装......稍微厉害的,会写个shell脚本.但是还是达不到真正的快速方 ...

  7. Android取得系统时间

    Time t = new Time();//实例化Time类 t.setToNow();//取得当前的系统时间 int month = t.month;//获取月 int year = t.year; ...

  8. mysql恢复ibd文件

    1.将原表删除,包括ibd和frm文件 2.重新创建表结构. 3.丢弃表空间 alter table tableName discard tablespace; 4.将要恢复的ibd文件拷贝到数据库目 ...

  9. 考虑实现一个不抛异常的swap

    Effective C++:参考自harttle land 类的swap实现与STL容器是一致的:提供swap成员函数, 并特化std::swap来调用那个成员函数. class Widget { p ...

  10. Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试

    标签:Linux 域名 Nginx 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xpleaf.blog.51cto.com/9 ...