基于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
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
其中的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:填写主库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与主库的相对应(看上图)
可以在从库查看到主库写入的信息,说明主从复制配置成功
amoeba官方提供的图:
设置跟给主给从库权限设置类似,不过权限为all,允许amoeba的所有操作
[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
amoeba端口为8066,其中的用户名和密码在amoeba配置文件中配置
模仿京东的界面。。。。。,数据是队友爬下来的数据查询没有问题,配置成功。可以在从库的日志文件里查看查询日志
更简单的测试方法是用navicat直接连接amoeba,填上端口和用户名密码即可看到数据库
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,填上端口和用户名密码即可看到数据库
相关文章推荐
- 基于windows的mysql读写分离和amoeba配置
- mysql基于amoeba配置读写分离
- mysql主从配置以及基于amoeba实现读写分离
- windows 下 MySQL读写分离、主从复制、通过amoeba代理实现读写分离 配置全过程
- Mysql 5.6 基于GTID的主从复制及使用Amoeba配置读写分离
- amoeba安装及读写分离配置(windows版)
- 基于linux 的mysql的主从同步配置读写分离
- ubuntu 下基于mycat的mysql读写分离配置
- mysql配置主从复制,读写分离(附amoeba源码包)
- 基于代理模式sharding-jdbc的mysql一主多从读写分离配置文件备份
- Mysql 分布式集群 主从同步 读写分离 amoeba 中间件配置
- 基于MYCAT的MYSQL主从与读写分离配置详解与示例
- Mysql 基于 Amoeba 的 读写分离
- 基于数据库中间件Mycat的MySQL主从与读写分离配置详解与示例
- MySQL之——基于Amoeba实现读写分离
- mysql5.6主从复制与基于amoeba实现读写分离
- Amoeba for MySQL 读写分离配置
- linux 安装mysql和主从配置 + Spring 基于注解配置mysql读写分离
- mysql基于mysql-proxy和amoeba的读写分离以及tcpdump+wireshark工具验证(下)
- mysql基于amoeba的读写分离