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

一、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
2.我们这里将amoeba相关软件放在/tmp目录下,这里我们先配置JDK

  1. # 解压JDK软件到/usr/local目录下  
  2. [root@centos tmp]# tar -xf jdk-7u15-linux-x64.tar.gz -C /usr/local/  
  3. # 进入相应目录,并建立java目录  
  4. [root@centos tmp]# cd /usr/local/  
  5. [root@centos local]# mkdir java  
  6. # 将解压出来的内容移到java目录  
  7. [root@centos local]# mv jdk1.7.0_15/* java  
  8. # 设置java环境变量  
  9. [root@centos local]# echo ‘export JAVA_HOME=/usr/local/java’ >> ~/.bashrc  
  10. [root@centos local]# . ~/.bashrc  
  11. # 测试jdk是否正确安装  
  12. [root@centos local]# java -version  
  13. # *******************************  
  14. # 以下这个方法设置JDK[在下面设置amoeba时,会覆盖,所以这里的配置文件,以最下面amoeba的配置为准]  
  15. [root@centos java]# echo $JAVA_HOME  
  16. [root@centos java]# vim /etc/profile  
  17. # 在末尾添加  
  18. export JAVA_HOME=/usr/local/java  
  19. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH  
  20. [root@centos java]# source /etc/profile  
  21. # *******************************  

3.配置amoeba中的dbServer.xml(后端mysql 服务器连接配置)

  1. [root@centos java]# cd /tmp/  
  2. # 建立相应amoeba目录  
  3. [root@centos tmp]# mkdir /usr/local/amoeba  
  4. # 将压缩包解压到指定目录  
  5. [root@centos tmp]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba  
  6. [root@centos tmp]# cd /usr/local/amoeba/  
  7. [root@centos amoeba]# cd conf/  
  8. # 准备修改配置文件  
  9. #/*  以下部分为注解  
  10. #/*  Amoeba总共有7个配置文件,分别如下:  
  11. #/*  Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用来配置Amoeba服务的基本参数,如Amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。  
  12. #/*  数据库服务器配置文件($AMOEBA_HOME/conf/dbServers.xml),用来存储和配置Amoeba所代理的数据库服务器的信息,如:主机IP、端口、用户名、密码等。  
  13. #/*  切分规则配置文件($AMOEBA_HOME/conf/rule.xml),用来配置切分规则。  
  14. #/*  数据库函数配置文件($AMOEBA_HOME/conf/functionMap.xml),用来配置数据库函数的处理方法,Amoeba将使用该配置文件中的方法解析数据库函数。  
  15. #/*  切分规则函数配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用来配置切分规则中使用的用户自定义函数的处理方法。  
  16. #/*  访问规则配置文件($AMOEBA_HOME/conf/access_list.conf),用来授权或禁止某些服务器IP访问Amoeba。  
  17. #/*  日志规格配置文件($AMOEBA_HOME/conf/log4j.xml),用来配置Amoeba输出日志的级别和方式。  
  18.   
  19. # 配置后端mysql 服务器连接[dbServer.xml]  
  20. [root@centos conf]# vim dbServers.xml  
  21. …………………….(省略)  
  22.         <dbServer name=”abstractServer” abstractive=”true”>  
  23.                 <factoryConfig class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>  
  24.                         <property name=”manager”>${defaultManager}</property>  
  25.                         <property name=”sendBufferSize”>64</property>  
  26.                         <property name=”receiveBufferSize”>128</property>  
  27. # 设置 mysql 数据库的端口  
  28.                         <!– mysql port –>  
  29.                         <property name=”port”>3306</property>  
  30. # 设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,  
  31. # 不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver   
  32.                         <!– mysql schema –>  
  33.                         <property name=”schema”>kongzhong</property>  
  34.  # 设置amoeba连接后端数据库服务器的账号和密码,需在后端数据库器上创建该用户,并授权amoeba连接   
  35.                         <!– mysql user –>  
  36.                         <property name=”user“>kongzhong123</property>  
  37.                         <!–  mysql password –>  
  38.                         <property name=”password”>kongzhong123</property>  
  39.                 </factoryConfig>  
  40.                 <poolConfig class=”com.meidusa.amoeba.net.poolable.PoolableObjectPool”>  
  41.  # 最大连接数[默认]  
  42.                         <property name=”maxActive”>500</property>  
  43.  # 最大空闲连接数[默认]   
  44.                         <property name=”maxIdle”>500</property>  
  45.                         <property name=”minIdle”>10</property>  
  46.                         <property name=”minEvictableIdleTimeMillis”>600000</property>  
  47.                         <property name=”timeBetweenEvictionRunsMillis”>600000</property>  
  48.                         <property name=”testOnBorrow”>true</property>  
  49.                         <property name=”testOnReturn”>true</property>  
  50.                         <property name=”testWhileIdle”>true</property>  
  51.                 </poolConfig>  
  52.         </dbServer>  
  53.  # 设置一个后端的dbServer,名为master ,这个可以随便取,但是为了明确其含义,最好给予特殊含义的单词,这里是主DB SERVER   
  54.         <dbServer name=”master”  parent=”abstractServer”>  
  55.                 <factoryConfig>  
  56.  # 设置这台DB server 的ip地址  
  57.                         <!– mysql ip –>  
  58.                         <property name=”ipAddress”>192.168.1.102</property>  
  59.                 </factoryConfig>  
  60.         </dbServer>  
  61. # 再设置一台后端mysql数据库,这里叫slave,名字需要唯一[这里可以创建N个后端数据库,只要复制下面<dbServer>…</dbServer>]  
  62.         <dbServer name=”slave”  parent=”abstractServer”>  
  63.                 <factoryConfig>  
  64. # 设置这台DB server 的ip地址  
  65.                         <!– mysql ip –>  
  66.                         <property name=”ipAddress”>192.168.1.100</property>  
  67.                 </factoryConfig>  
  68.         </dbServer>  
  69. # 指定一个虚拟的dbServer,将上面定义的dbserver加入这个虚拟的dbserver,相当于组成一个组[这里我们将读的数据库组成一个组]  
  70. # 这里 需要将 name=”mul…” 改成自己想要取的名字,这个名字也需要有含义,后面会用到  
  71.         <dbServer name=”ReadPool” virtual=”true”>  
  72.                 <poolConfig class=”com.meidusa.amoeba.server.MultipleServerPool”>  
  73.                         <!– Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA–>  
  74. # 选择调度算法 1 是轮询 2 是权重 3 是HA 这里选择1 轮询  
  75.                         <property name=”loadbalance”>1</property>  
  76.                         <!– Separated by commas,such as: server1,server2,server1 –>  
  77. # 负载均衡,slave1,slave2当成2个服务器进行调度,这模拟量加权的调度算法。  
  78. # 注意这里使用的dbserver必须是已经定义了的,可以写多个,如slave1,slave2  
  79.                         <property name=”poolNames”>slave</property>  
  80.                 </poolConfig>  
  81.         </dbServer>  
  82. </amoeba:dbServers>  

4. 配置 Amoeba 监听端口[amoeba.xml]

  1. [root@centos conf]# vim amoeba.xml  
  2. …………………….(省略)  
  3.         <proxy>  
  4.                 <!– service class must implements com.meidusa.amoeba.service.Service –>  
  5.                 <service name=”Amoeba for Mysql” class=”com.meidusa.amoeba.net.ServerableConnectionManager”>  
  6.                         <!– port –>  
  7.  # 设置amoeba监听的端口(这里如果默认,后面测试需要指定端口,就是这里的端口)  
  8.                         <property name=”port”>3306</property>  
  9.                         <!– bind ipAddress –>  
  10.                         <!–  
  11.  # 设置监听的接口,如果不设置,则监听所有的IP[选择默认]   
  12.                         <property name=”ipAddress”>127.0.0.1</property>  
  13.                          –>  
  14. …………………….(省略)  
  15.                         <property name=”authenticator”>  
  16.                                 <bean class=”com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator”>  
  17. # 提供客户端连接amoeba时需要使用这里设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关)  
  18.                                         <property name=”user“>kongzhong</property>  
  19. # 提供客户端连接amoeba时需要使用这里设定的密码  
  20.                                         <property name=”password”>kongzhong</property>  
  21.                                         <property name=”filter“>  
  22.                                                 <bean class=”com.meidusa.amoeba.server.IPAccessController”>  
  23.                                                         <property name=”ipFile”>${amoeba.home}/conf/access_list.conf</property>  
  24.                                                 </bean>  
  25.                                         </property>  
  26.                                 </bean>  
  27.                         </property>  
  28.                 </service>  
  29. …………………….(省略)  
  30.         <queryRouter class=”com.meidusa.amoeba.mysql.parser.MysqlQueryRouter”>  
  31.                 <property name=”ruleLoader”>  
  32.                         <bean class=”com.meidusa.amoeba.route.TableRuleFileLoader”>  
  33.                                 <property name=”ruleFile”>${amoeba.home}/conf/rule.xml</property>  
  34.                                 <property name=”functionFile”>${amoeba.home}/conf/ruleFunctionMap.xml</property>  
  35.                         </bean>  
  36.                 </property>  
  37.                 <property name=”sqlFunctionFile”>${amoeba.home}/conf/functionMap.xml</property>  
  38.                 <property name=”LRUMapSize”>1500</property>  
  39.                 <property name=”defaultPool”>master</property>  
  40.                 <!–                 –>  
  41. # 把默认注释掉的读写分离选项,把注释去掉并readpool修改成ReadPool(这个名字,我们前面在dbServer.xml里设置一个读数据库组,这里是作为只读池)   
  42.                 <property name=”writePool”>master</property>  
  43.                 <property name=”readPool”>ReadPool</property>  
  44.                 <property name=”needParse”>true</property>  
  45.         </queryRouter>  

5. 配置amoeba及JAVA的环境变量

  1. [root@centos conf]# vim /etc/profile  
  2. export JAVA_HOME=/usr/local/java  
  3. export AMOEBA_HOME=/usr/local/amoeba  
  4. export PATH=$PATH:$AMOEBA_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin  
  5. [root@centos conf]# source /etc/profile  

6.启动amoeba测试

  1. # 如果确认能够正常启动,就加>>/dev/null 否则还是看一下提示信息  
  2. [root@centos conf]# amoeba start & >>/dev/null   
  3. # 检测启动情况  
  4. [root@centos conf]# netstat -tulnp |grep java  
  5. # 停止amoeba测试指令是否可用  
  6. [root@centos conf]# amoeba stop  

7.在两台数据库做刚才设置中的相应操作

(1).在主DB server上操作

  1. # 建立配置文件指定的数据库  
  2. mysql> create database kongzhong;  
  3. mysql> use kongzhong  
  4. # 创建用于测试的表  
  5. mysql> create table t1(name varchar(10));  
  6. # 插入测试数据  
  7. mysql> insert into t1 values(‘102’);  
  8. # 授予amoeba用户连接数据库的权限  
  9. mysql> grant all privileges on kongzhong.* to ‘kongzhong123’@’192.168.1.104’ identified by ‘kongzhong123’;  
  10. mysql> flush privileges;  

(2).在从DB server上操作

  1. # 建立配置文件指定的数据库  
  2. mysql> create database kongzhong;  
  3. mysql> use kongzhong  
  4. # 创建用于测试的表  
  5. mysql> create table t1(name varchar(10));  
  6. # 插入测试数据  
  7. mysql> insert into t1 values(‘100’);  
  8. # 授予amoeba用户连接数据库的权限  
  9. mysql> grant all privileges on kongzhong.* to ‘kongzhong123’@’192.168.1.104’ identified by ‘kongzhong123’;  
  10. mysql> flush privileges;  

8.在任何一台机器上登陆测试,这里的ip地址指向amoeba所在服务器的ip地址

  1. # 登陆相应数据库,查询当前所在数据库(相应大家都应该懂的,就不详细演示了)  
  2. [root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104  
  3. [root@client100 ~]# mysql -ukongzhong -p -h192.168.1.104  
  4. [root@client104 ~]# mysql -ukongzhong -p -h192.168.1.104  

9.遇到的问题

(1).报错1:

  1. The stack size specified is too small, Specify at least 160k  
  2. Error: Could not create the Java Virtual Machine.  
  3. Error: A fatal exception has occurred. Program will exit.  
  4. 解决方法:  
  5. [root@centos bin]# cd /usr/local/amoeba/  
  6. # 修改配置文件  
  7. [root@centos amoeba]# vim bin/amoeba  
  8. 将下面这行  
  9. DEFAULT_OPTS=”-server -Xms1024m -Xmx1024m -Xss128k”  
  10. 修改为:  
  11. DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”  

(2).报错2:

  1. Error: JAVA_HOME environment variable is not set.  
  2. 解决方法:  
  3. [root@centos local]# echo ‘export JAVA_HOME=/usr/local/java’ >> ~/.bashrc  
  4. [root@centos local]# . ~/.bashrc  

10.需要注意的问题,思路延伸

(1).取消日志生成,不然磁盘容易爆满

  1. [root@centos conf]# vim log4j.xml [此文件在amoeba目录下的conf目录下]   
  2. 修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满)  
  3. <param name=”file” value=”${amoeba.home}/logs/project.log”/>  
  4. 改成  
  5. <param name=”file” value=”<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>”/>  

(2).性能优化

  1. [root@centos amoeba]# vim bin/amoeba  
  2. DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k”  
  3. 改成  
  4. DEFAULT_OPTS=”-server -Xms512m -Xmx512m -Xmn100m -Xss1204k”  

 

#             *************************************************************            #

以下优化内容摘录于网上:
1.amoeba优化注意以下几点:
     a.查询的类型,是属于并发少,但是语句复杂的查询,还是属于并发高,语句不复杂的查询。
b.查询的结果,查询结果返回的数据量大小
     c.最终的优化效果取决于后端真实mysqldb的配置,比如并发数,每个并发的缓存分配等,以及mysqldb自身的优化
简单的优化配置:
     a.修改amoeba启动参数,增加JAVA虚拟机的内存
     b.修改amoeba执行程序,查找DEFAULT_OPTS,修改为以下内容:
       DEFAULT_OPTS=”-server -Xms1024m -Xmx1024m -Xss256k”
     c.amoeba.xml中关于多线程和网络的优化
     修改如下参数
    <property name=”readThreadPoolSize”>500</property>
<property name=”clientSideThreadPoolSize”>500</property>
<property name=”serverSideThreadPoolSize”>500</property>
    <property name=”sendBufferSize”>256</property>
    <property name=”receiveBufferSize”>128</property>
这些值对并发的影响到底如何,需要测试。这里 只是根据手册的描述来修改。
    d.amoeba.xml中还有一个处理客户端连接和网络信息使用CPU核数的配置,不过默认配置是主机拥有的CPU核的数量,一般不用修改,如果你的amoeba负载较高,并且机器上还有其他服务,你就可以降低这个配置,避免系统或者其他服务没有资源,或者出现资源争抢,从而导致整理的处理能力 下降。
     查找amoeba.xml文件中connectionManagerList关键字,修改
     <!–
    default value is avaliable Processors
    <property name=”processors”>5</property>、
–>取消注释,并设置processors数量
2.压力测试
我们这里使用amoeba自带的benchmark工具。
(1).编辑查询规则文件
# cat /tmp/amoeba_test.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE properties SYSTEM “http://java.sun.com/dtd/properties.dtd“>
<properties version=”1.0″>
<entry key=”class”>com.meidusa.amoeba.mysql.net.packet.QueryCommandPacket</entry>
<entry key=”command”>3</entry>
<entry key=”query”>
# 这个查询可以根据实际情况进行修改
<![CDATA[select * mysql.user;]]>
</entry>
</properties>
(2). # ./benchmark –help
(3). # ./benchmark -P 8066 -c 10  -f /tmp/amoeba_test.xml  -h 10.1.1.12 -n 10000 -u amoeba -p amoeba
你可以通过改变并发度来查看并发对性能的影响,在找到并发度的瓶颈的时候,在调整原来的参数,寻找最佳的配置参数。
注意:
(1).在调整并发度的时候,后端mysqldb的最大连接总和必须大于benchmark的并发度,不然会出现mysql拒绝服务器的问题。
(2).如果你一台机器能够完全满足应用,就没有必要使用amoeba,应为使用amoeba后,虽然负载上能够得到很大的扩展,但是效率上比直连大打折扣,这个就是有利必有弊吧。

#       *************************************************************      #
# 注:测试的内容来源于网络,没有进行测试,各位可自行测试,并发表自己的测试结果,方便大家进步

基于mysql-proxy实现mysql数据库的读写分离

在我们的业务系统中,随着业务的增长,数据库的压力也随之产生,特别对于查询多于写入的业务环境下,迫切需要对读操作和写操作分离开来,这篇博文,主要描述mysql官方提供的mysql-proxy软件来实现读写分离[其实主要是通过lua脚本实现的],再结合mysql的主从复制,可以提升数据库的并发负载能力。但其稳定性较差,不建议使用,如果公司可以对lua脚本的读写分离重新定制开发,倒可以尝试,从途牛的招聘来看,途牛可能用的这一套,仅是推测。

附上简要原理图:

MY-PROXY

下面描述一下实验环境:

mysql-proxy:192.168.1.104

mysql1:192.168.1.104(master — w)

mysql2:192.168.1.102(slave — r)

mysql3:192.168.1.100(slave — r)

为能看到读写分离的效果,我这里就不配置数据库之间的主从关系,仅做mysql-proxy的配置[这里采用编译安装]

1.编译安装需要安装如下几个软件:[以下几个软件我都解压放在/tmp下]

glib,libenent,lua,pkg-config,mysql-proxy

软件共享下载地址:http://www.kuaipan.cn/file/id_119710994921422889.htm

2.安装pkg-config-0.23.tar.gz

  1. [root@centos tmp]# yum -y install gcc-c++.x86_64  
  2. [root@centos tmp]# tar -xf pkg-config-0.23.tar.gz  
  3. [root@centos tmp]# cd pkg-config-0.23  
  4. [root@centos pkg-config-0.23]# ./configure  
  5. [root@centos pkg-config-0.23]# make  
  6. [root@centos pkg-config-0.23]# make install  
  7. # 确保PKG_CONFIG_PATH环境变量包含了相关的pkg-config配置文件路径:  
  8. [root@centos pkg-config-0.23]# export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  

3.安装libevent-1.4.11-stable.tar.gz

  1. [root@centos tmp]# tar -xf libevent-1.4.11-stable.tar.gz  
  2. [root@centos tmp]# cd libevent-1.4.11-stable  
  3. [root@centos libevent-1.4.11-stable]# ./configure  
  4. [root@centos libevent-1.4.11-stable]#make  
  5. [root@centos libevent-1.4.11-stable]#make install  

4.安装glib-2.20.0.tar.bz2

  1. [root@centos tmp]# tar -xf glib-2.20.0.tar.bz2  
  2. [root@centos tmp]# cd glib-2.20.0  
  3. [root@centos glib-2.20.0]# ./configure  
  4. [root@centos glib-2.20.0]#make  
  5. [root@centos glib-2.20.0]#make install  

5.安装lua-5.1.4.tar.gz

  1. [root@centos lua-5.1.4]# yum -y install readline-devel.x86_64  
  2. [root@centos tmp]# tar -xf lua-5.1.4.tar.gz  
  3. [root@centos tmp]#cd lua-5.1.4  
  4. # 如果你的服务器是64位的,这时要调整一下Makefile:vi src/Makefile,在CFLAGS里加上-fPIC,否则会出错  
  5. # 接下来不用执行常见的configure,直接make,如下:  
  6. [root@centos lua-5.1.4]# make linux  
  7. [root@centos lua-5.1.4]# make install  
  8. # 复制相应文件到指定目录  
  9. [root@centos lua-5.1.4]# cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc  

6.安装mysql,我这里的mysql使用rpm安装mysql-devel[我这里已经安装好了,这一步我省略了]

  1. 注:编译安装完成后,要声明PATH变量,这样可以保证系统能找到mysql_config,后面编译mysql-proxy会用到它  
  2. export PATH=$PATH:/usr/local/mysql/bin  
  3. 同时,还要保证系统能找到mysql库文件:  
  4. vi /etc/ld.so.conf  
  5. 加入/usr/local/mysql/lib目录  
  6. 执行:/sbin/ldconfig /etc/ld.so.conf  

7.安装mysql-proxy-0.8.3.tar.gz

  1. [root@centos tmp]# tar -xf mysql-proxy-0.8.3.tar.gz  
  2. [root@centos tmp]# cd mysql-proxy-0.8.3  
  3. [root@centos mysql-proxy-0.8.3]# ./configure  
  4. [root@centos mysql-proxy-0.8.3]# make  
  5. [root@centos mysql-proxy-0.8.3]# make install  
  6. # 创建相应目录  
  7. [root@centos mysql-proxy-0.8.3]# mkdir -p /usr/local/mysql-proxy/share/doc/mysql-proxy  
  8. # 复制读写分离脚本 和 管理接口脚本  
  9. [root@centos mysql-proxy-0.8.3]#cp /tmp/mysql-proxy-0.8.3/lib/rw-splitting.lua /usr/local/mysql-proxy/share/doc/mysql-proxy/  
  10. [root@centos mysql-proxy-0.8.3]#cp /tmp/mysql-proxy-0.8.3/lib/admin.lua /usr/local/mysql-proxy/share/doc/mysql-proxy/  
  11. # 手动启动mysql-proxy测试  
  12. [root@centos ~]# mysql-proxy –daemon –log-level=debug –log-file=/var/log/mysql-proxy.log \  
  13. > –plugins=”proxy” –proxy-backend-addresses=”192.168.1.104:3306″ \  
  14. > –proxy-read-only-backend-addresses=”192.168.1.102:3306″ \  
  15. > –proxy-read-only-backend-addresses=”192.168.1.102:3307″ \  
  16. > –proxy-lua-script=”/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua” \  
  17. > –plugins=admin \  
  18. > –admin-username=”admin” \  
  19. > –admin-password=”admin” \  
  20. > –admin-lua-script=”/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua”  
  21.   
  22. #/* –daemon 采用daemon方式启动  
  23. #/* –proxy-backend-addresses=** 指定读写都可以的mysql数据库的IP地址和端口  
  24. #/* –proxy-read-only-backend-addresses=**指定只读mysql数据库的IP地址和端口#/* –proxy-lua-script=** 指定读写分离脚本的位置  
  25. #/* –admin-username=** 指定mysql-proxy管理的用户  
  26. #/* –admin-password=** 指定mysql-proxy管理用户的密码  
  27. #/* –admin-lua-script=** 指定mysql-proxy管理接口lua脚本的位置  
  28. #/* –log-level=debug 定义log日志级别,由高到低分别有(error|warning|info|message|debug)  
  29. #/* –log-file=** 定义log日志文件路径  
  30. #/* –admin-address=:4041 指定mysql proxy的管理端口,在这里,表示本机的4041端口[可以省略]  
  31. #/* –proxy-address=:3307 指定mysql proxy的监听端口(默认4040),也可以用 127.0.0.1:3307表示[可以省略],此接口是提供给应用访问数据库的地址和端口  

8.启动数据库[记的关闭防火墙,不然会有问题,也可以添加防火墙策略]

  1. [root@client102 ~]# mysqld_multi start  
  2. [root@client102 ~]# mysqld_multi report  
  3. Reporting MySQL servers  
  4. MySQL server from group: mysqld3306 is running  
  5. MySQL server from group: mysqld3307 is running  
  6. # 登陆数据库 授予mysql-proxy服务器的访问  
  7. [root@client102 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p  
  8. mysql> GRANT all privileges ON *.* TO ‘kongzhong’@’192.168.1.104’ IDENTIFIED BY ‘kongzhong’;  
  9. mysql> flush privileges;  
  10. [root@client102 ~]# mysql -uroot -S /usr/local/mysql/mysqld3307.sock -p  
  11. mysql> GRANT all privileges ON *.* TO ‘kongzhong’@’192.168.1.104’ IDENTIFIED BY ‘kongzhong’;  
  12. mysql> flush privileges;  
  13. [root@centos lib]# /etc/init.d/mysqld start  
  14. [root@centos lib]# mysql -u root -p  
  15. mysql> GRANT all privileges ON *.* TO ‘kongzhong’@’192.168.1.104’ IDENTIFIED BY ‘kongzhong’;  
  16. mysql> flush privileges;  

9.登陆测试

  1. # 这里是mysql-proxy服务器所在的iP地址和提供给外面的访问端口[使用任何一台提供mysql登陆功能的机器,记得关闭防火墙]  
  2. [root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104 –port=4040  
  3. # 正常登陆基本上就证明mysql-proxy已经配置成功  
  4. # 测试的话,使用下面的语句,但需要反复测试,没有压力是没法测出读写分离效果的  
  5. [root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104 –port=4040 -e “select * from mysql.user”  
  6. [root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104 –port=4040 -e “create database kongzhong”  
  7. # 管理接口[此接口也仅能执行这一条命令,查看读写分离状态]  
  8. [root@client102 ~]# mysql -h192.168.1.104 –port=4041 -uadmin -p  
  9. mysql> select * from backends;  
  10. +————-+——————–+———+——+——+——————-+  
  11. | backend_ndx | address | state | type | uuid | connected_clients |  
  12. +————-+——————–+———+——+——+——————-+  
  13. | 1 | 192.168.1.104:3306 | up | rw | NULL | 0 |  
  14. | 2 | 192.168.1.102:3306 | unknown | ro | NULL | 0 |  
  15. | 3 | 192.168.1.102:3307 | unknown | ro | NULL | 0 |  
  16. +————-+——————–+———+——+——+——————-+  
  17. 注意: 在测试读写分离的时候,我们可以分布测试,比如先测试读的语句,查看读写状态是否UP ,然后在测试写的语句,反反复复多测试几次才能看出效果,本人在测试的时候也出现过读的状态不能up 解决办法是 多测试即便就出来了。  
  18. # 因为我们现在还没有写启动脚本,所以只能手动杀掉进程  
  19. [root@centos mysql-proxy]# killall mysql-proxy  

10.配置启动脚本和启动配置文件

  1. # mysql-proxy启动脚本配置  
  2. [root@centos run]# vim /etc/init.d/mysql-proxy  
  3. # 脚本内容如下  
  4. #!/bin/sh  
  5. # Source function library.  
  6. . /etc/rc.d/init.d/functions  
  7. # PROXY_PATH 这里需要指向你mysql-proxy命令所在的路径  
  8. PROXY_PATH=/usr/local/bin  
  9. prog=”mysql-proxy”  
  10. # Source networking configuration.  
  11. . /etc/sysconfig/network  
  12. # Check that networking is up.  
  13. [ ${NETWORKING} = “no” ] &amp;&amp; exit 0  
  14. # Set default mysql-proxy configuration.  
  15. PROXY_OPTIONS=”–daemon”  
  16. PROXY_PID=/var/run/mysql-proxy.pid  
  17. # Source mysql-proxy configuration.  
  18. if [ -f /etc/sysconfig/mysql-proxy ] ; then  
  19. . /etc/sysconfig/mysql-proxy  
  20. fi  
  21. PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH  
  22. # By default it’s all good  
  23. RETVAL=0  
  24. # See how we were called.  
  25. case “$1” in  
  26. start)  
  27. # Start daemon.  
  28. echo -n $”Starting $prog: ”  
  29. daemon $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS –pid-file $PROXY_PID  
  30. RETVAL=$?  
  31. echo  
  32. if [ $RETVAL = 0 ]; then  
  33. touch /var/lock/subsys/mysql-proxy  
  34. fi  
  35. ;;  
  36. stop)  
  37. # Stop daemons.  
  38. echo -n $”Stopping $prog: ”  
  39. killproc $prog  
  40. RETVAL=$?  
  41. echo  
  42. if [ $RETVAL = 0 ]; then  
  43. rm -f /var/lock/subsys/mysql-proxy  
  44. rm -f $PROXY_PID  
  45. fi  
  46. ;;  
  47. restart)  
  48. $0 stop  
  49. sleep 3  
  50. $0 start  
  51. ;;  
  52. condrestart)  
  53. [ -e /var/lock/subsys/mysql-proxy ] &amp;&amp; $0 restart  
  54. ;;  
  55. status)  
  56. status mysql-proxy  
  57. RETVAL=$?  
  58. ;;  
  59. *)  
  60. echo “Usage: $0 {start|stop|restart|status|condrestart}”  
  61. RETVAL=1  
  62. ;;  
  63. esac  
  64. exit $RETVAL  
  65.   
  66. # 写配置文件 启动脚本会读取此配置文件:  
  67. [root@centos run]# vim /etc/sysconfig/mysql-proxy  
  68. # 文件内容如下[此内容需写在一行,不可主从换行,不然会有错]
  69. PROXY_OPTIONS=”–daemon –log-level=debug –log-file=/var/log/mysql-proxy.log –plugins=proxy –proxy-backend-addresses=192.168.1.104:3306 –proxy-read-only-backend-addresses=192.168.1.102:3306 –proxy-read-only-backend-addresses=192.168.1.102:3307 –proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua –plugins=admin –admin-username=admin –admin-password=admin –admin-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua”  
  70. # 赋予脚本执行权限  
  71. [root@centos run]# chmod +x /etc/init.d/mysql-proxy  
  72. # 测试脚本使用:  
  73. [root@centos run]# /etc/init.d/mysql-proxy start  
  74. Starting mysql-proxy: [ OK ]  
  75. [root@centos run]# netstat -tulnap|grep mysql  
  76. tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 5454/mysql-proxy  
  77. tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 5454/mysql-proxy  
  78. [root@centos run]# /etc/init.d/mysql-proxy stop  
  79. Stopping mysql-proxy: [ OK ]  
  80. # 以上mysql-proxy就配置好了,读写分离的效果需要有压力,大家需要反复测试,才能在管理接口上看到  
  81. # mysql的主从搭建,这里就不配置,各位可以参考上面的文章,如果有疑问,可在下面留言反馈。