Bootstrap

MySQL NDB Cluster部署方案与实践

MySQL Cluster集群

一、概述

​ MySQL Cluster是MySQL适用于分布式计算环境的高实用、高冗余版本。他采用了NDB Cluster存储引擎,允许在一个Cluster中运行多个MySQL服务器。

​ MySQL Cluster是一种在无共享系统中启用内存数据库集群的技术。无共享架构使系统能够使用非常便宜的硬件,并且对硬件或软件的特定要求最低。MySQL Cluster旨在没有任何单点故障。在无共享系统中,每个组件都应该有自己的内存和磁盘,不推荐也不支持使用网络共享、网络文件系统和 SAN 等共享存储机制。MySQL Cluster由一组称为主机的计算机组成,每台计算机运行一个或多个进程。 这些称为节点的进程可能包括 MySQL 服务器(用于访问 NDB 数据)、数据节点(用于存储数据)、一个或多个管理服务器,以及可能的其他专用数据访问程序。NDB Cluster 中这些组件的关系如下所示:
在这里插入图片描述
​ MySQL NDB Cluster由三种节点构成,SQL节点、数据节点及管理节点。

​ 管理节点:管理整个集群。启动、关闭集群。通过ndn_mgmd命令启动集群,通过ndn_mgm查看集群状态。

​ 数据节点:存储cluster中的数据。通过多个数据节点的方式,提供数据冗余。

​ SQL节点:给上层应用提供数据访问。

​ NDN引擎:是一种基于内存的数据存储引擎,他具有可用性高和数据一致性好的特点。

​ MySQLcluster使用了一个专用的基于内存的存储引擎–NDB引擎,这样做的好处是速度快,没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制,运行NDB的 MySQL服务器一定要内存够大,比如 4G,8G,甚至 16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上通过配置2台NDB 的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

二、优缺点对比

2.1 缺点

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

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

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

2.2 优点

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

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

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

三、搭建 MySQL-Cluster 集群

3.1 集群规划

角色主机名IP地址系统版本
管理节点mysql-cluster-mgm192.168.10.11Centos 7.98.0.31
数据节点1mysql-cluster-data1192.168.10.12Centos 7.98.0.31
数据节点2mysql-cluster-data2192.168.10.13Centos 7.98.0.31
SQL节点1mysql-cluster-sql1192.168.10.14Centos 7.98.0.31
SQL节点2mysql-cluster-sql2192.168.10.15Centos 7.98.0.31

​ Mysql cluster 的下载地址: https://dev.mysql.com/downloads/cluster/。以8.0.31为例,将下载的安装包上传至服务器/software目录,并解压备用。

3.2 安全问题

​ 关闭防火墙,关闭selinux,完成后尽量重启服务器。

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/*SELINUX*=enforcing/SELINUX=disabled/g' /etc/selinux/config

3.3 解决先决条件

​ 清理操作系统自带的 MySQL或者 Mariadb

rpm -qa l grep mariadb | xargs -irpm -e--nodeps f
rpm -qa l grep mysql l xargs -irpm -e--nodeps f

3.4 配置hostname

​ 为每个节点设置主机名:

#管理节点:
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中,添加主机名信息:

192.168.10.11 mysql-cluster-mgm
192.168.10.12 mysql-cluster-data1
192.168.10.13 mysql-cluster-data2
192.168.10.14 mysql-cluster-sql1
192.168.10.15 mysql-cluster-sql2

3.5 配置yum

​ 如果有互联网权限,可以使用自带的yum。如果不能访问互联网,则利用iso文件配置本地yum。

cat /etc/yum.repos.d/local.repo
#配置以下信息
[local]
name=local
baseurl=file:///media
gpgcheck=0
enabled=1
gpgkey=file:///media/RPM-GPG-KEY-CentOS-7

​ 注意:centos当中不包含一个重要的依赖包。需要手动下载和安装。wget https://mirrors.aliyun.com/epel/7/x86_64/Packages/p/perl-Class-MethodMaker-2.20-1.el7.x86_64.rpm

3.6 所有节点安装mysql-cluster-server

yum localinstall -y mysql-cluster-community-server-8.0.31-1.el7.x86_64.rpm

3.7 数据节点安装数据包

yum localinstall -y mysql-cluster-community-data-node-8.0.31-1.el7.x86_64.rpm

3.8 管理节点安装管理包

yum localinstall -y mysql-cluster-community-management-server-8.0.31-1.el7.x86_64.rpm

四、配置集群

4.1 管理节点

​ 创建管理节点配置文件存放目录

mkdir -p /data/mysql-cluster
cd /data/mysql-cluster

​ 创建配置文件:

vim config.ini

​ 写入以下配置信息:

[ndbd default]
#数据写入量。2表示两份(有几个数据节点就是几份)
NoOfReplicas=2
#配置数据存储可以使用的内存
DataMemory=500M
#配置索引可以使用的内存
IndexMemory=100M
[ndb_mgmd]
NodeId=1
#管理节点的日志文件路径
DataDir=/var/lib/mysql
#管理节点IP地址
HostName=192.168.10.11

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

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

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

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

4.2 数据节点

​ 在每个数据节点的my.cnf进行配置,注意数据节点的datadir要和管理节点的datadir配置保持一致,默认DataDir=/var/lib/mysql。

vim /etc/my.cnf

​ 末尾增加以下配置:

#启动ndb引擎
ndbcluster
#管理节点IP地址
ndb-connectstring=192.168.10.11
[mysql_cluster]
ndb-connectstring=192.168.10.11

4.3 SQL节点

​ 在每个SQL节点的my.cnf进行配置,SQL节点建议添加default_storage_engine=ndbcluster。因为只有ndbcluster数据引擎的表才能使用mysql cluster进行同步,如果创建的对象不是此数据引擎,会导致对象保存在sql节点本地,而无法进行同步。

vim /etc/my.cnf

​ 末尾增加以下配置:

#启动ndb引擎
ndbcluster
#指定默认引擎为ndbcluster
default_storage_engine=ndbcluster
#管理节点IP地址
ndb-connectstring=192.168.10.11
[mysql_cluster]
ndb-connectstring=192.168.10.11

五、MySQL Cluster启动

​ 初次启动命令以及用户密码更改调整:(请严格按照次序启动)
​ 依次先后启动:管理节点服务 —> 数据节点服务 —> sql 节点
​ 服务关闭:关闭管理节点服务,关闭管理节点服务后,nbdb数据节点服务会自动关闭 —> 手动关闭SQL节点。
​ 执行初次启动前请先确认将所有服务器的防火墙关闭 (service iptables stop 或者设定防火墙端口可通,两个端口即通讯端口1186、数据端口3306)。

5.1 启动管理节点

​ 在管理节点启动管理节点:

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

在这里插入图片描述
管理节点登录查看集群状态:
在这里插入图片描述

5.2 启动数据节点

数据节点1:

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

在这里插入图片描述
数据节点2:

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

在这里插入图片描述
管理节点查看数据节点启动情况:
在这里插入图片描述

5.3 启动SQL节点

SQL节点1:

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

SQL节点2:

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

管理节点查看数据节点启动情况:
在这里插入图片描述

六、数据同步验证

6.1 修改初始密码

只需要修改SQL节点的初始密码。在第一次启动的/var/log/mysqld.log中找到初始密码,并使用该密码进行登录。

SQL节点1:

[root@mysql-cluster-sql1 ~]# mysql -u root -p
mysql>alter user ‘root’@’localhost’ identified by ‘Password’;
mysql> update user set host='%' where user='root';

SQL节点2:

[root@mysql-cluster-sql2 ~]# mysql -u root -p
mysql>alter user ‘root’@’localhost’ identified by ‘Password’;
mysql> update user set host='%' where user='root';

6.2 数据验证

创建一个数据库验证是否同步

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

七、管理和维护命令

关闭mysql集群:ndb_mgm -e shutdown

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

重启数据节点:ndbd

启动SQL节点:systemctl restart mysqld

查看mysql状态:ndb_mgm -e show

启动顺序:

管理节点 -> 数据节点 -> SQL节点

关闭顺序:

SQL节点 --> 管理节点(数据节点会自行关闭)

八、注意事项

1.在建表的时候一定要用ENGINE=NDBCLUSTER指定使用NDBCLUSTER存储引擎,或用ALTER TABLE选项更改表的存储引擎。

2.NDB表必须有一个主键,因此创建表的时候必须定义主键,否则NDB存储引擎将自动生成隐含的主键。

;