脚本部署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免密登录(通过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

相关推荐
dz小伟14 小时前
execve() 系统调用深度解析:从用户空间到内核的完整加载过程
linux
Mr_Xuhhh14 小时前
博客标题:深入理解Shell:从进程控制到自主实现一个微型Shell
linux·运维·服务器
JoyCheung-14 小时前
Free底层是怎么释放内存的
linux·c语言
旖旎夜光15 小时前
Linux(9)
linux·学习
喵了meme16 小时前
Linux学习日记24:Linux网络编程基础
linux·网络·学习
whlqjn_121116 小时前
linux下使用SHC对Shell脚本进行封装和源码隐藏
linux·centos
weixin_4624462317 小时前
K8s 集群部署基础:Linux 三节点 SSH 互信(免密登录)配置指南
linux·kubernetes·ssh
Hard but lovely17 小时前
Linux: 线程同步-- 基于条件变量 &&生产消费模型
linux·开发语言·c++
m0_7381207217 小时前
应急响应——知攻善防靶场Linux-1详细应急过程
linux·运维·服务器·网络·web安全·ssh