MySQL集群(三)mysql-proxy搭建负载均衡与读写分离
前言
前面学习了主从复制和主主复制,接下来给大家分享一下怎么去使用mysql-proxy这个插件去配置MySQL集群中的负载均衡以及读写分离。
注意:这里比较坑的就是mysql-proxy一直没有更新导致版本太落后了,我在MySQL5.7.19中搭建玩负载均衡后有bug,所以这里我在windows中搭建了两个MySQL(好像是5.6或5.6以下的都可以搭建成功)服务器。
还有就是可以使用mysql-proxy的替代品mysql-Router功能更强大!废话不多说,我们直接干起来。
一、mysq-proxy简介与安装
1.1、mysql-proxy简介
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,
从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。
当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。
1.2、实例描述作用
1)我们在进行web开发的时候,往往一台MySQL服务器是不够用的,可能需要多台,web到底连接哪个数据库?
这个要程序员自己写的代码来决定的,现在是二台mysql服务器,如果有多台或者是N台呢,靠用php代码来管理连接数据库,就很尴尬了。
2)mysql proxy就很好解决了这个问题,对于程序端而言,web端的请求,只要到mysql proxy的连接池就OK了,剩下的工作就交给mysql proxy了。对于程序代码管理来说就简单多了。个人觉得这一点最值得借用的了。
1.3、mysql-proxy的安装
其实这个也有windows的版本,但是我推荐在linux中去使用,因为在开发中大部分服务器都是安装在linux中的。我的就是安装在ubuntu17.04版本的server版中。
1)首先你需要有这个安装包:mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz(需要的话私聊我)
2)一般我们把这个第三方的软件安装在/opt目录下
解压mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz到/opt/目录并创建软链接。
tar zxvf mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz –C /opt/
ln –snf /opt/mysql-proxy-0.8.5-linux-debian6.0-x86-64bit /opt/mysql-proxy(创建软链接不懂的看前面的博文)
3)配置环境变量
这里的话,一般配置在.bashrc下,因为每个用户有每个用户不同的功能,你也可以配置在全局环境变量当中(/etc/profile)
我在.baserc下的配置:
sudo vi .bashrc 在最后面添加:
完成之后注意要更新:source .bashrc如果配置在全局变量中也要更新
4)查看是否安装成功
其实当你输入mysql-p的时候,按tab键能够联想出来,说明你已经配置成功了。我们可以通过mysql-proxy -V查看是否配置成功。
二、使用mysql-proxy实现负载均衡
那我们该怎么去配置负载均衡呢?我们可以通过mysql-proxy --help来查看参数的意思
搭建步骤:
我的mysql-proxy安装在ubuntu中,两个mysql服务器安装在windows当中。
1)在你的已经安装了mysql-proxy的主机上创建一个脚本:mysql-proxy-replication.sh
#!/bin/bash
/opt/mysql-proxy/bin/mysql-proxy \
--proxy-address=1.0.0.3: \ #这个是安装mysql-proxy的主机上的ip,这个4040端口是mysql-proxy的默认端口
--proxy-backend-addresses=192.168.2.45: \ #这个是mysql服务器安装主机的ip和mysql的端口
--proxy-backend-addresses=192.168.2.45: \
--log-level=info \
--log-file=/opt/mysql-proxy/logs/mysql-proxy-.log \ #存放日志文件的位置
--daemon
2)然后我们执行这个脚本,我把脚本放在了家目录上面
创建好了,可以修改一下文件的权限sudo chmod u+x mysql-proxy-replication.sh
还要创建一下存放日志文件的目录与文件sudo mkdir -r /opt/mysql-proxy/logs与touch mysql-proxy-12.log
执行sudo ./mysql-proxy-replication.sh
注意:这里我为了给大家演示我把mysql-proxy先关闭:使用ps -ef查看进程号,在使用sudo kill -9 进程号或者sudo killall mysql-proxy
3)我们查看一下日志,看是否脚本运行成功
sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log
从日志文件可以清楚的看到,插件proxy正在监听着4040端口,它还添加了两个MySQL服务器(主主复制)。
4)获取mysql-proxy中管理的两个服务器的连接
获取连接:mysql -uroot -p123456 -h1.0.0.3 -P4040
分析:我们的用户名和密码是使用的是MySQL服务器的用户名和密码,因为是要从他们两个当中获取连接,ip和端口都是使用代理的ip和端口。
5)结果
我们在这里执行创建一个数据库:create database db_test_1
使用mysql -uroot -p123456 -h1.0.0.3 -P4040获取的连接
然后在查看mysql两台服务器有没有创建成功
使用mysql -uroot -p -h192.168.2.45 -P3125和mysql -uroot -p -h192.168.2.45 -P3126登录
两个都是一样的,说明主主复制的两个集群,使用mysql-proxy管理成功!
总结:在这个负载均衡当中,其实就是使用mysql-proxy均衡两个MySQL服务器的连接数。这里不管这个连接里面的连接处理的数据量有多大,处理时间有多长。
比如主机A有5个连接,处理时间只需要10分钟。二主机B有2个连接,处理时间需要1个小时。当有第8个连接时,更有可能获取的是主机B的连接。
mysql_proxy会把连接mysql服务器的tcp/IP连接缓存进连接池,以提高性能. 在缓存池里, 缓存的连接大致是平均分配在每台mysql服务器上. 但具体的每一个连接,始终连某台服务器.
三、使用mysql-proxy实现读写分离
3.1、概述
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
3.2、配置读写分离
在这里我只是配置的是主主复制。
1)怎么配置在两台MySQL服务器中的主主复制我就不介绍了,前面一篇博客已经介绍了。
2)在你的已经安装了mysql-proxy的主机上创建一个脚本:mysql-proxy-rw-splitting.sh,并运行
首先我们在前面当中已经运行了mysql-proxy我们需要先杀死这个进程:sudo killall mysql-proxy
#!bash/bin
/opt/mysql-proxy/bin/mysql-proxy \
--proxy-address=1.0.0.3: \
--proxy-backend-addresses=17.16.15.112: \ #在3125端口的服务器中配置可读可写
--proxy-read-only-backend-addresses=172.16.15.112: \ #在3126端口的服务器中配置只读
--proxy-lua-script=/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua \ #用这个lua脚本来实现读写分离
--log-level=info \
--log-file=/opt/mysql-proxy/logs/mysql-proxy-.log \ #这是它的日志
--daemon
3)我们查看一下日志,看是否脚本运行成功
sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log
-- ::: (critical) plugin proxy 0.8. started
-- ::: (message) proxy listening on port 1.0.0.3:
-- ::: (message) added read/write backend: 17.16.15.112:
-- ::: (message) added read-only backend: 172.16.15.112:
4)获取连接:mysql -uroot -p123456 -h1.0.0.3 -P4040
分析:我们的用户名和密码是使用的是MySQL服务器的用户名和密码,因为是要从他们两个当中获取连接,ip和端口都是使用代理的ip和端口。
四、Mysql-proxy 中间件的使用
4.1、在mysql 客户端通过中间件连接mysql集群
mysql –uroot –p –h 192.168.41.201 –P 4040(注意修改my.conf中绑定ip后才能远程登录mysql,且有远程登录账号 GRANT ALL PRIVILEGES ON *.* TO ‘root’@‘%’ IDENTIFIED BY ‘’ WITH GRANT OPTION;)
如果远程连接很卡,或者很慢,可以关闭mysql节点 地址反向解析功能 在my.cnf 中添加 skip-name-resolve。
4.2、在mysql 客户端通过中间件连接mysql集群
可以通过 JDBC 访问mysql-proxy进而访问mysql集群 Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://192.168.41.201:4040/test?user=briup&password=briup";
不错就点个“推荐”哦!
MySQL集群(三)mysql-proxy搭建负载均衡与读写分离的更多相关文章
- Mycat搭建负载均衡,读写分离的Mysql集群
Mycat搭建负载均衡,读写分离的Mysql集群 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.Mycat-server-1.6.7.4-te ...
- 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群,并部署客户端负载均衡和高可用
本文作者系:视野金服工程师 | 吴海胜 首发于 Nebula Graph 论坛:https://discuss.nebula-graph.com.cn/t/topic/1388 一.前言 本文介绍如何 ...
- 基于开源软件构建高性能集群NAS系统,包括负载均衡(刘爱贵)
大数据时代的到来已经不可阻挡,面对数据的爆炸式增长,尤其是半结构化数据和非结构化数据,NoSQL存储系统和分布式文件系统成为了技术浪潮,得到了长足的发展.非结构化数据目前呈现更加快速的增长趋势,IDC ...
- MySQL Route负载均衡与读写分离Docker环境使用
Docker环境描述 主机名 部署服务 备注 MySQL Route MySQL Route 部署在宿主机上的MySQL Route服务 MySQL Master1 MySQL 5.7.16 Dock ...
- SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)
SQL Server上唯一的数据库集群:负载均衡.读写分离.容灾(数据零丢失.服务高可用).审计.优化,全面解决数据库用户问题.一键安装,易用稳定,性价比高,下载链接:http://www.zheti ...
- mysql集群之MYSQL CLUSTER
1. 参考文档 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%9 ...
- 2.高并发教程-基础篇-之nginx+mysql实现负载均衡和读写分离
技巧提示:mysql读写分离搭建好之后,配合nginx的负载均衡,可以高效的mysql的集群性能,同时免去麻烦的query分流.比如,sever1收到的请求就专门链接slave1从mysql读取数据, ...
- Redis+PHP扩展的安装和Redis集群的配置 与 PHP负载均衡开发方案
以前有想过用 Memcache 实现M/S架构的负载均衡方案,直到听说了 Redis 后才发现它做得更好.发了几天时间研究了一下 Redis ,感觉真的很不错,特整理一下! 以下操作都是在 SUSE ...
- 利用中间件 mysql_proxy 完成 mysql 的负载均衡和读写分离
安装 mysql_proxy cd /usr/local/src wget http://mysql.cdpa.nsysu.edu.tw.Downloads/MySQL - ...
随机推荐
- 教程:基于访问控制的ABAP CDS视图权限
Hi! 对每一个CDS视图,我们都可以通过DCL(Data Control Language)定义访问控制.在这篇文章中,我会介绍ABAP CDS视图中非常重要的一面:权限管理. 本文的阐述基于我正在 ...
- 进程管理之wait和waitpid
僵尸进程 在介绍wait.waitpid和waitid函数之前,首先要介绍一下僵尸进程,因为,这三个函数的本质任务就是处理僵尸进程的问题. 进程会我们的生命体一样,也有消亡.进程在退出时,内核会清理进 ...
- Vue2.0父子组件之间和兄弟组件之间的数据交互
熟悉了Vue.js的同级组件之间通信,写此文章,以便记录. Vue是一个轻量级的渐进式框架,对于它的一些特性和优点,请在官网上进行查看,不再赘述. 使用NPM及相关命令行工具初始化的Vue工程,目录结 ...
- jstack jstat 简易使用教程
jstack – 用来查看堆栈信息 jstat – 用来查看JVM相关信息 jstack用法 找到CPU使用最高的进程:top命令,然后按P,CPU使用率排序,就可以看到对应的pid 先说一种暴力的方 ...
- BotVS配置托管者-基于阿里云
1. 上传Linux 64位 托管者并解压在 https://www.botvs.com/m/add-node 上下载Linux 64位 托管者, 当前下载地址 https://dn-botvs.qb ...
- java中的ArrayList 使得集合中的对象不重复
JAVA中的List接口存放的元素是可以重复的,在这个我重写对象里面的equals()方法,让集合里存放的对象不能重复 首先建一个类,在里面的main()方法中实现 list1中存放的是可以重复对象的 ...
- vue echarts 遇到的bug之一 无法渲染的问题
图表示这样的 页面上有很多个图表,由于没有查询按钮,就只是点击发送ajax数据,所以把所有图表的方法放在updated中, 功能是实现了没问题,但是加载页面的时候会发送很多的ajax请求,而且点击修改 ...
- bootstrap 基础(一)
1 bootstrap简介 bootstrap是Twitter公司的两名前端设计师设计的. bootstrap是一款基于HTML.CSS和JavaScript的一个前端框架. bootstrap的特点 ...
- js文件引用方式及其同步执行与异步执行
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp74 任何以appendChild(scriptNode) 的方式引入 ...
- Java缓存类的实际应用场景
不要着迷于技术,应把注意力放到问题上. 一个普通的后台管理系统,一定会有参数配置.参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作.参数配置的这些数据信息是贯穿在整个项目中,那么把他们放 ...