Mysql读写分离
1、什么是读写分离?
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
2、为什么要读写分离?
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
3、什么时候读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。
4、主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
环境部署:
Master机:server1(172.25.51.5)
Slave 机: server2(172.25.51.6)
调度器proxy:server3(172.25.51.4)
Mysql读写分离配置:
一、调度器(proxy)
1、server4安装读写分离proxy
[[email protected] ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[[email protected] ~]# cd /usr/local/
[[email protected] local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
示图:软链接
2、修改读写分离的lua脚本
[[email protected] ~]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy/
[[email protected] mysql-proxy]# vim rw-splitting.lua
38 if not proxy.global.config.rwsplit then
39 proxy.global.config.rwsplit = {
40 min_idle_connections = 1,
41 max_idle_connections = 2,
42
43 is_debug = false
44 }
45 end
3、编写配置文件
[[email protected] ~]# cd /usr/local/mysql-proxy
[[email protected] mysql-proxy]# mkdir conf
[[email protected] mysql-proxy]# mkdir logs
[[email protected] mysql-proxy]# cd conf/
[[email protected] conf]# pwd
/usr/local/mysql-proxy/conf
[[email protected] conf]# vim mysql-proxy.conf
[mysql-proxy]
user=root
proxy-address=172.25.51.4:3306 ##代理层
proxy-read-only-backend-addresses=172.25.51.6:3306 ##读
proxy-backend-addresses=172.25.51.5:3306 ##写
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
4、修改权限,使权限变小(否则无法启动)
[[email protected] conf]# chmod 660 mysql-proxy.conf
5、启动mysql-proxy
[[email protected] conf]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
示图:mysql-proxy端口3306
二、测试
1、Master授权远程登陆
mysql> grant select,insert,update on westos.* to [email protected]'172.25.51.%' identified by 'Westos#123';
2、Master和Slave安装lsof(list open files)
[[email protected] ~]# yum install -y lsof
[[email protected] ~]# lsof -i :3306 ##列出被进程所打开的文件信息
示图:Master上发现主库只与从库建立连接
示图:Slave上发现从库只与主库建立连接
3、读写分离测试
<1>开启一个shell连接
[[email protected] ~]# mysql -h 172.25.51.4 -u wxh -p
示图:Master上调度器与主库连接(2个连接)
示图:Slave上调度区与从库连接
<2>开启两个shell连接
示图:Master上调度器与主库连接(2个连接)
示图:Slave上无与调度器连接
<3>开启三个shell连接(读写分离)
示图:Master上调度器与主库连接(2个连接)
综上:三台以上客户端连接,才会实现读写分离
验证读写分离成功:我们在连接Slave的客户端上写入数据,看是否写入到Master,如果写入,表示读写分离成功。
(第3个客户端虽然连接从库,但是写入时,mysql-proxy自动实现主库写入;)