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。
至此整个读写分离的配置成功完成。