读写分离的介绍
MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。
MySQL读写分离能提高系统性能的原因在于:
1、物理服务器增加,机器处理能力提升。拿硬件换性能。
2、主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
3、slave可以配置myiasm引擎,提升查询性能以及节约系统开销。
4、master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。
5、slave可以单独设置一些参数来提升其读的性能。
6、增加冗余,提高可用性。
2、读写分离的配置
1、硬件配置
master 192.168.85.11slave 192.168.85.12proxy 192,168.85.14
2、首先在master和slave上配置主从复制
3、进行proxy的相关配置
#1、下载mysql-proxyhttps://downloads.mysql.com/archives/proxy/#downloads#2、上传软件到proxy的机器直接通过xftp进行上传#3、解压安装包tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz#4、修改解压后的目录mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy#5、进入mysql-proxy的目录cd mysql-proxy#6、创建目录mkdir confmkdir logs#7、添加环境变量#打开/etc/profile文件vi /etc/profile#在文件的最后面添加一下命令export PATH=$PATH:/root/mysql-proxy/bin#8、执行命令让环境变量生效source /etc/profile#9、进入conf目录,创建文件并添加一下内容vi mysql-proxy.conf添加内容[mysql-proxy]user=rootproxy-address=192.168.85.14:4040proxy-backend-addresses=192.168.85.11:3306proxy-read-only-backend-addresses=192.168.85.12:3306proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lualog-file=/root/mysql-proxy/logs/mysql-proxy.loglog-level=debugdaemon=true#10、开启mysql-proxymysql-proxy --defaults-file=/root/mysql-proxy/conf/mysql-proxy.conf#11、查看是否安装成功,打开日志文件cd /root/mysql-proxy/logstail -100 mysql-proxy.log#内容如下:表示安装成功2019-10-11 21:49:41: (debug) max open file-descriptors = 10242019-10-11 21:49:41: (message) proxy listening on port 192.168.85.14:40402019-10-11 21:49:41: (message) added read/write backend: 192.168.85.11:33062019-10-11 21:49:41: (message) added read-only backend: 192.168.85.12:33062019-10-11 21:49:41: (debug) now running as user: root (0/0)
4、进行连接
#mysql的命令行会出现无法连接的情况,所以建议使用客户端mysql -uroot -p123 -h192.168.85.14 -P 4040
使用amoeba实现mysql读写分离
1、什么是amoeba?
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
主要解决:
• 降低 数据切分带来的复杂多数据库结构
• 提供切分规则并降低 数据切分规则 给应用带来的影响
• 降低db 与客户端的连接数
• 读写分离
2、为什么要用Amoeba
目前要实现mysql的主从读写分离,主要有以下几种方案:
1、 通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。
2、 通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。
3、 自己开发接口实现,这种方案门槛高,开发成本高,不是一般的小公司能承担得起。
4、 利用阿里巴巴的开源项目Amoeba来实现,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单。国产的开源软件,应该支持,目前正在使用,不发表太多结论,一切等测试完再发表结论吧,哈哈!
3、amoeba安装
1、首先安装jdk,直接使用rpm包安装即可
2、下载amoeba对应的版本https://sourceforge.net/projects/amoeba/,直接解压即可
3、配置amoeba的配置文件
dbServers.xml
<?xml version="1.0" encoding="gbk"?>${defaultManager}641283306msbroot1235005001600000600000truetruetrue192.168.85.11192.168.85.121slave
amoeba.xml
<?xml version="1.0" encoding="gbk"?>806612864root123${amoeba.home}/conf/access_list.conf128500utf860com.meidusa.toolkit.net.AuthingableConnectionManager${amoeba.home}/conf/dbServers.xml${amoeba.home}/conf/rule.xml${amoeba.home}/conf/ruleFunctionMap.xml${amoeba.home}/conf/functionMap.xml1500writedbwritedbmyslavetrue
4、启动amoeba
/root/amoeba-mysql-3.0.5-RC/bin/launcher
4、测试amoeba
--测试的sql--在安装amoeba的服务器上登录mysqlmysql -h192.168.85.13 -uroot -p123 -P8066--分别在master、slave、amoeba上登录mysqluse msbselect * from user;--在amoeba上插入数据insert into user values(2,2);--在master和slave上分别查看表中的数据select * from user;--将master上的mysql服务停止,继续插入数据会发现插入不成功,但是能够查询--将master上的msyql服务开启,停止slave上的mysql,发现插入成功,但是不能够查询