MySQL读写分离

一:实验环境介绍

在这里插入图片描述
5台虚拟机,一台作为客户端用于对数据库的读写操作,一台做amoeba代理,把客户端对数据库的写操作交给master,读操作交给slave(slave01与slave02轮循读取),slave01与slave02通过master进行主从同步。

读写分离的前提要有主从复制,主从复制的配置请查看之前的博客,本篇主要介绍在主从复制的基础上通过amoeba实现读写分离的配置。

数据库版本为mysql5.7。

二:实验步骤

2.1:amoeba代理服务的配置

2.1.1:安装jdk软件包

 ##把jdk文件jdk-6u14-linux-x64.bin上传到/usr/local 目录
chmod +x jdk-6u14-linux-x64.bin  ##添加执行权限
./jdk-6u14-linux-x64.bin  ##安装

yes   ##出现提示时选择yes


mv jdk1.6.0_14 /usr/local/jdk1.6  ##重命名

mkdir /usr/local/amoeba   ##创建amoeba的文件目录
## 添加环境变量
vim /etc/profile
...
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin

source /etc/profile  ##让环境变量生效

2.1.2:安装amoeba软件

把amoebade的压缩包上传到/opt目录

##解压软件包
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ 
##修改权限
chmod -R 755 /usr/local/amoeba/
##执行amoeba命令
/usr/local/amoeba/bin/amoeba
##显示amoeba start|stop 说明安装成功

2.1.3:在三台mysql上添加权限开放给amoeba访问

mysql> grant all on *.* to 'test'@'192.168.209.%' identified by '123123';
mysql> flush privileges;

2.1.3:更改amoeba的配置文件

[root@localhost ~]# cd /usr/local/amoeba/conf/
[root@localhost conf]# ls
access_list.conf  amoeba.xml    dbServers.xml  functionMap.xml  log4j.xml  ruleFunctionMap.xml
amoeba.dtd        dbserver.dtd  function.dtd   log4j.dtd        rule.dtd   rule.xml
[root@localhost conf]# vim amoeba.xml 
...
30                                         <property name="user">amoeba</property>    ##授权客户端的权限账户,允许客户端通过此账号访问amoeba

 32                                         <property name="password">123123</property>  ##设置账号密码

115                 <property name="defaultPool">master</property>   ##更改默认池为master
116 
117                 <!--                                          ## 去掉注释
118                 <property name="writePool">master</property>  ##更改写操作的池子为master
119                 <property name="readPool">slaves</property>    ##更改读操作的池子为slaves
120                 -->                                           ## 去掉注释
...
[root@localhost conf]# vim dbServers.xml
...
22                         <!-- mysql schema -->
 23                         <property name="schema">test</property>    ##注意:mysql5.5版本此处无需修改,默认有test库,mysql5.7版本需要把test修改为mysql,因为mysql5.7版本中不再有test库
 24 
 25                         <!-- mysql user -->
 26                         <property name="user">test</property> ## 更改为之前新建的允许访问操作数据库的权限用户test
 27 
 28                         <!--  mysql password
 29                         <property name="password">123123</property>   ##用户密码
 30                         -->      ##去掉注释


45         <dbServer name="master"  parent="abstractServer">        ##定义写操作的主数据库名与主机地址
 46                 <factoryConfig>
 47                         <!-- mysql ip -->
 48                         <property name="ipAddress">192.168.209.145</property>
 49                 </factoryConfig>
 50         </dbServer>
 51 
 52         <dbServer name="slave01"  parent="abstractServer">     ##定义读操作的从数据库名与主机地址
 53                 <factoryConfig>
 54                         <!-- mysql ip -->
 55                         <property name="ipAddress">192.168.209.146</property>
 56                 </factoryConfig>
 57         </dbServer>

             <dbServer name="slave02"  parent="abstractServer">     ##复制上面6行数据,定义另一台读操作的从数据库名与主机地址
                   <factoryConfig>
                              <!-- mysql ip -->
                              <property name="ipAddress">192.168.209.147</property>
                      </factoryConfig>
              </dbServer>

 58 
 59         <dbServer name="salves" virtual="true">       ##定义读操作的从数据库地址池
 60                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
 61                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
 62                         <property name="loadbalance">1</property>
 63 
 64                         <!-- Separated by commas,such as: server1,server2,server1 -->
 65                         <property name="poolNames">slave01,slave02</property>
 66                 </poolConfig> 
 67         </dbServer>

...

2.1.4:开启amoeba服务

[root@localhost conf]# /usr/local/amoeba/bin/amoeba start&
[root@localhost conf]# netstat -antp | grep java

三:客户机验证读写分离

  • 1、在master节点上新建一个school的库
mysql> create database school;
  • 2、在两台slave节点上查看
    可以看到school库已存在,说明进行了主从复制的同步
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.02 sec)
  • 3、停掉两台slave的同步
mysql> stop slave;
  • 4、用客户端登录amoeba进行读写操作
[root@localhost ~]# mysql -uamoeba -p123123 -h 192.168.209.134 -P8066
  • 5、在数据库中对school库建表、向表中添加数据
mysql> create table info(id int(3) not null auto_increment primary key,name varchar(5) not null,score decimal(5,2));
mysql> insert into info (name,score) values ('lisi',90);
  • 6、进主从数据库进行查看
    主数据库(master)
mysql> use school;
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

mysql> select * from info;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | lisi | 90.00 |
+----+------+-------+
1 row in set (0.00 sec)

从数据库(slave)

mysql> use school;
Database changed
mysql> show tables;
Empty set (0.00 sec)

此时主数据库中有表有数据,而从数据库中无表无数据,说明amoeba把写操作的指向了master

  • 7、客户端进行数据的读取操作
mysql> select * from info;
ERROR 1146 (42S02): Table 'school.info' doesn't exist

报错,无表无数据,因为已经停止了两台slave从数据库的复制,写入的数据并没有同步到从数据库,验证了amoeba代理把读取数据的操作交给slave。

至此整个读写分离的配置成功完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值