news 2026/4/18 8:09:07

脚本部署MHA集群

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
脚本部署MHA集群

里面没有提供mha4mysql-node-0.58.rpm,和mha4mysql-manager-0.58.rpm的RPM,使用前自己先下载

#!/bin/bash
# MHA集群自动化部署脚本(CentOS 7 + MySQL 5.7 + MHA 0.58)
# 节点规划:
# 192.168.10.31 - mha-manager
# 192.168.10.32 - mysql-master
# 192.168.10.34 - mysql-slave1
# 192.168.10.35 - mysql-slave2
# 使用说明:使用前请上传mha4mysql-node-0.58.rpm,和mha4mysql-manager-0.58.rpm
# 作者:quinn
# 日期:2025-11-08

# 全局变量定义
MHA_MANAGER_IP="192.168.10.31"
MYSQL_MASTER_IP="192.168.10.32"
MYSQL_SLAVE1_IP="192.168.10.34"
MYSQL_SLAVE2_IP="192.168.10.35"
ALL_NODES=("$MHA_MANAGER_IP" "$MYSQL_MASTER_IP" "$MYSQL_SLAVE1_IP" "$MYSQL_SLAVE2_IP")
MYSQL_ROOT_PWD="Root@123"
REPL_USER="repl"
REPL_PWD="Repl@123456"
MHA_USER="mha"
MHA_PWD="Mha@123456"
MHA_CONF_DIR="/etc/mha"
MHA_LOG_DIR="/var/log/mha"

# 颜色输出函数
echo_red() { echo -e "\033[31m$1\033[0m"; }
echo_green() { echo -e "\033[32m$1\033[0m"; }
echo_yellow() { echo -e "\033[33m$1\033[0m"; }

# 检查是否为root用户
check_root() {
if [ $UID -ne 0 ]; then
echo_red "错误:必须以root用户执行此脚本!"
exit 1
fi
}

# 1. 通用前置配置(所有节点执行)
common_prepare() {
echo_green "===== 开始执行通用前置配置 ====="

# 1.1 修改hosts文件
echo_yellow "1. 修改hosts文件..."
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$MHA_MANAGER_IP mha-manager
$MYSQL_MASTER_IP mysql-master
$MYSQL_SLAVE1_IP mysql-slave1
$MYSQL_SLAVE2_IP mysql-slave2
EOF

# 1.2 配置YUM源(阿里云CentOS 7.9)
echo_yellow "2. 配置YUM源..."
rm -f /etc/yum.repos.d/*.repo
cat >/etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS-7 Base
baseurl=http://mirrors.aliyun.com/centos-vault/centos/7.9.2009/os/x86_64/
enabled=1
gpgcheck=0

[updates]
name=CentOS-7 Updates
baseurl=http://mirrors.aliyun.com/centos-vault/centos/7.9.2009/updates/x86_64/
enabled=1
gpgcheck=0

[extras]
name=CentOS-7 Extras
baseurl=http://mirrors.aliyun.com/centos-vault/centos/7.9.2009/extras/x86_64/
enabled=1
gpgcheck=0
EOF

cat >/etc/yum.repos.d/epel.repo <<EOF
[epel]
name=EPEL 7
baseurl=http://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
EOF

yum clean all && yum makecache -y > /dev/null 2>&1

# 1.3 关闭SELinux和防火墙
echo_yellow "3. 关闭SELinux和防火墙..."
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0 > /dev/null 2>&1
systemctl stop firewalld && systemctl disable firewalld > /dev/null 2>&1

# 1.4 安装基础依赖
echo_yellow "4. 安装基础依赖包..."
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-MakeMaker perl-CPAN wget > /dev/null 2>&1

# 1.5 安装MHA Node组件(所有节点必装)
echo_yellow "5. 安装MHA Node组件..."
# 优先尝试RPM包安装,失败则编译安装
if [ -f ./mha4mysql-node-0.58.rpm ];then
rpm -ivh mha4mysql-node-0.58.rpm
fi

echo_green "===== 通用前置配置执行完成 ====="
}

# 2. 配置SSH免密登录(交互式)
config_ssh_no_pass() {
echo_green "===== 开始配置SSH免密登录 ====="

# 2.1 生成RSA密钥(无密码)
echo_yellow "1. 生成SSH密钥(无密码)..."
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y > /dev/null 2>&1

# 2.2 获取当前节点主机名(精准匹配hosts配置的主机名)
CURRENT_HOSTNAME=$(hostname)
echo_yellow "当前节点主机名:$CURRENT_HOSTNAME"

# 2.3 推送公钥到所有节点(通过主机名匹配,跳过当前节点)
echo_yellow "2. 推送公钥到所有节点,请依次输入各节点root密码..."
for node_ip in "${ALL_NODES[@]}"; do
# 根据IP获取对应的主机名
node_host=${NODE_HOST_MAP[$node_ip]}
# 判断当前节点主机名是否与目标节点主机名一致,一致则跳过
if [ "$node_host" == "$CURRENT_HOSTNAME" ]; then
echo_yellow "跳过当前节点:$node_host(IP:$node_ip),无需推送公钥"
continue
fi
echo_yellow "正在推送公钥到 $node_host(IP:$node_ip)..."
# 使用主机名推送,更贴合hosts配置的通信方式
ssh-copy-id -o StrictHostKeyChecking=no root@$node_host
if [ $? -eq 0 ]; then
echo_green "$node_host(IP:$node_ip)公钥推送成功!"
else
echo_red "$node_host(IP:$node_ip)公钥推送失败,请检查密码或网络!"
exit 1
fi
done

echo_green "===== SSH免密登录配置完成 ====="
}

# 3. MySQL节点通用配置(master/slave)
mysql_common_config() {
echo_green "===== 开始配置MySQL通用参数 ====="

# 3.1 修改root密码并授权远程访问
echo_yellow "1. 配置MySQL root用户远程访问..."
mysql -uroot -p$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}') -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PWD';
CREATE USER 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PWD';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'$MHA_MANAGER_IP' IDENTIFIED BY '$MYSQL_ROOT_PWD' WITH GRANT OPTION;
FLUSH PRIVILEGES;
" > /dev/null 2>&1

# 3.2 创建复制账号和MHA管理账号
echo_yellow "2. 创建复制账号和MHA管理账号..."
mysql -uroot -p$MYSQL_ROOT_PWD -e "
CREATE USER '$REPL_USER'@'192.168.10.%' IDENTIFIED BY '$REPL_PWD';
GRANT REPLICATION SLAVE ON *.* TO '$REPL_USER'@'192.168.10.%';
CREATE USER '$MHA_USER'@'192.168.10.%' IDENTIFIED BY '$MHA_PWD';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO '$MHA_USER'@'192.168.10.%';
FLUSH PRIVILEGES;
" > /dev/null 2>&1

echo_green "===== MySQL通用配置完成 ====="
}

# 4. 配置MySQL主节点(192.168.10.32)
config_mysql_master() {
echo_green "===== 开始配置MySQL主节点 ====="

# 4.1 修改my.cnf配置
echo_yellow "1. 修改MySQL主节点配置文件..."
cat > /etc/my.cnf << 'EOF'
[mysqld]
server-id = 32
log-bin = mysql-bin
binlog_format = row
log_slave_updates = 1
skip_name_resolve = 1
relay_log_purge = 0
sync_binlog = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF

# 4.2 重启MySQL并获取主节点状态
echo_yellow "2. 重启MySQL服务..."
systemctl restart mysqld
sleep 3

echo_yellow "3. 主节点binlog状态:"
mysql -uroot -p$MYSQL_ROOT_PWD -e "SHOW MASTER STATUS\G"

echo_green "===== MySQL主节点配置完成 ====="
}

# 5. 配置MySQL从节点(slave1/slave2)
config_mysql_slave() {
local slave_id=$1
local slave_ip=$2
echo_green "===== 开始配置MySQL从节点 $slave_ip ====="

# 5.1 修改my.cnf配置
echo_yellow "1. 修改MySQL从节点配置文件..."
cat > /etc/my.cnf << EOF
[mysqld]
server-id = $slave_id
log-bin = mysql-bin
binlog_format = row
log_slave_updates = 1
skip_name_resolve = 1
relay_log_purge = 0
read_only = 1
super_read_only = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF

# 5.2 重启MySQL
echo_yellow "2. 重启MySQL服务..."
systemctl restart mysqld
sleep 3

# 5.3 获取主节点binlog信息(交互式输入)
echo_yellow "3. 请输入主节点($MYSQL_MASTER_IP)的binlog信息:"
read -p "请输入MASTER_LOG_FILE(如mysql-bin.000001):" log_file
read -p "请输入MASTER_LOG_POS(如154):" log_pos

# 5.4 配置主从同步
echo_yellow "4. 配置主从同步..."
mysql -uroot -p$MYSQL_ROOT_PWD -e "
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='$MYSQL_MASTER_IP',
MASTER_USER='$REPL_USER',
MASTER_PASSWORD='$REPL_PWD',
MASTER_LOG_FILE='$log_file',
MASTER_LOG_POS=$log_pos;
START SLAVE;
" > /dev/null 2>&1

# 5.5 检查同步状态
echo_yellow "5. 从节点同步状态:"
mysql -uroot -p$MYSQL_ROOT_PWD -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running"

echo_green "===== MySQL从节点 $slave_ip 配置完成 ====="
}

# 6. 配置MHA Manager节点(192.168.10.31)
config_mha_manager() {
echo_green "===== 开始配置MHA Manager节点 ====="

# 6.1 安装MHA Manager组件
echo_yellow "1. 安装MHA Manager组件..."
if [ -f ./mha4mysql-manager-0.58.rpm ];then
rpm -ivh mha4mysql-manager-0.58.rpm
fi

# 6.2 创建MHA配置目录和日志目录
echo_yellow "2. 创建MHA配置和日志目录..."
mkdir -p $MHA_CONF_DIR $MHA_LOG_DIR

# 6.3 创建MHA配置文件
echo_yellow "3. 创建MHA配置文件..."
cat > $MHA_CONF_DIR/app1.cnf << EOF
[server default]
manager_workdir = $MHA_LOG_DIR
manager_log = $MHA_LOG_DIR/manager.log
master_binlog_dir = /var/lib/mysql
user = root
password = $MYSQL_ROOT_PWD
repl_user = $REPL_USER
repl_password = $REPL_PWD
ssh_user = root
ping_interval = 10

[server1]
hostname = $MYSQL_MASTER_IP
ip = $MYSQL_MASTER_IP
port = 3306

[server2]
hostname = $MYSQL_SLAVE1_IP
ip = $MYSQL_SLAVE1_IP
port = 3306

[server3]
hostname = $MYSQL_SLAVE2_IP
ip = $MYSQL_SLAVE2_IP
port = 3306
EOF

# 6.4 测试SSH和主从复制
echo_yellow "4. 测试SSH免密和主从复制..."
echo_yellow "SSH连通性测试:"
masterha_check_ssh --conf=$MHA_CONF_DIR/app1.cnf
echo_yellow "主从复制检查:"
masterha_check_repl --conf=$MHA_CONF_DIR/app1.cnf

# 6.6 启动MHA并检查状态
echo_yellow "6. 启动MHA Manager..."

echo_green "===== MHA Manager节点配置完成 ====="
}


# 主菜单函数
main_menu() {
clear
echo_green "==================== MHA集群部署脚本 ===================="
echo "节点规划:"
echo "1. 192.168.10.31 - mha-manager(管理节点)"
echo "2. 192.168.10.32 - mysql-master(主节点)"
echo "3. 192.168.10.34 - mysql-slave1(从节点1)"
echo "4. 192.168.10.35 - mysql-slave2(从节点2)"
echo "=========================================================="
echo "请选择要执行的操作:"
echo "1) 所有节点 - 通用前置配置(必选)"
echo "2) 所有节点 - 配置SSH免密登录(必选)"
echo "3) mysql-master - 配置主节点"
echo "4) mysql-slave1 - 配置从节点1"
echo "5) mysql-slave2 - 配置从节点2"
echo "6) mha-manager - 配置管理节点"
echo "0) 退出脚本"
echo "=========================================================="
read -p "请输入选项[0-6]:" choice

case $choice in
1)
check_root
common_prepare
echo_green "通用前置配置执行完成!"
;;
2)
check_root
config_ssh_no_pass
echo_green "SSH免密配置执行完成!"
;;
3)
check_root
if [ $(hostname -I | awk '{print $1}') != "$MYSQL_MASTER_IP" ]; then
echo_red "错误:此操作必须在mysql-master节点($MYSQL_MASTER_IP)执行!"
exit 1
fi
mysql_common_config
config_mysql_master
echo_green "MySQL主节点配置完成!"
;;
4)
check_root
if [ $(hostname -I | awk '{print $1}') != "$MYSQL_SLAVE1_IP" ]; then
echo_red "错误:此操作必须在mysql-slave1节点($MYSQL_SLAVE1_IP)执行!"
exit 1
fi
mysql_common_config
config_mysql_slave 34 $MYSQL_SLAVE1_IP
echo_green "MySQL从节点1配置完成!"
;;
5)
check_root
if [ $(hostname -I | awk '{print $1}') != "$MYSQL_SLAVE2_IP" ]; then
echo_red "错误:此操作必须在mysql-slave2节点($MYSQL_SLAVE2_IP)执行!"
exit 1
fi
mysql_common_config
config_mysql_slave 35 $MYSQL_SLAVE2_IP
echo_green "MySQL从节点2配置完成!"
;;
6)
check_root
if [ $(hostname -I | awk '{print $1}') != "$MHA_MANAGER_IP" ]; then
echo_red "错误:此操作必须在mha-manager节点($MHA_MANAGER_IP)执行!"
exit 1
fi
config_mha_manager
echo_green "MHA管理节点配置完成!"
;;

0)
echo_green "退出脚本,感谢使用!"
exit 0
;;
*)
echo_red "无效选项,请重新输入!"
sleep 2
main_menu
;;
esac

read -p "按任意键返回主菜单..."
main_menu
}

# 脚本入口
check_root
main_menu

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 10:16:50

AI绘画工作流自动化:Z-Image-Turbo与ComfyUI的云端集成

AI绘画工作流自动化&#xff1a;Z-Image-Turbo与ComfyUI的云端集成 如果你正在寻找一种高效、可编程的AI绘画解决方案&#xff0c;Z-Image-Turbo与ComfyUI的云端集成可能是你的理想选择。本文将详细介绍如何利用这一组合实现自动化图像生成工作流&#xff0c;特别适合那些需要将…

作者头像 李华
网站建设 2026/4/18 12:35:26

科哥的Z-Image-Turbo安全指南:企业级部署的最佳实践

科哥的Z-Image-Turbo安全指南&#xff1a;企业级部署的最佳实践 在金融行业探索AI生成图像应用时&#xff0c;数据安全和模型可控性往往是首要考虑因素。科哥的Z-Image-Turbo安全指南提供了一套完整的企业级部署方案&#xff0c;帮助金融机构在满足合规要求的同时&#xff0c;快…

作者头像 李华
网站建设 2026/4/17 19:09:14

零基础玩转Z-Image-Turbo:10分钟搭建你的AI艺术工坊

零基础玩转Z-Image-Turbo&#xff1a;10分钟搭建你的AI艺术工坊 作为一名业余插画师&#xff0c;你是否曾被AI生成艺术的魅力所吸引&#xff0c;却又被复杂的模型部署和GPU配置劝退&#xff1f;Z-Image-Turbo作为2025年最快的生产级图像生成器之一&#xff0c;仅需8步推理即可…

作者头像 李华
网站建设 2026/4/17 20:49:37

AI艺术创作入门:绕过技术门槛直接开始创作

AI艺术创作入门&#xff1a;绕过技术门槛直接开始创作 作为一名传统艺术家&#xff0c;你是否曾对数字艺术创作充满好奇&#xff0c;却被复杂的软件安装、模型配置和GPU环境搭建劝退&#xff1f;本文将介绍如何利用预置的AI艺术创作镜像&#xff0c;让你无需关注技术细节&#…

作者头像 李华
网站建设 2026/4/17 20:49:38

跨平台AI绘画解决方案:随时随地访问你的Z-Image-Turbo工作区

跨平台AI绘画解决方案&#xff1a;随时随地访问你的Z-Image-Turbo工作区 作为一名自由职业者&#xff0c;我经常需要在不同设备间切换工作&#xff0c;从家里的台式机到咖啡馆的笔记本&#xff0c;甚至偶尔用平板应急处理需求。最让我头疼的就是AI绘画环境的部署——每次换设备…

作者头像 李华
网站建设 2026/4/17 20:46:00

低成本实验:学生党如何用云端GPU体验阿里通义Z-Image-Turbo

低成本实验&#xff1a;学生党如何用云端GPU体验阿里通义Z-Image-Turbo 作为一名对AI图像生成技术感兴趣的高中生&#xff0c;你是否曾因家庭电脑性能不足而无法体验最新的AI绘图工具&#xff1f;阿里通义Z-Image-Turbo作为一款高性能图像生成模型&#xff0c;能够快速生成高质…

作者头像 李华