里面没有提供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免密登录(通过IP判定)
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 获取当前节点的IP(仅匹配192.168.10.网段,精准定位本机)
LOCAL_IP=(ip addr \| grep -E 'inet 192.168.10.' \| grep -v '127.0.0.1' \| awk '{print 2}' | cut -d '/' -f1 | head -n 1)
校验本机IP是否获取成功
if [ -z "$LOCAL_IP" ]; then
echo_red "错误:未识别到本机192.168.10.网段的IP,请检查网络配置!"
exit 1
fi
echo_yellow "当前节点IP:$LOCAL_IP"
2.3 推送公钥到所有节点(通过IP判断,跳过本机)
echo_yellow "2. 推送公钥到所有节点,请依次输入各节点root密码..."
for node_ip in "${ALL_NODES[@]}"; do
核心逻辑:IP相同则跳过本机
if [ "node_ip" == "LOCAL_IP" ]; then
echo_yellow "跳过当前节点:$node_ip(本机IP),无需推送公钥"
continue
fi
echo_yellow "正在推送公钥到 $node_ip ..."
直接用IP推送,避开主机名解析问题
ssh-copy-id -o StrictHostKeyChecking=no root@$node_ip
if [ $? -eq 0 ]; then
echo_green "$node_ip 公钥推送成功!"
else
echo_red "$node_ip 公钥推送失败,请检查密码或网络!"
exit 1
fi
done
echo_green "===== SSH免密登录配置完成 ====="
}
3. MySQL节点通用配置(master/slave)
mysql_common_config() {
echo_green "===== 开始配置MySQL通用参数 ====="
echo_green "===== 添加MySQL YUM源 ====="
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
echo_green "===== 安装MySQL 5.7 ====="
yum install -y mysql-community-server
echo_yellow "等待MySQL初始化完成..."
sleep 10
3.1 修改root密码并授权远程访问
echo_yellow "1. 配置MySQL root用户远程访问..."
TEMP_PWD=(grep -E 'temporary password\|临时密码' /var/log/mysqld.log \| awk '{print NF}' | tail -1)
mysql -uroot -p"${TEMP_PWD}" --connect-expired-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PWD';
CREATE USER IF NOT EXISTS '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;
EOF
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
else
echo "安装包不存在,让上传后重试"
break 1
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
check_root
common_prepare
echo_green "通用前置配置执行完成!"
;;
check_root
config_ssh_no_pass
echo_green "SSH免密配置执行完成!"
;;
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主节点配置完成!"
;;
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配置完成!"
;;
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配置完成!"
;;
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管理节点配置完成!"
;;
echo_green "退出脚本,感谢使用!"
exit 0
;;
*)
echo_red "无效选项,请重新输入!"
sleep 2
main_menu
;;
esac
read -p "按任意键返回主菜单..."
main_menu
}
脚本入口
check_root
main_menu