MySQL Cluster集群部署指南:架构解析与从零搭建
本文详解MySQL Cluster高可用集群的底层架构与搭建实操。通过分析NDB存储引擎特性,明确管理节点、数据节点与SQL节点的角色分工。随后按照特定IP规划,逐步演示从系统环境初始化到关键配置文件(config.ini/my.cnf)编写,再到集群启动、数据双向同步测试及异常恢复的完整流程。
核心架构与组件功能
MySQL Cluster 是一种无共享(Shared-Nothing)体系结构的分布式数据库解决方案,旨在满足对可靠性要求极高(如99.999%可用性)的应用场景。其核心在于集成的 NDB 内存集群存储引擎,所有数据默认驻留于内存中,从而消除磁盘I/O瓶颈,提升查询速度。
完整的集群系统由三类主要节点构成:
- 管理节点 (Management Node, MGM):负责维护整个集群的配置信息、进行仲裁调度以及日志记录。通常部署在独立服务器或轻量级虚拟机上,理论上单点即可满足需求。
- 数据节点 (Data Node, DB):集群的核心承载者,负责实际数据的存储、事务处理及数据复制。至少需要两个节点以实现冗余和高可用。增加数据节点可分担负载,但需注意网络吞吐量限制。
- SQL节点 (API Node):连接客户端应用程序的接口,通过标准MySQL协议访问NDB数据。支持负载均衡,可与应用服务器(如Web后端)混合部署或独立存在。
部署环境准备与注意事项
本文将构建一个最小化的高可用集群,包含以下资源配置:
- 操作系统:CentOS 6.4 x86_64(或使用兼容的系统版本)
- 账号权限:全程使用 root 账户执行操作
- 软件包:MySQL Cluster GPL 版二进制文件
第1步:系统基础环境清理
目的:消除防火墙和安全策略对集群内部通讯端口的干扰。
- 关闭防火墙:直接关闭iptables或放行端口
1186(MGM),3306(SQL) 及各节点间动态通讯端口。# 关闭并禁止开机自启 chkconfig --level 35 iptables off - 禁用SELinux:防止安全策略拦截进程间通信。
# 编辑配置文件 vi /etc/selinux/config # 确保以下内容生效 SELINUX=disabled - 重启系统使安全策略变更生效。
- 解压安装文件至统一目录。
cd /root/Downloads tar -xvzf mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64.tar.gz mv mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64 /usr/local/mysql
第2步:配置管理节点 (Node ID: 1)
入口:专用管理节点服务器
动作:生成 config.ini 定义拓扑结构。
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
重要参数说明:config.ini 是整个集群的大脑,必须准确指向各节点IP。
[ndbd default]
NoOfReplicas=2 # 数据副本数,通常设为2实现高可用
DataMemory=80M # 分配给表数据的内存比例
IndexMemory=18M # 分配给索引的内存比例
[ndb_mgmd]
NodeId=1 # 管理节点ID固定为1
hostname=192.168.124.141 # 本节点IP
datadir=/var/lib/mysql-cluster
# 数据节点定义
[ndbd]
NodeId=2
hostname=192.168.124.142
datadir=/usr/local/mysql/data
[ndbd]
NodeId=3
hostname=192.168.124.143
datadir=/usr/local/mysql/data
# SQL节点定义
[mysqld]
NodeId=4
hostname=192.168.124.144
[mysqld]
NodeId=5
hostname=192.168.124.145
完成判断:保存文件后,将 ndb_mgm 和 ndb_mgmd 拷贝至环境变量路径并赋予执行权限。
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
chmod +x /usr/local/bin/ndb_mgm*
第3步:配置数据节点 (Node IDs: 2 & 3)
入口:两台数据存储服务器
动作:创建用户并编写 my.cnf 启用NDB引擎。
- 创建运行账户:
groupadd mysql
useradd -g mysql mysql
注意:后续所有涉及 /usr/local/mysql 的路径操作均需保证 mysql 用户对数据和 sock 目录拥有正确所有权。
配置 my.cnf: 指定连接到管理节点的地址。
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/sock/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=192.168.124.141 # 指向管理节点IP
初始化数据库实例(以data节点为例):
cd /usr/local/mysql
mkdir sock
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
chown -R root .
chown -R mysql.mysql /usr/local/mysql/data /usr/local/mysql/sock
chgrp -R mysql .
第4步:配置SQL节点 (Node IDs: 4 & 5)
入口:应用接口服务器
动作:同样创建mysql用户并修改 my.cnf,使其识别集群模式。
[client]
socket=/usr/local/mysql/sock/mysql.sock
[mysqld]
ndbcluster # 开启NDB集群模式
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/sock/mysql.sock
ndb-connectstring=192.168.124.141 # 连接管理节点
[mysql_cluster]
ndb-connectstring=192.168.124.141
SQL节点也需执行上述的 mysql_install_db 初始化和权限设置步骤,并注册服务以便通过 service mysql.server start 控制。
集群启动流程
严格按照顺序启动是避免“脑裂”和数据不同步的关键。
- 启动管理节点:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini - 启动数据节点:首次启动必须加
--initial参数进行初始化(重建数据目录),后续重启严禁添加此参数,否则会导致数据重置丢失。/usr/local/mysql/bin/ndbd --initial # 非首次启动仅执行 # /usr/local/mysql/bin/ndbd - 启动SQL节点:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
连通性与故障转移测试
测试一:跨节点数据同步
登录任一端SQL节点(如Node 4):
/usr/local/mysql/bin/mysql -u root -p
create database cluster_test;
use cluster_test;
-- 关键:引擎必须显式声明为 NDB
CREATE TABLE tb_sync (id INT) ENGINE=NDB;
INSERT INTO tb_sync VALUES (1001);
SELECT * FROM tb_sync;
切换到另一端SQL节点(Node 5),执行相同的 SELECT 查询。若返回相同结果,证明读写同步链路畅通。
测试二:数据节点宕机恢复
- 模拟故障:在主机上强制停止某个数据节点进程(如Node 3):
killall ndbd - 写入新数据:此时Node 2和SQL节点仍工作。通过SQL节点向其他表插入新数据。
- 恢复节点:重新启动该数据节点进程(不加initial):
/usr/local/mysql/bin/ndbd - 状态观察:回到管理节点查看状态:
ndb_mgm -e "show",确认节点状态由SHUTDOWN变为STARTED。 - 最终验证:新加入的数据在集群重新平衡后应可见于所有正常运行的节点中。
关闭集群的正确步骤
为避免数据损坏,请遵循从外向内的关闭顺序:
- 管理节点指令:在MGM服务器上运行
ndb_mgm,然后输入shutdown。这将通知所有数据节点和SQL节点有序停止。 - 手动关闭:如果自动化脚本未完全执行,依次停止MySQL服务和NDBD进程。
以上就是MySQL Cluster集群搭建过程,更多关于Linux下分布式数据库运维与优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













