关闭

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

718人阅读 评论(1) 收藏 举报
分类:

大四项目实训,老师要求我们学习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>

关于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,填上端口和用户名密码即可看到数据库



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5796次
    • 积分:214
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类