一、节点角色与分工
二、所有节点(Master/Slave1/Slave2/Manager)通用操作
1. 基础环境配置(4 个节点均执行)
# 关闭防火墙和SELinux(生产环境需配置防火墙白名单)
systemctl stop firewalld && systemctl disable firewalldsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 同步系统时间
yum install -y ntpdatentpdate time.windows.com 或使用阿里云NTP:ntpdate ntp.aliyun.com
# 创建MHA相关目录(Manager节点需额外创建,MySQL节点可选)
mkdir -p /var/log/mhachown -R root:root /var/log/mha
2. 安装 MHA Node 组件(仅 MySQL 节点:Master/Slave1/Slave2)目的:Node 组件包含 MHA 所需的底层工具(如日志解析、复制检查),需在所有 MySQL 节点安装
cd /opt wget https://github.com/yoshinorim/mha4mysql-node/archive/v0.58.tar.gz tar zxvf v0.58.tar.gz cd mha4mysql-node-0.58
# 安装Perl基础包
sudo yum install -y perl # 安装Perl开发工具和常用模块 sudo yum install -y perl-CPAN perl-Devel-CheckLib perl-ExtUtils-MakeMaker
# 安装编译工具链
sudo yum install -y gcc make openssl-devel yes | cpan Module::Install perl Makefile.PLmake && make install
三、MySQL 节点专属操作(Master/Slave1/Slave2)
1.把mysql5.7.44tar包导入三台服务器并完成安装
# 初始化MySQL(首次启动前执行,Manager节点跳过)
mysqld --initialize --user=mysql --basedir=/usr --datadir=/data/mysql/data
2. 配置 MySQL 参数(3 个 MySQL 节点执行,Manager 节点跳过)
修改 /etc/my.cnf,关键差异:
Master 节点:server-id=1,启用log-bin(必须)
Slave1 节点:server-id=2,启用log-bin(级联复制需开启)和relay-log
Slave2 节点:server-id=3,启用relay-log(从库需开启)
[mysqld]
datadir=/data/mysql/data
server-id=1 # Master设为1,Slave1设为2,Slave2设为3
log-bin=/data/mysql/logs/mysql-bin.log # Master和Slave1必须启用,Slave2可选(级联需开)
relay-log=/data/mysql/logs/relay-bin.log # Slave1和Slave2必须启用
log_slave_updates=1 # Slave1和Slave2必须启用(级联复制需要)
# 其他参数(字符集、连接数等)见前文通用配置
3.拿初始化密码:
grep 'temporary password' /var/log/mysqld.log
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mysql@1234';
1. 登录mysql -uroot -p
master节点执行
2. 创建主从复制账户CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@1234';
3. 授予该用户复制权限:GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
4. 使权限更改生效FLUSH PRIVILEGES;
5. 验证用户是否存在: SELECT user, host FROM mysql.user WHERE user = 'repl';
6. 验证权限SHOW GRANTS FOR 'repl'@'%';
7. 记录初始 Binlog 位置(配置 Slave 时需要)
master_file=$(mysql -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $1}')
master_pos=$(mysql -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $2}')
echo "Master Binlog: $master_file, Position: $master_pos"
Slave 节点专属操作(Slave1 和 Slave2 执行)
Slave1 节点(指向 Master):
mysql -uroot -p'Mysql@1234' -e "STOP SLAVE;"
mysql -uroot -p'Mysql@1234' -e "CHANGE MASTER TO
MASTER_HOST='10.9.187.59',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@1234',
MASTER_LOG_FILE='$master_file', # 替换为Master的File值
MASTER_LOG_POS=$master_pos;" # 替换为Master的Position值
mysql -uroot -p'Mysql@1234' -e "START SLAVE;"
Slave2 节点(指向 Slave1):
mysql -uroot -p'Mysql@1234' -e "STOP SLAVE;"
mysql -uroot -p'Mysql@1234' -e "CHANGE MASTER TO
MASTER_HOST='10.9.129.160', # Slave1的内网IP
MASTER_USER='repl',
MASTER_PASSWORD='Repl@1234',
MASTER_LOG_FILE='mysql-bin.000001', # 首次需从Slave1获取初始Binlog位置
MASTER_LOG_POS=154;"
mysql -uroot -p'Mysql@1234' -e "START SLAVE;"
ps:如果状态显示 Slave_IO_Running 为 Yes,而 Slave_SQL_Running 为 No
可以确认下检查从服务器上是否存在 repl 用户 如已存在可以尝试 删除重建用户 跳过错误并重新启动复制:
DROP USER 'repl'@'%';
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@1234';
GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
FLUSH PRIVILEGES;
跳过错误
SET GLOBAL sql_slave_skip_counter = 1;
重新启动 SQL 线程:
START SLAVE SQL_THREAD;
再次检查状态:
SHOW SLAVE STATUS\G
验证:在主服务器的 MySQL 提示符下,创建 test_db 数据库 并插入数据
在从服务器上验证
验证成功
六、Manager 节点专属操作(仅 Manager 执行)
生成 SSH 密钥(无密码):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ''
分发公钥到所有 MySQL 节点(以 root 用户为例):
# 替换为你的MySQL节点内网IP
MYSQL_NODES=("10.9.187.59" "10.9.129.160" "10.9.174.1")
for ip in "${MYSQL_NODES[@]}"; do
ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ip
done
测试免密登录(必须无密码提示):