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-mgm | 192.168.10.11 | Centos 7.9 | 8.0.31 |
数据节点1 | mysql-cluster-data1 | 192.168.10.12 | Centos 7.9 | 8.0.31 |
数据节点2 | mysql-cluster-data2 | 192.168.10.13 | Centos 7.9 | 8.0.31 |
SQL节点1 | mysql-cluster-sql1 | 192.168.10.14 | Centos 7.9 | 8.0.31 |
SQL节点2 | mysql-cluster-sql2 | 192.168.10.15 | Centos 7.9 | 8.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存储引擎将自动生成隐含的主键。