MySQL读写分离能一定程度上缓解服务器压力,数据的写入速度远远赶不上读取的速度,一般是设置主从服务器,在主服务器上进行写入操作,在从服务器上进行读取操作。
读写分离目前有两种方式,一种是基于程序内部的代码来实现,也是就是在开发时直接将代码写死,另外一种是基于中间代理,也就是软件实现。这里运用到的是前阿里大佬陈思儒开发的amoeba。
前期准备:一台mysql主服务器,一台mysql从服务器,一台将被来用于中间代理的Centos 7。
实验配置
一.完成主从服务器的配置。
主从服务器配置可参考https://blog.csdn.net/W1264822267/article/details/127139505?spm=1001.2014.3001.5502
二.中间服务器配置
1.关闭防火墙或者防火墙允许8066端口(如果只是学习读写分离推荐关闭防火墙,实际运用推荐开启8066端口);
systemctl stop firewalld
#或者配置防火墙规则,开启8066端口
firewall-cmd --zone=public --add-port=tcp/8066
2.部署jdk,直接在root下上载需要安装的jdk包(此处使用jdk版本为1.6.0);
#给jdk包赋予执行权限
chmod +x jdk-6u14-linux-x64.bin
#执行jdk.bin(一路回车,最后yes同意)
./jdk-6u14-linux-x64.bin
#将执行后产生的jdk1.6.0_14移动并改名到/usr/local/jdk1.6
mv jdk1.6.0_14/ /usr/local/jdk1.6
3.安装amoeba,这里使用的是2.2.0版本。也可以去网站下载amoeba - Browse /Amoeba for mysql at SourceForge.net
#创建一个文件夹用来存放解压的amoeba文件
mkdir /usr/local/amoeba
#将amoeba压缩包解压到刚创建的文件夹中
tar -zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
5.配置jkd和amoeba环境变量,在 /etc/profile 中直接写;
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
6.执行/usr/local/amoeba/bin/amoeba,如果回显amoeba start|stop表示安装成功;
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
7.登录MySQL主服务器,给amoeba服务器授权;
grant all on *.* to 'amoebatest'@'amoeba服务器IP' identified by '密码';
8.修改amoeba主配置文件;
vim /usr/local/amoeba/conf/amoeba.xml
#第11行,amoeba服务器的默认监听端口,客户端在访问时需要使用此端口(在末行模式下使用:set number可显示行数)
<property name="port">8066</property>
#第30行,客户端访问amoeba服务器所使用的用户名
<property name="user">amoeba</property>
#第32行,客户端访问amoeba服务器所使用的密码
<property name="password">123456</property>
#第115行,对数据库的默认操作,指定为主服务器
<property name="defaultPool">master</property>
#第118行,对数据库的写操作,指定为主服务器
<property name="writePool">master</property>
#第119行,对数据库的读操作,指定为从服务器,这里是一个集群名称
<property name="readPool">slave</property>
#将117行和120行的内容删除,原本是默认注释掉了118和119行的内容
9.修改dbServers.xml;
vim /usr/local/amoeba/conf/dbServers.xml
#第20行,表示amoeba去连接数据库的端口号
<property name="port">3306</property>
#第23行,表示客户机连接进去后的默认数据库
<property name="schema">数据库名</property>
#第26行,前面在主MySQL上授权的用户名
<property name="user">amoebatest</property>
#第29行,前面在主MySQL上授权的用户名密码(30行的内容移到到28行末尾)
<property name="password">密码</property>
#第45行,amoeba主配置文件中指定的写操作MySQL服务器名称
<dbServer name="master" parent="abstractServer">
#第48行,写操作MySQL服务器的IP地址
<property name="ipAddress">主服务器IP</property>
#第52行,amoeba主配置文件中指定的读操作MySQL服务器名称
<dbServer name="slave" parent="abstractServer">
#第55行,读操作MySQL服务器的IP地址
<property name="ipAddress">从服务器IP</property>
#因本次实验无从服务器集群,所以注释掉第59行到第67行的集群配置,也可删除
10.启动amoeba,用netstat -anpt查看是否有java的进程,有则表示成功;
/usr/local/amoeba/bin/amoeba start
[root@localhost ~]# netstat -anpt |grep java
tcp6 0 0 :::8066 :::* LISTEN 12459/java
tcp6 0 0 127.0.0.1:50228 :::* LISTEN 12459/java
三.验证
此处用的是Navicat 15 for MySQL进行读写操作,用Wireshark抓包查看数据走向。
1.登录amoeba服务器;
2.在Navicat 15 for MySQL中进行读写操作,并用Wireshark抓包
主服务器IP:192.168.183.146
从服务器IP:192.168.183.150
amoebaIP:192.168.183.151
分析流量有的是从amoeba(151)到主服务器(146),即写入操作;有的是从服务器(150)到amoeba(151),即读取操作;