ProxySQL(13):ProxySQL集群
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9362822.html
ProxySQL有原生的集群功能,但是这个原生的集群功能还正在试验阶段。本文会详细介绍这个原生集群的实现细节。
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的部署方式非常灵活,能实现的需求也很有弹性,具体如何实现,就看自己的了。
ProxySQL原生集群
关于ProxySQL的原生集群功能,我已将官方手册部分进行翻译,ProxySQL Cluster。该手册中已经非常详细地解释了ProxySQL集群的实现细节,所以这里就不多做解释了。
ProxySQL(13):ProxySQL集群的更多相关文章
- OEMCC 13.2 集群版本安装部署
之前测试部署过OEMCC 13.2单机,具体可参考之前随笔: OEMCC 13.2 安装部署 当时环境:两台主机,系统RHEL 6.5,分别部署OMS和OMR: OMS,也就是OEMCC的服务端 IP ...
- kubeadm安装kubernetes 1.13.1集群完整部署记录
k8s是什么 Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统.在 Docker 技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提 ...
- Ubuntu 13 Zookeeper 集群配置
一. 目标 在Linux集群搭建Zookeeper集群,并配置管理Web管理系统. 二. 先决条件 本文档中基于VirtualBox Ubuntu Server 13.04 虚机(启动SSH服务器)构 ...
- K8S从入门到放弃系列-(13)Kubernetes集群mertics-server部署
集群部署好后,如果我们想知道集群中每个节点及节点上的pod资源使用情况,命令行下可以直接使用kubectl top node/pod来查看资源使用情况,默认此命令不能正常使用,需要我们部署对应api资 ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
- cdh 5.13 hadoop 集群IP变更详细步骤
1.因一些不可抗因素,集群IP变更. 修改CM的数据库IP地址 /etc/cloudera-scm-server/db.p... 2.修改每个主机的hosts列表 3.修改SCM数据库的hosts表中 ...
- 13.1SolrCloud集群使用手册之Collections API
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建collection name:指明collection名字 router.name:指定路由策略,默 ...
- ActiveMQ-5.13.0集群
ActiveMQ集群介绍 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave(ActiveMQ5.8版本已不可用 ...
- 13.4SolrCloud集群使用手册之CRUD
转载请出自出处:http://www.cnblogs.com/hd3013779515/ Student.java package cn.ljh.ssm.test; import org.apache ...
- 13.3SolrCloud集群使用手册之Zookeeper指令
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.upconfig java -classpath .:/home/solr/cloud/lib/* org ...
随机推荐
- OutputStreamWriter介绍&代码实现和InputStreamReader介绍&代码实现
java.io.OutputStreamWriter extends Writer OutputStreamWriter: 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编 ...
- Fleet 使用感受
1. 前言 笔者主要使用的编程语言是 Java.平时使用的 IDE 是 JetBrains 公司的 IntelliJ IDEA.有时候也会打开该公司旗下的 PyCharm.DataGrip.WebSt ...
- docker容器管理操作
Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...
- .net6与英雄联盟邂逅之——根据官方LCU API制作游戏助手
看了网上很多自己开发的英雄联盟的小助手工具,当时苦于没有api,自己也想做一个.后来发现了其实拳头本身就提供了LCU API在客户端运行的时候会暴露出来. 现在我们就来了解下工具的实现. 查询数据:h ...
- 《Python编程:从入门到实践》第十八章笔记:Django最基本用法笔记
最近在看Python编程:从入门到实践,这是这本书"项目3 Web应用程序"第18章的笔记.记录了django最基本的一些日常用法,以便自己查阅. 可能是我的这本书版本比较老,书上 ...
- PHP,javascript实现大文件上传
HTML代码 <!doctype html> <html lang="en"> <head> <meta charset="UT ...
- YII场景
YII在模型中定义场景后 public function scenarios(){//场景 return [ 'sco1'=>['aid','uphone'], 'sco2'=>['aid ...
- Nginx 浏览器缓存配置指令
# 浏览器缓存 # 当浏览器第一次访问服务器资源的时候,服务器返回到浏览器后,浏览器进行缓存 # 缓存的大概内容有: # 1.缓存过期的日期和时间 # 2.设置和缓存相关的配置信息 # 3.请求资源最 ...
- 如何给MySQL添加自定义语法 ?
目录 1 背景 2 新增关键词(token) 3 新增语法 4 类似于PT_partition添加对应的数据结构global_partition_clause 1 背景 MySQL语法解析器用的bis ...
- CSS3 基础学习
CSS基础学习 当前进度[P78] 参考资料 视频链接:https://www.bilibili.com/video/BV14J4114768 菜鸟教程:https://www.runoob.com/ ...