mysql的读写分离

通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力
MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 当然,主服务器也可以提供查询服务。使用读写分离最大的作用无非是环境服务器压力。

数据库Master主服务器:172.25.64.1
数据库Slave从服务器:172.25.64.3
MySQL-Proxy调度服务器:172.25.64.2

以下操作,均是在172.25.64.2即MySQL-Proxy调度服务器 上进行的。

1 .MySQL的安装与配置2. 检查系统所需软件包
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*
libevent* glib*

若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。
3. 编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。

lua可通过以下方式获得
http://www.lua.org/download.html下载源码包

从rpm.pbone.net搜索相关的rpm包
download.fedora.redhat.com/pub/fedora/epel/5/i386/lua-5.1.4-4.el5.i386.rpm
download.fedora.redhat.com/pub/fedora/epel/5/x86_64/lua-5.1.4-4.el5.x86_64.rpm

这里我们建议采用源码包进行安装
cd /opt/install
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zvfx lua-5.1.4.tar.gz
cd lua-5.1.4

vi src/Makefile
在 CFLAGS= -O2 -Wall (MYCFLAGS)fPICCFLAGS=O2WallfPIC (MYCFLAGS) 来避免编译过程中出现错误。

make linux
make install

cp etc/lua.pc /usr/lib/pkgconfig/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig

4 .安装配置MySQL-Proxy
MySQL-Proxy可通过以下网址获得:
http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/

tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy

创建mysql-proxy服务管理脚本
mkdir /opt/mysql-proxy/init.d/

vim mysql-proxy
01 #!/bin/sh
02 #
03 # mysql-proxy This script starts and stops the mysql-proxy daemon
04 #
05 # chkconfig: - 78 30
06 # processname: mysql-proxy
07 # description: mysql-proxy is a proxy daemon to mysql
08
09 # Source function library.
10 . /etc/rc.d/init.d/functions
11
12 #PROXY_PATH=/usr/local/bin
13 PROXY_PATH=/opt/mysql-proxy/bin
14
15 prog=”mysql-proxy”
16
17 # Source networking configuration.
18 . /etc/sysconfig/network
19
20 # Check that networking is up.
21 [ ${NETWORKING} = “no” ] && exit 0

22
23 # Set default mysql-proxy configuration.
24 #PROXY_OPTIONS=”–daemon”
25 PROXY_OPTIONS=”–admin-username=root –admin-password=password –proxy-read-only-backend-addresses=192.168.10.131:3306 –proxy-backend-addresses=192.168.10.130:3306 –admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua –proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua”
26 PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid
27
28 # Source mysql-proxy configuration.
29 if [ -f /etc/sysconfig/mysql-proxy ]; then
30 . /etc/sysconfig/mysql-proxy
31 fi
32
33 PATH= PATH:/usr/bin:/usr/local/bin: PROXY_PATH
34

35 # By default it’s all good
36 RETVAL=0
37
38 # See how we were called.
39 case “$1” in

40 start)
41 # Start daemon.
42 echo -n "Starting prog: ”
43 NICELEVEL PROXY_PATH/mysql-proxy PROXYOPTIONSdaemonpidfile= PROXY_PID –user=mysql –log-level=warning –log-file=/opt/mysql-proxy/log/mysql-proxy.log
44 RETVAL= ?45echo46if[ RETVAL = 0 ]; then
47 touch /var/lock/subsys/mysql-proxy
48 fi
49 ;;
50 stop)
51 # Stop daemons.
52 echo -n "Stopping prog: ”
53 killproc prog54RETVAL= ?
55 echo
56 if [ RETVAL=0];then57rmf/var/lock/subsys/mysqlproxy58rmf PROXY_PID
59 fi
60 ;;
61 restart)
62 0stop63sleep364 0 start
65 ;;
66 condrestart)
67 [ -e /var/lock/subsys/mysql-proxy ] && 0restart68;;69status)70statusmysqlproxy71RETVAL= ?
72 ;;
73 *)
74 echo “Usage: 0start|stop|restart|status|condrestart75RETVAL=176;;77esac7879exit RETVAL

脚本参数详解:

PROXY_PATH=/opt/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径

PROXY_OPTIONS=”–admin-username=root \ //定义内部管理服务器账号
–admin-password=password \ //定义内部管理服务器密码
–proxy-read-only-backend-addresses=192.168.10.131:3306 \ //定义后端只读从服务器地址
–proxy-backend-addresses=192.168.10.130:3306 \ //定义后端主服务器地址
–admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua \ //定义lua管理脚本路径
–proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua” \ //定义lua读写分离脚本路径

PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径

NICELEVEL PROXY_PATH/mysql-proxy PROXYOPTIONS daemon //keepalive //使pidfile= PROXY_PID \ //定义mysql-proxy PID文件路径
–user=mysql \ //以mysql用户身份启动服务
–log-level=warning \ //定义log日志级别,由高到低分别有(error|warning|info|message|debug)

–log-file=/opt/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径

cp mysql-proxy /opt/mysql-proxy/init.d/
chmod +x /opt/mysql-proxy/init.d/mysql-proxy

mkdir /opt/mysql-proxy/run
mkdir /opt/mysql-proxy/log

mkdir /opt/mysql-proxy/scripts

配置并使用rw-splitting.lua读写分离脚本
最新的脚本我们可以从最新的mysql-proxy源码包中获取
cd /opt/install

wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz

tar xzvf mysql-proxy-0.8.1.tar.gz
cd mysql-proxy-0.8.1
cp lib/rw-splitting.lua /opt/mysql-proxy/scripts

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

vim /opt/mysql-proxy/scripts/rw-splitting.lua

– connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默认为4
max_idle_connections = 1, //默认为8
is_debug = false
}

end

修改完成后,启动mysql-proxy
/opt/mysql-proxy/init.d/mysql-proxy start

  1. 测试读写分离效果
    创建用于读写分离的数据库连接用户
    登陆主数据库服务器172.25.64.1,通过命令行登录管理MySQL服务器
    /opt/mysql/bin/mysql -uroot -p’new-password’
    mysql> GRANT ALL ON . TO ‘proxy1’@’172.25.64.2’ IDENTIFIED BY ‘password’;
    由于我们配置了主从复制功能,因此从数据库服务器172.25.64.3上已经同步了此操作。

为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器172.25.64.3,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p’new-password’

关闭Slave同步进程
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

连接MySQL-Proxy
/opt/mysql/bin/mysql -uproxy1 -p’password’ -P4040 -h192.168.10.132

登陆成功后,在first_db数据的first_tb表中插入两条记录
mysql> use first_db;
Database changed
mysql> insert into first_tb values (007,’first’);
Query Ok, 1 row affected (0.00 sec)
mysql> insert into first_tb values (110,’second’);
Query Ok, 1 row affected (0.00 sec)

查询记录

mysql> select * from first_tb;

+——+——+
| id | name |
+——+——+
| 1 | myself |
+——+——+

1 rows in set (0.00 sec)

通过读操作并没有看到新记录

mysql> quit
退出MySQL-Proxy

下面,分别登陆到主从数据库服务器,对比记录信息
首先,检查主数据库服务器

mysql> select * from first_tb;

+——+——+
| id | name |
+——+——+
| 1 | myself |
+——+——+
| 007 | first |
+——+——+
| 110 | second |
+——+——+

3 rows in set (0.00 sec)

两条新记录都已经存在

然后,检查从数据库服务器

mysql> select * from first_tb;

+——+——+
| id | name |
+——+——+
| 1 | myself |
+——+——+

1 rows in set (0.00 sec)

没有新记录存在

由此验证,我们已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步;
另外,所有的读操作都分摊给了其它各个Slave从服务器上,用来分担数据库压力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值