Mysql ------ 读写分离

一、Mysql 读写分离原理

  • 读写分离就是只在主服务器上写,只在从服务上读;
  • 主数据库处理事务性查询,从数据库处理 select 查询;
  • 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库

二、关于 Amoeba

(1)Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。
(2)Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。需要结合使用MySQL的 Replication等机制来实现副本同步等功能。

三、配置实例

环境说明:

  • 准备三台 Mysql服务器(一台为主服务器,其余两台为从服务器);
  • 一台 Amoeba,用来实现读写分离,写的操作交给主服务器,读的操作发给两台从服务器;
  • 实验验证:在客户机上执行写的操作,在主、从服务器上验证。

在这里插入图片描述
说明:Mysql 主从复制与读写功能是密切相关的,通过主从复制来实现数据同步,再通过读写分离来提升数据库的并发负载能力。

应用客户端192.168.220.131
Amoeba192.168.220.129
主服务器192.168.220.141
从服务器 1192.168.220.140
从服务器 2192.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表的内容。
在这里插入图片描述
因此,用户读取数据,同时通过从服务器,这样就减轻了主服务器的并发量。

四、总结

这篇博客,为了展示读写分离的实验效果,并没有同时做主从同步,在企业网中,主从同步和读写分离是密不可分的。这样,客户对数据库进行写的操作时,就由主服务器承担;进行读取,查询等操作时,就由从服务器来承担(由于做了主从同步,每台从服务器的数据和主服务器是一样的)
在高并发请求时,实现了负载均衡,保证数据的安全性,服务器的高效运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值