最近负责的项目严重依赖mysql,遇到了不少性能问题.前期通过代码优化、索引优化、读写分离等手段,项目尚能苟延残喘.但随着数据量与日俱增,单纯的优化已经不能从本质上解决性能问题,需要从数据库架构上做出改变.于是对mysql集群进行了初步调研,简单介绍和对比下六种集群方案.
innodb副本集的拓扑图与单主模式的innodb集群(见下文)非常相似,由单个主节点(PrimaryNode,ReadandWrite)和多个从节点(SecondaryNode,ReadOnly)组成.应用程序可通过MySQLRouter中间件来透明地访问InnoDBReplicaSet.
下图为InnoDBCluster单主模式的拓扑图,由单个主节点(PrimaryNode,ReadandWrite)和多个从节点(SecondaryNode,ReadOnly)组成.与InnoDBReplicaSet一样,客户端应用程序同样通过MySQLRouter透明地连接到服务器实例,但不同的是InnoDBCluster具有内置的故障转移机制,如果主节点出现故障,从节点会自动选举为主节点,MySQLRouter检测到这一点后,会将客户端应用程序自动转发到新的主节点。
MySQLInnoDBClusterSet由主集群和副本集群构成,主要应用于不同数据中心集群数据的复制,为InnoDBCluster部署提供容灾能力。如果主集群由于数据中心丢失或网络连接丢失而变得不可用,可以改为激活副本集群以恢复服务的可用性。例如下图示例,主集群及其副本集群均由三个成员服务器实例组成,一个主服务器实例和两个从服务器实例。其中,MySQLRouter仍然可以自动将客户端应用程序路由到InnoDBClusterSet中的正确集群。
NDBCluster将标准MySQL服务器与称为NDB(NetworkDataBase)的内存集群存储引擎集成在一起,是一种在无共享系统中实现内存数据库集群的技术,提供了高可用性和数据持久性功能。
在无共享系统中,每个组件都应该有自己的内存和磁盘,不推荐或不支持使用网络共享、网络文件系统和SAN等共享存储机制。无共享架构使系统能够使用非常便宜的硬件,并且对硬件或软件的特定要求最低。
NDBCluster就是指一个或多个MySQL服务器与NDB存储引擎的组合。集群一般包括MySQL服务器节点(sqlnode或APInode,用于访问NDB数据)、数据节点(datanode,用于存储数据)、一个或多个管理服务器节点(mgmnode,用于集群管理)。
SQL节点可以直接访问集群中的数据.当应用程序更新数据后,所有MySQL服务器都可以立即看到此更改。
SQL节点使用的mysqld服务器守护程序,在许多关键方面与MySQL8.0发行版提供的mysqld二进制文件不同,两个版本的mysqld不可互换。
NDBCluster表通常完全存储在内存中而不是磁盘上。但一些NDBCluster数据可以存储在磁盘上.
一个或多个节点构成节点组,节点存储数据分区(Partition),一个分区保存至少一个片段副本(FragmentReplica).
MariaDBGaleraCluster是一个几近同步的多主集群。它仅在Linux上可用,并且仅支持InnoDB存储引擎.
从下图可以看到,PerconaXtraDBCluster与MariaDBGaleraCluster具有几乎相同的特点,具体如下:
综上所述,现有的mysql集群方案都重在“复制”上,当我们仅仅只是想要提升mysql的性能而寻求集群方案时,不得不把数据存个好几份,对于大量时效性较短的数据而言,用后即删,根本没必要存储多份,反而显得有些浪费资源.这种情况下,可能不进行冗余备份的NDB集群才是最佳选择?