您的位置:首页 > 数据库 > MySQL

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

2018-03-27 19:04 585 查看
大四项目实训,老师要求我们学习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.zipamoeba下载地址: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安装目录[html] view plain copy#数据库ID号, 一般为1时表示为Master,从库id大于主库     
server-id = 1    
#启用二进制日志;    
log-bin=mysql-bin    
#需要同步的二进制数据库名;    
binlog-do-db=shop  
binlog-do-db=test     
#不同步的二进制数据库名,如果不设置可以将其注释掉;    
binlog-ignore-db=information_schema        
#设定生成的log文件名;    
log=C:\program\mysql\log\mysql.log    
#把更新的记录写到二进制文件中;    
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[html] view plain copyserver-id = 2    
    
# 增加 日志文件, 用于验证读写分离    
log = C:\program\mysql\log\mysql.log  
从库:172.18.0.62[html] view plain copyserver-id = 3    
    
# 增加 日志文件, 用于验证读写分离    
log = C:\program\mysql\log\mysql.log  

2.2重启mysql服务

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

命令1stopslave;
命令2:填写主库ipchange master tomaster_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 status\G;       下图的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上
[html] view plain copy<?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>  
          
        <span style="color:#ff0000;"><!-- proxy server绑定的IP -->  
        <!—amoeba所在电脑的ip -->  
        <property name="ipAddress">172.18.0.202</property></span>  
          
        <!-- 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>  
          
        <span style="color:#ff6666;"><!-- 对外验证的用户名 -->  
        <property name="user">root</property>  
          
        <!-- 对外验证的密码 -->  
          
        <property name="password">546626</property></span>  
          
    </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。  
        -->  
        <span style="color:#ff0000;"><dbServer name="master">  
              
            <!-- 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">172.18.0.48</property>  
                <property name="schema">shop</property>  
                  
                <!-- 用于登陆mysql的用户名 -->  
                <property name="user">amoeba</property>  
                  
                <!-- 用于登陆mysql的密码 -->  
                  
                  
                <property name="password">546626</property>  
                  
                  
            </factoryConfig></span>  
              
            <!-- 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>  
  
        <span style="color:#ff0000;"><dbServer name="slave1">  
              
            <!-- 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">172.18.0.60</property>  
                <property name="schema">shop</property>  
                  
                <!-- 用于登陆mysql的用户名 -->  
                <property name="user">amoeba</property>  
                  
                <!-- 用于登陆mysql的密码 -->  
                  
                  
                <property name="password">546626</property>  
                  
                  
            </factoryConfig></span>  
              
            <!-- 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>  
          
        <span style="color:#ff0000;"><dbServer name="slave2">  
              
            <!-- 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">172.18.0.62</property>  
                <property name="schema">shop</property>  
                  
                <!-- 用于登陆mysql的用户名 -->  
                <property name="user">amoeba</property>  
                  
                <!-- 用于登陆mysql的密码 -->  
                  
                  
                <property name="password">546626</property>  
                  
                  
            </factoryConfig></span>  
              
            <!-- 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="multiPool" virtual="true">  
            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">  
                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->  
                <property name="loadbalance">1</property>  
                  
                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->  
                <span style="color:#ff0000;"><property name="poolNames">slave1,slave2</property></span>  
            </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>  
        <span style="color:#ff0000;"><property name="defaultPool">master</property></span>  
          
          
        <property name="writePool">master</property>  
        <property name="readPool">multiPool</property>  
          
        <property name="needParse">true</property>  
    </queryRouter>  
</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,填上端口和用户名密码即可看到数据库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: