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 ...
随机推荐
- 21条最佳实践,全面保障 GitHub 使用安全
GitHub 是开发人员工作流程中不可或缺的一部分.无论你去哪个企业或开发团队,GitHub 都以某种形式存在.它被超过8300万开发人员,400万个组织和托管超过2亿个存储库使用.GitHub 是世 ...
- input函数的高级使用
经典的a+b问题终于重出江湖了 a=input('a = ') b=input('b = ') print(a+b)//error,因为此时ab是字符串类型,其加号起到的是连接的作用 所以这就是类型转 ...
- Linux串口编程进阶
在<Linux串口编程>编程一文中介绍了串口应用中常用的基本操作,如:串口打开关闭.串口设置.数据收发等.本篇文章主要基于常规串口操作进行了扩充,主要介绍如下操作: Linux系统使用非标 ...
- 第八天pyhton3 函数的返回值、作用域
返回值 pthon函数使用return语句返回"返回值": 所有函数都有返回值,如果没有return语句,隐式调用return None: return 语句并不一定是函数的语句块 ...
- Scanner练习
练习1 键盘输入两个数字求和 public static void main(String[] args) { Scanner in = new Scanner(System.in); System. ...
- 学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难
上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块学习Explain执 ...
- 兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
Go lang,为并发而生的静态语言,源于C语言又不拘泥于性能,高效却不流于古板,Python灵活,略输性能,Java严谨,稍逊风骚.君不见各大厂牌均纷纷使用Go lang对自己的高并发业务进行重构, ...
- P4315 月下“毛景树”(树链剖分)
P4315 月下"毛景树"(树链剖分) 题面 简述: 边权转点权(在dfs1处转换) 把一条边权赋值在深度更深的上 需要实现对单边权的染色 , 路径边权的染色 , 路径边权的增加 ...
- 60行自己动手写LockSupport是什么体验?
60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...
- True 和 False 分别代表数字中的几?形象地记忆
True 和 False 作为布尔值分别代表的意思是真和假. 灯泡亮起就是 1,灯泡熄灭就是 0.0 就是无状态,所以可以代表灯泡熄灭的状态,而 1 就是有状态的,所以可以代表灯泡亮起的状态. 那么, ...