Skip to content


MHA架构

启动顺序:44,46,47,45

ip 主机名 serve_id 类型 环境
192.168.242.45 Admin 监控mysql集群
192.168.242.44 Master 44 写入(主) mysql
192.168.242.46 Slave01 46 读取(Master故障转移候选) mysql
192.168.242.47 Slave02 47 读取 mysql

时间同步

# 时间同步
yum -y install ntp
ntpdate pool.ntp.org
systemctl start ntpd

设置主机名

# 所有节点全部配置自己的主机名
echo '主机名' > vi /etc/hostname
hostname 主机名

配置host文件(必须,后面配置需要主机名)

# 所有节点全部配置所有人的host
echo '192.168.242.45    Admin' >> /etc/hosts
echo '192.168.242.46    Slave01' >> /etc/hosts
echo '192.168.242.47    Slave02' >> /etc/hosts
echo '192.168.242.44    Master' >> /etc/hosts

配置互信

# 四台机器都生成密钥
ssh-keygen -t rsa
# 四台机器都运行以下代码,将公钥上传
ssh-copy-id 192.168.242.44
ssh-copy-id 192.168.242.45
ssh-copy-id 192.168.242.46
ssh-copy-id 192.168.242.47

配置文件

master配置

vi /etc/my.cnf
# 设置唯一节点id
server-id=44
# 开启二进制日志
log-bin=master-log
# 开启中继日志
relay-log=relay-log
# 关闭名称解析
skip_name_resolve
# 开启gtid
gtid-mode=on
# 强制gtid一致
enforce-gtid-consistency=true
# 密码加密方式为原生方式
default_authentication_plugin=mysql_native_password

记得重启mysql

slave配置(两台slave配置仅server_id不同)

# 设置唯一节点id
server-id=46
# 开启二进制日志
log-bin=master-log
# 开启中继日志
relay-log=relay-log
# 开启只读属性
read_only=ON
# 取消自动清理二进制中继日志
relay_log_purge=0
# 关闭名称解析
skip_name_resolve
# 使得更新的数据写入二进制日志中
log_slave_updates=1
# 开启gtid
gtid-mode=on
# 强制gtid一致
enforce-gtid-consistency=true
# 密码加密方式为原生方式
default_authentication_plugin=mysql_native_password

查看三台机器是否开启gtid一致

show variables like '%gtid%';

image-20241105214326171

主从同步

主库操作

# 创建复制账号,这个用户将用于设置主从复制。
create user repl@'%' identified with mysql_native_password by '123';
# 授予 repl 用户 replication slave 权限,使其能够从主服务器读取复制的二进制日志。
grant replication slave on *.* to repl@'%' with grant option;
# 刷新权限
flush privileges;

# 查看用户权限
 select user,host,grant_priv,Super_priv,password_last_changed from mysql.user;
 
 

image-20241105221458230

从库操作

change master to
master_host='192.168.242.44',
master_port=3306,
master_user='repl',
master_password='123',
master_auto_position=1;

# 启动slave
start slave;
----------------------------------参数解读--------------------------------------
master_host='192.168.242.44':
指定主库的 IP 地址或主机名。这里是 192.168.242.44,即从库将连接到这个主库地址。
master_port=3306:
指定主库的端口号。默认情况下,MySQL 使用 3306 端口进行连接。
master_user='repl':
指定用于连接主库的 MySQL 用户名。repl 是一个之前创建的用户,并且该用户应该具有 REPLICATION SLAVE 权限,用于从库从主库读取复制数据。
master_password='123':
指定连接主库时使用的密码。该密码应与 repl 用户的密码一致。
master_auto_position=1:
启用基于 GTID(全局事务标识符)的复制模式。master_auto_position=1 表示 MySQL 会自动使用 GTID 来同步事务,而不需要手动指定 binlog 的文件和位置。这样,主库的每个事务都带有一个唯一的 GTIDMySQL 会自动保证从库同步到主库的最新事务。在 GTID 复制模式下,不需要像传统的基于位置的复制一样关心 binlog 的位置(log_file  log_pos),MySQL 会自动管理。

配置验证

主库验证

show slave hosts;
select @@server_id,@@server_uuid;

image-20241105222930041

从库验证

show slave status \G;
SELECT user, host, grant_priv, Super_priv, password_last_changed  FROM mysql.user; 

image-20241105223307792

Master设置VIP

# 添加虚拟ip 192.168.242.99
ifconfig ens33:1 192.168.242.99
# 查看ip
ifconfig

image-20241105224759559

安装MHA

源码包安装

源码node地址:https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

源码manage地址:https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

image-20241105231332637

所有节点服务器都装node(manager依赖node运行)

# 即所有主从,不包含独立监控机,如果监控在主机,那么主机两个都装
# 安装编译需要的依赖
yum install -y perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN
# 解压MHA—node安装包
tar -zxf /home/hadoop/mha4mysql-node-0.58.tar.gz -C /usr/local/
# cd进安装目录
cd /usr/local/mha4mysql-node-0.58
# 编译安装
perl Makefile.PL
make
make install

manager安装

# 只有监控机安装
# 特别注意一定要看看安装是否有失败的,一定不能有失败的
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Mail-Sender -y
# 解压MHA-manager包
tar -zxf /home/hadoop/mha4mysql-manager-0.58.tar.gz -C /usr/local/
# 进入安装目录
cd /usr/local/mha4mysql-manager-0.58/
# 编译安装
perl Makefile.PL
make
make install

manager配置

vi /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_failover

my $vip='192.168.242.99/24'; #配置一个闲置网段(虚拟ip网段)
my $key='1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 192.168.242.99";


————————————!!!注意——————————————
# 此文件中 FIXME_xxx; 需要注释,否则会报错

配置MHA(监控机)

# 创建MHA软件所需目录
mkdir -p /usr/local/mha
mkdir -p /etc/mha

# 由于脚本中并没有master_ip_failover脚本,启动时会报错,到mha4mysqlmanager-0.5X/samples/scripts下拷贝对应脚本到指定位置。
cd /usr/local/mha/scripts
cp /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_* .

vi /etc/mha/mha.cnf

[server default]
manager_workdir=/usr/local/mha
manager_log=/usr/local/mha/manager_running.log
master_ip_failover_script=/usr/local/mha/scripts/master_ip_failover
master_ip_online_change_script=/usr/local/mha/scripts/master_ip_online_change
ping_interval=1
# 此句Slave01,Slave02为从机主机名
secondary_check_script=/usr/local/bin/masterha_secondary_check -s Slave01 -s Slave02 --user=root --master_host=MHA-Master --master_ip=192.168.242.44 --master_port=3306
shutdown_script=""
ssh_user=root  //基于ssh的密钥认证

user=root  //mha管理用户
password=123  //mha管理密码
repl_user=repl  //数据库用户名(你主库创建的复制账号)
repl_password=123  //数据库密码

[server1]
hostname=192.168.242.44
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.242.46
port=3306

[server3]
hostname=192.168.242.47
port=3306
masterha_check_status --conf=/etc/mha/mha.cnf

1.检查SSH情况
[root@MHA-Monitor ~]# masterha_check_ssh --conf=/etc/mha/mha.cnf
2.检查复制情况
[root@MHA-Monitor ~]# masterha_check_repl --conf=/etc/mha/mha.cnf
3.检查MHA状态
[root@MHA-Monitor /]# masterha_check_status --conf=/etc/mha/mha.cnf
4.启动MHA Manager
nohup masterha_manager --conf=/etc/mha/mha.cnf < /dev/null > /usr/local/mha/manager_start.log 2>&1
5.关闭MHA-manager(需要的时候再关闭)
[root@MHA-MES-Monitor-ip134 ~]# masterha_stop --conf=/etc/mha/mha.cnf

故障模拟

①停掉192.168.242.44的mysql进程

②此时后台开始故障转移

image-20241118212901206

# 解释,这句是因为原主节点只是mysql挂掉,并非机器宕机,因此虚拟ip不能转移,因为原主节点还占用着虚拟ip
Failed to activate master IP address for 192.168.242.46(192.168.242.46:3306) with return code 10:0

④观察新的主节点

image-20241118213321018

可以看到主节点成功故障转移

⑤查看从节点

image-20241118213343143

可以看到从节点已经成功切换新的主节点进行服务

Comments