基于windows的mysql读写分离和amoeba配置

 

 

 

大四项目实训,老师要求我们学习mysql的集群和mysql的读写分离。mysql集群已经搞定,也是基于windows下的,实验室机器都是windows的。mysql集群已经学会如何配置,但是感觉意义并没有那么大,毕竟在实际生产中基本都是使用mysql的读写分离。下面,分享一下我配置mysql读写分离的过程。

 

mysql读写分离是mysql自带的功能,只要配置好了从库和主库,就能实现读写分离,关键是在于需要代理分发请求到mysql的从库和主库上才能实现数据库的负载均衡。

 

本次配置使用的是虚拟机,和本机,相当于四台电脑。

 

准备如下:

 

oracle vm :  win7-1(主)  win7-2(从库) win7-3(从库)

              主库:           172.18.0.48

              从库1:      172.18.0.60

              从库2:      172.18.0.62 

              amoeba: 172.18.0.202(本机)

 

系统:win7 32位

         mysql版本:mysql-5.5.28-win32.msi

         amoeba版本:amoeba-mysql-1.2.0-GA.zip

amoeba下载地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/

 

(本次的配置相关文件下载地址 )http://pan.baidu.com/s/1nuCEZ3r 密码:c604

 

一、配置主库

 

1.配置主库:172.18.0.48

 

1.1在my.ini文件最后添下表信息:mysql安装目录

 

  1.  
    #数据库ID号, 一般为1时表示为Master,从库id大于主库
  2.  
    server-id = 1
  3.  
    #启用二进制日志;
  4.  
    log-bin=mysql-bin
  5.  
    #需要同步的二进制数据库名;
  6.  
    binlog-do-db=shop
  7.  
    binlog-do-db=test
  8.  
    #不同步的二进制数据库名,如果不设置可以将其注释掉;
  9.  
    binlog-ignore-db=information_schema
  10.  
    #设定生成的log文件名;
  11.  
    log=C:\program\mysql\log\mysql.log
  12.  
    #把更新的记录写到二进制文件中;
  13.  
    log-slave-updates

 

1.2重启mysql服务。

cmd命令行: net stop mysql net start mysql

或者服务窗口鼠标操作

 

1.3 配置从库访问主库的权限

 

grant replication slave on *.* to repl_user@172.18.0.60 identified by ‘123456‘;

grant replication slave on *.* to repl_user@172.18.0.62 identified by ‘123456‘;

 

1.4查看主库信息。

登入mysql命令行,执行:    showmaster status;

基于windows的mysql读写分离和amoeba配置

 

其中的File 和Position 在配置从库的时候要用到

2.配置从库:172.18.0.60 172.18.0.62  (两个从库配置一样)

2.1在从库mysql安装目录下的my.ini文件末尾加入一下信息:

id不可重复,比主库id大

从库:172.18.0.60

 

  1.  
    server-id = 2
  2.  
     
  3.  
    # 增加 日志文件, 用于验证读写分离
  4.  
    log = C:\program\mysql\log\mysql.log

从库:172.18.0.62

 

 

  1.  
    server-id = 3
  2.  
     
  3.  
    # 增加 日志文件, 用于验证读写分离
  4.  
    log = C:\program\mysql\log\mysql.log

 

 

2.2重启mysql服务

2.3 进入mysql命令行界面,进行相应设置,输入以下命令

 

命令1

stopslave;

 

命令2:填写主库ip

 

change master to

master_host=‘172.18.0.48‘,

master_user=‘repl_user‘,

master_password=‘123456‘,

master_log_file=‘mysql-bin.000006‘,

master_log_pos=2266821;

 

命令3:

start slave;

 

其中的master_log_file和master_log_pos与主库的相对应(看上图)

基于windows的mysql读写分离和amoeba配置

 

2.4查看从库状态

在从库执行mysql命令:show slave status\G;

       下图的waiting  for master to send event  代表已经连接上主库

基于windows的mysql读写分离和amoeba配置

 

 

二、 验证主从库配置是否正确

在主库执行对应数据库的写操作,从库的信息会与主库一致。本次配置同步的数据库为shop 和 test,对test数据库进行操作。

 

2.1 在主库test数据库插入数据

基于windows的mysql读写分离和amoeba配置
 

2.2.在从库查询

基于windows的mysql读写分离和amoeba配置
 

 

可以在从库查看到主库写入的信息,说明主从复制配置成功

 

 

三、配置amoeba

原理:所有mysql写入读取语句由amoeba负责代理转发到相应的主库从库,实现数据库负载均衡
 

amoeba官方提供的图:

基于windows的mysql读写分离和amoeba配置

3.1设置amoeba所在ip访问主从库的权限(主从都要设置)

基于windows的mysql读写分离和amoeba配置

 

设置跟给主给从库权限设置类似,不过权限为all,允许amoeba的所有操作

 

 

3.2将压缩包解压出来,配置conf目录下的amoeba.xml文件

有参考其他博文,配置上基本有dbServer.xml,但是官方下载的amoeba压缩包没有这个文件,需要手动创建,amoeba.xml引入这个配置。
本次配置跟其他不同,dbServer.xml 没有独立出来,直接配置在amoeba.xml上
 
  1.  
    <?xml version="1.0" encoding="gbk"?>
  2.  
     
  3.  
    <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
  4.  
    <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
  5.  
     
  6.  
    <server>
  7.  
    <!-- proxy server绑定的端口 -->
  8.  
    <property name="port">8066</property>
  9.  
     
  10.  
    <span style="color:#ff0000;"><!-- proxy server绑定的IP -->
  11.  
    <!—amoeba所在电脑的ip -->
  12.  
    <property name="ipAddress">172.18.0.202</property></span>
  13.  
     
  14.  
    <!-- proxy server net IO Read thread size -->
  15.  
    <property name="readThreadPoolSize">20</property>
  16.  
     
  17.  
    <!-- proxy server client process thread size -->
  18.  
    <property name="clientSideThreadPoolSize">30</property>
  19.  
     
  20.  
    <!-- mysql server data packet process thread size -->
  21.  
    <property name="serverSideThreadPoolSize">30</property>
  22.  
     
  23.  
    <!-- socket Send and receive BufferSize(unit:K) -->
  24.  
    <property name="netBufferSize">128</property>
  25.  
     
  26.  
    <!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm). -->
  27.  
    <property name="tcpNoDelay">true</property>
  28.  
     
  29.  
    <span style="color:#ff6666;"><!-- 对外验证的用户名 -->
  30.  
    <property name="user">root</property>
  31.  
     
  32.  
    <!-- 对外验证的密码 -->
  33.  
     
  34.  
    <property name="password">546626</property></span>
  35.  
     
  36.  
    </server>
  37.  
     
  38.  
    <!--
  39.  
    每个ConnectionManager都将作为一个线程启动。
  40.  
    manager负责Connection IO读写/死亡检测
  41.  
    -->
  42.  
    <connectionManagerList>
  43.  
    <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
  44.  
    <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
  45.  
     
  46.  
    <!--
  47.  
    default value is avaliable Processors
  48.  
    <property name="processors">5</property>
  49.  
    -->
  50.  
    </connectionManager>
  51.  
    </connectionManagerList>
  52.  
     
  53.  
    <dbServerList>
  54.  
    <!--
  55.  
    一台mysqlServer 需要配置一个pool,
  56.  
    如果多台 平等的mysql需要进行loadBalance,
  57.  
    平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
  58.  
    简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
  59.  
    或者自己写一个ObjectPool。
  60.  
    -->
  61.  
    <span style="color:#ff0000;"><dbServer name="master">
  62.  
     
  63.  
    <!-- PoolableObjectFactory实现类 -->
  64.  
    <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  65.  
    <property name="manager">defaultManager</property>
  66.  
     
  67.  
    <!-- 真实mysql数据库端口 -->
  68.  
    <property name="port">3306</property>
  69.  
     
  70.  
    <!-- 真实mysql数据库IP -->
  71.  
    <property name="ipAddress">172.18.0.48</property>
  72.  
    <property name="schema">shop</property>
  73.  
     
  74.  
    <!-- 用于登陆mysql的用户名 -->
  75.  
    <property name="user">amoeba</property>
  76.  
     
  77.  
    <!-- 用于登陆mysql的密码 -->
  78.  
     
  79.  
     
  80.  
    <property name="password">546626</property>
  81.  
     
  82.  
     
  83.  
    </factoryConfig></span>
  84.  
     
  85.  
    <!-- ObjectPool实现类 -->
  86.  
    <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  87.  
    <property name="maxActive">200</property>
  88.  
    <property name="maxIdle">200</property>
  89.  
    <property name="minIdle">10</property>
  90.  
    <property name="minEvictableIdleTimeMillis">600000</property>
  91.  
    <property name="timeBetweenEvictionRunsMillis">600000</property>
  92.  
    <property name="testOnBorrow">true</property>
  93.  
    <property name="testWhileIdle">true</property>
  94.  
    </poolConfig>
  95.  
    </dbServer>
  96.  
     
  97.  
    <span style="color:#ff0000;"><dbServer name="slave1">
  98.  
     
  99.  
    <!-- PoolableObjectFactory实现类 -->
  100.  
    <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  101.  
    <property name="manager">defaultManager</property>
  102.  
     
  103.  
    <!-- 真实mysql数据库端口 -->
  104.  
    <property name="port">3306</property>
  105.  
     
  106.  
    <!-- 真实mysql数据库IP -->
  107.  
    <property name="ipAddress">172.18.0.60</property>
  108.  
    <property name="schema">shop</property>
  109.  
     
  110.  
    <!-- 用于登陆mysql的用户名 -->
  111.  
    <property name="user">amoeba</property>
  112.  
     
  113.  
    <!-- 用于登陆mysql的密码 -->
  114.  
     
  115.  
     
  116.  
    <property name="password">546626</property>
  117.  
     
  118.  
     
  119.  
    </factoryConfig></span>
  120.  
     
  121.  
    <!-- ObjectPool实现类 -->
  122.  
    <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  123.  
    <property name="maxActive">200</property>
  124.  
    <property name="maxIdle">200</property>
  125.  
    <property name="minIdle">10</property>
  126.  
    <property name="minEvictableIdleTimeMillis">600000</property>
  127.  
    <property name="timeBetweenEvictionRunsMillis">600000</property>
  128.  
    <property name="testOnBorrow">true</property>
  129.  
    <property name="testWhileIdle">true</property>
  130.  
    </poolConfig>
  131.  
    </dbServer>
  132.  
     
  133.  
    <span style="color:#ff0000;"><dbServer name="slave2">
  134.  
     
  135.  
    <!-- PoolableObjectFactory实现类 -->
  136.  
    <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  137.  
    <property name="manager">defaultManager</property>
  138.  
     
  139.  
    <!-- 真实mysql数据库端口 -->
  140.  
    <property name="port">3306</property>
  141.  
     
  142.  
    <!-- 真实mysql数据库IP -->
  143.  
    <property name="ipAddress">172.18.0.62</property>
  144.  
    <property name="schema">shop</property>
  145.  
     
  146.  
    <!-- 用于登陆mysql的用户名 -->
  147.  
    <property name="user">amoeba</property>
  148.  
     
  149.  
    <!-- 用于登陆mysql的密码 -->
  150.  
     
  151.  
     
  152.  
    <property name="password">546626</property>
  153.  
     
  154.  
     
  155.  
    </factoryConfig></span>
  156.  
     
  157.  
    <!-- ObjectPool实现类 -->
  158.  
    <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  159.  
    <property name="maxActive">200</property>
  160.  
    <property name="maxIdle">200</property>
  161.  
    <property name="minIdle">10</property>
  162.  
    <property name="minEvictableIdleTimeMillis">600000</property>
  163.  
    <property name="timeBetweenEvictionRunsMillis">600000</property>
  164.  
    <property name="testOnBorrow">true</property>
  165.  
    <property name="testWhileIdle">true</property>
  166.  
    </poolConfig>
  167.  
    </dbServer>
  168.  
     
  169.  
    <dbServer name="multiPool" virtual="true">
  170.  
    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
  171.  
    <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
  172.  
    <property name="loadbalance">1</property>
  173.  
     
  174.  
    <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
  175.  
    <span style="color:#ff0000;"><property name="poolNames">slave1,slave2</property></span>
  176.  
    </poolConfig>
  177.  
    </dbServer>
  178.  
     
  179.  
    </dbServerList>
  180.  
     
  181.  
    <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
  182.  
    <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
  183.  
    <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
  184.  
    <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
  185.  
    <property name="LRUMapSize">1500</property>
  186.  
    <span style="color:#ff0000;"><property name="defaultPool">master</property></span>
  187.  
     
  188.  
     
  189.  
    <property name="writePool">master</property>
  190.  
    <property name="readPool">multiPool</property>
  191.  
     
  192.  
    <property name="needParse">true</property>
  193.  
    </queryRouter>
  194.  
    </amoeba:configuration>
 
关于dbServer的配置可以看这个链接,里面有详细说明各节点配置的含义http://docs.hexnova.com/amoeba/rw-splitting.html#example.rw.dbServer.virtualSlave

3.3启动amoeba

双击amoeba安装目录bin文件夹下的amoeba.bat即可。启动会窗口不会关闭,否则出错
 

四、测试amoeba配置是否成功

1.把本次实训用到的shop数据库导入,相应配置文件改为如下:

基于windows的mysql读写分离和amoeba配置

 

amoeba端口为8066,其中的用户名和密码在amoeba配置文件中配置

 

 

2.运行tomcat,执行相应查询操作

基于windows的mysql读写分离和amoeba配置

模仿京东的界面。。。。。,数据是队友爬下来的

 

 

数据查询没有问题,配置成功。可以在从库的日志文件里查看查询日志

 

更简单的测试方法是用navicat直接连接amoeba,填上端口和用户名密码即可看到数据库

基于windows的mysql读写分离和amoeba配置

上一篇:windows环境下mysql主从配置


下一篇:MySQL教程78-INNER JOIN 内连接