一、 读写分离介绍
MySQL读写分离基本原理是proxy自动进行一个请求的分发。让master数据库处理写操作,slave数据库处理读操作。
Mysql读写分离能提高系统性能的原因在于:
- 物理服务器增加,机器处理能力提升,拿硬件换性能
- 主从只负责各自的读和写,极大缓解了排他锁和共享锁争用
二、读写分离相关配置
mysql proxy方式
硬件配置
master 192.168.12.111 node01
slave 192.168.12.112 node02
proxy 192,168.12.113 node03
在master和slave上配置主从复制
进行proxy的相关配置
- 解压安装包并修改目录
1
2tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy - 进入mysql-proxy的目录,创建目录
1
2
3
4cd mysql-proxy
#6、创建目录
mkdir conf
mkdir logs - 添加环境变量
1
2
3
4
5
6#打开/etc/profile文件
vi /etc/profile
#在文件的最后面添加一下命令
export PATH=$PATH:/root/mysql-proxy/bin
#退出后执行命令让环境变量生效
source /etc/profile - 进入conf目录,创建文件并添加一下内容
1
2
3
4
5
6
7
8
9
10
11
12cd conf/
vi mysql-proxy.conf
添加内容
[mysql-proxy]
user=root
proxy-address=192.168.12.113:4040
proxy-backend-addresses=192.168.12.111:3306
proxy-read-only-backend-addresses=192.168.12.112:3306
proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/root/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
上面配置项只指定了node01既承担读也承担写,112只承担读。所以:
msb数据库node01和node02中,node03中没有。node01中psn表里面有数据1,node02中有数据1和2。
如果在navicat中,连接node03,会显示有msb。在msb中查询psn表,会查询到1。也就是说读数据的时候读进来了node01。
在node01中service mysqld stop
停掉服务,再次在navicat中查询会卡死失败。这时候再次开启node01中mysqld服务,然后查询,会查询到1和2,也就是查的是从库node02。
如果插入数据再查询,会发现写的时候是往mode01写的,而读是读的node02。如果现在要读node01,需要把node02关闭服务,再重启重读。
麻烦,很少用。
使用amoeba实现mysql读写分离
amoeba(变形虫)项目,专注分布式数据库proxy开发。
主要解决:
- 降低数据切分带来的复杂多数据库结构
- 提供切分规则并降低切分数据库带来的影响
- 读写分离
为什么要用amoeba
目前实现mysql的主从读写分离,主要有以下几个方案:
- 通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚步开发跟不上节奏,因此导致用于生产环境风险较大。
- 通过程序实现,复杂
- 自己开发接口实现,开发成本高
- 利用阿里巴巴开源项目Amoeba实现,负载均衡、读写分离、配置简单
安装
在node04中执行下面步骤:
一、安装jdk
1、https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html找到`jdk-8u181-linux-x64.rpm`,复杂到node04中
2、rpm -ivh jdk-8u181-linux-x64.rpm
进行安装
如果想删除
rpm -Uvh jdk-8u181-linux-x64.rpm
3、配置环境变量
1 | vi /etc/profile |
按G跳到最后一行,再按o添加内容:
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
export PATH=$PATH:$JAVA_HOME/bin
退出source /etc/profile
4、查看
java -version
二、使用amoeba
1、https://sourceforge.net/projects/amoeba/下载复制amoeba-mysql-3.0.5-RC-distribution.zip
2、下载解压包yum install zip unzip
,使用unzip解压上面的安装包
3、跳进目录amoeba-mysql-3.0.5-RC里面的conf中
4、修改里面的amoeba.xml和dbServers.xml
1 | vi dbServers.xml |
5、cd ../bin
1 | ./launcher |
可能会报错
1 | The stack size specified is too small, Specify at least 228k |
因为栈空间太小。解决:
跳回amoeba-mysql-3.0.5-RC中,修改jvm.properties
1 | cd .. |
再到bin目录下执行./launcher
,成功。
6、配置好后,可以进行连接。转到node03中:mysql -uroot -p140140 -h192.168.12.114 -P8066
读数据
1 | use msb |
打印结果为1,2,4。即查看的是node02
插数据
1 | insert into psn values(5,'5'); |
打印结果为1,2,4,5。即查看的是node02
现在停掉node01服务(service mysqld stop),再到node03中插入6.报错:
ERROR 1044 (42000): Amoeba could not connect to MySQL server[192.168.12.111:3306],Connection refused
重启node01服务,再插入就会成功。
停掉node02,node03查询,失败。再重启才可以查询到1,2,4,5,6
说明:node01是写库,node02是读库。
Mycat
对于DBA来说,Mycat就是Mysql Server,而Mycat后面连接的Mysql Server,就好像是Mysql的存储引擎。因此Mycat本身不存储数据,数据是在后端的Mysql上存储的。简单来说,Mycat在一定程度上让mysql拥有了跟Oracle pk的能力。
对于软件工程师来说,Mycat近似等于Mysql的数据库服务器,可用连接mysql的方式去连接mycat(默认端口号是8066而不是mysql的3306)