NDBmysql-cluster融合脚本
前期大白鼠发布了NDB&mysql-cluster部署脚本,该脚本有部分朋友感觉运行比较麻烦。
详情请见:NDB&mysql-cluster集群部署脚本-CSDN博客
对此,大白鼠重新整理了一下思路,为了方便大家快速部署mysql集群,重新编写了NDB&mysql-cluster融合脚本,该脚本更方便大家使用。
NDB&mysql-cluster融合脚本前期只需要将对应安装包上传到/root/,
安装包:mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz
站内下载链接:https://download.csdn.net/download/qq_28608175/91554469
另需提前获取五台服务器的IP地址,只要按规划输入服务器名称即可畅快部署mysql集群。
规划示例:
10.10.10.237 mgr
10.10.10.238 mysqla
10.10.10.239 mysqlb
10.10.10.240 data1
10.10.10.241 data2
脚本通过计算机名称判断应该运行那些代码、判断节点角色及自动生成节点ID,减少了人机交互过程。特别提醒:只能按照规划的计算机名称(mgr/mysqla/mysqlb/data1/data2),否则无法使用本脚本。
#!/bin/bash
# function: 一体化部署 MySQL NDB Cluster 节点
# author: tommypeng 20250801# 0. 用户检查
if [ "$USER" != "root" ]; thenecho "错误:非root用户,权限不足!"exit 1
fi# 1. 关闭防火墙与 SELinux
systemctl stop firewalld && systemctl disable firewalld && echo "防火墙已关闭"
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config && setenforce 0 && echo "SELinux 已关闭"# 2. 软件包检查
#####安装依赖
echo "正在安装 libaio 库..."
if [ -x "$(command -v yum)" ]; thenyum install -y libaio
elif [ -x "$(command -v apt)" ]; thenapt update && apt install -y libaio1
elseecho "未识别的包管理器,请手动安装 libaio"exit 1
fi
TARBALL="/root/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz"
if [ ! -f "$TARBALL" ]; thenecho "请将 $TARBALL 上传至 /root/"exit 1
fi# 3. 获取集群IP信息
read -ep "请输入管理节点IP: " mgrIP
read -ep "请输入mysqla节点IP: " mysqlAIP
read -ep "请输入mysqlb节点IP: " mysqlBIP
read -ep "请输入data1节点IP: " data1IP
read -ep "请输入data2节点IP: " data2IP# 4. 获取并设置主机名
read -ep "请输入当前主机名 (mgr/mysqla/mysqlb/data1/data2): " HOSTNAME
hostnamectl set-hostname $HOSTNAME# 5. 写入 hosts
cat >> /etc/hosts <<EOF
$mgrIP mgr
$mysqlAIP mysqla
$mysqlBIP mysqlb
$data1IP data1
$data2IP data2
EOF# 6. 自动推导 nodeid
case "$HOSTNAME" inmgr) nodeid=99 ;;mysqla) nodeid=1 ;;mysqlb) nodeid=2 ;;data1) nodeid=3 ;;data2) nodeid=4 ;;*) echo "未知主机名,无法推导 nodeid,退出。" && exit 1 ;;
esac
echo "推导得到的节点ID为: $nodeid"# 7. 创建用户与安装目录
groupadd mysql
useradd -M -s /sbin/nologin -g mysql mysql
mkdir -p /usr/local/mysql && tar -zxf $TARBALL -C /usr/local/mysql --strip-components=1
mkdir -p /usr/local/mysql/data && chown -R mysql:mysql /usr/local/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld# 8. 写入配置文件(根据节点角色)
mv /etc/my.cnf /etc/my.cnf.bak 2>/dev/nullif [[ $HOSTNAME == mysqla || $HOSTNAME == mysqlb ]]; thencat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
user=mysql
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
explicit_defaults_for_timestamp=true
ndbcluster
ndb-nodeid=$nodeid
default-storage-engine=ndbcluster
ndb-connectstring=$mgrIP:1186
max_connections=1000
max_allowed_packet=128M
query_cache_size=0
innodb_buffer_pool_size=512M[mysql_cluster]
ndb-connectstring=$mgrIP:1186
EOF# 初始化数据库rm -rf /usr/local/mysql/data/*/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data > /root/init.log 2>&1pw=$(grep 'temporary password' /root/init.log | awk -F 'root@localhost: ' '{print $2}')echo "MySQL默认临时密码为:$pw"elif [[ $HOSTNAME == data1 || $HOSTNAME == data2 ]]; thencat > /etc/my.cnf <<EOF
[mysqld]
skip-networking
skip-grant-tables
user=mysql[ndbd]
ndb-nodeid=$nodeid
ndb-connectstring=$mgrIP:1186[mysql_cluster]
ndb-connectstring=$mgrIP:1186
EOF# 启动数据节点/usr/local/mysql/bin/ndbd --initial --ndb-connectstring=$mgrIP:1186 && echo "数据节点初始化成功"elif [[ $HOSTNAME == mgr ]]; thenmkdir -p /var/lib/mysql-clustercat > /var/lib/mysql-cluster/config.ini <<EOF
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
#IndexMemory=18M[TCP DEFAULT]
#portnumber=1186
SendBufferMemory=2M
ReceiveBufferMemory=64k [ndb_mgmd]
hostname=mgr
nodeid=99
datadir=/var/lib/mysql-cluster[ndbd]
hostname=data1
nodeid=3
datadir=/usr/local/mysql/data[ndbd]
hostname=data2
nodeid=4
datadir=/usr/local/mysql/data[mysqld]
hostname=mysqla
nodeid=1[mysqld]
hostname=mysqlb
nodeid=2
EOFecho "启动管理节点..."/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial --configdir=/var/lib/mysql-cluster && echo "管理节点启动成功"
fi# 9. 加入环境变量
echo 'export PATH=\$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile# 10. 启动 SQL 节点数据库(如适用)
if [[ $HOSTNAME == mysqla || $HOSTNAME == mysqlb ]]; then/etc/init.d/mysqld start && echo "MySQL SQL 节点启动成功"
fi
诸君顺利!