1、 简介

当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。

其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器。

2、基本环境

三台linux虚拟主机

Linux版本CentOS6.6、MySQL 5.5

mysql-proxy-0.8.5

ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)

3、配置主从复制

详细可以参考:mysql主从复制与主主复制

粗略介绍一下数据库的主从复制的配置:

第一步:

在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.',    -> master_log_pos=586;

第四步:

在192.168.95.12中

mysql>SLAVE START;   #开启复制mysql>SHOW SLAVE STATUS\G   #查看主从复制是否配置成功

主从复制配置成功!

(注意:上面Relicate_Do_DB:aa表示主从复制只针对数据库aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章:

4、MySQL读写分离配置

百度云下载:

密码:9j0m

4.1、安装lua

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。

官网下载:

# wget -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

安装成功

1)、修改rw-splitting.lua文件

修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离

#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

# vi rw-splitting.lua

# 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脚本路劲&                   #表示后台执行

用户名: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中都创建了这个用户】

可以使用任意ip客户端登陆这个账号

在192.168.95.13登陆:

# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

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

结果表明:账号使用

(ps:id是自增长,之前高主主复制的时候更改了配置文件,还没更改回来,就将就用着先吧)

mysql> stop slave;

使用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中的数据

主数据库:

从数据库:

结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。

使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据

mysql>use aa;mysql>select*from tab1;

结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。

为了方便启动与管理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/binPROXY_PATH=/usr/local/mysql-proxy/binprog="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-proxyfiPATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH# By default it's all goodRETVAL=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       ;;esacexit $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日志文件路径

(作者注:以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)