MySQL主从复制与读写分离在windows系统下的实现(amoeba3.0+mysql5.1实现)因版本问题,本文在原来文章基础上有更改并且本人已经测试成功

本文详细介绍了在Windows系统下如何配置MySQL主从复制和基于Amoeba For MySQL读写分离集群环境,包括环境准备、配置步骤等关键步骤。

MySQL主从复制与读写分离在windows系统下的实现(amoeba+mysql实现)

一、简介   

在实际生产环境中,一台MySQL服务器是很难做到高可用(HA)。对于一台 MySQL

服务器,如果没有及时做数据备份,一旦遇到故障宕机后将无法继续提供后端数据业务。

而且随着业务和需求的不断发展,应用系统对数据库性能要求也越来越高,单一的数据

库节点对于高并发、高负载场景呈现出各种瓶颈问题也越来越突出,已经无法满足相应

应用场景的需求。 而数据库集群技术通过水平扩展的方式将负载分散到多个节点上以解

决一个数据库节点的不足。 

MySQL集群技术广泛应用下,以基于MySQL数据库主从复制及基于Amoeba For 

MySQL读写分离最为常见。本手册为配置搭建 MySQL主从复制和基于 Amoeba For 

MySQL读写分离集群环境提供参考。 

 

二、环境准备 

Ø  硬件环境 

计算机4台: 

节点名称  IP  端口 

Master   192.168.1.110  3306 

Slave1   192.168.1.115  3306 

Slave2   192.168.1.116  3306 

Amoeba  192.168.1.102  8806 

软件环境 

JDK 

下载地址:http://www.oracle.com/technetwork/java/javase/archive-139210.html 

安装过程:略。 

设置环境变量:依次选择“计算机->属性->高级系统设置->高级->环境变量”,

然后在系统变量中新建 JAVA_HOME变量,值为 C:\Program Files\Java\jdk1.6.0_10

新建classpath变量,值为.;%JAVA_HOME%\lib.jar;%JAVA_HOME%\lib\tools.jar

最后找到path变量,在path变量中添加%JAVA_HOME%\bin。 

注意: 

²  在添加环境时,多个变量之间用分号隔开; 

²  在 classpath 变量值的前面一定要记得加上“.”,表示在当前路径中找不

到时才会去%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar中找相应的

类; 

²  path中的变量%JAVA_HOME%\bin最好放在最前面,以防止安装了 oracle

数据库的系统中,oracle所添加的低版本的 jdk的影响。 

查看环境变量是否安装成功:打开命令行窗口,执行java -version 命令,出现

如下信息表示安装成功。 

 

MySQL 

下载地址:http://dev.mysql.com/downloads

安装过程:略。 

 

Amoeba 

下载地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/ 

在线文档:http://docs.hexnova.com/amoeba/ 

 

安装过程:将其解压到任意目录,并且目录不能包含空格和中文。这里安装即解压

到了D:\amoeba-mysql-3.0.5-RC\下。 

注意:Amoeba 所要求的版本最小是 5.0

三、配置步骤 

1.  MySQL主从复制 

1)  主从复制拓扑结构图: 

 

复制的过程: 

master将改变记录到二进制日志(Binary log)中(这些记录叫做二进制日志事

件,binary log events); 

slave将 master 的 binary log events拷贝到它的中继日志(relay log);  

slave重做中继日志中的事件,将改变反映它自己的数据。 

2)  配置步骤: 

①  创建复制账号 

GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456'; 

 

②  配置主(Master)节点 

在主节点MySQL安装目录下的 my.ini文件的[mysqld]下加入以下配置: 

server-id=1   

log-bin=mysql-bin 

 

 

③  配置从(Slave1Slave2)节点 

在从节点Slave1的 MySQL安装目录下的 my.ini文件的[mysqld]下加入以下

配置: 

#log_bin = mysql-bin 

server_id=2 

relay_log=mysql-relay-bin 

#log_slave_updates=1     

read_only=1 

skip-slave-start 

在从节点Slave2的 MySQL安装目录下的 my.ini文件的[mysqld]下加入以下

配置: 

#log_bin = mysql-bin 

server_id=3 

relay_log=mysql-relay-bin 

#log_slave_updates=1     

read_only=1 

skip-slave-start 

 

 

 

 

④  数据同步(将主节点上的数据复制到从节点,使其数据在某个时刻保持一致) 

I.  保证此次同步备份过程中主节点上不会有新数据或程序(存储过程)的写入或

更新,若在备份过程中有新数据写入则会等待直到解锁后才会执行。 

    mysql> flush tables with read lock; 

II.    查看 master 状态信息,记录下 filePosition信息。 

    mysql> show master status; 

+---------------------------------------------------------------------+  

| File          | Position  | Binlog_Do_DB  | Binlog_Ignore_DB    |  

+--------------------------------------------------------------------+  

| mysql-bin.000003 | 106       |            |                 | 

+---------------------------------------------------------------------+  

III.  备份数据 (参考网站:http://blog.youkuaiyun.com/bxbx258/article/details/2945832)

mysql的备份(command下完成,此步要先把mysql下的bin路径加入系统变量Path):

mysqldump -h localhost -u root -pmysql test > c:/tempdata/datatest.sql

IV.    待备份完成后进行解锁  

mysql> UNLOCK TABLES; 

V.    登录从节点,导入主的快照 

mysql数据恢复:(command下完成,此步要先把mysql下的bin路径加入系统变量Path):

mysql -h localhost -u root -pmysql test<c:/tempdata/datatest.sql

⑤  重启服务,使配置生效 

进入windows 服务管理器,重新启动 MasterSlave1和 Slave2节点的

MySQL服务。 

⑥  登录从节点 Slave1Slave2,并分别设置与主服务器相关的配置参数 

mysql> change master to

    -> MASTER_HOST='192.168.1.110',

    -> MASTER_USER='root',

    -> MASTER_PASSWORD='mysql',

    -> MASTER_LOG_FILE='mysql-bin.000003',

    -> MASTER_LOG_POS=106;

Query OK, 0 rows affected (0.08 sec)

注意: 

²  如果之前配过主从复制,并且 Slave是启动的话,则要先执行 slave stop

停止slave 服务; 

²  MASTER_LOG_FILE 和 MASTER_LOG_POS的值就是之前记录下的 master 

的 file和 Position信息。

此配置完成后,无论主从服务器什么时候重启,只要主服务有数据变动,从服务器都会进行记录并同步,但是这种配置,如果对从服务器进行数据改动,可是不会对主服务器(1.110)造成影响的。单向的。

⑦  开启Slave 服务,分别在从节点 Slave1Slave2 节点上执行以下命令 

mysql> slave start; 

注:从服务器slave stop之后,主服务器上的操作是不会被从服务器记录的,所以数据不会发生改变,但是slave start之后,从服务器便会自动同步主服务器里面的数据,达到同步。

 

⑧  查看从节点 Slave1Slave2的状态信息 

mysql> show slave status\G 

 

如果看到:Slave_IO_Running: YesSlave_SQL_Running: Yes 

明启动复制功能成功了。 

⑨  测试是否进行主从复制 

在主节点上创建库(mytest)、表(create table t1(id int))、插入

数据,如果在从节点上也能看到新创建的库、表和插入的数据,证明从节点已经同

步了主节点的数据。整个主从复制配置 OK。即主从复制已经配置成功了。。 

 

 

2.  基于 Amoeba的读写 

1)  读写分离系统架构图: 

 

读写分离过程: 

客户端向后台发起数据库读写操作请求; 

Amoeba将客户发起的写(INSERTUPDATEDELETE)请求分发到 Master

节点,将客户端发起的读(SELECT)请求分发到Slave1Slave2 节点,并对

Slave1Slave2 做负载均衡; 

Slave1和 Slave2通过MySQL的复制功能使其数据和 Master中的数据保

持一致。 

 

2)  配置步骤: 

进入 D:\amoeba-mysql-3.0.5-RC\conf(ip192.168.1.102的主机下),配置 amoeba.xml文件: 

①  配置service

<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">

<property name="port">8066</property>

<property name="ipAddress">192.168.1.102</property>

 

<!-- proxy server net IO Read thread size -->

<property name="readThreadPoolSize">50</property>

<!-- proxy server client process thread size -->

<property name="clientSideThreadPoolSize">80</property>

<!-- mysql server data packet process thread size --> 

<property name="serverSideThreadPoolSize">80</property>

<!-- socket Send and receive BufferSize(unit:K)  -->

<property name="netBufferSize">100</property>

<!--  Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm).--> 

<property name="tcpNoDelay">true</property>

 

<property name="connectionFactory">

<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">

<property name="sendBufferSize">128</property>

<property name="receiveBufferSize">64</property>

</bean>

</property>

<property name="authenticateProvider">

<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

<property name="user">amoeba</property>

<property name="password">amoeba</property>

<property name="filter">

  <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">

<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>

   </bean>

</property>

</bean>

</property>

</service>

 

②  配置ConnectionManager 

<!--  

  每个 ConnectionManager都将作为一个线程启动, 

  manager 负责 Connection IO 读写/死亡检测 

  --> 

<connectionManagerList>

<connectionManager  name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">

 <propertyname="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>

</connectionManager>

</connectionManagerList>

 

③  配置dbServers.xml

<dbServerList> 

  <!--  

  一台 mysqlServer 需要配置一个 pool,如果多台平等的 mysql 需要进行 loadBalance, 

平台已经提供一个具有负载均衡能力的 objectPoolcom.meidusa.amoeba.mysql. 

server.MultipleServerPool 简单的配置是属性加上 virtual="true",该 Pool 不允

  许配置 factoryConfig或者自己写一个 ObjectPool--> 

<dbServer name="master">

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="connectionManager">${defaultManager}</property>

<property name="sendBufferSize">64</property>

<property name="receiveBufferSize">128</property>

<!-- mysql port -->

<property name="port">3306</property>

<property name="ipAddress">192.168.1.110</property> 

<!-- mysql schema -->

<property name="schema">copytest</property>

<!-- mysql user -->

<property name="user">root</property>

<property name="password">mysql</property>

</factoryConfig>

 

<poolConfig class="com.meidusa.toolkit.common.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="testOnReturn">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

 

<dbServer name="slave1">

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="connectionManager">${defaultManager}</property>

<property name="sendBufferSize">64</property>

<property name="receiveBufferSize">128</property>

<!-- mysql port -->

<property name="port">3306</property>

<property name="ipAddress">192.168.1.115</property> 

<!-- mysql schema -->

<property name="schema">copytest</property>

<!-- mysql user -->

<property name="user">root</property>

<property name="password">mysql</property>

</factoryConfig>

 

<poolConfig class="com.meidusa.toolkit.common.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="testOnReturn">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="slave2">

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="connectionManager">${defaultManager}</property>

<property name="sendBufferSize">64</property>

<property name="receiveBufferSize">128</property>

<!-- mysql port -->

<property name="port">3306</property>

<property name="ipAddress">192.168.1.116</property> 

<!-- mysql schema -->

<property name="schema">copytest</property>

<!-- mysql user -->

<property name="user">root</property>

<property name="password">mysql</property>

</factoryConfig>

 

<poolConfig class="com.meidusa.toolkit.common.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="testOnReturn">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

 

<dbServer name="multiPool" virtual="true">

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

<property name="loadbalance">1</property>

<!-- Separated by commas,such as: slave1,slave2,slave1,则负载为2:1-->

<property name="poolNames">slave1,slave2</property>

</poolConfig>

</dbServer>

 

④  配置queryRouter 

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

<property name="ruleLoader">

<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">

<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>

<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>

</bean>

</property>

<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property>

<property name="writePool">master</property>

<property name="readPool">multiPool</property>

<property name="needParse">true</property>

</queryRouter>

⑤  配置IP访问控制 

进入 D:\amoeba-mysql-3.0.5-RC\conf下,配置 access_list.conf

文件,在里面加入:192.168.1.*:yes。 

⑥  启动Amoeba 

cmd 进入到 F:\amoeba\amoeba-mysql-0.32\bin\目录下,执行 launcher.bat如果没有错,说明启动成功了。 

⑦  读写分离和主从复制应用整合 

只需修改原数据库配置信息就 OK了。 

如下: 

原数据源配置信息: 

<bean id="dataSource"  

  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 

  <property name="driverClassName"> 

com.mysql.jdbc.Driver 

</property> 

<property name="url"> 

jdbc:mysql://ip:3306/mytest?useUnicode=true&characterEncoding=utf8 

</property> 

  <property name="username">root</property> 

  <property name="password">root</property> 

</bean> 

修改后的配置信息: 

<bean id="dataSource"  

  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 

  <property name="driverClassName"> 

com.mysql.jdbc.Driver 

</property> 

<property name="url"> 

jdbc:mysql://192.168.1.102:8066/copytest?useUnicode=true&characterEncoding=utf8 

</property> 

  <property name="username">amoeba</property> 

  <property name="password">amoeba</property> 

</bean> 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值