MySQL NDB Clusters

Outlines
MySQL NDB Cluters简介
MySQL NDB Cluters搭建

一、MySQL NDB Cluters简介

定义
MySQL NDB Cluters(MySQL Network Database Cluters)是一个具备线性扩展和高可用性的分布式网络数据库。它在分区、分布式的数据集中,实现事务完整性,并提供内存式的实时访问。它专为至关重要的应用而设计。
这段可能读起来起来有点拗口,其原文如下:
“MySQL NDB Cluster is the distributed database combining linear scalability and high availability. It provides in-memory real-time access with transactional consistency across partitioned and distributed datasets. It is designed for mission critical applications.”

特点
(1)容量大,单一集群可以存储100+TB的数据
(2)速度快,使用内存优化的表,提供内存式的实时访问

主要概念
在MySQL集群中,有三个类型的集群节点:管理节点(Management Node)、数据节点(Data Node)、客户端节点(SQL Node

管理节点Management Node:顾名思义,管理节点的作用就是管理NDB集群中的其他节点,比如提供配置数据、启动停止节点、运行备份。由于该类型的节点是管理作用,所以该类型的节点必须先于集群中其他类型的节点启动,具体使用ndb_mgmd命令启动一个管理节点。

数据节点Data Node:顾名思义,数据节点的作用就是存储集群数据的节点。每一个数据节点应该在一台独立的设备上。数据节点的数量=片段副本fragment replicas数乘以单节点片段# fragment数。比如单节点片段fragment数为2,片段副本fragment replicas数为2,那么我们需要准备的数据节点数目就是2*2=4个。为了保证冗余性和高可用性,单一集群中片段副本fragment replicas数至少为2。(这里的片段fragment怎么理解呢?如果数据库中整体数据是一块完整的美味的蛋糕,那么片段fragment就是切到你手里的那一块)

客户端节点SQL Node:顾名思义,SQL Node就是运行SQL指令的节点,即客户端节点,我们通过这个客户端访问NDB Cluster集群数据。也是说,一个SQL Node就是传统的MySQL Server,唯一的区别在于SQL Node使用NDBCLUSTER storage engine存储引擎。我们在使用MySQL NDB CLusters创建库表的时候,需要指明使用NDBClUSTER存储引擎

在生产环境中,只放三个节点是不现实的。为了发挥NDB集群的高可用性优势,我们必须多个Data Node和SQL Node。当然,使用多个Management Node也是推荐的
“Important: It is not realistic to expect to employ a three-node setup in a production environment. Such a configuration provides no redundancy; to benefit from NDB Cluster’s high-availability features, you must use multiple data and SQL nodes. The use of multiple management nodes is also highly recommended.”

上图是一个来自官网的示例图片,整个数据库有四个Partition分区,这里的分区Partition和片段Fragment的概念类似,片段Fragment是分区Partition的复制品。四个分区Partition(四个片段Fragment),即原本整体的蛋糕被分成了四份。其中两份(分区Partition 0和2)被交给了数据节点组Date Node Group 0管理,另外两份(分区Partition 1和3)被交给了数据节点组Data Node Group 1管理。在Node Group 0中,两个分区Partition被分别复制了两份:主片段副本Primary Fragment Replica、备份片段副本Backup Fragment Replica。该示例中片段副本Fragment Replica数就为2,即每个分区会存在2个片段副本。这里需要注意的是,同一个分区Partition的片段副本是分散在两个Data Node上面。当然这样放肯定更安全,就算一个节点彻底坏掉了,由于同一个分区Partition的副本片段分散在不同的节点,所以整体不会受到影响。相反,如果同一个分区的副本都放在同一个节点,如果该节点发生故障,那么该分区的数据就会丢失。“不要把鸡蛋放在同一个篮子里”,我想MySQL NDB CLUSTER设计的时候也是充分考虑了这点的。

到这里我们可能会问,那么整体数据库到底分为几个分区Partition比较好呢?(原始蛋糕到底分几块?),这个问题官方给的公式为:[# of partitions] = [# of data nodes] * [# of LDM threads],可见其受到数据节点数量和LDM线程的影响,而LDM线程数量可以进行配置。具体可以参考MaxNoOfExecutionThreads配置。其默认情况是1,也就是说默认区分Partition的数量为Data Node的数量。

二、MySQL NDB Cluters搭建

(1)准备好相关服务器:这里我们先准备6台服务器并允许其彼此之间相互通信,2台作为Data Node,2台作为Management Node,2台作为SQL Node,每台服务器安装都是Ubuntu-24-04操作系统,操作系统最好需要统一,安装要便捷一些,不同的OS的方式不太一样。

server1 : 192.168.245.128 -> Data Node 1
server2 : 192.168.245.129 -> Data Node 2

server3 : 192.168.245.130 -> Management Node 1
server4 : 192.168.245.131 -> Management Node 2

server5 : 192.168.245.132 -> SQL Node 1
server6 : 192.168.245.133 -> SQL Node 2

(2)添加MySQL APT Repository:这里因为我们服务器操作系统是Ubuntu,MySQL NDB CLuster为Ubuntu和Debian提供了APT的安装方式。在server1、server2、server3、server4、server5、server6这6台服务器上面分别执行下面的操作。

mkdir ~/mysqlndbcluster
cd ~/mysqlndbcluster
wget https://repo.mysql.com//mysql-apt-config_0.8.33-1_all.deb
dpkg -i mysql-apt-config_0.8.33-1_all.deb

# MySQL Server & Cluster(Currently selected: mysql-cluster-8.4-lts)

apt-get update

(3)安装数据节点Data Node:在server1、server2上面分别执行下面操作。

apt-get install mysql-cluster-community-data-node

(4)安装管理节点Management Node:在server3、server4上面分别执行下面的操作。

apt-get install mysql-cluster-community-management-server

# This is not necessary, but strongly recommended
apt-get install mysql-cluster-community-client

(5)安装客户端节点SQL Node:这里的SQL Node其实就是我们之前使用的、熟悉的MySQL Server,这个步骤的安装过程中要记好设置的root密码。在server5、server6上面分别执行下面的操作

apt-get install mysql-cluster-community-server

(6)配置客户端节点SQL Node:在server5、server6上面分别执行下面的操作。

vim /etc/mysql/my.cnf

[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=192.168.245.130,192.168.245.131  # location of management server

(7)配置数据节点Data Node:在server1、server2上面分别执行下面的操作。

mkdir /etc/mysql
touch /etc/mysql/my.cnf
vim /etc/mysql/my.cnf

[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=192.168.245.130,192.168.245.131  # location of management server

(8)配置管理节点Management Node:SQL Node和Data Node的配置很类似,唯一的区别在Data Node原本是没有my.cnf文件的,我们先给它创建了一个,而SQL Node安装的时候就自带了my.cnf文件。管理节点Management Node的配置要稍微麻烦一些,顾名思义,管理节点嘛,所以其配置文件里面自然是要将整个集群的节点都串联起来。在server3、server4上面分别执行下面的操作。

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vim config.ini

[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2    # Number of fragment replicas
DataMemory=98M    # How much memory to allocate for data storage

[ndb_mgmd]
# Management process options:
HostName=192.168.245.130        # Hostname or IP address of management node
DataDir=/var/lib/mysql-cluster  # Directory for management node log files
NodeId=3

[ndb_mgmd]
# Management process options:
HostName=192.168.245.131        # Hostname or IP address of management node
DataDir=/var/lib/mysql-cluster  # Directory for management node log files
NodeId=4

[ndbd]
# Options for data node "A":
                                # (one [ndbd] section per data node)
HostName=192.168.245.128        # Hostname or IP address
NodeId=1                        # Node ID for this data node
DataDir=/root/mysqlndbcluster   # Directory for this data node's data files

[ndbd]
# Options for data node "B":
HostName=192.168.245.129        # Hostname or IP address
NodeId=2                        # Node ID for this data node
DataDir=/root/mysqlndbcluster   # Directory for this data node's data files

[mysqld]
# SQL node options:
HostName=192.168.245.132        # Hostname or IP address
NodeId=5

[mysqld]
# SQL node options:
HostName=192.168.245.133        # Hostname or IP address
NodeId=6

(9)启动管理节点Management Node:管理节点需要先启动,在server3、server4上面分别执行下面的操作。

ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini

(10)启动数据节点Data Node:在server1、server2上面分别执行下面的操作。

ndbd

(11)启动客户端节点SQL Node:这个其实就是我们之前熟悉的MySQL Server,启动方式也是一样的。在server5、server6上面分别执行下面的操作。(因为安装SQL Node的时候,默认就会运行起来了,但是我们修改了配置,所以需要重启)

systemctl status mysql
systemctl restart mysql

(12)在Management Node上面查看集群运行情况:必须要在前面安装Management Node的时候,安装mysql-cluster-community-client才行。因为有两个Management Node,这里我们选择server3,即在server3上面执行下面的操作。

ndb_mgm
ndb_mgm> show

(13)其他常用的一些ndb_mgm指令

show:显示集群信息
show status:显示集群状态
start/restart:启动/重启集群节点,e.g. start node 1
stop:停止集群节点,e.g. stop node 1
reload:重新加载配置
add:添加节点,e.g. add node 8
remove:移除节点,e.g. remove 8
shutdown:关闭整个集群

(14)MySQL NDB CLuster使用提醒:到这里,我们6台服务器构成的MySQL NDB集群就算部署好了,开发使用的时候,我们只需将两台SQL Node提供出去就行了。和之前使用Standard MySQL Server的方式几乎是一模一样的,唯一的区别在于创建库表的时候必须要指明使用NDBCLUSTER引擎,并且每一个NDBCLUSTER table都要有主键(如果没有主键,NBD引擎也是创建一个隐式的主键,但是这种方式会增加额外开销,不推荐)。

CREATE TABLE tbl_name (col_name column_definitions) ENGINE=NDBCLUSTER;

References
《Chapter 25 MySQL NDB Cluster 8.4》
《Installing MySQL NDB Cluster Using the APT Repository》
《Adding the MySQL APT Repository》
《Initial Configuration of NDB Cluster》
《Initial Startup of NDB Cluster》
《mysql ndbcluster8 集群中的ndb_mgm工具命令讲解》