MySQL NDB Cluster使用及性能测试

MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。

MySQL集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部分都应该拥有自己的内存和磁盘。任何共享存储方案如网络共享,网络文件系统和SAN设备是不推荐或不支持的。通过这种冗余设计,MySQL声称数据的可用度可以达到99.999%。

实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。

概念介绍

成员角色

管理节点(MGM)

用来实现整个集群的管理,理论上一般只启动一个,而且宕机也不影响 cluster 的服务,这个进程只在cluster 启动以及节点加入集群时起作用, 所以这个节点不是很需要冗余,理论上通过一台服务器提供服务就可以了。通过 ndb_mgmd 命令启动,使用 config.ini 配置文件。

数据节点(NDB)

用来存储数据,可以和管理节点(MGM)、 用户端节点(API)处在不同的机器上,也可以在同一个机器上面,集群中至少要有一个DB节点,2个以上 时就能实现集群的高可用保证,DB节点增加时,集群的处理速度会变慢。通过 ndbd 命令启动,第一次创建好cluster DB 节点时,需要使用 –init参数初始化。

客户端节点(API)

通过他实现 Cluster DB 的访问,这个节点也可以是普通的 mysqld 进程,也可以是空节点,提供给外界连接,如JAVA程序。 需要在配置文件中配置ndbcluster 指令打开 NDB Cluster storage engine 存储引擎,增加 API 节点会提高整个集群的并发访问速度和整体的吞吐量,该节点 可以部署在Web应用服务器上,也可以部署在专用的服务器上,也开以和DB部署在 同一台服务器上。

网络拓扑

NDB安装

这里使用安装工具安装,自带GUI操作界面,比较方便。

下载地址

请根据MySQL版本下载对应的NDB安装包

地址:https://dev.mysql.com/downloads/cluster/

包:mysql-cluster-community-7.6.8-1.el7.x86_64.rpm-bundle.tar,mysql-cluster-gpl-7.6.8-el7-x86_64.tar.gz

安装步骤

解压两个包

删除已有的mysql安装包

安装Auto Installer工具并启动,安装过程中会需要其他依赖包,按提示安装即可

将必要的文件拷到相应目录下

创建用户及组

启动安装工具

Auto-Installer图形化安装步骤

第一次登陆输入一个密码,这里随便填,并且需要填写一个配置文件名,随便填,如test。

填写集群内机器IP及登陆方式,其他默认即可。

连接主机成功后会显示主机信息。

节点管理,可以创建或删除节点。

创建好之后查看节点分布情况以及管理端口目录等等。

部署启动或停止集群。

各组件运行命令行

使用命令行查看集群状态

连接Mysql客户端及建库建表

ClusterJ API 使用

概念介绍

详见官方文档:https://dev.mysql.com/doc/ndbapi/en/mccj-overview-clusterj-object-models.html

接口定义

定义一个数据库对象接口,不用的字段可以不映射。

基础用法

高级使用

可以做批量插入、删除、修改、等操作。

详见官方文档:https://dev.mysql.com/doc/ndbapi/en/mccj-using-clusterj.html

JDBC使用

因为集群提供了服务,所以我们可以通过传统JDBC方式接入NDB集群。

性能测试

本次性能测试只比较同等条件下,Mysql Cluster NDB的两种Java访问方式的性能差异,并不涉及NDB与单Mysql实例的性能对比。

NDB集群主机配置

测试程序主机配置

测试背景

为检测NDB的两种访问方式的效率,故通过工具分别对、进行性能测试对比。为保证两种方式的对等性,只连一个API Node节点,并设置最大事务数为64;JDBC只连一个服务端,并设置连接池大小为64.

系统架构图

ClusterJ是通过JNI接口直接与NDB的数据节点交互,而JDBC则需要通过Mysqld服务进行数据操作。因此理论上ClusterJ的效率要好与JDBC。

ClusterJ测试工程

参数配置:

核心代码:

JDBC测试工程

参数配置:

核心代码:

测试结果

基础数据

ClusterJ访问方式CRUD随线程增加TPS变化数据

ClusterJ访问方式CRUD随线程增加CUP Load变化数据

JDBC访问方式CRUD随线程增加TPS变化数据

JDBC访问方式CRUD随线程增加CUP Load变化数据

TPS趋势对比图

Insert操作

Select操作

Update操作

Delete操作

CPU Load趋势图

ClusterJ CRUD操作

JDBC CRUD操作

结论分析

由上述几张图可知,Select操作ClusterJ方式要比JDBC方式快两倍左右,Insert操作快1.5倍左右,而Update、Delete操作性能基本相当。

ClusterJ访问方式基于JNI接口直接访问数据节点NDB Node,因此比JDBC方式效率要高很多。对于Update、Delete操作,ClusterJ需要通过Session先查询出来,然后再对对象进行下一步操作,实际上做了两步操作,因此在效率上比没有出现预想的比JDBC高。

在测试集群中,NDB Cluster的数据节点有两个,MySQL服务端节点一个。使用ClusterJ是直连数据节点,压力是均匀分布在两台机器上;而通过JDBC连接时,压力全部都在MySQL节点上。因此,使用ClusterJ要比JDBC方式对数据库主机的压力要小得多。

但是ClusterJ同时只能操作一个表对象,不能进行多张表之间的Join操作,因此局限性也是显而易见的。

测试源码

GitHub地址:https://github.com/CharleyWuCL/ndb-practice

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181220G190V400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券