基于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安装目录
-
#数据库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
-
server-id = 2
-
-
# 增加 日志文件, 用于验证读写分离
-
log = C:\program\mysql\log\mysql.log
从库:172.18.0.62
-
server-id = 3
-
-
# 增加 日志文件, 用于验证读写分离
-
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与主库的相对应(看上图)
2.4查看从库状态
在从库执行mysql命令:show slave status\G;
下图的waiting for master to send event 代表已经连接上主库
二、 验证主从库配置是否正确
在主库执行对应数据库的写操作,从库的信息会与主库一致。本次配置同步的数据库为shop 和 test,对test数据库进行操作。
2.1 在主库test数据库插入数据
可以在从库查看到主库写入的信息,说明主从复制配置成功
三、配置amoeba
amoeba官方提供的图:
3.1设置amoeba所在ip访问主从库的权限(主从都要设置)
设置跟给主给从库权限设置类似,不过权限为all,允许amoeba的所有操作
3.2将压缩包解压出来,配置conf目录下的amoeba.xml文件
-
-
-
-
<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>
3.3启动amoeba
四、测试amoeba配置是否成功
1.把本次实训用到的shop数据库导入,相应配置文件改为如下:
amoeba端口为8066,其中的用户名和密码在amoeba配置文件中配置
2.运行tomcat,执行相应查询操作
模仿京东的界面。。。。。,数据是队友爬下来的
数据查询没有问题,配置成功。可以在从库的日志文件里查看查询日志
更简单的测试方法是用navicat直接连接amoeba,填上端口和用户名密码即可看到数据库