1 概述

1.1 分布式数据库集群

Mysql cluster是适用于分布式计算环境的高可用、高冗余版本的mysql,其技术在分布式系统中为mysql数据提供了冗余特性,增强了安全性,使得单个mysql服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。Mysql cluster采用shared-nothing(无共享)架构,主要利用了NDB存储引擎来实现,NDB存储引擎是一个内存式存储引擎,要求数据必须全部加载到内存之中,具有自动分片(分区)功能。数据被自动分布在集群中的不同存储节点上,每个存储节点只保存完整数据的一个分片(fragment)。同时,用户可以设置同一份数据保存在多个不同的存储节点上,以保证单点故障不会造成数据丢失。

Mysql cluster需要一组计算机,用到mysql cluster安装包,在集群中的每台计算机上安装,只是每台计算机的角色可能是不一样的。Mysql cluster按照节点类型可以分为3类:管理节点(对其他节点进行管理)、数据节点(存放cluster中的数据,可以有多个)和sql节点(存放表结构,可以有多个)。Cluster中的某计算机可以是某一种节点,也可以是2种或3种节点的集合。这3种节点只是在逻辑上划分,所以他们不一定和物理计算机是一一对应的关系。多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。

管理节点(MGM):这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据,并停止节点,运行备份等。由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。

数据节点(NDB):这类节点用于保存Cluster的数据,数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点,没有必要设定过多的副本,在NDB中数据会尽量的保存在内存中。数据节点使用命令“ndbd”(单线程)或"ndbmtd"(多线程)启动的。

SQL节点:这是用来访问Cluster数据的节点,对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。

Mysql cluster的数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。

Mysql cluster具体的同步复制步骤,如下所示:


1.Master执行提交语句时,事务被发送到slave,slave开始准备事务的提交。
2.每个slave都要准备事务,然后向master发送OK(或ABORT)消息,表明事务已经准备好(或者无法准备该事务)。
3.Master等待所有Slave发送OK或ABORT消息,如果Master收到所有 Slave的OK消息,它就会向所有Slave发送提交消息,告诉Slave提交该事务;如果 Master收到来自任何一个Slave的ABORT消息,它就向所有 Slave发送ABORT消息,告诉Slave去中止事务。
4.每个Slave等待来自Master的OK或ABORT消息。如果Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交 的确认;如果Slave收到取消请求,它们就会撤销所有改变并释放所占有的资源,从而中止事务,然后向Masterv送事务已中止的确认。
5.Master收到来自所有Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。
由于同步复制一共需要4次消息传递,故mysql cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点可以采用双网卡,节点组之间采用直连方式。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssxz1mS8-1626160905618)(media/16104139227338/16225412812596.jpg)]

1.2 数据库的分布式和主从的区别

主从(Master-Slave): 主从机器上安装mysql community(普通版)就可以。

主从并没有像集群那样分三种节点,只有主和从两种,而且主从之间是通过mysql的replication方式来保证数据的一致性。相对mysql cluster的数据同步方式来讲是异步的。

主从复制的过程中,若从数据库中出现其中一条数据同步失败(即relay log中的语句有其中一条写操作语句执行失败),则后面的数据无法继续同步(relay log中后面的写操作语句无法继续执行下去),必须得解决掉或跳过这个执行失败的语句(需要人为去操作),这样就不能保证所有的从数据库的数据一致了。而mysql cluster则不然,若其中只要有一个节点的写操作失败,则其他所有节点针对这一同步均会更新失败,以保证所有节点的数据一致性。

2 环境说明

2.1 系统环境

服务器 角色 说明
192.168.17.131 数据节点 (NDB) 系统 centos 7 64位
192.168.17.132 数据节点 (NDB) 系统 centos 7 64位
192.168.17.133 SQL节点 系统 centos 7 64位
192.168.17.134 SQL节点 系统 centos 7 64位
192.168.17.130 管理节点 (MGM) 系统 centos 7 64位

2.2 软件环境

mysql cluster 集群版本:
mysql-cluster-gpl-7.6.15-linux-glibc2.12-x86_64.tar.gz
可到官网下载:https://dev.mysql.com/downloads/cluster/

3 安装MySQL Cluster

所有服务器均需执行执行以下操作。

  • 注意:在安装mysql cluster之前,必须得先检查该服务器上是否已安装了普通mysql,若安装了则需先把mysql删除干净,因为mysql cluster就包括了普通版mysql;

  • 在安装管理节点、数据节点和sql节点时,最好以root用户登录执行,否则有一些步骤需要用到sudo命令来执行。

#上传到服务器目录/usr/softwares并解压
tar -xzvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz#将解压的文件重命名为mysql,并放到/usr/local/目录下
mv mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64 /usr/local/mysql

4 配置安装管理节点

在服务器192.168.17.130上执行以下操作。

  • 注意,管理节点的防火墙端口开放,默认是1186。

4.1 拷贝命令

#将文件ndb_mgm和ndb_mgmd拷贝到/usr/local/bin/目录下
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/#ndb_mgm,ndb客户端命令
#ndb_mgmd,ndb管理节点启动命令
#ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客户端管理工具,通过它可以方便的检查Cluster的状态、启动备份、关闭Cluster等功能。

4.2 配置文件

创建数据库集群配置文件的目录
mkdir /var/lib/mysql-cluster

创建并编辑配置文件
vim /var/lib/mysql-cluster/config.ini

[ndbd default]
NoOfReplicas=1
DataMemory=200M
IndexMemory=64M[ndb_mgmd]
NodeId=1
hostname=192.168.17.130
datadir=/var/lib/mysql-cluster/[ndbd]
NodeId=2
hostname=192.168.17.131
datadir=/usr/local/mysql/data/
[ndbd]
NodeId=3
hostname=192.168.17.132
datadir=/usr/local/mysql/data/[mysqld]
NodeId=4
hostname=192.168.17.133
[mysqld]
NodeId=5
hostname=192.168.17.134
  • [NDBD DEFAULT]:表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。

  • NoOfReplicas:副本数量,数据节点数必须是副本数的整数倍。

  • [NDB_MGMD]:表示管理节点的配置,只有一个,默认的对其他节点的端口是1186,故服务器需要开放1186端口。

  • [NDBD]:表示每个数据节点的配置,可以有多个,分别写上不同数据节点的IP地址。

  • [MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址。

####4.3 启动管理节点
切换至/usr/local/bin下,执行以下命令

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

ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上–initial参数,不然添加的节点不会作用在mysql cluster中。
###5 配置安装数据节点
分别在服务器192.168.17.131和192.168.17.132上执行以下操作。

注意,数据节点的端口开放问题,最好把防火墙关闭,虽然之前版本的默认端口号时2202,但是好像时5.1之后的端口号就没有限制(看哪个端口空闲就用哪个端口),即与sql节点通信的端口号会随机变换。若没有关闭防火墙,后面在管理节点查看集群状态的时候,可能会出现mysql节点老是连接不上的问题。
####5.1 配置my.cnf文件
mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,故需要修改/etc/my.cnf配置文件。

[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
ndb-connectstring=192.168.17.130[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid[mysql_cluster]
ndb-connectstring=192.168.17.130

5.2 安装mysql数据库

5.2.1 更改权限
#分别添加mysql组和mysql用户
groupadd mysql
useradd mysql -g mysql
#进入mysql目录
cd /usr/local/mysql/
#把mysql的目录设置成所有者为root
chown -R root .
#创建data目录,并把data目录设置所有者为mysql
mkdir data
chown -R mysql data
#把mysql的目录改成所属组为mysql
chgrp -R mysql .
5.2.2 执行安装脚本

初始化数据库(这里要注意,如果你安装的版本和我的不同,数据库初始化的命令使不同的,很多之前的版本会使用:scripts/mysql_install_db --user=mysql来初始化,这个已经被mysql在新的版本中废弃了,所以需要使用下面的命令安装,如果你需要安装别的版本请参考mysql官网的对应版本的安装命令。)

#执行安装脚本,初始化数据库
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
#注意其中用户为mysql的名称需要跟配置文件my.cnf中的user=mysql相同
#另外,这里一定要把--basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ 加上,
#否则会最后启动MySQL服务的时候会出现"table mysql.plugin doesn't exist","Can\'t open the mysql.plugin table. Please run mysql_upgrade to create it."错误,以及"PID"获取失败的错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7fBIBLr-1626160905624)(media/16104139227338/16225964050961.jpg)]

5.2.3 设置mysql服务开机自启动
//加入到service服务
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
//加入到开机自启动列表
chkconfig --add mysqld

查询是否启动成功

chkconfig --list

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDkZjSZ3-1626160905627)(media/16104139227338/16225964660295.jpg)]

5.2.4 修改数据库密码
//启动数据库
[root@localhost bin]# service mysqld start//进入客户端
[root@localhost bin]# ./mysql -uroot -p
Enter password:这里输入之前的临时密码//修改密码
mysql> set password=password('新密码');//注意此密码必须要与其他服务器上的数据库设置的密码相同

#####5.3 启动数据节点

cd /usr/local/mysql
./bin/ndbd --initial#非第一次启动,命令如下
./bin/ndbd

安装后第一次启动数据节点时要加上–initial参数。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。
###6 配置安装sql节点
分别在服务器192.168.17.133和192.168.17.134上执行以下操作。

####6.1 配置my.cnf文件
mysql服务启动时会默认加载/etc/my.cnf作为其配置文件,故需要修改/etc/my.cnf配置文件。

[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
default-storage-engine=ndbcluster
port=3306[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid[mysql_cluster]
ndb-connectstring=192.168.17.130:1186

default-storage-engine,数据库建表时的默认引擎为ndbcluster,否则数据会同步失败。
####6.2 安装mysql数据库
详见 5.2 安装mysql数据库
####6.3 启动sql节点
其实就是启动mysql服务。

service mysqld start

7 测试

7.1 用管理节点查看

ndb_mgmndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2   @192.168.17.131  (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0, *)
id=3   @192.168.17.132  (mysql-5.7.23 ndb-7.6.7, Nodegroup: 1)[ndb_mgmd(MGM)] 1 node(s)
id=1   @192.168.17.130  (mysql-5.7.23 ndb-7.6.7)[mysqld(API)] 2 node(s)
id=4   @192.168.17.133  (mysql-5.7.23 ndb-7.6.7)
id=5   @192.168.17.134  (mysql-5.7.23 ndb-7.6.7)

证明,mysql cluster启动成功!
注意:如果在此步骤提示如下:

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2   @192.168.47.136  (mysql-8.0.25 ndb-8.0.25, starting, Nodegroup: 0)
id=3   @192.168.47.137  (mysql-8.0.25 ndb-8.0.25, starting, Nodegroup: 0)[ndb_mgmd(MGM)]  1 node(s)
id=1   @192.168.47.135  (mysql-8.0.25 ndb-8.0.25)[mysqld(API)]    2 node(s)
id=4 (not connected, accepting connect from 192.168.47.138)
id=5 (not connected, accepting connect from 192.168.47.139)

可能是由于端口没开放导致,此时应该关闭防火墙。或者开放对应端口;命令如下:

开放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent   # 开放5672端口firewall-cmd --zone=public --remove-port=5672/tcp --permanent  #关闭5672端口firewall-cmd --reload   # 配置立即生效查看防火墙所有开放的端口
firewall-cmd --zone=public -- list-ports关闭防火墙
如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估
systemctl stop firewalld.service查看防火墙状态
firewall-cmd --state查看监听的端口netstat -lnpt
图1
PS:centos7默认没有 netstat 命令,需要安装 net-tools 工具,yum install -y net-tools检查端口被哪个进程占用
netstat -lnpt |grep 5672
图2查看进程的详细信息ps 6832图3中止进程kill -9 6832

图1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96xKR5cY-1626160905639)(media/16104139227338/16225974145120.jpg)]

图2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgV2s6J8-1626160905645)(media/16104139227338/16225974438639.jpg)]

图3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWfGBe9a-1626160905647)(media/16104139227338/16225974650066.jpg)]

如果都正常,则重启数据库即可解决此问题

####7.2 测试数据
连接任何一个sql节点,在此sql节点上操作,创建数据库、创建表结构、增删改等操作,在其他的sql节点上也会同步这些操作,使数据保持一致。

(1)这里在sql节点192.168.17.134上操作。

#登陆数据库
cd /usr/local/mysql
./bin/mysql -uroot -p
Enter password:输入密码#创建数据库mytest
mysql> create database mytest;#切换到mytest数据库
mysql> use mytest;#创建表结构sys_myfirst
mysql> create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255));#在sys_myfirst中添加几条数据
mysql> insert into sys_myfirst(id, name, memo) values('1','test1','hello world!');
mysql> insert into sys_myfirst(id, name, memo) values('2','test2','hello world haha!');
mysql> insert into sys_myfirst(id, name, memo) values('3','test3','hello world hehe!');#查看数据
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 2  | test2 | hello world haha! |
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
+----+-------+-------------------+
3 rows in set (0.00 sec)

测试成功!这里每次查找出来的数据顺序不一样,其原因不难想到是,查找的数据是两个数据库来回切换导致的。

###8 启动和停止集群
启动顺序:管理节点—数据节点—sql节点

停止顺序:管理节点(会同时停止管理节点和数据节点)—sql节点

以上是看网上的人都是这么说的,但是根据我的实践,其实sql节点可以一直保持启动状态(即使管理节点停止了也没关系,下次启动的时候会自动连接上此sql节点),只要第一次启动的时候遵循上面的顺序即可。

####8.1 停止管理节点
停止管理节点的同时,会把其管理的所有数据节点也停止掉。

#第一种方法
ndb_mgm -e shutdown#第二种方法
ndb_mgm
ndb_mgm> shutdown;

8.2 停止sql节点

其实就是停止mysql服务。

service mysqld stop

9 总结

到这里,mysql cluster的简单搭建就完成了。不知读者有没发现这么一个问题,因为我这里把管理节点、数据节点和sql节点都是分开的,所以在部署数据节点的时候,其实并不用去安装mysql数据库和开启mysql服务都可以。然而,这里的问题是,怎么确定在sql节点上操作的数据并不是sql节点上的数据,而是数据节点上的数据呢?

之前看到了很多网上的资料,都是自以为的数据就是存在数据节点,但是我到数据节点上找那些我曾在sql节点上操作的数据,均没有找到,反而是在sql节点上找到了那些数据库(但是没有表数据)。因此,我就在想数据库集群的数据到底是存在哪里的呢?

在网上找了很多资料,终于不负有心人,让我找到了,数据确实是存在数据节点上的,原来可以在数据节点上通过lsof -c ndb命令(以root身份运行)来找出包含ndb进程所有打开的文件,发现其真正存储数据的位置在mysql/data/ndb_3_fs/下面(3数字是config.ini的节点id),各个文件夹中的文件是以16.7M为单位存储的,临时文件达到16.7M后就另起一个,如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bGUGzajq-1626160905648)(media/16104139227338/16225969082019.jpg)]

MySQL NDB Cluste-分布式数据库集群搭建相关推荐

  1. MySQL Cluste—分布式数据库集群搭建

    一.为什么要用MySQL Cluset分布式集群? 大家可以看这两位大佬的文章: https://blog.csdn.net/qq_15092079/article/details/82665307 ...

  2. MySQL Cluste(入门篇)—分布式数据库集群搭建

    目录 前言 1 概述 1.1 分布式数据库集群 1.2 数据库的分布式和主从的区别 2 环境说明 2.1 系统环境 2.2 软件环境 3 安装MySQL Cluster 4 配置安装管理节点 4.1 ...

  3. mysql 数据库集群搭建:(四)pacemaker管理三台maxscale集群,搭建mariadb读写分离中间层集群...

    为什么80%的码农都做不了架构师?>>>    <mysql 数据库集群搭建:(一)VirtualBox中多台CentOS虚拟机间和windows主机间互通以及访问互联网设置& ...

  4. MinIO纠错码、分布式MinIO集群搭建及启动

    文章目录 前言 一.MinIO纠删码 二.分布式集群部署 1.分布式存储可靠性常用的方法 2.分布式MinIO 3.分布式MinIO集群搭建 3.1 下载MinIO 3.2 为每一台虚拟机创建目录并上 ...

  5. 【Data Cluster】真机环境下MySQL数据库集群搭建

    真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同,它采用 无共享架构Shared nothing(share ...

  6. mysql cluster linux_【完美】Mysql-cluster数据库集群搭建(linux)

    介绍 <Mysql-cluster数据库集群介绍> 安装系统:Linux CentOS7.4查看是否安装mysqlrpm -qa | grep mysql普通删除rpm -e mysql强 ...

  7. Mycat高可用架构原理_Mycat集群搭建_HA高可用集群_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0027

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 前面我们已经讲了,对于数据库来说,mycat可以,我们通过搭建一主一从,双主双从,来实现数据库集群 ...

  8. 深入学习MySQL、SQL优化、集群搭建

    个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 日拱一卒,不期速成,厚积薄发 序号 内容 1 Java基础面试题 2 JVM面试题 3 ...

  9. mysql 去重 根据id_mycat数据库集群系列之mysql主从同步设置

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...

最新文章

  1. 【数据结构】邻接矩阵及其实现
  2. html jquery ajax乱码问题,jquery使用ajax提交中文乱码问题的解决
  3. 如何成为 Spring Cloud Alibaba committer ?
  4. 对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)
  5. 20应用统计考研复试要点(part17)--概率论与数理统计
  6. mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱
  7. Python2.7.16安装(Win10)
  8. kafka jar包_和同事交流不会kafka怎么行,API奉上,不是大神也能编
  9. 自媒体各大平台收益对比_各大自媒体平台的收益情况汇总
  10. JavaWeb — session+Cookie
  11. java麻麻_知了堂教你不怂密密麻麻的Java代码
  12. C#实现手机发送验证码
  13. 方框加对勾怎么输入_Word文档里的□(方框)里怎么加入√(对勾)?
  14. 【已解决】error: ‘CV_GRAY2BGR’ was not declared in this scope
  15. Android -- 启动页面背景图片配置(splash)
  16. android id如何修改密码,小编教你忘记Apple ID密码怎么办?以及如何修改密码
  17. 测试开发工程师成长日记018 - 测试面试必备题记录(持续更新)
  18. dreamweaver网页设计作业制作 学生NBA篮球网页 WEB静态网页作业模板 大学生校园篮球网页代码 dw个人网页作业成品
  19. 电脑显示无网络,刷新DNS解析缓存
  20. 将工作组信息 (.mdw) 文件转换为 Access 2002

热门文章

  1. 导致论文高被引的关键因素
  2. 计算机毕业设计Node.js+Vue基于的宠物领养管理系统(程序+源码+LW+部署)
  3. python pandas 讲解ppt_Python中pandas的分析——包括代码实践,相关,解析,含,实战
  4. Java8使用stream操作两个list根据某字段匹配再对其中一个list进行赋值
  5. 新能源高级别故障-热失控
  6. 第十周 项目二 回文数
  7. 羽毛球馆场地管理系统的设计与实现
  8. 《口吃者的自我治疗》(4. 影响治疗的因素)
  9. 《精通QTP——自动化测试技术领航》—第1章1.3节录制与回放—QTP的开关
  10. 五年级数学:100盏灯问题