读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
[root@server4 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@server4 ~]# cd /usr/local/
[root@server4 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
[root@server4 ~]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy/
[root@server4 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
[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]# pwd
/usr/local/mysql-proxy/conf
[root@server4 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
[root@server4 conf]# chmod 660 mysql-proxy.conf
[root@server4 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
示图:mysql-proxy端口3306
mysql> grant select,insert,update on westos.* to wxh@'172.25.51.%' identified by 'Westos#123';
[root@server5 ~]# yum install -y lsof
[root@server5 ~]# lsof -i :3306 ##列出被进程所打开的文件信息
[root@foundation51 ~]# mysql -h 172.25.51.4 -u wxh -p
(第3个客户端虽然连接从库,但是写入时,mysql-proxy自动实现主库写入;)