读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。所以读写分离,解决的是,数据库的写入,影响了查询的效率。数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。
实验准备3台主机:
server2:(master)
server3:(slave)
server4:(proxy)
首先配置好server2/3的主从复制。
安装mysql-proxy:
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@server4 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@server4 ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
[root@server4 ~]# cd /usr/local/mysql-proxy/bin/
[root@server4 bin]# vim ~/.bash_profile
[root@server4 bin]# source ~/.bash_profile
[root@server4 mysql-proxy]# cd share/doc/
[root@server4 doc]# cd mysql-proxy/
[root@server4 mysql-proxy]# vim rw-splitting.lua
min_idle_connections = 1,默认超过4个连接数时,才开始读写分离,改为1
max_idle_connections = 2,#默认8,改为2
配置mysql-proxy启动文件
[root@server4 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --help ##查看配置项
[root@server4 ~]# cd /usr/local/mysql-proxy/
[root@server4 mysql-proxy]# mkdir conf
[root@server4 mysql-proxy]# mkdir logs
[root@server4 mysql-proxy]# cd conf/
[root@server4 conf]# vim mysql-proxy.conf
user=root运行mysql-proxy用户
proxy-address=0.0.0.0:3306
proxy-read-only-backend-addresses=172.25.0.118:3306 指定后端从slave读取数据
proxy-backend-addresses=172.25.0.117:3306指定后端主master写入数据
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua读
写分离配置脚本 admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log日志位置
log-level=debug定义log日志级别,由高到低分别有(error|warning|info|message|debug
daemon=true以守护进程方式运行
keepalive=true 崩溃时,尝试重启
admin-address=172.25.0.119:4041 ##proxy的管理用户adminiphe端口
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua #admin的lua脚本地址
admin-username=admin #添加admin用户
admin-password=Westos+123 ## admin用户的密码
plugins=proxy,admin #添加admin模块
启动mysql-proxy:
[root@server4 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@server4 conf]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
测试:
主库授权:#该用户必须可以远程登陆root
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Westos+123';
[root@server4 ~]# mysql -h 172.25.0.117 -u root -p
mysql> use westos
mysql> select * from usertable;
安装lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
[root@server2 ~]# yum install lsof -y
[root@server2 ~]# lsof -i :3306
当连接数大于2(lua脚本中设置);即启动了读写分离机制:可以登陆admin proxy管理用户查看
再开启一个shell连接mysql
在连接mysql的shell里添加信息
mysql> insert into usertable values('user3','333');
通过tcpdump抓取数据分析读写分离
[root@server2 ~]# yum install tcpdump -y
[root@server2 ~]# tcpdump -i eth0 port 3306