基于amoeba实现mysql数据库的读写分离/负载均衡

时间:2021-07-16 18:24:23

一、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).简要原理图:
基于amoeba实现mysql数据库的读写分离/负载均衡基于amoeba实现mysql数据库的读写分离/负载均衡
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="${amoeba.home}/logs/project.log"/>
改成
<param name="file" value="<![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数据库的读写分离/负载均衡的更多相关文章

  1. 利用oneproxy部署mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...

  2. 如何轻松实现MySQL数据库的读写分离和负载均衡?

    配置好了 Mysql 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡.读写分离和负载均衡是 Mysql 集群的基础需求,MaxScale 就可以帮着 ...

  3. 利用mysql-proxy进行mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 mysql-proxy-0 ...

  4. Mysql数据库的读写分离

    读写分离,即在主数据库中进行写操作(也可以进行增.删.改操作),在从数据库中进行读操作.在正常情况下,我们对主数据库进行的是增.删.改.查操作,数据库的写入时间比较长,而查询时间短,所以为了提高数据库 ...

  5. mysql高可用架构方案之二&lpar;keepalived&plus;lvs&plus;读写分离&plus;负载均衡&rpar;

    mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方 ...

  6. MyCat 读写分离&comma;负载均衡

    docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` ) N ...

  7. MySQL搭建Amoeba&lowbar;读写分离

    一.背景知识 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离.可路由相关 ...

  8. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

    Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...

  9. docker-compose&period;yml样例(mysql主从&plus;mycat读写分离)

    Docker-compose.yml文件示例 1.mysql主从复制的docker-compose.yml文件 # cat docker-compose.yml version: '2' # 这个ve ...

随机推荐

  1. PHP-格式标签

    格式控制标签 <font color="" size="" face=""></font>  控制字体:color控 ...

  2. ASP&period;NET XmlSerializer权限问题

    今天碰到一个奇怪问题.因为在2台服务器上做文件共享,使服务器A能访问服务器B的共享目录.在IIS上使用虚拟目录实现的话,需要给应用程序池指定一个统一的账号.在调试的时候能够使用,但是一部署到服务器上, ...

  3. 进程间的通讯&lpar;IPC&rpar;方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...

  4. 过程式编程 drawShapes

    // // main.m // 3.2.1 过程式编程 #import <Foundation/Foundation.h> typedef enum { kCircle, kRectang ...

  5. VMware linux与windows文件共享

    将要共享的文件做成一个iso文件,然后打开VMware

  6. Linux常用命令2--用户问题、文件的打包压缩

    Linux常用命令 如何进行用户和群组的创建和更改 [1]groupadd:用于创建新的群组. 语法:groupadd [-option] 用户名:其常用参数有:-g groupadd -g 555 ...

  7. download plugin update site for offline installation

    Reference Eclipse Launcher Running update manager from command line   好多次为window下的eclipse不能拿到linux下直 ...

  8. PHP扩展安装方法

    php扩展安装方法极简单. 也遵循3大步.但多出一个phpize的步骤. 1.pecl.php.net  在右上解的输入框 中输入需要的扩展    比如 redis 2.搜索完成后会看到两个蓝色的框 ...

  9. (一〇二)静态库&lpar;&period;a&rpar;的打包

    库是代码的集合,根据代码公开程度,分为开源库和闭源库. 其中闭源库主要包括静态库和动态库,是经过编译的二进制文件,看不到具体实现. 静态库的拓展名是.a或者.framework,动态库则是.dylib ...

  10. win10连接无线网,开启移动热点,手机连接它手机一直显示获取ip地址中。

    *必须要有无线网卡才能设置WIFI首先打开电脑,选中“计算机”或者“我的电脑”,右击进入“管理”选项“.打开“计算机管理”窗口之后,在左栏菜单选项中找到“服务和应用程序”下的“服务”选项,如图点击进入 ...