大四项目实训,老师要求我们学习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数据库插入数据
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上- <?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>
3.3启动amoeba
双击amoeba安装目录bin文件夹下的amoeba.bat即可。启动会窗口不会关闭,否则出错四、测试amoeba配置是否成功
1.把本次实训用到的shop数据库导入,相应配置文件改为如下:
amoeba端口为8066,其中的用户名和密码在amoeba配置文件中配置
2.运行tomcat,执行相应查询操作
模仿京东的界面。。。。。,数据是队友爬下来的
数据查询没有问题,配置成功。可以在从库的日志文件里查看查询日志
更简单的测试方法是用navicat直接连接amoeba,填上端口和用户名密码即可看到数据库