一、MySQL读写分离
1.1 原理
- 读写分离就是只在主服务器上写,只在从服务器上读
- 主数据库处理事务性査询,而从数据库处理 select査询
- 数据库复制被用来把事务性査询导致的变更同步到集群中的从数据库
1.2 为什么要读写分离
- 因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
- 但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
- 所以读写分离,解决的是,数据库的写入,影响了查询的效率。
二、读写分离的基础:主从复制
- 可以说没有主从复制的技术就没有读写分离策略
- 主从复制的搭建详情可以看我的博客:https://www.cnblogs.com/bushilengmo/p/13668756.html
三、读写分离实验
3.1 环境
-
VMware软件
-
环境依赖上一篇博客做的主从复制的结果
-
一台centos7服务器当做client
-
一台centos7服务器作为Amoeba服务器
-
三台centos7服务器作为mysql数据库服务器,一主二从
3.2 实验过程
3.2.1 关闭防火墙 关闭核心防护
3.2.2 搭建mysql主从复制环境(上篇you详细过程)
3.2.3 Amoeba服务器环境安装
amoeba是给予jdk1.5开发的,建议使用1.5或者1.6的环境,不要太高
上传JDK到opt目录
[root@localhost ~]# cd /opt
[root@localhost opt]# tar xzvf jdk-8u144-linux-x64.tar.gz
[root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java
[root@localhost opt]# vi /etc/profile ##在末尾添加
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
3.2.4 配置Amoeba读写分离,slave1和slave2读负载均衡
- 三台mysql服务器添加权限和用户开放给amoeba访问
mysql> GRANT ALL ON *.* TO test@'192.168.79.%' IDENTIFIED BY 'abc123';
- 配置amoeba服务器
1 [root@amoeba mnt]# cd /usr/local/amoeba/conf/ 2 [root@amoeba conf]# vim amoeba.xml '//编辑amoeba主配置文件' 3 '//此段设置的是客户端通过amoeba用户和123456密码访问amoeba服务器' 4 <property name="user">amoeba</property> '//第30行开始修改用户名' 5 6 <property name="password">123456</property> '//使用123456密码访问amoeba服务器' 7 8 '//移动到117行,开启读写功能池设定' 9 <property name="defaultPool">master</property> '//115行修改' 10 <!-- --> '//117行取消注释' 11 <property name="writePool">master</property> '//118行修改' 12 <property name="readPool">slaves</property> '//119行修改' 13 '//120行删除-->注释符号' 14 15 [root@amoeba conf]# vim dbServers.xml '//编辑数据库配置文件' 16 <property name="schema">mysql</property> '//23行test修改为mysql' 17 18 '//设置amoeba访问mysql数据库的用户和密码' 19 <property name="user">test</property> '//26行修改用户名' 20 21 <!-- mysql password--> '//28行-30行取消注释' 22 <property name="password">123.com</property> '//29行修改密码' 23 24 <dbServer name="master" parent="abstractServer"> '//45行主mysql服务器名称修改为master' 25 <property name="ipAddress">192.168.79.135</property> '48行//修改主服务器IP' 26 27 <dbServer name="slave1" parent="abstractServer"> '//52行修改从服务器名称' 28 <property name="ipAddress">192.168.79.135</property> '//55行修改从服务器IP' 29 '//第一个从服务器段后插入第二个从服务器配置' 30 <dbServer name="slave2" parent="abstractServer"> 31 <factoryConfig> 32 <!-- mysql ip --> 33 <propertyname="ipAddress">192.168.79.136</property> 34 </factoryConfig> 35 </dbServer> 36 '//修改数据库从服务器池' 37 <dbServer name="slaves" virtual="true"> '//66行修改服务器吃名称为slaves' 38 <property name="poolNames">slave1,slave2</property> '//72行添加两个从服务器名称slave1,slave2'
3.2.5 启动Amoeba软件
- 开启amoeba软件,放到后台运行
1 [root@amoeba conf]# /usr/local/amoeba/bin/amoeba start & 2 [1] 63847 3 [root@amoeba conf]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml 4 2020-01-08 23:38:40,817 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0 5 log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf 6 2020-01-08 23:38:41,113 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066. 7 2020-01-08 23:38:41,122 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:23097. 8 '//此时处于持续监控状态,无法输入命令'
3.3 验证实验
- 测试读写分离,关闭主从复制功能
mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave statusG; ...省略内容 Slave_IO_Running: No '//发现功能已被关闭' Slave_SQL_Running: No ...省略内容
- 从服务器配置数据,验证读写分离
1 MySQL [(none)]> create database siku; '//客户端创建库' 2 '//会发现主服务器有,但是从服务器没有,说明主从复制功能已经关闭' 3 '//slave1从服务器设置:都有erku的库,所以各自在erku创建yibiao并插入不同数据' 4 mysql> use erku; 5 Database changed 6 mysql> create table yibiao (id int not null,name char(10)); 7 Query OK, 0 rows affected (0.01 sec) 8 9 mysql> insert into yibiao values(1,'zhangsan'); '//添加zhangsan记录' 10 Query OK, 1 row affected (0.02 sec) 11 12 mysql> select * from yibiao; 13 +----+----------+ 14 | id | name | 15 +----+----------+ 16 | 1 | zhangsan | 17 +----+----------+ 18 1 row in set (0.00 sec) 19 20 '//slave1从服务器设置:' 21 mysql> use erku; 22 Database changed 23 mysql> create table yibiao(id int not null,name char(10)); 24 Query OK, 0 rows affected (0.01 sec) 25 26 mysql> insert into yibiao values(2,'lisi'); '//添加lisi记录' 27 Query OK, 1 row affected (0.02 sec) 28 29 mysql> select * from yibiao; 30 +----+------+ 31 | id | name | 32 +----+------+ 33 | 2 | lisi | 34 +----+------+ 35 1 row in set (0.00 sec)
- 进入客户端验证
1 MySQL [(none)]> use erku; '//进入库' 2 Database changed 3 MySQL [erku]> select * from yibiao; 4 +----+------+ 5 | id | name | 6 +----+------+ 7 | 2 | lisi | 8 +----+------+ 9 1 row in set (0.01 sec) 10 11 MySQL [erku]> select * from yibiao; 12 +----+----------+ 13 | id | name | 14 +----+----------+ 15 | 1 | zhangsan | 16 +----+----------+ 17 1 row in set (0.01 sec) 18 '//发现每一次查询都会轮询在slave1和slave2上查询数据,如果开启主从复制,则数据都会相同' 19 '//读写分离试验成功'