网站Logo daydayup

MYSQL+MHA完成高可用-主从同步(一)

weilin.dong
16
2025-07-02

一、节点角色与分工

节点类型

节点名称

内网 IP

核心任务

Master

Master 节点

10.9.187.59

主数据库实例,启用 Binlog,创建复制用户,作为主从复制的源头。

Slave1

从库节点 1

10.9.129.160

作为 Master 的从库,同时作为 Slave2 的主库(级联复制),启用 Relay Log。

Slave2

从库节点 2

10.9.174.1

作为 Slave1 的从库,启用 Relay Log,参与 MHA 故障转移候选。

Manager

管理节点

10.9.164.136

仅安装 MHA Manager 组件,不运行 MySQL 实例,负责监控集群、触发故障转移。

二、所有节点(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

  1. done
    测试免密登录(必须无密码提示):

 

动物装饰