zoukankan      html  css  js  c++  java
  • 使用Amoeba实现mysql读写分离机制

    Amoeba的实用指南
    http://docs.hexnova.com/amoeba/
    
    如何实现mysql读写分离 :                                                                        
    通常来说有两种方式:    
    1,应用程序层实现                                                                                                            
    2,中间件层实现  
    
    
    应用层实现
    应用层实现是指在应用程序内部及连接器中实现读写分离。
    例如:
    com.mysql.jdbc.replicationdriver
    mysqlnd_ms
    优点:
    程序内部实现读写分离,安装即可使用
    减少部署难度。
    访问压力在一定级别以下,性能很好。
    缺点:
    架构一旦调整,代码要更这变, 不够灵活。
    难以实现高级应用,如自动分库,分表
    无法适用于更大型的应用场景。
    目前还不支持事务
    
    中间件层实现:
    中间件层实现是指外部中间件程序实现读写分离
    mysql-proxy
    amoeba
    TDDL(TAObao)
    CObar(alibaba)
    Atlas(qihoo360)
     
    优点:
    架构设计上更加灵活、
    读库的负载均衡
    可在程序上实现一些高级控制,failover,流量控制
    依靠一些技术可以实现mysql性能提升,如连接池
    对业务代码侵入性少
    缺点:
    需要有一定的开发实力和运维团队的支持
    wKiom1ZUEZigsaQVAAGhwB6QewY870.png
    
    
    如果你想支 持事务,又想读写分离,还想负载均衡和高可用,请去了解楼方鑫老师的oneproxy
    
    
    什么是Amoeba?
    
    
    Amoeba 2008发布的第一款开源框架
    amoeba for mysql,致力于mysql分布式数据库代理层
    它主要在应用层访问mysql的时候充当sql路由功能,专注于分布式数据库代理层,坐落于client,DBserver之间,对客户端透明具有负载均衡,高可用,sql过滤,读写分离,可路由相到目标数据库,可并发请求多台数据库合并结果
    通过amoeba您能够完成数据源的高可用,负载均衡,数据切换功能,
    目前amoeba目前不支持事务
    
    下面是实现这一方案的架构图:
    wKiom1Yt14_i8SSlAAEJLSWgjGU617.jpg
    mysql主从复制配置
    因为读写分离,所以一台负责mysql的写操作,另一台负责mysql的读操作,所以我们这里使用mysql的主从复制再合适不过了。关于这一配置,请移步:                                                                    http://douya.blog.51cto.com/6173221/1596113
    
    Amoeba实现读写分离:
    
    2,java环境配置
    Amoeba框架是基于Java SE1.5开发的,建议使用Java SE 1.5版本。目前Amoeba经验证在JavaTM SE 1.5和Java SE 1.6能正常运行,(可能包括其他未经验证的版本)。
    Java SE 1.6下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html
    我这里下载jdk-6u32-linux-i586-rpm.bin。
    下载完成后执行sh jdk-6u32-linux-i586-rpm.bin开始安装,将会安装到/usr/java/jdk1.6.0_32目录。
    我自己选择的jdk是根据统一环境使用的1.7
    3,Amoeba的安装
    Amoeba下载地址:http://sourceforge.net/projects/amoeba/
    下面是安装步骤:
    
    cd /root
    mkdir /usr/local/amoeba
    wgethttp://softlayer.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
    tar xzf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba
    配置用户环境变量
    vim /etc/profile
    设置为:
    
    export JAVA_HOME=/root/jdk1.7.0_79
    export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
    export PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME
    export PATH
    立即生效:
    source  /etc/profile
    
    4,Amoeba for mysql配置
    
    配置Amoeba for mysql的读写分离主要涉及两个文件:
    1、/usr/local/amoeba/conf/amoeba.xml
    此文件定义了Amoeba代理的相关配置。
    2、/usr/local/amoeba/conf/dbServers.xml
    此文件定义由Amoeba代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。
    
    
    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">3306</property>   -改成3306比较好,开发直接实用默认3306端口
    <!-- bind ipAddress -->
    <property name="ipAddress">192.168.0.48</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">Centos</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时用来验证的用户及密码。
    
    amoeba.xml读写分离配置:
    
     <property name="defaultPool">Master</property>
    <property name="writePool">Master</property>
    <property name="readPool">virtualSlave</property>
    virtualSlave和dbServer.xml中配置的节点相关
    defaultPool:配置了默认的数据库节点,一些除了SELECTUPDATEINSERTDELETE的语句都会在defaultPool执行。
    writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。
    readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的virtualSlave数据库池。
     (1)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">roudy</property> 必须是一个存在的database
      
              <!-- mysql user -->
              <property name="user">amoeba</property>  ********
      
              <!--  mysql password -->
              <property name="password">Centos</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>
    此部分定义 登录mysql服务器的端口,数据库名称,mysql用户及密码。
    
    接下来配置主从定义:
    ***************表示需要修改部分
    
    <dbServer name="master"  parent="abstractServer">
         <factoryConfig>
          <!-- mysql ip -->
         <property name="ipAddress">192.168.0.1</property>  ** master-IP
         </factoryConfig>
         </dbServer>
    <dbServer name="Slave1"  parent="abstractServer">
         <factoryConfig>
         <!-- mysql ip -->
         <property name="ipAddress">192.168.0.2</property> ****slave1的IP        
         </factoryConfig>
         </dbServer>
    <dbServer name="Slave2"  parent="abstractServer"> 
         <factoryConfig>
         <!-- mysql ip -->
         <property name="ipAddress">192.168.0.3</property>   ***slave2的IP
         </factoryConfig>
         </dbServer>
         <dbServer name="virtualSlave" virtual="true">      ***轮询策略
         <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">Slave1,Slave2</property>
         </poolConfig>
         </dbServer>
    此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码就是上面的abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限 ,这里是先安装,完了在授权
    配置授权用户
    主服务器
    mysql> grant create,select,insert,update,delete on *.* to amoeba@'192.168.0.%' identified by 'Centos';
    
    mysql> flush  privileges;
    此时MySQL由于配置了主从同步,所以需要先停掉从的权限。
    这里的amoeba,是amoeba.xml ,dbServer.xml中配置的amoeba用户
    
    从服务器
    
     stop slave;
     grant select on *.* to amoeba@'192.168.0.%' identified by 'Centos';
     
    
    
    amoeba启动
    启动命令:
    
    [root@localhost amobea]# bin/amoeba start
    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.
    
    
    
    此命令以前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行:
    启动报错,修改启动脚本
    
    [root@localhost amobea]# vim bin/amoeba
    改为
    DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
    
    后台启动amoeba
    /usr/local/amoeba/bin/amoeba &
    检验启动是否成功(3306端口):
    
    [root@localhost amoeba]# ps aux | grep amoeba
    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
    [root@localhos amoeba]# netstat -lnp | grep java
    
    最终测试:
    链接测试 在任意客户端登录amoeba
    
    [root@localhost ~]# mysql -u amoeba -p -h192.168.2.48
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 1982632907
    Server version: 5.1.45-mysql-amoeba-proxy-2.1.0-RC5 MySQL Community Server (GPL)
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | amoeba_test        |
    | mysql              |
    | performance_schema |
    | repl               |
    | roudy              |
    | test               |
    +--------------------+
    7 rows in set (0.02 sec)
    mysql>
    如上表明amoeba配置完全正确。
    
    测试读写是否正确:
    此时读库是没有开启复制功能的,(stop  slave)
    在master服务器上操作,新增一条数据
    insert into luodi values ('1','luodi','master1');
    紧接着在master查询
    
    mysql> select * from luodi;
    +------+-------+---------+
    | id   | name  | address |
    +------+-------+---------+
    |    1 | luodi | master  |
    |    1 | luodi | master1 |
    
    在salve服务器上操作,新增一条数据
    insert into luodi values ('1','luodi','slave1');
    紧接着在salve查询:
    
    mysql> select * from luodi;
    +------+-------+---------+
    | id   | name  | address  |
    +------+-------+---------+
    |    1 | luodi | slave   |
    |    1 | luodi | slave1  |
    
    现在在ameoba服务器查询:
    
    mysql> select * from luodi;
    +------+-------+---------+
    | id   | name  | address  |
    +------+-------+---------+
    |    1 | luodi | slave   |
    |    1 | luodi | slave1  |
    
    没有master服务器的数据,那么在amoeba服务器上插入一条数据,再次验证
    insert into luodi values ('1','luodi','slave2');
    登录master,salve查看
    
    master:
    mysql> select * from luodi;
    +------+-------+---------+
    | id   | name  | address |
    +------+-------+---------+
    |    1 | luodi | master  |
    |    1 | luodi | master1 |
    |    1 | luodi | master2
    salve:   此时slave任然没有开启复制
    
    mysql> select * from luodi;
    +------+-------+---------+
    | id   | name  | address  |
    +------+-------+---------+
    |    1 | luodi | slave   |
    |    1 | luodi | slave1  |
    
    到目前为止amoeba基于-M-S结构的动静分离完全成功,然后start slave即可、
    
    
  • 相关阅读:
    【网络攻击】之防止短信验证码接口被攻击
    【支付专区】之检查微信预下单返回结果
    【mybatis】之批量添加
    【java】之转码
    【springmvc】之常用的注解
    数字信号处理MATLAB简单序列
    matlab中同一文件定义子函数的方法
    MATLAB 单变量函数一阶及N阶求导
    Android 学习笔记1
    java socket tcp(服务器循环检测)
  • 原文地址:https://www.cnblogs.com/ligao/p/6387426.html
Copyright © 2011-2022 走看看