zoukankan      html  css  js  c++  java
  • 基于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:programmysqllogmysql.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;

    其中的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:programmysqllogmysql.log

    从库:172.18.0.62

    1.  
      server-id = 3
    2.  
       
    3.  
      # 增加 日志文件, 用于验证读写分离
    4.  
      log = C:programmysqllogmysql.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与主库的相对应(看上图)

    2.4查看从库状态

    在从库执行mysql命令:show slave statusG;

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

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

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

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

     

    2.2.在从库查询

     

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

    三、配置amoeba

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

    amoeba官方提供的图:

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

    设置跟给主给从库权限设置类似,不过权限为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数据库导入,相应配置文件改为如下:

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

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

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

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

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

  • 相关阅读:
    JS重写alert,保证弹窗错误的友好性
    wpf窗体中复合控件焦点控制
    mybatis特殊字符转义
    SpringMVC HandlerMethodArgumentResolver自定义参数转换器
    IntelliJ IDEA创建maven web项目
    shiro app
    Linux查看日志定位问题
    Flask中使用Flask-Migrate扩展迁移数据库
    flask + pymysql操作Mysql数据库
    HTTP
  • 原文地址:https://www.cnblogs.com/guarderming/p/13544322.html
Copyright © 2011-2022 走看看