MySQL中间件之ProxySQL(13):ProxySQL集群
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
ProxySQL有原生的集群功能,但是这个原生的集群功能还正在试验阶段。本文会详细介绍这个原生集群的实现细节。
1.ProxySQL部署在哪
在拓扑结构中,ProxySQL部署在应用程序和MySQL集群的中间位置。应用程序向ProxySQL发起SQL语句,ProxySQL分析收到的SQL语句,进行匹配、重写等操作,然后路由给后端MySQL集群中的某实例。
如图:
上图描述的是多个application共用一个ProxySQL实例,但需求总是多变的。例如有些app比较繁忙,我们想要将这些繁忙的app使用的ProxySQL分离出来,让不同的application独立使用一个ProxySQL甚至一个ProxySQL集群,让那些不太繁忙的app共用一个ProxySQL。这种情形如下图:
还可以为每个app都配置一个ProxySQL,如下图。
这种配置的好处是明显的,没有单点故障,不需要额外的负载均衡,app+proxysql的节点可以轻松扩展。但是,也有缺点,各ProxySQL之间无法共享查询缓存。但无论如何,这是一种良好的配置方式。
此外,还可以使用多层结构,对ProxySQL群进行负载均衡。如下图:
上图几个注意点:
- 负载软件层,也可以使用ProxySQL对ProxySQL集群进行负载均衡,因为ProxySQL自身就是一个代理,而且是专门负责MySQL协议的代理。
- 在负载均衡层,要保证事务持久,不能让一个事务内的不同语句路由到不同的目标上,也就是说负载的目标是"有状态"的。因此在使用lvs/haproxy时,必须想办法保证事务持久性。通用性方法是,从多个ProxySQL节点中取出一个作为逻辑写节点(可以有backup),haproxy/lvs通过端口(也可以用户名,但通常采用端口)代理的方式,强制将所有写语句路由到这个固定的ProxySQL节点上。
- 而通过ProxySQL来代理ProxySQL集群,因为ProxySQL内部支持事务持久(在mysql_users表中字段transaction_persistent控制持久性)。
综上分析,通过lvs/haproxy负载ProxySQL或者负载MySQL、Galera、组复制等,实非良策。而ProxySQL因其MySQL协议感知,完全能胜任这样的负载工作。
无论如何,当有多个ProxySQL实例构成一个集群时,需要解决的问题是:如何保证ProxySQL的可用性、如何同步集群中各ProxySQL实例的配置。
目前ProxySQL原生集群功能还在研究当中,在原生集群(ProxySQL Cluster)功能中,使用master、候选master和slave的概念,master和候选master负责投票,负责写入、更改配置,并同步到集群中的其它节点。master故障后,还可以从候选Master中选举一个新的master,如下两图。这些特性能保证ProxySQL集群的可用性、伸缩性。
但是现在,在试验阶段步入稳定可用阶段之前,如何保证ProxySQL的可用性?只能借助第三方工具实现,例如:
- keepalived保证第一层次的代理高可用,缺点是可能会浪费一台机器(除非使用VRRP多实例的互为主从结构);
- ZooKeeper,ZooKeeper实现的分布式锁服务,可以人为进行master选举,从而协调整个ProxySQL集群。
这两种方案的拓扑图如下:
至于如何保证配置文件的同步性,其实这个不是大问题,只要通过管理工具,集群内的所有ProxySQL实例都以完全相同的配置启动,并以批量管理工具(如ansible/salt)来管理各实例,那么配置同步问题就没有多大问题。
但是需要注意,有些时候ProxySQL内部会自动执行load to runtime
,例如某ProxySQL实例发现某个MySQL Server节点拖后腿(replication lag),会临时避开这个节点,这时会在内部更改配置并load to runtime
。这样内部自动更改的配置如何同步到其它ProxySQL实例上去?其实这类内部更改无需同步,因为所有ProxySQL实例都在监控着后端,一个ProxySQL实例发现了问题,其它ProxySQL实例在极短的时间内也一定会发现问题并自动重新配置。
关于ProxySQL的集群拓扑,大概抛完砖了。经过上面的初步分析,ProxySQL可以结合app部署,可以部署单层ProxySQL群,可以部署多层ProxySQL群,还可以相互结合起来部署。可见,ProxySQL的部署方式非常灵活,能实现的需求也很有弹性,具体如何实现,就看自己的了。
2.ProxySQL原生集群
关于ProxySQL的原生集群功能,我已将官方手册部分进行翻译,ProxySQL Cluster。该手册中已经非常详细地解释了ProxySQL集群的实现细节,所以这里就不多做解释了。
MySQL中间件之ProxySQL(13):ProxySQL集群的更多相关文章
- MySQL/MariaDB数据库的Galera高可用性集群实战
MySQL/MariaDB数据库的Galera高可用性集群实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Galera Cluster概述 1>.什么是Gale ...
- MySQL Shell无法拉起MGR集群解决办法
MySQL Shell无法拉起MGR集群解决办法 用MySQL Shell要重新拉起一个MGR集群时,可能会提示下面的错误信息: Dba.rebootClusterFromCompleteOutage ...
- kubeadm安装kubernetes 1.13.1集群完整部署记录
k8s是什么 Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统.在 Docker 技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提 ...
- mysql的AB及读写和集群
Mysql的AB及读写 第1章 Mysql的AB配置 1.1 master配置 1.2 slave配置 第2章 读写分离 2.1 安装mycat 2.2 启动mycat 2.3 登录mycat相关问 ...
- mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...
- MyCAT+MySQL搭建高可用企业级数据库集群视频课程
原文地址:https://www.guangboyuan.cn/mycatmysql%E6%90%AD%E5%BB%BA%E9%AB%98%E5%8F%AF%E7%94%A8%E4%BC%81%E4% ...
- MHA-结合MySQL半同步复制高可用集群(Centos7)
目录 一.理论概述 本案例部署思路 二.环境 三.部署 部署MHA 部署二进制包MySQL及部署主从复制 部署半同步复制 配置MHA MHA测试 部署lvs+keepalived(lvs1,lvs2) ...
- MySQL高可用篇之MHA集群
1 准备工作 1.1 修改主机名 vim /etc/hosts # 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha3 ...
- 利用MySQL Router构建读写分离MGR集群
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 部署MySQL Router 2. 启动mysqlrouter服务 3. 确认读写分离效果 4. 确认只读负载 ...
- nodejs的mysql模块学习(十)连接池集群配置选项
连接池集群选项 canRetry : 如果true ,连接池集群会在连接失败时尝试连接 默认true removeNodeErrorCount : 如果连接失败,节点的errCount增加.当erro ...
随机推荐
- Git使用(一、TortoiseGit和Gitlab在Windows下的项目库创建和上传)
介绍使用TortoiseGit初次创建并上传到gitlab项目库,转载请注明出处. 一.需要先安装git环境,并配置Git用户名及邮箱. 二.用PuTTYgen生成公约私钥对(鼠标画画).PuTTYg ...
- appium + java + WebDriverAgent实现IOS app启动
Appium v1.8.1 <dependency> <groupId>io.appium</groupId> <artifactId>ja ...
- UEditor可以如何直接复制word的图文内容到编辑器中?
下载并打开工程: 文档的上传 运行: 复制随便一篇文档,粘贴进去. 通过粘贴后,文档以及图片被粘贴进来了,看看html代码: 图片全部使用img标签统一.传输进度条的效果也不错. 文档图片被放置在 ...
- [f]智能获取浏览器版本UA信息的方法
var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { ...
- css中文字超出文本框,溢出部分用点点点表示
text-overflow 属性规定当文本溢出包含元素时发生的事情.我们可以使用它来对文本超出的部分进行样式的处理. text-overflow: clip|ellipsis|string;包 ...
- <笔记>TP5的save方法返回值
用save方法来更新数据时,若更新前后数据没有改变则返回0,更新成功返回影响行数,更新失败返回false 若想要数据没改变时提示修改成功,则需要严格判断 if(结果!==false){提示成功}而不是 ...
- Activity的task任务栈
转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...
- HDU1262-寻找素数对
//#include<bits/stdc++.h> #include<map> #include<cstdio> #include<string> #i ...
- unigui 1.90.0 Example
Example//-------------------------------------1:[UNG-2783] - ReCaptcha -------//无法显示 //------------- ...
- Java基础巩固——排序
快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对两部分继续进行排序,直到整个序列有序. 实例: 1.一趟排序的过程: 2.排序的全 ...