返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.htmlhtml
ProxySQL有原生的集群功能,可是这个原生的集群功能还正在试验阶段。本文会详细介绍这个原生集群的实现细节。mysql
在拓扑结构中,ProxySQL部署在应用程序和MySQL集群的中间位置。应用程序向ProxySQL发起SQL语句,ProxySQL分析收到的SQL语句,进行匹配、重写等操做,而后路由给后端MySQL集群中的某实例。git
如图:github
上图描述的是多个application共用一个ProxySQL实例,但需求老是多变的。例若有些app比较繁忙,咱们想要将这些繁忙的app使用的ProxySQL分离出来,让不一样的application独立使用一个ProxySQL甚至一个ProxySQL集群,让那些不太繁忙的app共用一个ProxySQL。这种情形以下图:sql
还能够为每一个app都配置一个ProxySQL,以下图。后端
这种配置的好处是明显的,没有单点故障,不须要额外的负载均衡,app+proxysql的节点能够轻松扩展。可是,也有缺点,各ProxySQL之间没法共享查询缓存。但不管如何,这是一种良好的配置方式。缓存
此外,还可使用多层结构,对ProxySQL群进行负载均衡。以下图:app
上图几个注意点:负载均衡
综上分析,经过lvs/haproxy负载ProxySQL或者负载MySQL、Galera、组复制等,实非良策。而ProxySQL因其MySQL协议感知,彻底能胜任这样的负载工做。分布式
不管如何,当有多个ProxySQL实例构成一个集群时,须要解决的问题是:如何保证ProxySQL的可用性、如何同步集群中各ProxySQL实例的配置。
目前ProxySQL原生集群功能还在研究当中,在原生集群(ProxySQL Cluster)功能中,使用master、候选master和slave的概念,master和候选master负责投票,负责写入、更改配置,并同步到集群中的其它节点。master故障后,还能够从候选Master中选举一个新的master,以下两图。这些特性能保证ProxySQL集群的可用性、伸缩性。
可是如今,在试验阶段步入稳定可用阶段以前,如何保证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 Cluster。该手册中已经很是详细地解释了ProxySQL集群的实现细节,因此这里就很少作解释了。