mysql-proxy简介
MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。
 mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等

 MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,

  从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。

  当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。

从图中可以看到,SQL语句并不直接进入到master数据库或者slave数据库,而是进入到
proxy,然后proxy判断这条语句是有关写的语句(包括insert、update、delete)还
是读语句(select),当是写语句的时候,那么proxy将向master所在的服务器发出请
求,同理,如果是读语句的时候,proxy将向slave所在的服务器发出请求。
  
环境设定:

server1 172.25.78.11 master
server2 172.25.78.12 slave
server3 172.25.78.13 mysql-proxy
前提:必须实现主从复制

server1上建立用户

server2同步成功

通过编写lua脚本实现读写分离
在slave上

[root@server3 ~]# cd /usr/local/mysql-proxy/
[root@server3 mysql-proxy]# mkdir conf
[root@server3 mysql-proxy]# cd conf/
[root@server3 conf]# pwd
/usr/local/mysql-proxy/conf
[root@server3 conf]# vim ~./bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin
[root@server3 conf]# source ~/.bash_profile
[root@server3 conf]# cd ..
[root@server3 mysql-proxy]# mkdir logs
[root@server3 mysql-proxy]# cd conf/
[root@server3 conf]# vim mysql-proxy.conf
[mysql-proxy]
user=root 运行mysql-proxy用户
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.44.1:3306 #指定后端主master写入数据
proxy-read-only-backend-addresses=172.25.44.2:3306 #指定后端从slave读取数据
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 #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
daemon=true #以守护进程方式运行
keepalive=true #mysql-proxy崩溃时,尝试重启
[root@server3 logs]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy/
[root@server3 conf]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@server3 logs]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
2018-08-14 10:23:06: (critical) mysql-proxy-cli.c:326: loading config from '/usr/local/mysql-proxy/conf/mysql-proxy.conf' failed: permissions of /usr/local/mysql-proxy/conf/mysql-proxy.conf aren't secure (0660 or stricter required)
2018-08-14 10:23:06: (message) Initiating shutdown, requested from mysql-proxy-cli.c:328
2018-08-14 10:23:06: (message) shutting down normally, exit code is: 1
[root@server3 logs]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@server3 logs]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@server3 conf]# ps ax
1555 ? Ss 0:00 sshd: root@pts/1
1557 pts/1 Ss+ 0:00 -bash
1617 pts/0 R+ 0:00 ps ax
[root@server3 conf]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]

[root@server3 conf]# ps ax
1662 ? S 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults
1663 ? S 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults
1664 pts/0 R+ 0:00 ps ax
[root@server3 conf]# netstat -antlp
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1663/mysql-proxy

客户端进行远程测试

[root@foundation44 ~]# mysql -h 172.25.44.3 -u root -p # 远程登陆测试
MySQL [(none)]> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [westos]> select * from userlist;
+----------+----------+
| username | password |
+----------+----------+
| userq | 111 |
| user2 | 222 |
| user3 | 333 |
| user5 | 555 |
+----------+----------+
4 rows in set (0.00 sec)

如果登陆不上,就在master端进行授权

在master端插入数据

[root@server1 ~]# mysql -pTing@666
mysql> insert into userlist values('user6','666');
Query OK, 1 row affected (0.09 sec)

看客户端是否可以成功同步

[root@foundation44 ~]# mysql -h 172.25.44.3 -u root -p
MySQL [westos]> select * from userlist; #数据同步成功
+----------+----------+
| username | password |
+----------+----------+
| userq | 111 |
| user2 | 222 |
| user3 | 333 |
| user5 | 555 |
| user6 | 666 |
+----------+----------+
5 rows in set (0.00 sec)

在master上进行监控

[root@server1 ~]# yum install -y lsof
[root@server1 ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1248 mysql 18u IPv6 8560 0t0 TCP *:mysql (LISTEN)
mysqld 1248 mysql 48u IPv6 9242 0t0 TCP server1:mysql->server3:44918 (ESTABLISHED)
mysqld 1248 mysql 50u IPv6 9089 0t0 TCP server1:mysql->server2:37402 (ESTABLISHED)

在master上插入数据,多次远程连接,就会抓到
mysql> use westos;
mysql> insert into userlist values('user7','777');
Query OK, 1 row affected (0.08 sec)
mysql> insert into userlist values('user8','888');
Query OK, 1 row affected (0.17 sec)

[root@server1 ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1248 mysql 18u IPv6 8560 0t0 TCP *:mysql (LISTEN)
mysqld 1248 mysql 48u IPv6 9242 0t0 TCP server1:mysql->server3:44918 (ESTABLISHED)
mysqld 1248 mysql 49u IPv6 9909 0t0 TCP server1:mysql->server3:44919 (ESTABLISHED)
mysqld 1248 mysql 50u IPv6 9089 0t0 TCP server1:mysql->server2:37402 (ESTABLISHED)
mysqld 1248 mysql 52u IPv6 10300 0t0 TCP server1:mysql->server3:44922 (ESTABLISHED)

#自动抓包
[root@server3 mysql-proxy]# server default db: westos
client default db:
syncronizing
server default db: westos
client default db:
syncronizing
server default db: westos
client default db:
syncronizing

[root@server3 conf]# pwd
/usr/local/mysql-proxy/conf
[root@server3 conf]# vim mysql-proxy.conf

[root@server3 mysql-proxy]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf --plugins=admin --plugins=proxy
[root@server3 mysql-proxy]# netstat -antlp #会出现4041端口
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 1753/mysql-proxy
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1753/mysql-proxy

#如果端口没有出现,执行以下操作:
[root@server3 mysql-proxy]# killall mysql-proxy
#重新刷新
[root@server3 mysql-proxy]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf --plugins=admin --plugins=proxy

#远程登陆4041,,4041为管理员端口,3306为mysql-proxy与进行读写分离的两台mysql的主机进行直接通信的端口,如果使用mysql-proxy的默认端口,则必须在登陆时在后面加上 -P 4040

#远程登陆master和slave,必须成功登陆

#再次远程查看就会变成up

#检测读写分离
[root@server3 mysql-proxy]# vim rw-splitting.lua #改变连接数,方便查看实验效果

因为在proxy读写脚本设置的最大连接数是2,而现在已经达到最大连接数

再次刷新连接,查看监控就会发现连接到slave端

读的数据也是slave端的数据

但是写入数据时就会写在master端

在server1上可以查看到添加的数据

拓展
mysql-proxy --help

--help-all :获取全部帮助信息;
--admin-address=host:port :管理模块监听的地址和端口;
--proxy-backend-addresses=host:port :后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name :完成mysql代理功能的Lua脚本;
--daemon :以守护进程模式启动mysql-proxy;
--keepalive :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name :日志文件名称;
--log-level=level :日志级别;
--log-use-syslog :基于syslog记录日志;
--plugins=plugin:在mysql-proxy启动时加载的插件;
--user=user_name :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name : 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling : 禁用profile;
--pid-file=/path/to/pid_file_name :进程文件名;

实现mysql的读写分离(mysql-proxy)____2的更多相关文章

  1. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  2. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  3. python实现mysql的读写分离及负载均衡

    Oracle数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候. 但是,相对my ...

  4. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  5. MySQL Router实现MySQL的读写分离

    1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...

  6. 搭建基于MySQL的读写分离工具Amoeba

    搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...

  7. MySQL的读写分离的几种选择

    MySQL的读写分离的几种选择 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 原址如下: http://heylinux.com/archives/1004. ...

  8. MySQL/MariaDB读写分离配置

    DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力:数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作.实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的mys ...

  9. 使用mysql-proxy实现mysql的读写分离

     前言: MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力.使用mysql-proxy实现mysql的读写分离,mysq ...

随机推荐

  1. PAT 1008数组元素右移问题

    PAT 1008数组元素右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变 ...

  2. vim替换字符串

    1. s 命令来替换字符串 :s/vivian/sky/ #替换当前行第一个 vivian 为 sky :s/vivian/sky/g #替换当前行所有 vivian 为 sky :n,$s/vivi ...

  3. 自己开发SSO单点登录

    概述 单点登录指的是有一个中央的单点登录服务器,各个子系统和这个中央的单点登录服务器打交道,比如有A,B两个子系统. A登录后,B系统就不用再登录,直接可以访问,当其中有一个子系统选择注销时,那么所有 ...

  4. Httpd服务入门知识-Httpd服务常见配置案例之修改监听的IP和Port

    Httpd服务入门知识-Httpd服务常见配置案例之修改监听的IP和Port 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看默认配置 [root@node101.yinzh ...

  5. zabbix--CPU监控并告警

    zabbix监控CPU超值则报警 由于默认没有 cpu 的使用率监控,需要添加一个监控项,通过 system.cpu.util[,,] 来进行配置 添加监控项  添加图形 添加触发器 展示图

  6. php一句话木马+中国菜刀拿服务器文件目录

    使用工具: 中国菜刀 一句话php木马 <?php @eval($_POST['123456']);?> 第一步,将php木马上传至服务器,为了方便我就直接在服务器上建立. [root@p ...

  7. Git for Windows安装教程

    1.国内直接从官网(http://git-scm.com/download/win)下载比较困难,速度极慢,需要翻墙. 这里提供一个国内的下载站,方便网友下载(https://npm.taobao.o ...

  8. git---如何解决The authenticity of host can't be established.

    新生成密钥的时候,git clone或者push的时候,可能会报这样的错误: ``` The authenticity of host 'gitee.com (xxx.xxx.xxx.xxx)' ca ...

  9. upd

    今天是中华人民共和国成立70周年,先祝我的祖国母亲生日快乐 由于最近嗓子不太好使,我就不发歌了 分割线 在学校挤了一点本来应该发呆的时间写了点没用的 前一部分是对一点OI知识的复习,后一部分是最近高中 ...

  10. destoon6.0 手机版添加下载模块

    common.inc.php  里面加入 下载板块的down 名称 在include 文件里 加入 down.inc.php 文件 在 mobile模版里 加入 down.htm 模版文件 在 电脑版 ...