Mysql NDB Cluster 集群搭建实战全网最详细

2023年3月29日

Mysql NDB Cluster 集群搭建实战全网最详细

https://dev.mysql.com/doc/refman/8.0/en/mysql-cluster-overview.html   #官方的文档介绍地址

一、NDB集群概述

NDB集群是一种在无共享系统中实现内存数据库集群的技术。无共享体系结构使系统能够使用非常便宜的硬件,并且对硬件或软件的特定要求最低。
  NDB集群设计为没有任何单点故障。在无共享系统中,每个组件都应该有自己的内存和磁盘,不建议或不支持使用共享存储机制,如网络共享、网络文件系统和SAN。
  NDB Cluster将MySQL服务器与NDB的内存集群存储引擎集成在一起。NDB集群由一组主机组成,每个主机运行一个或多个进程。这些被称为节点的进程可以包括MySQL服务器(用于访问NDB数据)、数据节点(用于存储数据)、一个或多个管理服务器,以及可能的其他专用数据访问程序。NDB集群中这些组件的关系如下所示:

当数据使用NDB存储引擎存储时,表和数据存储在数据节点中。这样的表可以从集群中的所有其他SQL节点直接访问。尽管NDB集群SQL节点使用mysqld服务器守护进程,但它与MySQL 8.0提供的mysqld二进制文件在许多关键方面有所不同,而且mysqld的两个版本是不可互换的。
  NDB集群中存储在数据节点中的数据可以被镜像,集群可以处理单个数据节点的故障,除了少量事务因丢失事务状态而中止外,没有其他影响。
  单个节点可以停止并重新启动,然后重新加入集群。滚动重新启动(其中所有节点依次重新启动)用于进行配置更改和软件升级。滚动重启也被用作在线添加新数据节点过程的一部分。
  NDB集群节点可以采用不同的传输机制进行节点间通信;在大多数实际部署中,TCP/IP超过标准的100mbps或更快的以太网硬件被使用。

二、NDB核心概念

NDB CLUSTER是一种内存存储引擎,提供高可用性和数据持久性功能。NDB CLUSTER存储引擎可以与一系列故障切换和负载平衡选项进行配置。NDB Cluster的NDB存储引擎包含一整套数据,仅依赖于群集本身内的其他数据。
  共有三种类型的群集节点:

管理节点:管理节点的作用是管理NDB Cluster内的其他节点,执行诸如提供配置数据,启动和停止节点以及运行备份之类的功能。由于此节点类型管理其他节点的配置,因此应首先启动此类型的节点,然后再启动任何其他节点。使用命令ndb_mgmd启动一个MGM节点 。

数据节点:数据节点存储集群数据。数据节点的数量是副本的数量乘以片段的数量。例如,对于两个副本(每个副本都有两个片段),需要四个数据节点。一个副本足以存储数据,但不提供冗余。因此,建议具有2个(或更多)副本以提供冗余,从而提高可用性。使用命令 ndbd或 ndbmtd启动数据节点。NDB Cluster表通常完全存储在内存中,而不是磁盘上。但是,某些NDB Cluster数据可以存储在磁盘上。

SQL节点:SQL节点是一个访问集群数据的节点。对于NDB集群,SQL节点是使用NDB CLUSTER存储引擎的传ySQL服务器。SQL节点是以–ndbcluster和–ndb connectstring选项启动的mysqld进程。SQL节点实际上只是一种特殊类型的API节点,它指定任何访问NDB集群数据的应用程序。

在生产环境中采用三节点设置是不现实的这样的配置没有冗余。要利用NDB Cluster的高可用性功能,必须使用多个数据和SQL节点。强烈建议使用多个管理节点。
  集群的配置包括配置集群中的每个节点,以及在节点之间设置单独的通信链路。NDB集群目前的设计是数据节点在处理器、内存和带宽方面是相同的。此外,为了提供单点配置,整个集群的所有配置数据都位于一个配置文件中。
  管理服务器管理集群配置文件和集群日志。群集中的每个节点都从管理服务器检索配置数据,因此需要一种确定管理服务器所在位置的方法。当数据节点中发生事件时,节点会将有关这些事件的信息传输到管理服务器,然后管理服务器将信息写入群集日志。
标准MySQL客户端
  NDB集群可以与PHP、Perl、C、C++、java、Python、Ruby等MySQL应用程序一起使用。这种应用程序向充当NDB集群SQL节点的MySQL服务器发送SQL语句并从中接收响应,这与它们与独立的MySQL服务器交互的方式非常相似。
  可以修改使用NDB集群作为数据源的MySQL客户机,以利用与多个MySQL服务器连接的能力来实现负载平衡和故障转移。
NDB客户端程序
  可以使用NDB API直接从存储引擎访问NDB Cluster数据,而绕过可能连接到群集的任何MySQL服务器,而无需使用该程序。对于不需要数据的SQL接口的特殊用途,此类应用程序可能有用。
  NDB还可以使用NDB Cluster Connector for Java为NDB Cluster编写特定于Java的Java应用程序。这个NDB集群连接器包括ClusterJ,它是一种高级数据库API,类似于直接连接到的对象关系映射持久性框架,NDB CLUSTER因此不需要访问MySQL Server。
  NDB Cluster还支持使用Node.js用JavaScript编写的应用程序。用于JavaScript的MySQL连接器包括用于直接访问NDB存储引擎和MySQL服务器的适配器。使用此连接器的应用程序通常是事件驱动的,并且使用域对象模型,该域对象模型在许多方面与ClusterJ所采用的模型类似。

用于NDB Cluster的Memcache API,已实现为适用于memcached 1.6版和更高版本的可加载ndbmemcache存储引擎,可用于提供持久性NDB Cluster数据存储,可使用memcache协议进行访问。

标准的Memcached缓存引擎包含在NDB Cluster 8.0发行版中。每个Memcached服务器都可以直接访问存储在NDB Cluster中的数据,但也可以在本地缓存数据并可以处理来自本地缓存的请求。

管理客户

这些客户端连接到管理服务器,并提供用于正常启动和停止节点,启动和停止消息跟踪,显示节点版本和状态,启动和停止备份等的命令。

Oracle还提供了MySQL Cluster Manager,它提供了高级命令行界面,简化了许多复杂的NDB Cluster管理任务,例如重新启动具有大量节点的NDB Cluster。MySQL Cluster Manager客户端还支持用于获取和设置大多数节点配置参数以及mysqld服务器选项和与NDB Cluster相关的变量的值的命令。

事件日志 :NDB Cluster按类别(启动,关闭,错误,检查点等),优先级和严重性记录事件。事件日志是此处列出的两种类型:

群集日志:记录整个群集所需的所有可报告事件。

节点日志:一个单独的日志,也为每个单独的节点保留。

检查点:一般来说,当数据保存到磁盘时,就表示已经到达了一个检查点。更具体地说,检查点是一个时间点,所有提交的事务都存储在磁盘上。对于NDB存储引擎,有两种类型的检查点协同工作,以确保集群数据的一致视图得到维护。这些显示在以下列表中:

本地检查点(LCP):这是一个特定于单个节点的检查点;但是,LCP或多或少同时发生在集群中的所有节点上。LCP通常每隔几分钟发生一次;精确的时间间隔会有所不同,这取决于节点存储的数据量、群集活动的级别以及其他因素。ndb8.0支持部分lcp,在某些情况下可以显著提高性能。

全局检查点(GCP):当所有节点的事务都被同步并且redo日志被刷新到磁盘时,GCP每隔几秒发生一次。

三、NDB Cluster节点,节点组,副本和分区

数据节点: ndbd或ndbmtd进程,它存储一个或多个副本,即分配给该节点所属的节点组的分区的副本。每个数据节点应位于单独的计算机上。虽然也可以在一台计算机上托管多个数据节点进程,但是通常不建议这样的配置。
节点组: 一个节点组由一个或多个节点组成,并存储分区或副本集。

NDB群集中的节点组数不是直接可配置的;它是数据节点数量和副本数量(NoOfReplicas配置参数)的函数,如下所示:

[# of node groups] = [# of data nodes] / NoOfReplicas

1
  因此,具有4个数据节点的NDB群集NoOfReplicas在config.ini文件中如果设置为1,则有4个节点组,如果 将其NoOfReplicas设置为2,则有2个节点组 ,而如果NoOfReplicas将其设置为4,则有1个节点组 。NDB群集中的所有节点组必须具有相同数量的数据节点可以在线将新的节点组(以及新的数据节点)在线添加到正在运行的NDB群集中。

分区: 分区是集群存储的数据的一部分。每个节点负责使分配给它的任何分区的至少一个副本(即至少一个副本)可供群集使用。

NDB群集默认使用的分区数取决于数据节点数和数据节点使用的LDM线程数,如下所示:

[# of partitions] = [# of data nodes] * [# of LDM threads]

1
  使用运行ndbmtd的数据节点时,LDM线程数由MaxNoOfExecutionThreads控制 。使用ndbd时,只有一个LDM线程,这意味着与参与集群的节点一样多的集群分区。当使用ndbmtd且 MaxNoOfExecutionThreads设置为3或更少时,也是如此。

NDB和用户定义的分区。 、[NDBCLUSTER]通常会自动对表进行分区 。但是,也可以对表使用用户定义的分区。这受到以下限制:

表的生产中 仅支持KEY和LINEAR KEY分区方案NDB。

可以为任何NDB表显式定义的最大分区数为8*[number of LDM threads]*[number of node groups],NDB集群中的节点组数量如本节前面所述。在为数据节点进程运行ndbd时,设置LDM线程的数量没有效果(因为ThreadConfig仅适用于ndbmtd);在这种情况下,为了执行此计算,可以将此值视为等于1。

副本: 节点组中的每个节点都存储一个副本。副本数等于每个节点组的节点数。副本完全属于单个节点;一个节点可以存储多个副本。

下图说明了一个NDB群集,该群集具有四个运行ndbd的数据节点,按两个节点组(每个节点两个)排列。节点1和2属于节点组0,节点3和4属于节点组1。这里仅显示数据节点。尽管正常工作的NDB群集需要一个ndb_mgmd进程来进行群集管理,并且至少有一个SQL节点才能访问该群集存储的数据。
  

群集存储的数据分为四个分区,编号分别为0、1、2和3。每个分区(以多个副本的形式)存储在同一节点组上。分区存储在备用节点组上,如下所示:

分区0存储在节点组0上;一个 主副本(主副本)被存储在节点1和一个 备份副本(分区的备份副本)被存储在节点2上。
分区1存储在另一个节点组(节点组1)上;该分区的主副本位于节点3上,其备份副本位于节点4上。
分区2存储在节点组0上。但是,其两个副本的放置与分区0相反。对于分区2,主副本存储在节点2上,备份存储在节点1上。
分区3存储在节点组1上,其两个副本的位置与分区1的位置相反。也就是说,其主副本位于节点4上,而备份副本位于节点3上。
  只要参与群集的每个节点组至少有一个在运行的节点,该群集就具有所有数据的完整副本并保持生存。

集群由两个节点组组成,每个节点组均由两个数据节点组成。每个数据节点都在运行ndbd的实例。来自节点组0的至少一个节点和来自节点组1的至少一个节点的任何组合都足以使群集“处于活动状态 ”。但是,如果单个节点组中的两个节点均发生故障,则由另一个节点组中其余两个节点组成的组合是不够的。在这种情况下,群集丢失了整个分区,因此无法再提供对所有NDB群集数据的完整访问。
一个NDB群集实例支持的最大节点组数为48

四、总结

MySQL Cluster(MySQL集群)是一个高性能、可扩展、集群化数据库产品,其研发设计的初衷就是要满足许多行业里的最严酷应用要求。这些应用中经常要求数据库运行的可靠性要达到99.999%。
  自从2004年开始MySQL Cluster发布以来,其新特性的变化就不断的被更新增强。这增加了MySQL Cluster在新的应用领域、市场、行业中的需求量。MySQL Cluster目前已经不仅仅应用于传统的传统的电信业务中,如HLR(Home Locator Registry)或 SLR( Subscriber Locator Registry),它还被广泛的应用在VOIP、网络计费、会议管理、电子商务网站、搜索引擎,甚至是传统的后台应用中。

特点:

高可用性:主服务器故障后可自动切换到后备服务器

可伸缩性:可方便通过脚本增加DB服务器

负载均衡:支持手动把某公司的数据请求切换到另外的服务器,可配置哪些公司的数据服务访问哪个服务器

五、实战演练环境准备

IP地址 计算机名称 角色 操作系统 版本
172.18.21.150 mysql-cluster-mgm 管理节点 centos7 8.0.32
172.18.21.151 mysql-cluster-data1 数据节点1 centos7 8.0.32
172.18.21.152 mysql-cluster-data2 数据节点2 centos7 8.0.32
172.18.21.153 mysql-cluster-sql1 SQL节点1 centos7 8.0.32
172.18.21.155 mysql-cluster-sql2 SQL节点2 centos7 8.0.32

六、下载离线安装包极其相关插件

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


下载完之后解压上传至每个服务器上

七、逐个服务器离线安装

7.1先把所有服务器的防火墙都关掉

systemctl stop firewalld
systemctl disable firewalld

确保5个服务器之间端口可以互相访问没有限制
7.1把操作系统上原有安装的Mysql跟mariadb删除干净避免冲突

rpm -qa | grep mariadb
rpm -e --nodeps mariadb-errmessage-10.3.9-9.p02.ky10.x86_64

逐一删除,因为会跟MYSQL包安装有冲突,下方是倘若之前系统已经安装过MYSQL包也一起删除!

rpm -qa | grep mysql
rpm -e --nodeps 删除已经安装的MYSQL包

7.3设置各个计算机名称
进到相应各个服务器给各个服务器命名,避免混乱。

#管理节点:
hostnamectl set-hostname mysql-cluster-mgm
#数据节点1:
hostnamectl set-hostname mysql-cluster-data1
#数据节点2:
hostnamectl set-hostname mysql-cluster-data2
#SQL节点1:
hostnamectl set-hostname mysql-cluster-sql1
#SQL节点2:
hostnamectl set-hostname mysql-cluster-sql2

​ 在每个节点的/etc/hosts中,添加主机名信息:

  vi  /etc/hosts

写入host,可以用代理计算机名称,也可以直接写IP。

172.18.21.150 mysql-cluster-mgm
172.18.21.151 mysql-cluster-data1
172.18.21.152 mysql-cluster-data2
172.18.21.153 mysql-cluster-sql1
172.18.21.155 mysql-cluster-sql2

7.4顺序离线安装

7.4.1所有5个节点都要安装,安装下列的依赖顺序
172.18.21.150
172.18.21.151
172.18.21.152
172.18.21.153
172.18.21.155
都得安装

rpm -ivh mysql-cluster-community-icu-data-files-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-cluster-community-common-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-cluster-community-client-plugins-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-cluster-community-libs-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-cluster-community-client-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-cluster-community-server-8.0.32-1.el7.x86_64.rpm

7.4.2数据2个节点特别安装
172.18.21.151
172.18.21.152

rpm -ivh mysql-cluster-community-data-node-8.0.32-1.el7.x86_64.rpm

7.4.2管理节点1个特别安装
172.18.21.150

rpm -ivh mysql-cluster-community-management-server-8.0.32-1.el7.x86_64.rpm

八、配置各个节点的配置文件

8.1创建管理节点的配置文件
进入到管理节点服务器172.18.21.150

mkdir -p /data/mysql-cluster
cd /data/mysql-cluster
vim config.ini
[ndbd default]
#数据写入量。2表示两份(有几个数据节点就是几份)
NoOfReplicas=2
#配置数据存储可以使用的内存虚拟机内存是12G
DataMemory=1500M
#配置索引可以使用的内存虚拟机内存是12G
IndexMemory=1100M
[ndb_mgmd]
NodeId=1
#管理节点的日志文件路径
DataDir=/var/lib/mysql
#管理节点IP地址
HostName=172.18.21.150

#存储节点
#data node options
[ndbd]
#数据节点IP地址
HostName=172.18.21.151
#数据节点数据目录
DataDir=/var/lib/mysql
#数据节点ID
NodeId=2

[ndbd]
#数据节点IP地址
HostName=172.18.21.152
#数据节点数据目录
DataDir=/var/lib/mysql
#数据节点ID
NodeId=3

#SQL节点
[mysqld]
#SQL节点IP地址
HostName=172.18.21.153
#SQL节点ID
NodeId=4

[mysqld]
#SQL节点IP地址
HostName=172.18.21.155
#SQL节点ID
NodeId=5

8.2进入到2台数据节点修改配置
172.18.21.151
172.18.21.152
修改配置文件

 vi /etc/my.cnf

再最尾部加上下面配置,可以配置IP也可以配置host的名字,因为提前配置了host,下面配置了host name!

ndbcluster

ndb-connectstring=mysql-cluster-mgm
[mysql_cluster]
ndb-connectstring=mysql-cluster-mgm

8.3进入到2台SQL节点修改配置
172.18.21.153
172.18.21.155

修改配置文件

 vi /etc/my.cnf

在配置文件尾部加上下面配置
再最尾部加上下面配置,可以配置IP也可以配置host的名字,因为提前配置了host,下面配置了host name!

ndbcluster

default_storage_engine=ndbcluster

ndb-connectstring=mysql-cluster-mgm          
[mysql_cluster]
ndb-connectstring=mysql-cluster-mgm

九、启动NDB集群

初次启动命令以及用户密码更改调整:(请严格按照次序启动)
​ 依次先后启动:管理节点服务 —> 数据节点服务 —> sql 节点
​ 服务关闭:关闭管理节点服务,关闭管理节点服务后,nbdb数据节点服务会自动关闭 —> 手动关闭SQL节点。

9.1启动管理节点命令
进入到172.18.21.150

ndb_mgmd -f /data/mysql-cluster/config.ini

管理节点登录查看集群状态:

ndb_mgm -e show


9.1启动数据节点命令
进入到172.18.21.151
进入到172.18.21.152

[root@mysql-cluster-data1 ~]# ndbd

9.2启动SQL节点命令
进入到172.18.21.153
进入到172.18.21.155

[root@mysql-cluster-sql1 ~]# systemctl start mysqld

9.3检查集群状态
最后回到管理节点查看集群的状态

ndb_mgm -e show


上图是代表各个节点正常,如果有节点启动失败了,要翻看各个节点的日志。

管理节点日志位置:

tail -f /var/lib/mysql/ndb_1_cluster.log      #管理节点日志位置

数据节点日志位置:

tail -f /var/lib/mysql/ndb_2_out.log      #数据节点日志位置

SQL节点的日志位置:

tail -f /var/log/mysqld.log      #数据节点日志位置

9.4疑难杂症解决
如果出现下列报错,数据节点、SQL节点起不来

则需要修改管理节点的内存配置

修改减小管理节点配置的内存,然后重启集群。
进入到172.18.21.150

ndb_mgm -e shutdown  #关闭mysql集群
ndb_mgmd -f /data/mysql-cluster/config.ini  #重启mysql集群

再重启集群过程中,遇到了新问题。

重启加载的配置无法启用.

解决方法:
删除掉缓存的配置文件,再重启。

find / -name mysql-cluster   #找到缓存配置文件的路径

rm -rf ndb_1_config.bin.1   #删除掉缓存配置文件

再重启管理节点解决

ndb_mgmd -f /data/mysql-cluster/config.ini  #重启mysql集群

十、测试验证

进到2个SQL节点
172.18.21.153
172.18.21.155
到这里跟普通mysql服务一致,可以单独设置 权限用户。
只需要修改SQL节点的初始密码。在第一次启动的/var/log/mysqld.log中找到初始密码,并使用该密码进行登录。

mysql -u root -p     #上图找到初始化密码登录
alter user ‘root’@’localhost’ identified by ‘你自己设置密码’;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你自己设置密码';
 grant all privileges on *.* to 'root'@'%' with grant option;   #赋予权限
FLUSH PRIVILEGES;   #刷新权限

十一、创建表验证分布式NDB引擎

1、验证NBD引擎

mysql> create database test ;
mysql> use test ;
mysql> create table test1( id int) engine=ndbcluster;
mysql> Insert into test1() values (1);
#分别登录两个sql节点,执行查询,发现数据一致,数据数据同步成功
mysql> select * from test1;

验证结果2个SQL节点都有这个表,并且数据一致。
NDB表数据存在在2个存储节点上
2、验证InnoDB引擎

mysql> use test ;
mysql> create table test2( id int) engine=InnoDB;
mysql> Insert into test2() values (1);
mysql> select * from test2;

只在SQL1节点存在这个表,SQL2节点不存在。表数据存在SQ1L服务器上。

3、作者我遇到的问题NBD引擎
1、NBD引擎不支持range分区

2、在对NBD引擎表执行更新操作的时候,非常依赖服务器内存。如果内存不足,则执行失败。说明NBD引擎比较依赖服务器的内存大小。

该存储引擎有下列缺点:

1、基于内存,数据库的规模受集群总内存的大小限制

2、基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。

3、多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,

当然也有它的优点:

1、多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。

2、扩展性很好,增加节点即可实现数据库集群的扩展。

3、冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。

4、实现高可用性的成本比较低,不象传统的高可用方案一样需要共享的存储设备和专用的软件才能实现,NDB 只要有足够的内存就能实现。

服务器托管,北京服务器托管,服务器租用 http://www.hhisp.net

hackdl

咨询热线/微信 13051898268