1.3.1 MySQL
MySQL作为一款开源的关系型数据库,目前在互联网领域应用非常广泛。MySQL虽然比较轻便小巧,但支持大型的数据库部署模式,是能够处理上千万条记录的大型数据库。MySQL提供原生的文档数据库支持,使用GPL开源协议,主要提供免费的社区版软件,同时也提供收费的企业版本软件和技术支持。MySQL的开源性使其在互联网领域得到广泛应用和普及,并能够根据业务需求研制定制化需求的MySQL系统。基于其开源性,有多种开发组件或第三方中间件可以构建MySQL数据库集群架构,因此在MySQL部署过程中,需要根据业务需求进行MySQL的技术选型。
目前,常见的支持MySQL进行数据库集群架构的第三方中间件有MySQL Proxy、MySQL Cluster等。
1. MySQL Proxy
MySQL Proxy是MySQL官方提供的MySQL中间件服务,是一个处于业务端和MySQL Server端之间的代理程序,可以监测、分析和改变它们的通信。MySQL Proxy使用MySQL协议,使用灵活,常见的用途包括负载平衡、读写分离、故障查询分析、查询过滤和修改等。当服务器需要访问数据库时,将直接连接到MySQL Proxy,通过这个代理程序访问后端的多个MySQL服务器,如图1-6所示。在MySQL读写分离实施过程中,主节点处理写操作,从节点处理读操作,非常适合读操作量比较大的场景,可减轻单节点的压力。在使用MySQL Proxy实现MySQL的读写分离时,MySQL Proxy实际上是后端MySQL服务器的代理,直接接受客户端的请求,对SQL语句进行分析,判断是读操作还是写操作,然后分发至对应的MySQL服务器上。MySQL Proxy相当于一个连接池,负责将前台应用的连接请求转发给后台数据库,并且通过使用Lua脚本,实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对应用来说,MySQL Proxy是完全透明的,应用只需要连接到MySQL Proxy的监听端即可。当然,MySQL Proxy机器可能出现单节点失效,但完全可以使用多个MySQL Proxy机器作为冗余,在应用服务器的连接池中配置多个到MySQL Proxy的连接参数即可。
图1-6 MySQL Proxy
任何使用MySQL数据库的服务器程序都无须修改任何代码,即可迁移至MySQL Proxy上。另外,MySQL Proxy允许用户指定Lua脚本对请求进行拦截,同时能够对请求进行分析与修改,它还允许用户指定Lua脚本对服务器的返回结果进行修改,加入一些结果集或去除一些结果集。
2. MySQL Cluster
MySQL Cluster是MySQL家族中的产品,是一个基于NDB Cluster存储引擎的完整分布式数据库系统。它不仅具有高可用性,而且可以自动切分数据,还具有冗余数据等高级功能。在功能实现上,MySQL Cluster是一个无共享(Share Nothing)的数据库集群架构,MySQL服务器之间不共享任何数据,因此具备高度的可扩展性和可用性。
MySQL Cluster的集群环境主要由3部分组成,如图1-7所示。
1)NDB管理节点(NDB管理服务器,NDB Management Server)
NDB管理节点负责整个MySQL Cluster中各个节点的管理工作,主要用于管理MySQL Cluster中的其他类型节点,通过它可以配置各节点信息、启动和停止各个节点、对各个节点进行常规维护,以及实施数据的备份恢复等。NDB管理节点会获取整个MySQL Cluster环境中的各节点状态和错误信息,并且将集群中各个节点的信息反馈给其他节点。由于管理节点上保存了整个集群环境的配置,同时承担了集群中各节点的基本沟通工作,所以它必须是最先被启动的节点。
图1-7 MySQL Cluster
2)SQL节点
在MySQL Cluster中,一个SQL节点就是一个使用NDB管理节点引擎的MySQL服务器进程,是外部应用提供集群数据的访问入口。SQL节点主要负责实现数据库在存储层上的所有事情,如连接管理、查询优化和响应、缓存管理等。在纯MySQL Cluster环境中的SQL节点,可以被认为是一个不需要提供任何存储引擎的MySQL服务器,因为它的存储引擎由MySQL Cluster环境中的NDB管理节点来担任。所以,SQL层各MySQL服务器的启动与普通MySQL服务器的启动有一定的区别,需要进行独立设置。
3)数据节点
数据节点主要用于存储集群数据,从而实现底层数据存储功能。每个数据节点保存完整数据的一个分片,这主要是受节点数目和参数控制的,因此MySQL Cluster在存储层上不会出现数据单节点存储的问题。在实际使用中,单节点存储所有数据还是一部分数据还受存储节点数目的限制。在通常情况下,可以通过设置参数来配置数据节点,从而控制数据的冗余存储情况。