MySQL集群架构01MySQL架构的关注点
mysql集群架构系列将讨论mysql集群架构的几种最常见形式解决的问题,实现原理,存在的问题,以及环境搭建步骤。
本文主要讨论mysql架构关注的问题。
1.高可用的作用
在mysql的高可用架构中,高可用的作用简单来讲就是保证整个架构的对外服务不会出现中断,即通过技术手段避免单点故障引起架构整体服务中断,提供7x24小时不间断的有效服务。
这个保障服务不中断的作用具体的说,表现为:
在整个高可用架构中,对外提供读写服务的主机宕机或者mysql服务崩溃后,其它主机
仍然可以继续对外提供服务,并接管已宕机的主机的服务,从而保证整个架构的对外服务不会出现中断。
在不同的高可用架构实现方案中,实现这个保障的机制有所不同,但目的都是相同的,就是保障高可用架构作为一个整体,对外提供7x24小时不间断的服务。
2.高可用的实现方案
mysql高可用架构的实现方案,根据实现的核心机制的不同,主要分为以下三类:
基于mysql主从复制技术的方案。mm+keepalived、mmm、mha等技术方案的核心机制都是mysql主从复制技术。最经典最常用的mha方案的核心就是在保障没有数据丢失的情况下实现了故障自动转移。这种情况下所屏蔽的单点故障,通常仅仅限于对外提供读写服务的mysql主节点,而不包括仅仅提供只读服务的从节点,即使从节点出现故障,通常也不属于管辖范围。
基于pxc(percona xtradb cluster)的gcache技术的方案。pxc集群中增加了管理节点的概念,同时pxc集群中任意两个节点之间都可以建立必要的连接。pxc集群中每个mysql节点都拥有完整的数据,新增节点使用percona xtrabackup工具进行数据的复制。pxc集群中每个mysql节点均可以对外提供读写服务,天生就是一个mysql高可用方案。
基于mysql ndb 技术的mysql ndb cluster的方案。mysql ndb cluster集群中包含管理节点、sql节点和数据节点三种节点,同时任意两个节点之间都建立了必要的连接。集群中的数据存储在数据节点中,每个数据节点只存储一部分数据,每一部分数据至少保存在两个不同的节点中。集群中每个mysql节点均可以对外提供读写服务,同样天生就是一个mysql高可用方案。由于各种原因,这款oracle官方的mysql集群方案,竟然很少有企业实际应用到生产环境。
3.高可用方案做了的工作
高可用方案主要是检测mysql集群(多个mysql主机的各种形式的组合,不单指pxc集群或者ndb 集群)中的单点故障,在发现单点故障的时候,将该故障主机暂时下线处理,同时将其承担的对外服务转移到其它主机上。
总结为三个工作:
(1)定时检测单点故障。
一般是通过mysql客户端程序mysql执行一些查询mysql服务状态的sql语句进行分析判断mysql服务是否可用,同时还会判断主从之间是否存在较大的延时。
(2)屏蔽故障节点。
一般是通过将故障节点做暂时下线处理,比如停止mysql服务,使得第三方中间件(比如mycat、haproxy等)不再使用故障节点,但仅此一个操作,无法让应用程序停止对该故障节点的访问尝试。
(3)转移故障节点的对外服务到其它节点。
如果没有使用第三方中间件,则应用程序通常没法自动停止对故障节点的访问尝试。不解决
这个问题,则这个高可用方案基本没什么用,因为在集群的故障节点屏蔽(停止服务)后,外部的应用程序仍然会尝试连接和访问这个故障节点,因为应用程序根本不知道集群的对外服务已经不是由这个故障节点来提供了。
解决这个问题的办法通常有两种:
一是使用第三方负载均衡中间件,这些中间件往往可以配合特定的脚本程序自动探测并屏蔽故障节点。应用程序只能访问第三方中间件提供的对外服务端口,而并不知道集群内部各个mysql节点的ip地址。
二是使用vip相关技术,主要原理是使用vip代表mysql集群对外提供服务,应用程序只知道访问vip,而不知道集群内部各个mysql节点的ip地址。在高可用方案探测到故障节点后,去除故障节点的vip,同时在其它可用节点之一上增加vip,通过vip的自动转移实现集群对外服务地址的固定不变,从而对外屏蔽集群内部的单点故障。
4.高可用方案没有做的工作
高可用方案没做的工作包括以下几个:
集群中多个节点对外提供服务时,各个节点之间的负载均衡工作。单纯的高可用方案通常不包括负载均衡。负载均衡有专门的第三方中间件来实现。有的高可用方案已经包含了
负载均衡中间件,有些则直接使用vip,大部分则没有包括负载均衡,比如pxc集群、ndb集群、mha等都没有包括负载均衡。
读写分离的工作。单纯的高可用方案通常不包括读写分离的工作。读写分离通常也有专门的中间件来做,比如haproxy、mysql router、maxscale等。
分库分表的工作。单纯的高可用方案通常不包括分库分表的工作。分库分表通常有专门的中间件来做,比如mycat、oneproxy等。
5.负载均衡的作用
在mysql的技术架构中,负载均衡组件的作用主要体现为将外部应用程序对多个mysql服务主机的访问,简化为对负载均衡组件的特定访问端口的访问,简化了外部应用程序访问数据库的过程。
同时,负责均衡组件通常还可以通过一些脚本程序检测mysql服务主机的故障从而自动屏蔽对该主机的访问。
另外有一些负载均衡组建同时附带拥有读写分离的功能,可以实现特定的读写分离的功能。
6.负载均衡的实现方案
负载均衡的实现方案,通常有以下几种:
通用的负载均衡技术。负载均衡组件仅仅在某个网络层次负责转发数据。收到外部应用程序的网络数据包后,根据某种策略从后端真正的服务主机中选择出一个主机,将数据包转发到这个主机上。可以工作在网络层,也可以工作在传输层。负载均衡组件不了解数据包的实际含义。包括ipvs等负载均衡组件。
基于协议的负载均衡技术。负载均衡组件通常工作在应用层,了解每个数据包的实际含义,比如http协议,mysql的客户端协议等。包括haproxy、nginx、mysql router等负载均衡组件。
7.读写分离的作用
在应用程序中,通常都是数据的读操作非常多,而写操作相对少。因此读写分离之后,可以放置大量的用于只读连接的mysql服务器,从而提高整个架构的读性能,而且不会影响承担写数据功能的主mysql服务器。
8.读写分离的实现方案
两种方案:
基于连接的读写分离。比如haproxy,mysql router等。这些软件开启两个端口分别用于客户端的读操作和写操作的连接端口,同时会将来自这两个端口的数据转发到后端的两组mysql服务器之一,这两组服务器分别是用于读操作和写操作。这种方式需要dba对后端的mysql服务器进行配置,将只读组配置为只读状态。
基于mysql客户端连接协议的读写分离。就是说这种软件需要理解mysql客户端和服务器之间的通信协议,即可以解析出传输的sql语句,从而识别出是select操作还是insert/update/delete操作。实现真正的读写分离。比如mycat等软件。
9.分表分库的作用
分表分库的作用主要体现在单表的记录数特别巨大的场景中。在单表数据量巨大(超过1000万条)的情况下,该表所在的mysql节点容易成为性能瓶颈。如果将这个表水平分割为多张数据量相对较小的表,同时将这些表按照一定的规律,分布到不同的mysql节点上,那么多个mysql节点共同承担读写负载,使得每个节点的读写压力都大大降低,而且,这些mysql节点可以使用更加廉价的硬件来搭建环境。
10.分表分库的实现方案
分表分库主要的实现方案包括以下两种类型:
(1)使用mysql自带的分区表或者合并表的功能。这种方案仍然是单机部署的思路,不是分布式数据访问的思路。
(2)使用第三方中间件,比如mycat,maxscale等。可以实现自动化的分表分库功能,应用程序几乎不需要改动即可完成。本文主要关注mycat中间件来实现分表分库。
后续博客将具体讨论几种常见架构。
上一篇: orcl 复杂查询
下一篇: 垂直电商,没有冬奥?