一、MHA集群架构说明
1.1、MHA简介
|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是作为MySQL高可用性环境下故障切换和主从同步的一套优秀高可用软件,采用 Perl 语言开发。 MHA能在MySQL故障切换过程中,做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 ||
| 序号 | 说明 |
| 1 | MHA由两部分组成【MHA Manager(管理节点)】【MHA Node(数据节点)】: 《1》MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。 《2》MHA Node运行在每台MySQL服务器上; 《3》MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。 |
| 2 | 在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。(如:如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据)。 使用MySQL的半同步复制,可以大大降低数据丢失的风险;MHA可以与半同步复制结合起来(如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性)。 |
| 3 | 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。 |
| MHA官网 ||
[MHA简介]
1.2、MHA架构

1.3、MHA的组成
|--------|-----------------------------|--------------------------------|
| MHA由两部分组成【MHA Manager(管理节点)】【MHA Node(数据节点)】 |||
| MHA Manager(管理节点)工具包内容 |||
| 序号 | MHA Manager工具包内容 | 说明 |
| 1 | masterha_check_ssh | 检查MHA的SSH配置状况 |
| 2 | masterha_check_repl | 检查MySQL复制状况 |
| 3 | masterha_manger | 启动MHA |
| 4 | masterha_check_status | 检测当前MHA运行状态 |
| 5 | masterha_master_monitor | 检测master是否宕机 |
| 6 | masterha_master_switch | 控制故障转移(自动或者手动) |
| 7 | masterha_conf_host | 添加或删除配置的server信息 |
| |||
| MHA Node(数据节点)工具包内容(通常由MHA Manager的脚本触发,无需人为操作) |||
| 序号 | MHA Node工具包内容 | 说明 |
| 1 | save_binary_logs | 保存和复制master的二进制日志 |
| 2 | apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的slave |
| 3 | purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
[MHA的组成]
1.4、MHA基础集群架构
MHA集群架构中Master对外提供写服务,备选master(实际的Slave,主机名41server)提供读服务,42server也提供相关的读服务,一旦Master宕机,MHA将会把备选Master提升为新的Master,Slave节点42server也会自动修改复制地址为新的Master地址。

1.5、MySQL的MHA高可用集群环境
|----------------|--------------|----------|---------------|--------|
| 《1》采用四台物理机或虚拟机,都使用OpenEuler2203LTS或(RHEL9/Almalinux9.1)及其更高系统。 《2》采用MySQL版本为:8.0.43。。 《3》MHA的版本为:0.58及其更高版本。 |||||
| 角色 | IP规划 | 主机名称 | Server_id | 类型 |
| Master | 192.168.1.40 | 40server | 1 | 写入 |
| Slave/备选Master | 192.168.1.41 | 41server | 2 | 读 |
| Slave | 192.168.1.42 | 42server | 3 | 读 |
| MHAManager | 192.168.1.10 | 10server | 无 | 监控复制组 |
[MySQL的MHA高可用集群环境]
Linux的全新网络管理命令行工具------nmcli-CSDN博客https://coffeemilk.blog.csdn.net/article/details/148851886
bash
#修改Linux主机名称命令【hostnamectl set-hostname 需修改为的主机名称】
#1-修改192.168.1.10服务器主机名称为10server
hostnamectl set-hostname 10server
host
reboot

二、MySQL的MHA高可用集群实操流程
2.1、实现MySQL服务器的ssh无密码登录
《1》在安装MySQL服务器上配置的免密登录流程
bash
#实现安装MySQL服务器的ssh免密码登录实操步骤
#1-在任意一台服务器上生成密钥对(其中ck@163.com是邮箱地址,可根据自己需要自定义内容,这有助于标识密钥的用途或拥有者)
ssh-keygen -t ed25519 -C "ck@163.com"
cd /root/.ssh
#2-将生成的公有密钥【/root/.ssh/id_ed25519.pub】生成到需免密登录的服务器上(包括生成密钥对的服务器也要生成)
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.40
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.41
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.42
#3-验证ssh免密登录是否成功
ssh -p 22222 192.168.1.40
ssh -p 22222 192.168.1.41
ssh -p 22222 192.168.1.42
#4-#登录到服务器后查看当前是哪个用户及其当前服务器的信息
whoami
hostnamectl
exit
需要这三台MySQL的Linux服务器上都执行ssh免密登录的操作;可实现在每台服务器上都可以免密登录其他的服务器。
《2》在Manager节点服务器执行的免密登录操作
主要实现【MHA Manager】节点服务器可以免密码登录到所有MySQL的服务器,详细操作如下:
bash
#实现安装【MHA Manager】节点服务器(192.168.1.10)的ssh免密码登录实操步骤
#1-在安装【MHA Manager】服务器上生成密钥对(其中ck@163.com是邮箱地址,可根据自己需要自定义内容,这有助于标识密钥的用途或拥有者)
ssh-keygen -t ed25519 -C "ck@163.com"
cd /root/.ssh
#2-将生成的公有密钥【/root/.ssh/id_ed25519.pub】生成到需免密登录的服务器上(包括生成密钥对的服务器也要生成)
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.40
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.41
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.42
#3-验证ssh免密登录是否成功
ssh -p 22222 192.168.1.40
ssh -p 22222 192.168.1.41
ssh -p 22222 192.168.1.42
#4-#登录到服务器后查看当前是哪个用户及其当前服务器的信息
whoami
hostnamectl
exit
2.2、安装MySQL8.0.43及主从复制环境配置
2.2.1、安装MySQL8.0.43数据库
全网最全的关系型数据库MySQL解析及其安装部署的保姆级教程https://coffeemilk.blog.csdn.net/article/details/151891095
进入Mysql的社区版(Community Server)下载界面选择对应的版本-->【Linux Generic】-->【选择CPU架构(如:x86)】后即可选择第一个Mysql压缩过的二进制包下载。
bash
#使用MySQL二进制包安装的详细实操流程
#1-下载MySQL二进制安装包并解压
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.43-linux-glibc2.28-x86_64.tar.xz -c 0 -P /data
mkdir -p /usr/local/mysql
cd /data
tar -xvf mysql-8.0.43-linux-glibc2.28-x86_64.tar.xz -C /usr/local/mysql/
#2-进入mysql的安装目录修改名称
cd /usr/local/mysql/
mv mysql-8.0.43-linux-glibc2.28-x86_64 mysql-8.0.43
#3-创建mysql用户且给mysql二进制文件所在目录【/usr/local/mysql/mysql-8.0.43/】创建data、etc、logs文件夹
useradd mysql
id mysql
cd mysql-8.0.43/
mkdir -p /usr/local/mysql/mysql-8.0.43/{data,etc,logs}
cd etc
#4-进入【/usr/local/mysql/mysql-8.0.43/etc】下创建并编辑mysql的配置文件my.cnf及其配置里面的内容
cd /usr/local/mysql/mysql-8.0.43/etc
vi my.cnf
[mysqld]
#指定mysql的数据存放路径
datadir=/usr/local/mysql/mysql-8.0.43/data
socket=/tmp/mysql.sock
#指定mysql的报错日志文件
log-error=/usr/local/mysql/mysql-8.0.43/logs/mysqld-error.log
pid-file=/usr/local/mysql/mysql-8.0.43/logs/mysqld.pid
port=13336
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
#默认时区(东八区)
default-time-zone='+8:00'
#数据库日志时间匹配系统时区
log_timestamps=system
#表名和字段名不区分大小写
lower_case_table_names=1
#5-将mysql文件夹及其内容都授权给mysql用户并初始化(注意:初始化后没有任何信息提示表示初始化成功,否则就是有问题的)
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/mysql-8.0.43/bin/mysqld --defaults-file=/usr/local/mysql/mysql-8.0.43/etc/my.cnf --initialize --user=mysql
#6-查看日志文件获取临时密码(复制一份临时密码用于登录和修改密码)
cd /usr/local/mysql/mysql-8.0.43/logs/
tail -f mysqld-error.log
#7-手动启用mysql服务测试(如可以指定默认的配置文件【 --defaults-file=/usr/local/mysql/mysql-8.0.43/etc/my.cnf】)【查看mysql的进程、网络端口内容(查看到对应的mysql进程与网络端口与我们配置的一致表示正常;然后使用临时密码登录到mysql服务器中修改root用户密码;最后确认正常后即可杀死该进程)】
/usr/local/mysql/mysql-8.0.43/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.0.43/etc/my.cnf
ps -ef | grep mysql
netstat -antlp | grep mysql
/usr/local/mysql/mysql-8.0.43/bin/mysql -uroot -p'临时密码'
alter user 'root'@'localhost' identified by 'abc123456';
flush privileges;
#8-配置mysql的服务
vi /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server 8.0.43
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/mysql-8.0.43/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.0.43/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
#9-启动mysql服务并设置开机自启
#9.1-重载所有服务
systemctl daemon-reload
#9.2-启动mysql服务
systemctl start mysqld.service
#9.3-查看mysql服务状态
systemctl status mysqld.service
#9.4-设置mysql服务开机自启
systemctl enable mysqld.service
#9.5-停止mysql服务
systemctl stop mysqld.service
#10-可以重启Linux后查看mysql服务状态看它是否开机重启
reboot now
systemctl status mysqld.service
2.2.2、MySQL的主从复制环境配置
关系数据库MySQL的常用基础命令详解实战https://coffeemilk.blog.csdn.net/article/details/151959864
bash
#一、在3个MySQL的配置文件【my.cnf】中添加如下内容(注意:Master节点的【server-id=1】、备用Master节点的【server-id=2】另外一个Slave节点的【server-id=3】)
#1.1-进入MySQL的配置文件路径
cd /usr/local/mysql/mysql-8.0.43/etc/
#1.2-编辑MySQL的配置文件【my.cnf】
vi my.cnf
#如下是MHA架构的MySQL多节点主从架构配置参数【注意:每个MySQL节点上的server_id必须唯一,不能相同,其余内容保持不变】
gtid_mode=ON
enforce_gtid_consistency=ON
server-id = 1
read-only=1
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
#1.3-分别重启3个Mysql
systemctl restart mysqld.service
systemctl status mysqld.service
#二、分别在3个MySQL节点做授权配置【Mysql-8.0.X版本执行的命令】
#2.1-分别登录3个MySQL创建主从复制用户和授权
/usr/local/mysql/mysql-8.0.43/bin/mysql -uroot -p
create user 'repl_user'@'192.168.1.%' identified by 'repl_passwd';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.1.%';
update mysql.user set host='192.168.1.%' where user='root' and host='localhost';
FLUSH PRIVILEGES;
select user,host from mysql.user;
exit;
#2.2-重新登录3个MySQL并开启主从同步【首先查看MySQL的Master节点状态】【然后在其他的slave节点执行同步操作】
/usr/local/mysql/mysql-8.0.43/bin/mysql -h 192.168.1.40 -P 13336 -uroot -p
#2.3-首先查看MySQL的Master节点状态(192.168.1.40)并且将master节点对应的binlog日志文件名和编号,并记录下来(如:我们这里是【mysql-bin.000016】【237】)
show master status;
#2.4-在另外两个slave节点(192.168.1.41、192.168.1.42)执行如下命令进行同步操作【最终只有(Replica_IO_Running与Replica_SQL_Running的值都是Yes才表示主从同步成功,否则就是失败的,需要根据具体的报错信息进行排查)】:
change replication source to source_host='192.168.1.40',source_port=13336,source_user='repl_user',source_password='repl_passwd',source_log_file='mysql-bin.000016',source_log_pos=237,get_source_public_key=1;
start replica;
show replica status\G;
#2.4.1-在【Mysql5.X版本】执行的命令如下:
grant replication slave on *.* to 'repl_user'@'192.168.1.%' identified by 'repl_passwd';
grant all on *.* to 'root'@'192.168.1.%' identified by 'abc123456';
show master status;
change master to master_host='192.168.1.40',master_port=13336,master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000016',master_log_pos=237,get_source_public_key=1;
start slave;
show slave status\G;
三、若MySQL是安装在【/usr/local/mysql/mysql-8.0.43】路径下,还需要设置软链接为全局可用(每台MySQL服务器上都需要设置)
ln -s /usr/local/mysql/mysql-8.0.43/bin/* /usr/bin/
ll /usr/bin/mysql*








**注意:**若在slave节点上执行【start replica】命令后报错"ERROR 1872 (HY000): Replica failed to initialize applier metadata structure from the repository";则需要重置一下replica(即执行【reset replica】命令即可)。



三、MHA的安装
mha4mysql-managerhttps://github.com/yoshinorim/mha4mysql-managermha4mysql-node
https://github.com/yoshinorim/mha4mysql-node
|--------|---------------------------------------|
| 序号 | MHA的安装流程说明 |
| 1 | 在三个MySQL节点服务器上都安装【mha4mysql-node】 |
| 2 | 只在MHA的Manager节点上安装【mha4mysql-manager】 |
[MHA的安装流程]
bash
#使用rpm包的方式安装MHA的0.58版本实操流程
#1-在三个MySQL节点服务器上都安装【mha4mysql-node】
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -c 0 -P /data
cd /data
yum install perl-DBD-mysql -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#2-只在MHA的Manager节点上安装【mha4mysql-manager】
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -c 0 -P /data
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm -c 0 -P /data
cd /data
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles perl-Time-HiRes -y --nogpgcheck
《1》在三个MySQL节点服务器(192.168.1.40、192.168.1.41、192.168.1.42)上都安装【mha4mysql-node】详细操作如下图所示:

《2》在MHA的Manager节点上安装【mha4mysql-manager】详细操作如下图所示:


