MySQL读写分离技术
1、简介
当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。
其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器。
2、基本环境
三台linux虚拟主机
Linux版本CentOS6.6、MySQL 5.5
mysql-proxy-0.8.5
lua-5.1.4
ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)
3、配置主从复制
详细可以参考:mysql主从复制与主主复制
http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2
粗略介绍一下数据库的主从复制的配置:
第一步:
在192.168.95.11中创建一个192.168.95.12主机中可以登录的MySQL用户
用户:mysql12
密码:mysql12
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’; mysql>FLUSH PRIVILEGES;
第二步:
查看192.168.95.11MySQL服务器二进制文件名与位置
mysql>SHOW MASTER STATUS;

第三步:
告知二进制文件名与位置
在192.168.95.12中执行:
mysql> change master to
-> master_host='192.168.95.11',
-> master_user='mysql12',
-> master_password='mysql12',
-> master_log_file='mysql-bin.000124',
-> master_log_pos=586;
第四步:
在192.168.95.12中
mysql>SLAVE START; #开启复制
mysql>SHOW SLAVE STATUS\G #查看主从复制是否配置成功

主从复制配置成功!
(注意:上面Relicate_Do_DB:aa表示主从复制只针对数据库aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)
4、MySQL读写分离配置
百度云下载:链接:https://pan.baidu.com/s/1FBW-76Ew-fOfNb0fW878ZQ 密码:r8uy
4.1、安装lua
官网下载:http://www.lua.org/download.html
Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
1)、安装lua需要依赖很多软件包。
可以通过rpm -qa | grep name检查以下软件是否安装:
gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*
若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(我的话一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装)
2)、依赖软件安装完毕后则进行编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
官网下载:http://www.lua.org/download.html(下载源码包)
# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
# tar zxvf lua-5.1.4.tar.gz
# cd lua-5.1.4
# make linux
# make install
# export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"
(我安装的时候是直接在光盘软件库中找到,直接rpm安装)
4.2、安装mysql-proxy
1)、首先查看linux版本确认是32位还是64为系统
查看linux内核版本
# cat /etc/issue
查看linux版本
# cat /proc/version
2)、按系统位数下载(上面百度云链接64位的文件)
3)、安装
# tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz
# mkdir /usr/local/mysql-proxy
# cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy
# cd /usr/local/mysql-proxy

安装成功
5、MySQL读写分离测试
1)、修改rw-splitting.lua文件
修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

# vi rw-splitting.lua

2)、修改完成后,启动mysql-proxy
# cd /usr/local/mysql/bin
# ./mysql-proxy --proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua &
参数:
--proxy-read-only-backend-addresses #只读服务器地址(ip)
--proxy-backend-addresses #服务器地址(主服务器)
--proxy-lua-script #lua脚本路劲
& #表示后台执行

3)、创建用于读写分离的数据库连接用户
用户名:proxy1
密 码:321
mysql>grant all on *.* to 'proxy1'@'192.168.95.13' identified by '321';
mysql>use aa;
mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id));
【因为已经开启了主从复制所以,11、12主机mysql中都创建了这个用户】
4)、测试登陆账号proxy1@192.168.95.13进行添加数据
可以使用任意ip客户端登陆这个账号
在192.168.95.13登陆:
# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

在两个mysql中查看结果:一致

结果表明:账号使用
(ps:id是自增长,之前高主主复制的时候更改了配置文件,还没更改回来,就将就用着先吧)
5)、关闭12mysql的从复制
mysql> stop slave;

6)、证明写分离
使用proxy1@192.168.95.13账号打开多个客户端进行插入数据
打开三个mysql客户端分别插入2条数据:
mysql> insert into tab1 (name) values('stop_slave11111');
….
mysql> insert into tab1 (name) values('stop_slave6666’);
查看:
分别登陆11mysql与12mysql查看aa.tab1中的数据
主数据库:

从数据库:

结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。
7)、证明读分离
使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据
mysql>use aa;
mysql>select*from tab1;

结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。
6、建议
为了方便启动与管理mysql-proxy可以创建mysql-proxy服务管理脚本
下面这个管理脚本仅适合以上我给出的安装路径位置
【此管理脚本需要按照自己的安装路径做出相应的修改方可使用】
#!/bin/sh #
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql # Source function library.
. /etc/rc.d/init.d/functions #PROXY_PATH=/usr/local/bin
PROXY_PATH=/usr/local/mysql-proxy/bin prog="mysql-proxy" # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0 # Set default mysql-proxy configuration.
#PROXY_OPTIONS="--daemon" PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua" PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid # Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
. /etc/sysconfig/mysql-proxy
fi PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
# By default it's all good
RETVAL=0 # See how we were called.
case "$1" in
start)
# Start daemon.
echo -n $"Starting $prog: "
$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
touch /var/lock/subsys/mysql-proxy]
echo "ok"
fi
;;
stop)
# Stop daemons.
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
rm -f /var/lock/subsys/mysql-proxy
rm -f $PROXY_PID
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
condrestart)
[ -e /var/lock/subsys/mysql-proxy ] && $0 restart
;;
status)
status mysql-proxy
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|status|condrestart}"
RETVAL=1
;;
esac
exit $RETVAL
#---我将mysql-proxy服务管理脚本放在了/usr/local/mysql-proxy/init.d/文件夹里
#---给执行权限,建立相应目录
#chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy
#mkdir /usr/local/mysql-proxy/run
#mkdir /usr/local/mysql-proxy/log #cd /usr/local/mysql-proxy/init.d/
#---启动mysql-proxy
#./mysql-proxy start
#---停止mysql-proxy
#./mysql-proxy stop
#---重启mysql-proxy
#./mysql-proxy restart
一些相关参数:
PROXY_PATH=/usr/local/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径
--proxy-read-only-backend-addresses=192.168.95.12:3306 //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.95.11:3306
//定义后端主服务器地址
--proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua //定义lua读写分离脚本路径
PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy
PID文件路径
--daemon //定义以守护进程模式启动
--keepalive //使进程在异常关闭后能够自动恢复【上面的管理脚本没有加上此参数】
--user=root //以root用户身份启动服务
--log-level=debug //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径
(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)
作者:那一叶随风
声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接
MySQL读写分离技术的更多相关文章
- Django中MySQL读写分离技术
最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...
- 【MySQL】剖析MySQL读写分离技术
主从技术的一个基本流程图: 如何实现主从复制的呢: MySQL Master(主节点) 1>当一个请求来时,首先由[mysqld]写入到我们的主[data]中 2>然后[mysqld]将 ...
- MySQL主从复制技术与读写分离技术amoeba应用
MySQL主从复制技术与读写分离技术amoeba应用 前言:眼下在搭建一个人才站点,估计流量会非常大,须要用到分布式数据库技术,MySQL的主从复制+读写分离技术.读写分离技术有官方的MySQL-pr ...
- mysql读写分离总结
随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状.读写分离现在被大量应用于很多大型网站,这个技 ...
- Mysql读写分离方案-Amoeba环境部署记录
Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...
- mysql读写分离实战
一个完整的MySQL读写分离环境包括以下几个部分: 应用程序client database proxy database集群 在本次实战中,应用程序client基于c3p0连接后端的database ...
- 使用Amoeba实现mysql读写分离机制
Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实 ...
- MySQL读写分离-架构
MySQL读写分离-架构 简介 对于很多大型网站(pv值百万.千万)来说,在所处理的业务中,其中有70%的业务是查询(select)相关的业务操作(新闻网站,插入一条新闻.查询操作),剩下的则是写(i ...
- 使用Spring实现MySQL读写分离(转)
使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...
随机推荐
- 【排序算法】快速排序算法 Java实现
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 基本思想 先从数组中找出一个数作为基 ...
- Javascript继承(暂略去中转函数、组合继承和寄生继承)
继承,在JS中通过原型链实现.如: function Box(){ this.name="Lee"; } function Desk(){ this.age=100; } //通过 ...
- WPF DataGrid Drag
自己实现的功能.代码比较简单的DataGrid的Drag处理,着重处理DataGrid里的拖动排序. using System; using System.Collections.Generic; u ...
- spring事务源码解析
前言 在spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!最后遗留了一个问题:spring是怎么样保证事务一致性的? 当然,spring事务内容挺多的,如果都要讲的话要花很长时间, ...
- AtomicInteger源码分析——基于CAS的乐观锁实
1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及 ...
- 3409: [Usaco2009 Oct]Barn Echoes 牛棚回声
3409: [Usaco2009 Oct]Barn Echoes 牛棚回声 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 57 Solved: 47[ ...
- 1179: [Apio2009]Atm
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1629 Solved: 615[Submit][Status ...
- jquery知识点复习
一. 基本概念 jQuery简介 jQuery是一个基于javascript的框架.它提供了丰富的选择器和大量的函数,可以方便的实现网页中各种动态的效果.迄今为止,已经有大量的jquery插件和基于j ...
- SQL一次查出相关类容避免长时间占用表(上)
/* server: db: EDI */ -- 以下案例多次查询同一张表,仅有组合条件Name+Direction不同 --可以使用一次查出相关类容避免长时间占用表 USE EDI GO DECLA ...
- [No0000C1]Excel 删除空白行和空白列VBA代码
在exce中删除空行和空列的方法有很多,相对而言删除空行较为简单,只需进行筛选,将空白行筛选出来,删除即可,但要删除空列比较困难.因为你不能按列进行筛选删除.Excel中没有这个功能.当然你可以用另外 ...