文章目录
一、Mysql 读写分离原理
- 读写分离就是只在主服务器上写,只在从服务上读;
- 主数据库处理事务性查询,从数据库处理 select 查询;
- 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二、关于 Amoeba
(1)Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。
(2)Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。需要结合使用MySQL的 Replication等机制来实现副本同步等功能。
三、配置实例
环境说明:
- 准备三台 Mysql服务器(一台为主服务器,其余两台为从服务器);
- 一台 Amoeba,用来实现读写分离,写的操作交给主服务器,读的操作发给两台从服务器;
- 实验验证:在客户机上执行写的操作,在主、从服务器上验证。
说明:Mysql 主从复制与读写功能是密切相关的,通过主从复制来实现数据同步,再通过读写分离来提升数据库的并发负载能力。
应用客户端 | 192.168.220.131 |
---|---|
Amoeba | 192.168.220.129 |
主服务器 | 192.168.220.141 |
从服务器 1 | 192.168.220.140 |
从服务器 2 | 192.168.220.136 |
第一步:配置 Amoeba 服务器
(1)关闭防火墙:
systemctl stop firewalld.service
setenforce 0
(2)安装管理 jdk:
1、安装 jdk
cp jdk-6u14-linux-x64.bin /usr/local/ //复制
./jdk-6u14-linux-x64.bin
//安装jdk ,注意这一步,一路按回车到最后,提示输入yes,等待安装
2、方便管理,将jdk包重新命名:
mv jdk1.6.0_14/ /usr/local/jdk1.6
3、修改 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
(3)解压 amoeba包:
1、先创建一个文件
mkdir /usr/local/amoeba
2、解压
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
3、赋权,并验证是否安装成功
chmod -R 755 /usr/local/amoeba/
输入:/usr/local/amoeba/bin/amoeba ,按回车检查是否成功
第二步:在三台 mysql 服务器上添加权限,开放给 amoeba 访问(即三台mysql允许amoeba对它们进行访问)
进入数据库,输入以下命令:
grant all on *.* to test@'192.168.220.%' identified by '123.com';
//允许ip为192.168.220网段从任意终端通过123.com的密码进行访问
第三步:在 amoeba 服务器上配置读写分离功能
1、cd /usr/local/amoeba
vim conf/amoeba.xml
第30行:<property name="user">amoeba</property>
第32行:<property name="password">123456</property>
117行去掉注释:
<property name="writePool">master</property>
<property name="readPool">slaves</property>
2、vim conf/dbServers.xml
26-29行:去掉注释,设置登录用户名和密码
<property name="user">test</property>
<property name="password">123.com</property>
找到主服务器和从服务器模块,修改好名称和对应IP地址:
主服务器:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.220.141</property>
第一台从服务器:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.220.140</property>
第二台从服务器:
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.220.136</property>
指定从服务器池:
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
3、启动 amoeba
/usr/local/amoeba/bin/amoeba start& //&表示将进程放到后台,时间较长,稍等待
第四步:客户端测试
1、客户端虚拟机,可以直接用yum安装一个mysql服务
yum install -y mysql
2、连接 amoeba 服务器
(1)指定密码和端口连接 amoeba
mysql -u amoeba -p 123456 -h 192.168.220.129 -P8066
(2)创建一个 名为 school 的库,再创建一个叫 info 的表
MySQL [school]> create table info (
-> id int(4) not null primary key, //指定id号,为primary key,不为空
-> name varchar(10) not null, //名字
-> score decimal(4,1) not null); //成绩
Query OK, 0 rows affected (0.03 sec)
3、三台mysql服务器验证实验结果
首先验证写的操作是否分离:
(1)此时,我们在主服务器上,直接进入数据库,就会发现也多了一个名为 info的表
(2)但是,两台从服务器上并没有:
所以,我们在客户端写入的语句,在主服务器上会查询到,但是两台从服务器上并没有,此时写的操作就直接交给了主服务器。
接下来是验证读的操作:
(1)在两台从服务器上的各自也创建一个 info 表,也都各自写入两条信息。
(2)客户端查询 info 表的内容,因为做了读写分离操作,所以查询的内容应该是 两台从服务器上 info表的内容。
因此,用户读取数据,同时通过从服务器,这样就减轻了主服务器的并发量。
四、总结
这篇博客,为了展示读写分离的实验效果,并没有同时做主从同步,在企业网中,主从同步和读写分离是密不可分的。这样,客户对数据库进行写的操作时,就由主服务器承担;进行读取,查询等操作时,就由从服务器来承担(由于做了主从同步,每台从服务器的数据和主服务器是一样的)
在高并发请求时,实现了负载均衡,保证数据的安全性,服务器的高效运行。