【赵渝强老师】MySQL Cluster

[复制链接]
发表于 2026-6-18 09:22:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

MySQL Cluster(现官方称:MySQL NDB Cluster)是一个高可用、高性能的数据库办理方案,它通太过布式数据存储来进步读写性能和数据冗余度。MySQL Cluster接纳NDB(Network Database)存储引擎,支持实时处理处罚大量并发利用,特殊恰当于电信、金融等须要高可靠性和高性能的行业应用。
点击这里检察视频解说:【赵渝强老师】MySQL Cluster一、 MySQL Cluster的功能特性:


  • 高可用
MySQL Cluster具有内置的高可用性功能,可以自动检测和规复故障。它支持故障检测和节点规复,以确保集群中的数据和服务可用性。

  • 分布式存储
NDB存储引擎支持将数据分布在多个节点上,实现了数据的分布式存储。这意味着数据可以程度扩展,从而进步了存储容量和性能。

  • 实时处理处罚
MySQL Cluster旨在支持实时数据处理处罚,特殊实用于须要低耽误和高吞吐量的应用步伐,如电信、在线游戏和金融范畴。

  • 自动分区
NDB存储引擎支持自动分区,可以根据数据分布自动将数据分割成多个分区,以实现负载平衡和高性能。

  • 动态扩展
MySQL Cluster支持动态添加和删除节点,因此可以根据需求扩展集群。

  • 变乱支持
MySQL Cluster支持ACID(原子性、划一性、隔离性和长期性)变乱,确保数据的划一性和可靠性。

  • 并行查询
NDB存储引擎支持并行查询,答应同时实验多个查询以进步性能。

  • 多地域复制
MySQL Cluster支持跨地域的数据复制,使数据在差别地理位置之间举行同步,以进步数据冗余和可用性。
二、 MySQL Cluster的体系架构

MySQL Cluster的体系架构如下:

此中:

  • SQL Node
SQL节点紧张负责实现一个数据库在存储层之上的全部事变,好比:毗连管理,Query优化和相应,Cache管理等等,只有存储层的工作交给了数据节点行止理处罚。也就是说,在MySQL Cluster环境中的SQL Node,可以被以为是一个不须要提供任何存储引擎的MySQL服务器,只要用于实验SQL语句。

  • Management Node
管理节点的作用是管理集群中的其他节点,提供设置数据、启动和克制节点以及运行备份等功能。由于这种范例的节点管理其他节点的设置,以是应该起首启动这种范例的节点,然后再启动任何其他节点。利用下令ndb_mgmd启动管理节点。

  • Data Node
数据节点紧张实现底层数据存储的功能。每一个数据节点生存完备数据的一个fragment,也就是一个数据分片(大概一份完备的数据),以是只要设置恰当,MySQL Cluster在存储层不会出现单点的题目。利用下令ndbd或ndbmtd启动数据节点。
三、 摆设MySQL Cluster

下面的表格枚举了集群中的节点信息(利用体系:银河麒麟Linux)。

安装介质信息如下:
  1. mysql-cluster-community-client-8.0.23-1.el8.x86_64.rpm
  2. mysql-cluster-community-client-plugins-8.0.23-1.el8.x86_64.rpm
  3. mysql-cluster-community-common-8.0.23-1.el8.x86_64.rpm
  4. mysql-cluster-community-data-node-8.0.23-1.el8.x86_64.rpm
  5. mysql-cluster-community-libs-8.0.23-1.el8.x86_64.rpm
  6. mysql-cluster-community-management-server-8.0.23-1.el8.x86_64.rpm
  7. mysql-cluster-community-server-8.0.23-1.el8.x86_64.rpm
复制代码
详细的安装步调如下:
(1)全部节点关闭防火墙
  1. systemctl stop firewalld
  2. systemctl disable firewalld
复制代码
(2)全部节点编辑/etc/selinux/config文件关闭SELinux
  1. SELINUX=enforcing
  2. 修改为
  3. SELINUX=disabled
复制代码
(3)全部节点编辑​/etc/hosts​文件设置主机名与IP地点映射关系
  1. 192.168.79.11 node11
  2. 192.168.79.12 node12
  3. 192.168.79.13 node13
  4. 192.168.79.14 node14
复制代码
(4)全部节点卸载原有mariadb和mysql的库
  1. # 检查是否安装了mariadb
  2. yum list installed | grep mariadb*
  3. # 卸载mariadb
  4. yum remove mariadb* -y
  5. # 检查是否安装了mysql
  6. yum list installed | grep mysql*
  7. # 卸载mysql
  8. yum remove mysql* -y
复制代码
(5)在node11上安装SQL Node
  1. rpm -ivh mysql-cluster-community-client-plugins-8.0.23-1.el8.x86_64.rpm
  2. rpm -ivh mysql-cluster-community-common-8.0.23-1.el8.x86_64.rpm
  3. rpm -ivh mysql-cluster-community-libs-8.0.23-1.el8.x86_64.rpm
  4. rpm -ivh mysql-cluster-community-client-8.0.23-1.el8.x86_64.rpm
  5. rpm -ivh mysql-cluster-community-server-8.0.23-1.el8.x86_64.rpm
复制代码
(6)在node12上安装Management Node和客户端管理工具
  1. rpm -ivh mysql-cluster-community-management-server-8.0.23-1.el8.x86_64.rpm
  2. rpm -ivh mysql-cluster-community-client-plugins-8.0.23-1.el8.x86_64.rpm
  3. rpm -ivh mysql-cluster-community-common-8.0.23-1.el8.x86_64.rpm
  4. rpm -ivh mysql-cluster-community-libs-8.0.23-1.el8.x86_64.rpm
  5. rpm -ivh mysql-cluster-community-client-8.0.23-1.el8.x86_64.rpm
复制代码
(7)在node13和node14上安装Data Node
  1. rpm -ivh mysql-cluster-community-data-node-8.0.23-1.el8.x86_64.rpm
复制代码
(8)在node12上设置Management Node
  1. # 创建目录
  2. mkdir -p /var/lib/mysql-cluster/
  3. # 在管理节点上创建配置文件​​/var/lib/mysql-cluster/config.ini​,添加以下内容
  4. [NDBD DEFAULT]
  5. NoOfReplicas=2
  6. DataMemory=80M
  7. IndexMemory=18M
  8. [TCP DEFAULT]
  9. [MYSQLD DEFAULT]
  10. [NDB_MGMD DEFAULT]
  11. [NDB_MGMD]
  12. HostName=node12
  13. DataDir=/var/lib/mysql-cluster
  14. [NDBD]
  15. HostName=node13
  16. DataDir=/usr/local/mysql/data
  17. [NDBD]
  18. HostName=node14
  19. DataDir=/usr/local/mysql/data
  20. [MYSQLD]
复制代码
(9)在node12上启动Management Node
  1. ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
  2. # 输出的信息如下:
  3. MySQL Cluster Management Server mysql-8.0.23 ndb-8.0.23
  4. ... [MgmtSrvr] INFO     -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
  5. ... [MgmtSrvr] INFO     -- Sucessfully created config directory
  6. ... [MgmtSrvr] WARNING  -- at line 4: [DB] IndexMemory is deprecated, will use Number bytes on each ndbd(DB) node allocated for storing indexes instead
复制代码
(10)在node13和node14上设置Data Node
  1. # 创建目录
  2. mkdir -p /usr/local/mysql/data
  3. chown -R mysql:mysql /usr/local/mysql/data
  4. # 编辑文件/etc/my.cnf,增加下面的内容
  5. [mysql_cluster]
  6. ndb-connectstring=node12
复制代码
(11)在node13和node14上启动Data Node
  1. ndbd --initial
  2. # 输出的信息如下:
  3. [root@node13 8]# ndbd --initial
  4. 2026-05-14 17:48:36 [ndbd] INFO     -- Angel connected to 'node12:1186'
  5. 2026-05-14 17:48:36 [ndbd] INFO     -- Angel allocated nodeid: 2
  6. [root@node14 8]# ndbd --initial
  7. 2026-05-14 17:48:39 [ndbd] INFO     -- Angel connected to 'node12:1186'
  8. 2026-05-14 17:48:39 [ndbd] INFO     -- Angel allocated nodeid: 3
复制代码
(12)在node12的Management Node上检察集群的状态信息。
  1. # ndb_mgm
  2. -- NDB Cluster -- Management Client --
  3. ndb_mgm> show
  4. # 输出的信息如下:
  5. Connected to Management Server at: localhost:1186
  6. Cluster Configuration
  7. ---------------------
  8. [ndbd(NDB)]        2 node(s)
  9. id=2        @192.168.79.13  (mysql-8.0.23 ndb-8.0.23, Nodegroup: 0, *)
  10. id=3        @192.168.79.14  (mysql-8.0.23 ndb-8.0.23, Nodegroup: 0)
  11. [ndb_mgmd(MGM)]        1 node(s)
  12. id=1        @192.168.79.12  (mysql-8.0.23 ndb-8.0.23)
  13. [mysqld(API)]        1 node(s)
  14. id=4 (not connected, accepting connect from any host)
复制代码
(13)在node11上设置SQL Node
  1. # 编辑/etc/my.cnf文件,添加以下内容:
  2. [mysqld]
  3. ndbcluster
  4. ndb-connectstring=node12
  5. [mysql_cluster]
  6. ndb-connectstring=node12
复制代码
(14)在node11上启动SQL Node
  1. systemctl start mysqld
复制代码
(15)在node12的Management Node上验证集群状态
  1. # ndb_mgm
  2. -- NDB Cluster -- Management Client --
  3. # 查看集群的信息
  4. ndb_mgm> show
  5. # 输出的信息如下:
  6. Cluster Configuration
  7. ---------------------
  8. [ndbd(NDB)]        2 node(s)
  9. id=2        @192.168.79.13  (mysql-8.0.23 ndb-8.0.23, Nodegroup: 0, *)
  10. id=3        @192.168.79.14  (mysql-8.0.23 ndb-8.0.23, Nodegroup: 0)
  11. [ndb_mgmd(MGM)]        1 node(s)
  12. id=1        @192.168.79.12  (mysql-8.0.23 ndb-8.0.23)
  13. [mysqld(API)]        1 node(s)
  14. id=4        @192.168.79.11  (mysql-8.0.23 ndb-8.0.23)
  15. # 查看集群的节点信息
  16. ndb_mgm> 1 status
  17. Node 1: connected (Version 8.0.23)
  18. ndb_mgm> 2 status
  19. Node 2: started (mysql-8.0.23 ndb-8.0.23)
  20. ndb_mgm> 3 status
  21. Node 3: started (mysql-8.0.23 ndb-8.0.23)
  22. ndb_mgm> 4 status
  23. Node 4: connected (Version 8.0.23)
复制代码
(16)在node11的SQL Node上登录MySQL客户端
  1. # 初始密码位于/var/log/mysqld.log文件中
  2. # 登录后修改root用户密码
  3. mysql> alter user root@localhost identified by 'Welcome_1';
复制代码
(17)实验脚本创建分布式表
  1. create database scott;
  2. use scott
  3. create table dept
  4. (deptno int primary key,
  5. dname varchar(10),
  6. loc varchar(10)
  7. ) ENGINE=ndbcluster;
  8. create table emp
  9. (empno int primary key,
  10. ename varchar(10),
  11. job varchar(10),
  12. mgr int,
  13. hiredate varchar(10),
  14. sal int,
  15. comm int,
  16. deptno int,
  17. foreign key(deptno) references dept(deptno)) ENGINE=ndbcluster;
  18. insert into dept values(10,'ACCOUNTING','NEW YORK');
  19. insert into dept values(20,'RESEARCH','DALLAS');
  20. insert into dept values(30,'SALES','CHICAGO');
  21. insert into dept values(40,'OPERATIONS','BOSTON');
  22. insert into emp values(7369,'SMITH','CLERK',7902,'1980/12/17',800,null,20);
  23. insert into emp values(7499,'ALLEN','SALESMAN',7698,'1981/2/20',1600,300,30);
  24. insert into emp values(7521,'WARD','SALESMAN',7698,'1981/2/22',1250,500,30);
  25. insert into emp values(7566,'JONES','MANAGER',7839,'1981/4/2',2975,null,20);
  26. insert into emp values(7654,'MARTIN','SALESMAN',7698,'1981/9/28',1250,1400,30);
  27. insert into emp values(7698,'BLAKE','MANAGER',7839,'1981/5/1',2850,null,30);
  28. insert into emp values(7782,'CLARK','MANAGER',7839,'1981/6/9',2450,null,10);
  29. insert into emp values(7788,'SCOTT','ANALYST',7566,'1987/4/19',3000,null,20);
  30. insert into emp values(7839,'KING','PRESIDENT',-1,'1981/11/17',5000,null,10);
  31. insert into emp values(7844,'TURNER','SALESMAN',7698,'1981/9/8',1500,null,30);
  32. insert into emp values(7876,'ADAMS','CLERK',7788,'1987/5/23',1100,null,20);
  33. insert into emp values(7900,'JAMES','CLERK',7698,'1981/12/3',950,null,30);
  34. insert into emp values(7902,'FORD','ANALYST',7566,'1981/12/3',3000,null,20);
  35. insert into emp values(7934,'MILLER','CLERK',7782,'1982/1/23',1300,null,10);
复制代码
(18)查询表的分片信息。
  1. mysql> select partition_name,table_rows
  2.       from information_schema.PARTITIONS
  3.             where table_name='emp' and table_schema='scott';
  4. # 输出的信息如下:
  5. +----------------+------------+
  6. | PARTITION_NAME | TABLE_ROWS |
  7. +----------------+------------+
  8. | p0             |          1 |
  9. | p1             |         13 |
  10. +----------------+------------+
  11. 2 rows in set (0.01 sec)
  12. mysql> select partition_name,table_rows
  13.        from information_schema.PARTITIONS
  14.        where table_name='dept' and table_schema='scott';
  15. # 输出的信息如下:
  16. +----------------+------------+
  17. | PARTITION_NAME | TABLE_ROWS |
  18. +----------------+------------+
  19. | p0             |          2 |
  20. | p1             |          2 |
  21. +----------------+------------+
  22. 2 rows in set (0.00 sec)
  23. # 从输出的信息可以看出,员工表emp中共有14条数据;
  24. # 其中13条数据被存储在了p1分片上。
  25. # 因此使用员工号empno()主键作为片键发生了数据倾斜。
复制代码
(19)创建一张新的员工表emp1,并利用员工姓名ename作为主键(片键),并插入数据。
  1. mysql> create table emp1
  2.        (empno int,
  3.        ename varchar(10) primary key,
  4.        job varchar(10),
  5.        mgr int,
  6.        hiredate varchar(10),
  7.        sal int,
  8.        comm int,
  9.        deptno int,
  10.        foreign key(deptno) references dept(deptno)) ENGINE=ndbcluster;
  11.           
  12. mysql> insert into emp1 select * from emp;
复制代码
(20)查询emp1的数据分片环境
  1. mysql> select partition_name,table_rows
  2.        from information_schema.PARTITIONS
  3.        where table_name='emp1' and table_schema='scott';
  4. # 输出的信息如下:
  5. +----------------+------------+
  6. | PARTITION_NAME | TABLE_ROWS |
  7. +----------------+------------+
  8. | p0             |          5 |
  9. | p1             |          9 |
  10. +----------------+------------+
  11. 2 rows in set (0.00 sec)
  12. # 此时的数据更加均匀地进行了分布。
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表