图片 17

Amobea读写分离,Amoeba消除mysql主从读写分离

By admin in 澳门新葡亰官网app on 2019年8月6日

看了下有关amoeba的小说,总体以为好像要比mysql-proxy好的多,也参照了好些个的资料,此小说恐怕与其余小说我会有一样的地点,请见谅,可是此进程着实是自个儿亲自试验得来的.
 
考试意况
操作系统:  SUSE Linux
Enterprise Server 10 (x86_64)
 
服务器IP:  10.10.0.72  10.10.0.77  10.10.0.87
 
服务器剧中人物:  10.10.0.72用作mysql的master服务器,
0.77作为mysql的slave服务器,0.87当作amoeba服务器
 
软件列表:    MySQL-client-community-5.1.54-1.sles10.i586.rpm
             MySQL-server-community-5.1.54-1.sles10.i586.rpm
             amoeba-mysql-1.3.1-BETA.zip
             jdk-1_5_0_16-linux-i586-rpm.bin
Amoeba的简介
Amoeba(变形虫)项目,专注遍布式数据proxy 开拓.座落与Client、DB
Server(s)之间.对客户端透明.具备负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目的数据库、可出现乞请多台数据库合并结果.
 
驷不如舌化解了什么难点:

原创文章,转发请保留原版的书文链接:来自飞鸿无痕CU博客

         
Amoeba的中文意思是变型虫,Amoeba是贰个以MySQL为底层数据存款和储蓄,并对利用提供MySQL协议接口的proxy。它集中地响应应用的伸手,依靠用户优先设置的
 
 准则,将SQL央求发送到特定的数据库上进行。基于此能够兑现负载均衡、读写分离、高可用性等供给。与MySQL官方的MySQL
Proxy比较,小编强调的是amoeba配    
 置的便民(基于XML的配置文件,用SQLJEP语法书写法则,比基于lua脚本的MySQL
Proxy简单);

? 减少数据切分带来的复杂性比较多据库结构

   
前言:平素想找一个工具,能很好的达成mysql主从的读写分离架构,曾经试用过mysql-proxy开掘lua用起来很不爽,尤其是不懂lua脚本,陡然发掘了Amoeba这些类型,试用了下,以为尚可,写出文书档案,希望对大家有帮带!

  
Amoeba也就是贰个SQL央求的路由器,指标是为负载均衡、读写分离、高可用性提供体制,并非全然实现它们。用户须要组合使用MySQL的
Replication等机制    
 来促成别本同步等职能。amoeba对底层数据库连接处理和路由贯彻也接纳了可插拨的编写制定,第三方得以付出越来越尖端的政策类来代替小编的兑现。那一个顺序总体上相比符
 
 合KISS原*
则的思想。***

? 提供切分准绳并裁减数据切分法规给采取带来的震慑

一、Amoeba 是什么


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

Amoeba(变形虫)项目,专注 布满式数据库 proxy
开辟。座落与Client、DB Server(s)以内。对客户端透明。具备负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到对象数据库、可现身供给多台数据库合併结果。

  主要消除:
    • 裁减数据切分带来的头晕目眩繁多据库结构
    • 提供切分法规并减少数据切分准绳给采取带来的熏陶
    • 减少db 与客户端的连接数
    • 读写分离***

? 读写分离
 
此处关于mysql的装置就不说了,网络的科目比非常多.
完成mysql的主从复制
在master服务器上实施如下命令:
#mysql –uroot –ptest
mysql> grant replication slave,file on *.* to ‘sxit’@’10.10.0.77’
identified by ‘123456’;
mysql> flush privileges;
mysql> exit;
 
//修改master的my.cnf的配置
 
log-bin=mysql-bin            //展开mysql二进制日志
server-id = 1                //设置mysql_id,主从无法长期以来
binlog-do-db=test            //设置二进制日志记录的库
sync_binlog=1     
 
//修改slave的my.cnf的配置
 
log-bin=mysql-bin
server-id = 2
replicate-do-db=test          //设置同步的库
log-slave-updates            //同步后记录二进制日志  
sync_binlog=1
slave-net-timeout=60
 
各自重启主从mysqld服务,登入master服务器.
 
在master服务器上实践如下命令
 
# mysql –u root –ptest
mysql>  flush tables with read lock;
mysql>  show master status\G;
 
*************************** 1. row
***************************
 File: mysql-bin.000002
 Position: 106
 Binlog_Do_DB: test
Binlog_Ignore_DB:
 
mysql> unlock tables;
 
登陆到slave服务器,推行如下命令:
 
# mysql –u root –ptest
 
mysql>  stop slave;
 
mysql> change master to master_host=’10.10.0.72′,
master_user=’sxit’, master_password=’123456′,
       master_log_file=’mysql-bin.000002′,master_log_pos=106;
 
mysql>  start slave;
 
mysql>  show slave status\G;
 
假如现身下边的事态,表明为主同步已经打响!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
安装amoeba
出于amoeba基于JDK1.5支付的,接纳了JDK1.5的表征,所以我们那边要设置JDK,到10.10.0.87服务器上安装相关程序
 
# chmod +x jdk-1_5_0_16-linux-i586-rpm.bin
# ./ jdk-1_5_0_16-linux-i586-rpm.bin
#  vi /etc/profile         
//在文件之中增加jdk的意况变量,增加从头到尾的经过如下
 
JAVA_HOME=/usr/java/jdk1.5.0_16
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
 
# source  /etc/profile
 
# mkdir amoeba
# cd  /usr/local/amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip
# chmod -R +x /usr/local/amoeba/bin/
 
Amoeba For MySQL 的应用特别轻易,全数的陈设文件都是正经的XML
文件,总共有多个布局文件.分别为:
 

amoeba.xml:主配置文件,配置全数数据源以及Amoeba自己的参数设置,达成焦点的话配
   置这一个文件就足以了;
 
◆ rule.xml:配置全部Query 路由法规的新闻;
 
◆ functionMap.xml:配置用于深入分析Query 中的函数所对应的Java 完结类;
 
◆ rullFunctionMap.xml:配置路由准绳中须要动用到的一定函数的落到实处类;
 
经过更动amoeba.xml配置文件贯彻mysql主从读写分离,配置如下:
 
<?xml version=”1.0″ encoding=”gbk”?>
 
<!DOCTYPE amoeba:configuration SYSTEM “amoeba.dtd”>
<amoeba:configuration xmlns:amoeba=”;
 
        <server>
                <!– proxy server绑定的端口 –>
                <property name=”port”>8066</property>
 
                <!– proxy server绑定的IP –>
                <property
name=”ipAddress”>10.10.0.87</property>
                <!– proxy server net IO Read thread size –>
                <property
name=”readThreadPoolSize”>20</property>
 
                <!– proxy server client process thread size –>
                <property
name=”clientSideThreadPoolSize”>30</property>
 
                <!– mysql server data packet process thread size
–>
                <property
name=”serverSideThreadPoolSize”>30</property>
 
                <!– socket Send and receive BufferSize(unit:K) 
–>
                <property
name=”netBufferSize”>128</property>
 
                <!– Enable/disable TCP_NODELAY (disable/enable
Nagle’s algorithm). –>
                <property
name=”tcpNoDelay”>true</property>
 
                <!– 对外表达的用户名 –>
                <property name=”user”>root</property>
 
                <!– 对外表达的密码 –>
              
                <property name=”password”>sxit</property>
 
                <!– query timeout( default: 60 second ,
TimeUnit:second) –>
                <property
name=”queryTimeout”>60</property>
        </server>
 
        <!–
                各个ConnectionManager都将用作一个线程运转。
                manager肩负Connection IO读写/长逝检查评定
        –>
        <connectionManagerList>
           <connectionManager name=”defaultManager”
class=”com.meidusa.amoeba.net.MultiConnectionManagerWrapper”>
  <property
name=”subManagerClassName”>com.meidusa.amoeba.net.AuthingableConnectionManager
</property>
     <!–
       default value is avaliable Processors
         <property name=”processors”>5</property>
     –>
</connectionManager>
</connectionManagerList>
 
<dbServerList>
     <!–
        一台mysqlServer 须要安顿一个pool,
        若是多台 平等的mysql要求张开loadBalance,
       
平台已经提供八个具有负载均衡技艺的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
         轻易的安顿是性质加上 virtual=”true”,该Pool
不容许配置factoryConfig
         也许本人写叁个ObjectPool。
     –>
<dbServer name=”server1″>
 
     <!– PoolableObjectFactory实现类 –>
        <factoryConfig
class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>
             <property
name=”manager”>defaultManager</property>
 
                <!– 真实mysql数据库端口 –>
                     <property name=”port”>3306</property>
 
                <!– 真实mysql数据库IP –>
                      <property
name=”ipAddress”>10.10.0.72</property>
                      <property
name=”schema”>test</property>
 
                <!– 用于登录mysql的用户名 –>
                       <property
name=”user”>test</property>
 
                 <!– 用于登录mysql的密码 –>
 
                        <property
name=”password”>123456</property>
 
            </factoryConfig>
 
      <!– ObjectPool实现类 –>
         <poolConfig
class=”com.meidusa.amoeba.net.poolable.PoolableObjectPool”>
                <property name=”maxActive”>200</property>
                  <property name=”maxIdle”>200</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>

尤为重要消除:

 

图片 1

• 减少 数据切分带来的纷纷相当多据库结构

***    不足之处:
    a)这几天还不支持专门的学业
    b)暂时不补助仓库储存进度(如今会接济)
    c)不符合从amoeba导数据的情景大概对大数据量查询的query并不适宜(比如叁遍呼吁重回10w以上以致越多多少的场所)
    d)一时不帮忙分库分表,amoeba近些日子只完毕分数据库实例,每一个被切分的节点须求保持库表结构同样:
   Amoeba:阿米巴原虫***

• 提供切分准则并收缩 数据切分法规 给应用带来的震慑

***             
  图片 2***

• 收缩db 与客户端的连接数

***                   
 图片 3***

• 读写分离

***1》**蒙受介绍*

 

***  master–IP:192.168.100.161
  slave—IP:192.168.100.160
  Amoeba–IP:192.168.100.214
2》**安装JDK*

二、为啥要用Amoeba

***  #mkdir /Amoeba
  #tar –xvf jdk-7u40-linux-x64.tar.gz -C /Amoeba
  # vim /etc/profile
  JAVA_HOME=/Amoeba/jdk1.7.0_40
  export JAVA_HOME
  PATH=$JAVA_HOME/bin:$PATH
  export PATH
  CLASSPATH=:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
  export CLASSPATH***

此时此刻要落到实处mysql的为主读写分离,首要有以下二种方案:

***3》**安装Amoeba***  #:mkdir /usr/local/amoeba**

1、  通进程序达成,英特网广大现成的代码,相比复杂,假使加上从服务器要改成多台服务器的代码。

**  #:unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
  #:chmod -R +x /usr/local/amoeba/bin/
  #java -version
  java version “1.7.0_40”
  Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
  Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

2、  通过mysql-proxy来贯彻,由于mysql-proxy的中心读写分离是通过lua脚本来实现,如今lua的台本的开支跟不上节奏,而写未有全面包车型地铁现存的剧本,因而导致用于生产条件的话危机比极大,据网络海人民广播广播台大人说mysql-proxy的习性不高。

4》***基本授权,扩充用户*

3、  本人开销接口达成,这种方案门槛高,开荒开销高,不是形似的小公司能承受得起。

***  mysql–>grant all privileges on *.* to amoeba@’%’
identified by ‘amoeba123’;
  mysql–>flush privileges;***

4、  利用Alibaba的开源项目Amoeba来兑现,拥有负载均衡、高可用性、sql过滤、读写分离、可路由有关的query到对象数据库,况且安装配备特别简单。国产的开源软件,应该支持,近年来正值利用,不登出太多结论,一切等测验完再发布结论吧,哈哈!

***5》**Amoeba配置介绍***  **

 

**      Amoeba For MySQL
的行使特别简单,全数的布置文件都是正统的XML
文件,总共有几个布局文件。分别为:amoeba.xml:主配置文件,配置全部数据源以及
          Amoeba
本身的参数设置;实现基本的话配置那几个文件就能够了;**

三、快捷架设amoeba,完毕mysql主从读写分离

**  rule.xml:配置全部Query 路由法规的音信;
  functionMap.xml:配置用于分析Query 中的函数所对应的Java 完结类;
  rullFunctionMap.xml:配置路由法则中要求利用到的特定函数的兑现类;
6》***配置Amoeba IP 与用户*

假诺amoeba的前提条件:

***  # vim /usr/local/amoeba/conf/amoeba.xml***

n        
Java SE 1.5 或上述 Amoeba
框架是依据JDK1.5支出的,选取了JDK1.5的特征。

***         
  图片 4***

n        
支持Mysql 协议版本10(mysql 4.1随后的本子)。

***7》**Amoeba配置Master基本消息*

n        
您的互联网情况至少运营有一个mysql 4.1之上的服务

*       
 图片 5*

       1、首先介绍下自个儿的实行情状。

*             
 图片 6*

              System:    CentOS release
5.4

8》Amoeba配置Slave基本消息

              Master mysql:192.168.1.121

*         
 图片 7*

              Slave mysql:192.168.1.108

*           
  图片 8*

              Amoeba server:  
192.168.1.159

9》Master负载配置

架构如如下所示:

*       
  图片 9*

图片 10

10》Slave负载配置

本身这里只用了二个从数据库!

*       
  图片 11*

2、安装配置mysql主从遭受,mysql的装置简便,请自行编写翻译可能用rpm安装

11》最终布置读写分离

###在master
mysql创造同步用户

*       
 图片 12*

grant replication slave,file on *.* to
‘replication’@’192.168.1.108’ identified by ‘123456’;

*  启动Amoeba
  # cd /usr/local/amoeba/bin
这种运营方便看nohup.log日志.幸免提示溢出
  #:nohup bash -x amoeba & *

       flush privileges;

*     常见错误:1
    **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.
  化解办法:
    # vim /usr/local/amoeba/bin/amoeba
    #DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k” 注释
    DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k” 增加

####修改master的my.cnf的配置

  常见错误2:
  org.xml.sax.SAXParseException; lineNumber: 406; columnNumber: 6;
注释中不一样意出现字符串”–“。
  消除办法:
  后来改了一大通,试了一早晨,才察觉。大家的声明两侧要有空格,才行。***

log-bin=mysql-bin         #开发mysql二进制日志
server-id       = 1          #设置mysql_id,主从不可能长期以来
binlog-do-db=test          #安装二进制日志记录的库
binlog-ignore-db=mysql        ##安装二进制日志不记录的库
sync_binlog=1      

          

####修改slave的my.cnf的配置

    举例<!– 实体类路线和名 –>

log-bin=mysql-bin
server-id       = 2
replicate-do-db=test       #设置同步的库
replicate-ignore-db=mysql     #安装不一样台的库
log-slave-updates           #一齐后记录二进制日志
slave-skip-errors=all     
sync_binlog=1

12》测验是还是不是读写分离

slave-net-timeout=60

  1>在(master)主上的test库建设构造三个alvin的表
    Mysql->use test;
    Mysql->create table alvin(id int(10),name char(10));

个别重启主从mysqld服务,登入主mysql,在主上实施flush
tables with read lock;后将test数据库的数量copy到从上,并记下下主上show master status\G的结果:

             
  图片 13

如:

      2>在(slave)从上查看test库是不是同步了alvin表
    Mysql-> use test;
    Mysql->show tables;
   3>在主(master)操作.插入一条数据.
    mysql–>insert into alvin values(1,’master’);
   4>在从(slave)操作,插入一条数据.
    mysql–>insert into alvin values(2,’slave’);
    注意因为从同步主的数码。所以那边有2条数据,

mysql> show master status\G;

           
 图片 14

*************************** 1.
row ***************************

    5>在Amoeba机器上操作
  
在192.168.100.214下边测验,那一个密码正是安排文件之中对外的印证密码root
和密码123456

            File: mysql-bin.000022

               
  图片 15

        Position: 1237

        #mysql –u root –p 123456 –h 192.168.100.214 –P 9066
  (1)
先验证读:我们安顿文件是用的是D帕杰罗轮询,注意那些IP地址要写:amoeba的IP地址,不是master亦非slave
,是由此amoeba代理登入192.168.100.214
    Mysql->use test;
    测验轮询成功,主和从各查询壹遍。
  (2)
验证写:平常来讲。固然唯有一切写到主里面,两边的数码才会招致。假诺中间有一个分化的话。那么申明写到从在那之中去了。因为主不会同步从的数量。都以                          单向数据传输。

                  Binlog_Do_DB: test

               
  图片 16

Binlog_Ignore_DB: mysql

                   
 图片 17

              然后推行unlock
tables

13》常用配置写法

              登陆从mysql,在从上推行:

  (1)假使负载多少个库,软件会依靠你用户授权来调整对什么库有权力
    grant all privileges on *.* to amoeba@’%’ identified by
‘amoeba123’; 这里写的是all
那么正是对富有的库有权力(会活动负载全体的库).

    上面配置文件的库名test.根据这几个语句来决定.若是是all.那么直接用写test来测量检验.方便一点.

stop slave;

  (2)一主一从的负荷写法一:
    主只写.<property
name=”poolNames”>server1</property>

    从只读.<property
name=”poolNames”>server2</property>

change master to
master_host=’192.168.1.121′,master_user=’replication’,master_password=’123456′,master_log_file=’mysql-bin.000022′,
master_log_pos=1237;

  (3)一主一从的载荷写法:
    主负写:<property
name=”poolNames”>server1</property>

    主也肩负读,从也担当读.比例1:1
第一读.从.次之次读住.循环写的话,只好写主.<property
name=”poolNames”>server1,server2</property>

start slave;

  (4)一主多从的载重写法:
    比方.一台主.3台从.在最上边定义了.server1(master)
server2(slave1) server3(slave2) server4(slave3)

    1主只写:<property
name=”poolNames”>server1</property>

    3从负载读 <property
name=”poolNames”>server2,server3,server4</property>

    权重:1:1 3台轮询各一回.持续循环

show slave status\G;

  (5)比方本人想要.slave1
权重高一点.其余的.2台从.每一次读贰遍.slave1读.2次.

    <property
name=”poolNames”>server2,server2,server3,server4</property>

              即便出现上边包车型地铁事态,表达为主同步已经打响!

  =================================================================

             Slave_IO_Running: Yes

amoeba.xml配置文件
<?xml version=”1.0″ encoding=”gbk”?>

             Slave_SQL_Running: Yes

<!DOCTYPE amoeba:configuration SYSTEM “amoeba.dtd”>
<amoeba:configuration xmlns:amoeba=”;

             

<server>
<!– proxy server绑定的端口 –>
<property name=”port”>6006</property>

3、安装JDK环境

<!– proxy server绑定的IP –>

       下载jdk1.5恐怕更新版本,地址

<property name=”ipAddress”>10.0.2.160</property>

       作者用的是:jdk-6u20-linux-i586-rpm.bin

<!– proxy server net IO Read thread size –>
<property name=”readThreadPoolSize”>20</property>

       在Amoeba
server上执行

<!– proxy server client process thread size –>
<property name=”clientSideThreadPoolSize”>30</property>

chmod +x jdk-6u20-linux-i586-rpm.bin

<!– mysql server data packet process thread size –>
<property name=”serverSideThreadPoolSize”>30</property>

./ jdk-6u20-linux-i586-rpm.bin

<!– socket Send and receive BufferSize(unit:K) –>
<property name=”netBufferSize”>128</property>

##接下来按n次空格键,然后输入yes就能够了!^_
^

<!– Enable/disable TCP_NODELAY (disable/enable Nagle’s algorithm).
–>
<property name=”tcpNoDelay”>true</property>

ln -s /usr/java/jdk1.6.0_20/ /usr/java/jdk1.6

<!– 对外证实的用户名 –>
<property name=”user”>root</property>

vi /etc/profile

<!– 对外证实的密码 –>

#加上如下两行内容

<property name=”password”>123456</property>

export JAVA_HOME=/usr/java/jdk1.6

<!– query timeout( default: 60 second , TimeUnit:second) –>
<property name=”queryTimeout”>60</property>
</server>

export
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

<!–
种种ConnectionManager都将作为一个线程运维。
manager肩负Connection IO读写/过逝检查测验
–>
<connectionManagerList>
<connectionManager name=”defaultManager”
class=”com.meidusa.amoeba.net.MultiConnectionManagerWrapper”>
<property
name=”subManagerClassName”>com.meidusa.amoeba.net.AuthingableConnectionManager</property>

#施行下边包车型大巴授命使更动的剧情生效

<!–
default value is avaliable Processors
<property name=”processors”>5</property>
–>
</connectionManager>
</connectionManagerList>

source /etc/profile

<dbServerList>
<!–
一台mysqlServer 必要安插二个pool,
万一多台 平等的mysql须求开始展览loadBalance,
平台已经提供一个装有负载均衡本领的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
轻便易行的布署是性质加上 virtual=”true”,该Pool 不容许配置factoryConfig
抑或自身写二个ObjectPool。
–>
<dbServer name=”server1″>

 

<!– PoolableObjectFactory实现类 –>
<factoryConfig
class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>
<property name=”manager”>defaultManager</property>

4、  安装amoeba-mysql

<!– 真实mysql数据库端口 –>
<property name=”port”>3306</property>

下载amoeba-mysql,近年来最新版本为amoeba-mysql-1.3.1-BETA.zip

<!– 真实mysql数据库IP –>
<property name=”ipAddress”>10.0.2.159</property>
<property name=”schema”>test</property>

mkdir /usr/local/amoeba/

<!– 用于登入mysql的用户名 –>
<property name=”user”>amoeba</property>

wget http://blogimg.chinaunix.net/blog/upfile2/101027160252.zip

<!– 用于登入mysql的密码 –>

unzip
101027160252.zip

<property name=”password”>amoeba123</property>

陈设文件位于conf目录下,施行文书位于bin目录下,解压后发觉bin目录下的开发银行文件并未有可推行权限,请试行:chmod -LX570 +x /usr/local/amoeba/bin/

</factoryConfig>

Amoeba For MySQL 的运用非常简单,全数的安排文件都以专门的学业的XML 文件,总共有多个布局文件。分别为:

<!– ObjectPool实现类 –>
<poolConfig
class=”com.meidusa.amoeba.net.poolable.PoolableObjectPool”>
<property name=”maxActive”>200</property>
<property name=”maxIdle”>200</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>


amoeba.xml:主配置文件,配置全数数据源以及Amoeba 本身的参数设置;完成主题的话配置这一个文件就可以了;

<dbServer name=”server2″>


rule.xml:配置全数Query 路由法则的消息;

<!– PoolableObjectFactory实现类 –>
<factoryConfig
class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>
<property name=”manager”>defaultManager</property>


functionMap.xml:配置用于剖析Query
中的函数所对应的Java 完成类;

<!– 真实mysql数据库端口 –>
<property name=”port”>3306</property>


rullFunctionMap.xml:配置路由法规中必要利用到的一定函数的贯彻类;

<!– 真实mysql数据库IP –>
<property name=”ipAddress”>10.0.2.158</property>
<property name=”schema”>test</property>

下边大家就来经过改换amoeba.xml配置文件贯彻mysql主从读写分离,作者的配备如下:

<!– 用于登入mysql的用户名 –>
<property name=”user”>amoeba</property>

<?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd"><amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">    <server>        <!-- proxy server绑定的端口 -->        <property name="port">8066</property>                <!-- proxy server绑定的IP -->        <property name="ipAddress">192.168.1.110</property>        <!-- proxy server net IO Read thread size -->        <property name="readThreadPoolSize">20</property>                <!-- proxy server client process thread size -->        <property name="clientSideThreadPoolSize">30</property>                <!-- mysql server data packet process thread size -->        <property name="serverSideThreadPoolSize">30</property>                <!-- socket Send and receive BufferSize(unit:K)  -->        <property name="netBufferSize">128</property>                <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->        <property name="tcpNoDelay">true</property>                <!-- 对外验证的用户名 -->        <property name="user">root</property>                <!-- 对外验证的密码 -->        <property name="password">password</property>                <!-- query timeout( default: 60 second , TimeUnit:second) -->        <property name="queryTimeout">60</property>    </server>        <!--         每个ConnectionManager都将作为一个线程启动。        manager负责Connection IO读写/死亡检测    -->    <connectionManagerList>        <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">            <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>                        <!--               default value is avaliable Processors             <property name="processors">5</property>             -->        </connectionManager>    </connectionManagerList>        <dbServerList>        <!--             一台mysqlServer 需要配置一个pool,            如果多台 平等的mysql需要进行loadBalance,             平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool            简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig            或者自己写一个ObjectPool。        -->        <dbServer name="server1">                        <!-- PoolableObjectFactory实现类 -->            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">                <property name="manager">defaultManager</property>                                <!-- 真实mysql数据库端口 -->                <property name="port">3306</property>                                <!-- 真实mysql数据库IP -->                <property name="ipAddress">192.168.1.121</property>                <property name="schema">test</property>                                <!-- 用于登陆mysql的用户名 -->                <property name="user">zhang</property>                                <!-- 用于登陆mysql的密码 -->                                <property name="password">zhang123</property>                            </factoryConfig>                        <!-- ObjectPool实现类 -->            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">                <property name="maxActive">200</property>                <property name="maxIdle">200</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="server2">                        <!-- PoolableObjectFactory实现类 -->            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">                <property name="manager">defaultManager</property>                                <!-- 真实mysql数据库端口 -->                <property name="port">3306</property>                                <!-- 真实mysql数据库IP -->                <property name="ipAddress">192.168.1.108</property>                <property name="schema">test</property>                                <!-- 用于登陆mysql的用户名 -->                <property name="user">zhang</property>                                <!-- 用于登陆mysql的密码 -->                                <property name="password">zhang123</property>                            </factoryConfig>                        <!-- ObjectPool实现类 -->            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">                <property name="maxActive">200</property>                <property name="maxIdle">200</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" virtual="true">            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->                <property name="loadbalance">1</property>                                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->                <property name="poolNames">server1</property>            </poolConfig>        </dbServer>        <dbServer name="slave" virtual="true">            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->                <property name="loadbalance">1</property>                                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->                <property name="poolNames">server1,server2</property>            </poolConfig>        </dbServer>            </dbServerList>        <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">        <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>        <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>        <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>        <property name="LRUMapSize">1500</property>        <property name="defaultPool">master</property>                <property name="writePool">master</property>        <property name="readPool">slave</property>        <property name="needParse">true</property>    </queryRouter></amoeba:configuration>

<!– 用于登录mysql的密码 –>

启动amoeba

<property name=”password”>amoeba123</property>

/usr/local/amoeba/bin/amoeba &

</factoryConfig>

核实运营是不是中标(使用的是暗许的8066端口):

<!– ObjectPool实现类 –>
<poolConfig
class=”com.meidusa.amoeba.net.poolable.PoolableObjectPool”>
<property name=”maxActive”>200</property>
<property name=”maxIdle”>200</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>

[root@Centos2 amoeba]# ps aux | grep amoeba

<dbServer name=”master” virtual=”true”>
<poolConfig
class=”com.meidusa.amoeba.server.MultipleServerPool”>
<!– 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA –>
<property name=”loadbalance”>1</property>

root     24580  0.2 19.2 408912 49264 pts/1    Sl  
12:52   0:11 /usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m
-Xss128k -Damoeba.home=/usr/local/amoeba
-Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath
/usr/local/amoeba/lib/classworlds-1.0.jar
org.codehaus.classworlds.Launcher

<!– 参加该pool负载均衡的poolName列表以逗号分割 –>
<property name=”poolNames”>server1</property>
</poolConfig>
</dbServer>

[root@Centos2 amoeba]# netstat -lnp | grep
java

<dbServer name=”slave” virtual=”true”>
<poolConfig
class=”com.meidusa.amoeba.server.MultipleServerPool”>
<!– 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA –>
<property name=”loadbalance”>1</property>

tcp        0      0 ::ffff:192.168.1.159:8066  
:::*                        LISTEN      24580/java

<!– 参加该pool负载均衡的poolName列表以逗号分割 –>
<property name=”poolNames”>server1,server2</property>
</poolConfig>
</dbServer>

 

</dbServerList>

5、  测试

<queryRouter
class=”com.meidusa.amoeba.mysql.parser.MysqlQueryRouter”>
<property
name=”ruleConfig”>${amoeba.home}/conf/rule.xml</property>
<property
name=”functionConfig”>${amoeba.home}/conf/functionMap.xml</property>
<property
name=”ruleFunctionConfig”>${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name=”LRUMapSize”>1500</property>
<property name=”defaultPool”>master</property>

测量检验在此之前先要保险amoeba-server有访谈多个着力服务器test库的权杖,在主旨mysql上都实行:

<property name=”writePool”>master</property>
<property name=”readPool”>slave</property>

grant all on test.* to zhang@’192.168.1.%’
identified by ‘zhang123’;

<property name=”needParse”>true</property>
</queryRouter>
</amoeba:configuration>

#用户名密码要和前边配置的意志力

flush privileges;

测试的时候和我们常常采取一样,amoeba-mysql对大家选取透明,正是个mysql的代办了!

登入mysql使用如下命令(用户名密码和上边配置的要平等):

mysql -uroot -ppassword -h192.168.1.159 -P8066

登入上去后,为了测验读和写必须,先把mysql的主从复制停掉,本事更了然地观看读写的服务器是哪台,在从上利用stop slave;登入到amoeba-mysql上,使用命令mysql
-uroot -ppassword -h192.168.1.159 -P8066,然后实行写和读操作,查看写的是哪台服务器,读的是哪台服务器,实验结果呈现:写只在主上实行,读在主和从都进行,比率是1:1

测验步骤:

还未曾停掉从一块此前,创制贰个表:

create table zhang (id int(10) ,name
varchar(10),address varchar(20));

在从上实施stop
slave;

下一场在着力上各插入一条区别数量(供测验读的时候用),

在主上插入:insert into zhang
values(‘1′,’zhang’,’this_is_master’);

在从上插入:insert into zhang
values(‘2′,’zhang’,’this_is_slave’);

接下去通过登陆amoeba-mysql上来测验读写:

[root@Centos2 ~]# mysql -uroot -ppassword
-h192.168.1.159 -P8066

Welcome to the MySQL monitor.  Commands end with ; or
\g.

Your MySQL connection id is 14556042

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

 

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear
the buffer.

 

mysql> use test;

Database changed

mysql> select * from zhang;    ###率先次举办展现在主上读取的数量!

+——+——-+—————-+

| id   | name  | address        |

+——+——-+—————-+

|    1 | zhang | this_is_master |

+——+——-+—————-+

1 row in set (0.02 sec)

 

mysql> select * from zhang;        
####其次次试行select语句突显是在从上读取的数量

+——+——-+—————+

| id   | name  | address       |

+——+——-+—————+

|    2 | zhang | this_is_slave |

+——+——-+—————+

1 row in set (0.02 sec)

mysql> insert into zhang
values(‘3′,’hhh’,’test_write’);               ###插入一条数据,然后查询

Query OK, 1 row affected (0.01 sec)

mysql> select * from zhang;               
###我们得以看出插入的数码被加多到了主上!

+——+——-+—————-+                  
####能够多插入三次数据看看是不是会冒出谬误!

| id   | name  | address        |

+——+——-+—————-+

|    1 | zhang | this_is_master |

|    3 | hhh   | test_write     |

+——+——-+—————-+

mysql> select * from zhang;               
###从上依旧不曾加塞儿,因为实施了stop slave;

+——+——-+—————+

| id   | name  | address       |

+——+——-+—————+

|    2 | zhang | this_is_slave |

+——+——-+—————+

 

6、  轻便主从权重配置

大家兴许会想到,大家投入唯有两台数据库服务器,一台主,一台从,遵照地方的布局只可以是主和从的读取比率是1:1,而写又全方位在主上进行,那样主的压力就非常大了,所以要是能让主和从的读设置权重,譬如设置成1:3,那样就足以很好的化解主从不压力平衡的标题!通过研究确实能够!

铺排正是将方面包车型大巴读的池的布局改换一下:

将<property
name=”poolNames”>server1,server2</property>更改成

<property
name=”poolNames”>server1,server2,server2,server2</property>

自己测量试验的结果正好为1:3,如下:

mysql> select * from zhang;

+——+——-+—————-+

| id   | name  | address        |

+——+——-+—————-+

|    1 | zhang | this_is_master |

|    3 | hhh   | test_write     |

+——+——-+—————-+

2 rows in set (0.01 sec)

 

mysql> select * from zhang;

+——+——-+—————+

| id   | name  | address       |

+——+——-+—————+

|    2 | zhang | this_is_slave |

+——+——-+—————+

1 row in set (0.04 sec)

 

mysql> select * from zhang;

+——+——-+—————+

| id   | name  | address       |

+——+——-+—————+

|    2 | zhang | this_is_slave |

+——+——-+—————+

1 row in set (0.01 sec)

 

mysql> select * from zhang;

+——+——-+—————+

| id   | name  | address       |

+——+——-+—————+

|    2 | zhang | this_is_slave |

+——+——-+—————+

 

上学链接:

开垦者博客链接:

     amoeba 中文文书档案下载地址:

    amoeba
未来提升大方向:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有