基于proxy实现的mysql的读写分离

什么是读写分离?

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
为什么要实现读写分离?

因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
什么时候要读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。
主从复制和读写分离的原理:
基于proxy实现的mysql的读写分离_第1张图片
环境部署:
Master——->server1:172.25.30.1
Slave———>server2:172.25.30.2
Proxy———>server3:172.25.30.3

一:实现mysql的主从复制:

基于proxy实现的mysql的读写分离_第2张图片
安装mysql-proxy:

[root@server3 ~]# tar zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
[root@server3 ~]# cd /usr/local/mysql-proxy/
[root@server3 mysql-proxy]#mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
[root@server3 mysql-proxy]# useradd -r mysql-proxy
[root@server3 mysql-proxy]# id mysql-proxy
uid=498(mysql-proxy) gid=498(mysql-proxy) groups=498(mysql-proxy)
[root@server3 mysql-proxy]# mkdir etc
[root@server3 mysql-proxy]# mkdir logs
[root@server3 mysql-proxy]# vim ~/.bash_profile #s设置环境变量 
[root@server3 mysql-proxy]# source ~/.bash_profile

基于proxy实现的mysql的读写分离_第3张图片
[root@server3 mysql-proxy]# vim etc/mysql-proxy.cnf

[mysql-proxy]
user=root运行mysql-proxy用户 
admin-username=repl
admin-password=Redhat123*用户的密码
proxy-address=0.0.0.0:3306
proxy-read-only-backend-addresses=172.25.64.2:3306 指定后端从slave读取数据 
proxy-backend-addresses=172.25.64.1: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-username=admin
admin-password=Redhat123*  admin用户的密码
plugins=proxy,admin #添加admin模块
[root@server3 mysql-proxy]# chmod 660 etc/mysql-proxy.cnf 
[root@server3 mysql-proxy]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
-- connection pool
if not proxy.global.config.rwsplit then
        proxy.global.config.rwsplit = {
                min_idle_connections = 1,默认超过4个连接数时,才开始读写分离,改为1 
                max_idle_connections = 2,#默认8,改为2

                is_debug = false
        }
end

[root@server3 mysql-proxy]# bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/etc/mysql-proxy.conf #脚本启动proxy服务
[root@server3 mysql-proxy]# ps -ax
 1096 ?        Ss     0:00 /usr/sbin/anacron -s
 1186 ?        S      0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/mysql-proxy/et
 1187 ?        S      0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/mysql-proxy/et
 1188 pts/0    R+     0:00 ps -ax
[root@server3 mysql-proxy]# netstat -antlpe #端口4041mysql-proxy启动后会启动两个端口4040和4041,4040用于SQL转发,4041用于管理mysql-proxy。如有多个mysql-slave可以依次在后面添加

基于proxy实现的mysql的读写分离_第4张图片

[kiosk@foundation30 ~]$ mysql -h 172.25.30.3 -u admin -p -P 4041
#通过admin模块可以查看后端slave和master调用状态

基于proxy实现的mysql的读写分离_第5张图片

二.用户授权:

主库授权:可读可写权限 #该用户必须可以远程登陆root
mysql> grant all on *.* to root@'172.25.30.%' identified by 'Redhat123*';

mysql> flush privileges;
Query OK, 0 rows affected (0.13 sec)
登陆查看:多连几次就可以刷新:

基于proxy实现的mysql的读写分离_第6张图片

3.节点都安装lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

4.触发读写分离

在物理机上远程登陆

[kiosk@foundation30 ~]$ mysql -h 172.25.30.3 -u root -p #连接两次当超过rw-splitting.lua中的最大连接数就会触发读写分离

基于proxy实现的mysql的读写分离_第7张图片
master只支持两台连接当第三台连接proxy时就会连接到slave—->server2;但我们还是可以在登陆过程写入数据虽然登陆proxy—->slave;但proxy实现了读写分离我们还是写进数据的过程中还是用master写的在master可以看到数据证明我们写动作是master执行的:
基于proxy实现的mysql的读写分离_第8张图片

在master查看:同步过来
mysql> select * from userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
| user2    | 222      |
| user3    | 333      |
| user4    | 444      |
| user5    | 555      |
| user6    | 666      |
| user7    | 777      |
+----------+----------+

[root@server3 mysql-proxy]# yum install lsof -y 

基于proxy实现的mysql的读写分离_第9张图片
主数据库:安装lsof
基于proxy实现的mysql的读写分离_第10张图片
从数据库安装:

yum install tcpdump #抓包工具
tcpdump -i eth0 #可以看到prxoy的数据流:

主库查看:
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# mysqlbinlog mysql-bin.000001
基于proxy实现的mysql的读写分离_第11张图片
mysql> show variables like ‘%sync%’;频率
基于proxy实现的mysql的读写分离_第12张图片
mysql> show variables like ‘%binlog%’;日志文件
基于proxy实现的mysql的读写分离_第13张图片

你可能感兴趣的:(mysql)