MySQL 实现读写分离

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 -> masterhost=‘192.168.95.11’,
-> masteruser=‘mysql12’,
-> masterpassword=‘mysql12’,
-> masterlogfile=‘mysql-bin.000124’,
-> masterlog_pos=586;

第四步:

在 192.168.95.12 中

mysql>SLAVE START; #开启复制

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

主从复制配置成功!

(注意:上面 RelicateDoDB:aa 表示主从复制只针对数据库 aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7

回到顶部

4、MySQL 读写分离配置

百度云下载:链接:http://pan.baidu.com/s/1slTl18L 密码:9j0m

回到顶部

  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(下载源码包)

[](javascript:void(0); “复制代码”)

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 LUACFLAGS=“-I/usr/local/include” LUALIBS=“-L/usr/local/lib -llua -ldl” LDFLAGS=“-lm”

(我安装的时候是直接在光盘软件库中找到,直接 rpm 安装)

[](javascript:void(0); “复制代码”)

回到顶部

  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 服务管理脚本

下面这个管理脚本仅适合以上我给出的安装路径位置

【此管理脚本需要按照自己的安装路径做出相应的修改方可使用】

[](javascript:void(0); “复制代码”)

1 #!/bin/sh
2
3 #
4 # mysql-proxy This script starts and stops the mysql-proxy daemon
5 #
6 # chkconfig: - 78 30
7 # processname: mysql-proxy
8 # description: mysql-proxy is a proxy daemon to mysql
9
10 # Source function library.
11 . /etc/rc.d/init.d/functions 12
13 #PROXYPATH=/usr/local/bin
14 PROXYPATH=/usr/local/mysql-proxy/bin 15
16 prog=“mysql-proxy”
17
18 # Source networking configuration.
19 . /etc/sysconfig/network 20
21 # Check that networking is up.
22 [ ${NETWORKING} = “no” ] && exit 0
23
24 # Set default mysql-proxy configuration.
25 #PROXYOPTIONS=“–daemon”
26
27 PROXYOPTIONS=“–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”
28
29 PROXYPID=/usr/local/mysql-proxy/run/mysql-proxy.pid 30
31 # Source mysql-proxy configuration.
32 if [ -f /etc/sysconfig/mysql-proxy ]; then 33 . /etc/sysconfig/mysql-proxy 34 fi 35
36 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXYPATH
37 # By default it’s all good
38 RETVAL=0
39
40 # See how we were called.
41 case “$1” in 42 start) 43 # Start daemon.
44 echo -n $“Starting $prog: ”
45 $NICELEVEL $PROXYPATH/mysql-proxy $PROXYOPTIONS –daemon –pid-file=$PROXYPID –user=root –log-level=debug –log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
46 RETVAL=$?
47 echo
48 if [ $RETVAL = 0 ]; then 49 touch /var/lock/subsys/mysql-proxy] 50 echo “ok”
51 fi 52 ;; 53 stop) 54 # Stop daemons.
55 echo -n $“Stopping $prog: ”
56 killproc $prog
57 RETVAL=$?
58 echo
59 if [ $RETVAL = 0 ]; then 60 rm -f /var/lock/subsys/mysql-proxy 61 rm -f $PROXYPID
62 fi 63 ;; 64 restart) 65 $0 stop 66 sleep 3
67 $0 start 68 ;; 69 condrestart) 70 [ -e /var/lock/subsys/mysql-proxy ] && $0 restart 71 ;; 72 status) 73 status mysql-proxy 74 RETVAL=$?
75 ;; 76 *) 77 echo “Usage: $0 {start|stop|restart|status|condrestart}”
78 RETVAL=1
79 ;; 80 esac 81 exit $RETVAL

[](javascript:void(0); “复制代码”)

[](javascript:void(0); “复制代码”)

#—我将 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

[](javascript:void(0); “复制代码”)

一些相关参数:

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 日志文件路径

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

作者:那一叶随风

声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接