思考并回答以下问题:
MySQL Cluster也称为MySQL集群或者MySQL簇,是一种允许在无共享架构(SNA,share nothing architecture)系统中部署“内存”数据库集群的技术。通过无共享架构,可以使系统使用廉价的硬件获取持续的高可用性。本章首先介绍了MySQL集群的基础知识,重点介绍了MySQL集群的环境搭建方法。
MySQL Cluster简介
MySQL Cluster是一个高性能、可扩展、集群化的数据库技术。MySQL集群是一种分布式架构,通常由一组计算机构成,每台计算机运行至少一个MySQL集群进程,每个MySQL集群进程对应一个“节点”(node)。通过节点间的切换,可以确保集群出现节点故障或者网络故障时的持续高可用性。
说明
在很多情况下,一个“节点”对应一台计算机。但在讨论MySQL集群时,一个“节点”表示的是一个“集群进程”。如果在单台计算机开启了多个集群进程,那么这台计算机上存在了多个节点。
MySQL集群的组成
MySQL集群由4类节点组成:SQL节点、数据节点、管理节点以及客户机节点。
1.客户机节点
为了实现MySQL集群中数据的增、删、改、查,需要通过MySQL客户机编辑、提交SQL语句(这里将MySQL客户机简称为客户机节点)。MySQL集群中最简单的客户机节点是打开CMD命令提示符窗口,然后输入“mysql -h localhost -u root -p”命令,接着连接MySQL 服务器。
2.SQL节点
SQL节点主要用于提供MySQL服务,提供了访问MySQL集群中数据节点中数据的“接口”。在MySQL集群体系中,客户机节点通过SQL节点访问数据节点中的数据,任意一个数据节点都是连接到所有的SQL节点的。当任意一个SQL节点出现故障时,客户机节点都可以将请求转移到其他SQL节点。当然,数据库开发人员应该提供一种当一个SQL节点出现故障时,客户机节点能够自行切换到其他SQL节点的机制。
事实上,MySQL集群主要是通过将NDB Cluster内存集群存储引擎与MySQL服务器集成实现的,因此SQL节点的MySQL服务必须支持NDB存储引擎才能实现MySQL集群。而传统的MySQL服务默认情况下仅支持8种存储引擎(不支持NDB Cluster存储引擎),为了实现MySQL集群,需下载、安装支持MySQL集群的MySQL服务软件。
通常,SQL节点使用命令“mysqld–ndbcluster”启动,或在my.ini配置文件的[mysqld]选项组中添加“ndbcluster”参数,使得SQL节点支持NDB Cluster 存储引擎。每个SQL节点对应一个mysqld.exe进程。
说明
NDB是网络数据库(network database)的缩写。NDB存储引擎支持所有通常的MySQL数据类型和SQL语句,该存储引擎还提供了完整的事务支持,而且是ACID兼容的。
3.数据节点
数据节点用于存储所有属于MySQL集群的数据,这些数据在数据节点之间被复制,以保证在一个或多个数据节点出现故障时,MySQL集群仍然持续可用。可以这样理解:在MySQL集群体系中,客户机节点通过SQL节点访问数据节点中的数据,任意一个SQL节点都是连接到所有的数据节点的,当任意一个数据节点出现故障时,SQL节点都可以将请求转移到另一个数据节点。
数据节点是通过命令“ndbd”启动的,每个数据节点对应一个ndbd.exe进程。
MySQL集群中的事务安全是由数据节点保证的,任意一个事务产生的数据变化会同时反映到所有数据节点中;某个事务在执行过程中,某个数据节点数据更新的失败会导致整个事务的回滚。说明
每个数据节点中都有两个检查点,即本地检查点以及全局检查点。本地检查点的目的是将内存中的数据和硬盘上的数据进行同步。全局检查点是在各节点中进行通信,以保证事务的一致性。
4.管理节点
管理节点用于控制MySQL集群启动时的初始配置,管理MySQL集群内的其他节点。管理节点的初始配置由集群配置文件决定,集群配置文件默认的文件名为config.ini,该配置文件提供了数据节点和SQL节点的全局配置信息,包括数据、索引所占用内存大小、各个节点的IP地址信息、数据存放的目录信息等。
MySQL集群期间,管理节点会获取其他节点的状态和错误信息,并将这些信息写入集群日志,反馈给集群中的其他所有节点。例如,当数据节点出现新的事件时,数据节点将关于该事件的信息传输到管理节点,然后由管理节点将事件信息写入集群日志,并反馈给其他节点。由于管理节点担任了集群中各个节点的沟通工作,因此在启动其他节点之前,应该首先启动管理节点。管理节点是通过命令“ndb_mgmd”启动的,每个管理节点对应一个ndb_mgmd.exe进程。
说明
管理节点只在集群启动和发生配置变化的时候起作用,集群正常运行期间停止管理节点,整个集群都将保持在线和可用状态。通常只需配置一个管理节点,然而为了排除单点故障需要,可能需要增加管理节点的数量。
MySQL集群架构
可以看出:MySQL集群架构可以简单地分为4个区域,客户机节点、SQL节点、数据节点、管理节点,如图1所示。
图1 MySQL集群架构
MySQL集群中的数据保存在NDB存储引擎的表中(数据节点中),MySQL集群中的表结构保存在MySQL服务器中(SQL节点中)。数据库用户通过客户机节点连接SQL节点访问集群数据,为了保证每个数据节点中的数据均匀分布,在进行数据插入时,SQL节点采用分片的策略将数据均匀分配到不同的数据节点上。管理节点通过管理工具(ndb_mgmd)管理数据节点与SQL节点,MySQL Cluster所有的这些节点构成一个完整的MySQL集群体系。
MySQL Cluster环境搭建
目前支持MySQL Cluster的操作系统有Linux、Mac OS X和Solaris,最新版本的MySQL Cluster支持更多的操作系统,包括Windows操作系统。本章以Windows操作系统为例,讲解MySQL Cluster配置的最简单方法。
准备工作
MySQL集群的准备工作包括下载MySQL集群软件、准备主机以及网络环境。
主机:对于实验目的的MySQL集群主机而言,MySQL集群可以在一台单独的计算机上成功部署,每个数据节点、SQL节点设置不同的目录以及端口号,即可进行MySQL集群实验。为了让读者更好地理解MySQL集群,本书以5台主机为例部署MySQL集群环境。
网络环境:集群内的主机必须可以通过IP地址相互通信(读者可以通过ping命令判断集群内的主机是否连通)。为了提升MySQL集群的性能以及高可用性,MySQL集群通常在单独的子网中部署(不建议跨越公网部署MySQL集群)。除此之外,还要确保集群内所有主机的防火墙关闭,否者可能导致SQL节点与管理节点无法连接。
MySQL集群软件:所需的MySQL集群软件可以在 MySQL Cluster 官网
说明
为了便于学习,读者也可以到本书指定的网址下载MySQL集群软件mysql-cluster-gpl-7.3.2-win32.zip。
假设当前的网络环境存在M、S1、S2、D1、D2五台主机,五台主机的IP 地址如表15-1所示,这些主机可以通过IP地址相互通信,并且它们的防火墙已经关闭。五台主机中,M主机是管理节点,D1和D2主机是数据节点,S1和S2是SQL节点。
表1 MySQL集群环境
对于免安装压缩文件mysql-cluster-gpl-7.3.2-win32.zip,将该文件分别拷贝到M、S1、S2、D1 与D2 五台主机的C盘,接着解压缩至当前文件夹,然后重命名为mysql-cluster,如图2所示。
为了便于启动管理节点、数据节点以及 SQL 节点,将图 15-2 中 bin 目录所在的路径(即C:\mysql-cluster\bin)添加到Path系统环境变量中(方法为:鼠标右键单击我的电脑高级环境变量系统变量Path),如图3所示。
图3 配置MySQL Cluster环境变量说明
如果当前主机存在其他MySQL服务,并且这些MySQL服务bin目录所在的路径已经配置到了 PATH 环境变量,建议删除这些环境变量的配置,或者将图2中bin目录所在的路径配置到Path环境变量最开始处。
数据节点的配置
数据节点的配置较为简单,分别将D1与D2主机中mysql-cluster目录中的my-default.ini配置文件重命名为my.ini,然后分别在两个my.ini配置文件中添加[mysql_cluster]选项组,并在该选项组中添加下列参数信息,如下所示。1
2[mysql_cluster]
ndb-connectstring = 192.168.4.15
说明
[mysql_cluster]选项组的 ndb-connectstring 参数用于指定当前的数据节点连接哪一台管理节点主机(IP地址为192.168.4.15的M主机提供了管理节点服务)。
至此,MySQL集群中的数据节点已经配置完毕。接下来讲解管理节点的配置方法。
SQL节点的配置
步骤1:在S1、S2主机上注册MySQL服务。
为了方便管理MySQL服务,便于启动、停止SQL节点,分别在S1、S2主机的CMD命令提示符窗口中运行下列命令,注册MySQL服务,执行结果如图15-4所示。
cd C:\mysql-cluster\bin
mysqld.exe -install mysqlcluster
▲图15-4 安装MySQL服务说明
同一台主机的服务名不能重名,否则将提示如图15-4所示的“The service already exists!”错误信息。出现重名问题后,如果不想修改服务名,可以在CMD命令提示符窗口中运行“sc delete mysqlcluster”命令,删除指定的服务(如果该服务正在运行,删除服务时将失败)。
成功注册MySQL服务后,右键单击“我的电脑”,在弹出的菜单中单击“管理”,在弹出的“计算机管理”窗口中双击“服务和应用程序”,然后单击“服务”选项,即可找到刚刚注册的MySQL服务(服务名为“mysqlcluster”),如图15-5所示(建议将MySQL服务的启动类型由自动修改为手动,再进行其他配置工作)。由于名字为“mysqlcluster”的MySQL服务缺失my.ini配置文件,mysqlcluster服务尚不能启动。
步骤2:启动MySQL服务。
分别将S1与S2主机中mysql-cluster目录中的my-default.ini配置文件重命名为“my.ini”,然后单击图15-5 中的“启动”链接,或者在CMD 命令提示符窗口输入命令“net start mysqlcluster”启动MySQL服务,接着在CMD命令提示符窗口输入下面的命令,开启MySQL客户机,并连接MySQL服务器,如图15-6所示(默认情况下,初始密码为空字符串)。
mysql -h localhost -u root -p
▲图15-6 启动MySQL服务
执行MySQL命令“show engines;”,执行结果如图15-7所示。从图15-7中可以看到,当前的MySQL服务默认的存储引擎为InnoDB,并且不支持NDB存储引擎。
▲图15-7 查看MySQL服务存储引擎
▲图15-7 查看MySQL服务存储引擎
步骤3:开启S1、S2 主机MySQL服务的NDB Cluster 存储引擎支持。
单击图15-8中的“停止”链接,或者在CMD命令提示符窗口输入命令“net stop mysqlcluster”,停止S1与S2主机的MySQL服务。分别在S1与S2主机my.ini配置文件的[mysqld]选项组中添加下列参数信息,该参数用于开启MySQL 服务的NDB Cluster 存储引擎支持。
ndbcluster
步骤4:指定管理节点。
分别在S1与S2主机my.ini配置文件的[mysqld]选项组中添加下列参数信息,该参数用于指定当前的SQL节点连接哪一台管理节点主机(IP地址为192.168.4.15的A主机提供了管理节点服务)。
ndb-connectstring = 192.168.4.15
至此,MySQL集群中的数据节点以及SQL节点已经配置完毕,接下来讲解管理节点的配置方法。由于MySQL集群中SQL节点、数据节点以及管理节点的启动顺序有特殊要求,配置管理节点前,暂且不能启动数据节点与SQL节点。
▲图15-8 MySQL服务管理
管理节点的配置
管理节点负责管理MySQL集群内所有其他节点,管理节点的配置比较复杂。管理节点的初始配置由集群配置文件决定,该文件配置了所有管理节点、所有数据节点以及所有SQL节点的基本信息。这里将IP地址为192.168.4.15的M主机作为“管理节点”,在M主机C盘根目录创建conf目录,在该目录下创建config.ini文件作为集群配置文件,并输入如下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[NDBD DEFAULT]
NoOfReplicas=2
DataDir=C:/data
[NDB_MGMD]
HostName=192.168.4.15
DataDir=C:/logs
#数据节点
[NDBD]
HostName=192.168.4.11
[NDBD]
HostName=192.168.4.12
#SQL节点
[MYSQLD]
HostName=192.168.4.13
[MYSQLD]
HostName=192.168.4.14
接着在M主机的C盘创建logs目录,在D1与D2主机的C盘创建data目录。需要注意的是:创建config.ini文件时,一定不能隐藏已知文件类型的扩展名。说明
集群配置文件 config.ini 中共有 6 种选项组,分别是[NDB_MGMD DEFAULT]、[NDB_MGMD]、[MYSQLD DEFAULT]、[MYSQLD]、[NDBD DEFAULT]以及[NDBD]。其中,名字中包含有“DEFAULT”的选项组最多出现一次,分别用于配置管理节点、SQL 节点以及数据节点参数的默认值。[NDB_MGMD]、[MYSQLD]以及[NDBD]选项组分别用于单个管理节点、单个 SQL 节点以及单个数据节点的个性化配置。例如,[NDBD DEFAULT]选项组的 DataDir 参数定义了所有数据节点日志信息默认存放的路径;[NDB_MGMD]选项组的 DataDir 参数定义了当前管理节点日志信息存放的路径。每个节点都有各自的个性化配置,例如,每个节点的主机 IP 地址需要使用 HostName参数进行单独的配置。说明
NoOfReplicas=2:表示在集群环境中,定义两个数据节点为一个节点组,同组存储的数据是相同的,继而避免了单点故障。可以看出,该参数定义了相同数据的份数,即数据的冗余次数。NoOfReplicas参数只能设置在[NDBDDEFAULT]选项组中,该参数对所有数据节点有效。NoOfReplicas参数的默认值为2,原因在于:假设当前MySQL集群环境存在两个数据节点D1和D2,需要存储两个数据A和B。如果将NoOfReplicas的值设为1,则数据A存储在节点D1上,数据B存储在节点D2上,此时,节点D1与节点D2中只要有一个节点宕机,数据将不再完整。但如果将NoOfReplicas的值设为2,则数据A存储在节点D1上,数据A的“副本”也将存储在节点D2上;数据B存储在节点D2上,数据B的“副本”也将存储在节点D1上,此时,即便节点D1与节点D2中有一个节点宕机,数据依然完整。
MySQL集群的启动
MySQL集群的启动包括管理节点的启动、数据节点的启动以及SQL节点的启动,启动顺序依次是:先启动管理节点,接着是数据节点,最后是SQL节点。
步骤1:启动管理节点。
在M主机的CMD命令行窗口中运行如下命令,即可启动管理节点,如图15-9所示。
ndb_mgmd ——configdir=c:/conf -f c:/conf/config.ini - initial
▲图15-9 管理节点的启动
管理节点成功启动后,M主机的C:/logs目录中将自动创建ndb_1.pid文件、ndb_1_cluster.log文件以及ndb_1_out.log文件,如图15-10所示。其中,ndb_1_cluster.log文件以及ndb_1_out.log文件用于记录管理节点的日志信息,ndb_1.pid用于记录管理节点的进程ID。
▲图15-10 管理节点的日志
同时,M主机的C:/conf目录中将自动创建ndb_1_config.bin.1文件,如图15-11所示。该文件是config.ini 集群配置文件的二进制缓存文件“副本”,以后每次重新启动管理节点时,管理节点将直接加载二进制缓存文件ndb_1_config.bin.1的配置信息。如果config.ini集群配置文件的内容发生了变动,需要删除ndb_1_config.bin.1文件后,再启动管理节点。
步骤2:查看管理节点的状态。
管理节点一旦启动,即可通过管理节点客户机了解管理节点当前的状态信息。打开 M 主机新的CMD命令行窗口,输入ndb_mgm命令,接着输入show命令,即可查看管理节点当前的状态信息,如图15-12所示。
▲图15-11 管理节点的二进制缓存文件
▲图15-12 查看管理节点的状态
图15-12中状态信息的含义依次如下:
① 连接本地主机的管理节点,管理节点默认情况下占用的端口号为1186。
② 管理节点的配置如下:
[ndbd(NDB)] 2 node(s):两个数据节点。
③ id=2 的数据节点主机 IP 地址为 192.168.4.11,该数据节点没有连接管理节点。集群中的每个节点都有唯一的标识。
④ id=3的数据节点主机IP 地址为192.168.4.12,该数据节点没有连接管理节点。
⑤ [ndb_mgmd(MGM)] 1 node(s):一个管理节点。
⑥ id=1的管理节点主机IP 地址为192.168.4.15。
⑦ [mysqld(API)] 2 node(s):两个SQL节点。
⑦ [mysqld(API)] 2 node(s):两个SQL节点。
⑧ id=4的SQL 节点主机IP 地址为192.168.4.13,该SQL节点没有连接管理节点。
⑨ id=5的SQL 节点主机IP 地址为192.168.4.14,该SQL节点没有连接管理节点。
步骤3:启动D1、D2主机的数据节点。
在D1主机的CMD命令行窗口中运行如下命令,执行结果如图15-13所示,此时D1主机的数据节点服务成功启动。从图15-13中可以看出,管理节点默认情况下占用的是1186端口号。
Ndbd – initial
▲图15-13 启动D1主机的数据节点
D1主机的数据节点服务成功启动后,D1主机的C:/data目录中将自动创建如图15-14所示的文件(或者目录)。
▲图15-14 D1数据节点的文件
在D2主机的CMD命令行窗口中运行如下命令,执行结果如图15-15所示,此时D2主机的数据节点服务成功启动。
Ndbd – initial
▲图15-15 启动D2主机的数据节点
D2主机的数据节点服务成功启动后,D2主机的C:/data目录中将自动创建如图15-16所示的文件(或者目录)。
▲图15-16 D2数据节点的文件说明
第一次启动数据节点时,或者config.ini配置文件改动后,在ndbd命令后建议添加“– initial”参数,以便进行数据节点的初始化工作。以后再次启动数据节点时,无需添加该参数,否则该参数将会使数据节点删除由早期ndbd进程创建的、用于恢复的任何文件,包括恢复用途的日志文件。
步骤4:启动S1、S2主机的MySQL服务。
重新启动S1、S2主机的MySQL服务,重新执行MySQL命令“show engines;”,
重新启动 S1、S2 主机的MySQL服务,重新执行MySQL命令“show engines;”,执行结果如图15-17所示。从图15-17中可以看到,当前的MySQL 服务已经支持NDB Cluster存储引擎。
步骤5:查看管理节点的状态。
打开M主机新的CMD命令行窗口,输入“ndb_mgm”命令,接着输入“show”命令,查看管理节点当前的状态信息,如图15-18所示。从图15-18可以看出:MySQL集群的所有节点已经成功启动。
▲图15-17 查看S1、S2主机的存储引擎
▲图15-18 查看管理节点的状态
15.2.6 集群测试
在S1 主机上打开CMD 命令提示符窗口,并输入“mysql -h localhost -u root -p”命令连接S1 主机的MySQL服务。接着依次输入下面的SQL语句,执行结果如图15-19所示。1
2
3
4create database student;
use student;
create table teacher(teacher_no int primary key) engine=ndb;
insert into teacher values(1);
▲图15-19 添加测试数据
由于 teacher 表的存储引擎是 NDB Cluster,teacher 表对应的表结构文件存放在 S1 主机C:\mysql-clusterdata\student目录下,如图15-20所示。
▲图15-20 NDB存储引擎的表结构文件
在另一台S2主机上打开CMD 命令提示符窗口,并输入“mysql -h localhost -u root -p”命令连接S2主机的MySQL服务。接着依次输入下面的SQL语句,执行结果如图15-21所示。1
2
3show databases;
use student;
select * from teacher;
▲图15-21 集群测试
可以看到:针对S1主机NDB Cluster存储引擎teacher表的数据更新同步到了S2主机。至此MySQL集群的环境搭建工作已经完毕。鉴于目前MySQL Cluster的成熟案例并不太多,为了便于读者快速地部署 MySQL Cluster 环境,上述 MySQL Cluster 环境搭建方法仅仅是集群的最简化配置方法。有关MySQL Cluster 的复杂配置,读者可以登录MySQL Cluster官网查看具体资料。
说明
SQL节点和数据节点在启动的时候需要连接到管理节点读取MySQL集群的配置信息,SQL节点和数据节点启动完成后,管理节点是可以停止工作的。因此MySQL集群过程中,即便管理节点宕机,也不会影响整个集群服务,所以管理节点一般只需要一台主机即可满足应用要求。