MySQL8 是一款功能强大且开源的(遵循GPL协议)关系型数据库管理系统(RDBMS)。
MHA(Master High Availability) 是一个成熟的 MySQL 高可用解决方案。作为 MySQL 高可用性环境下故障切换和主从提升的高可用中间件,在 MySQL 故障切换过程中,能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中能够最大程度上保证数据的一致性。它由两部分组成:
MHA Manager(管理节点):MHA Manager 可以部署在一台独立的服务器上,同时管理一个或多个 MySQL 主备集群;也可以部署一个 MySQL 主备集群的 Slave 节点上管理该集群 。
MHA Node(数据节点):MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测主备集群中的主库节点,当主库出现故障时,它可以自动将最新数据的从库提升为新的主库,然后将所有其他的从库重新指向新的主库。整个故障转移过程对应用程序完全透明。
MHA 主要支持一主多从的主备库架构,搭建 MHA,要求一个 MySQL 主备集群中必须最少有三台数据库服务器,一台充当主库,一台充当备用主库,另外一台充当从库。
在 MHA 自动故障切换过程中,MHA 试图从宕机的主库节点上保存二进制日志,最大程度的保证数据的不丢失,但如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,只进行故障转移而丢失了最新的数据。如果只有一个从库已经收到了最新的二进制日志,MHA 可以将最新的二进制日志应用于其他所有的从库服务器上,因此可以保证所有节点的数据一致性。
本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。部署数据库集群使用服务器及网络资源较多,建议在实施前做好规划工作,有利于部署工作顺利、有序进行。
目录
1.集群工作模式
2.集群部署拓扑图
3.MySQL8 + Replication 主备库部署方案
4.MHA 安装和配置
1.集群工作模式
集群具有故障转移功能,每个集群由≥3个数据库节点组成。
1、主要特点:
1)多个数据库节点并行工作。
2)主要数据库节点失效后,由从属数据库节点接管。
3)数据只通过主要数据库节点进行读写,主要数据库节点将通过内置的 Replication 组件,将数据复制到从属数据库节点。
2、故障转移工作原理:
1)从宕机崩溃的主库保存二进制日志事件(Binlog Events);
2)识别含有最近更新的从库;
3)应用最近更新的差异的中继日志 (Relay Log) 到其他从库;
4)应用从主库保存的二进制日志事件(Binlog Events);
5)提升一个从库为新主库;
6)将其他从库连接到新的主库上。
2.集群部署拓扑图
集群部署拓扑图网络资源规划:
1、MySQL 主备集群
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
主库 | Master | 192.168.0.20:3306 | MySQL8 | CentOS8 |
从库-1 | Slaver-1 | 192.168.0.21:3306 | MySQL8 | CentOS8 |
从库≥2 | Slaver-2 | 192.168.0.22:3306 | MySQL8 | CentOS8 |
2、MHA 管理端
- 主机名:MHA;
- IP地址和端口号:192.168.0.10;
- 中间件:MHA Manager;
- 虚拟IP:192.168.0.11。MHA Manager 创建的 VIP,客户端通过 VIP 访问 MySQL 数据库;
- 操作系统:CentOS7;
注意:目前 MHA Manager 仅支持 CentOS7 版本。
3、客户端:同一网段计算机,部署 HeidiSQL 或应用系统的调用程序模块。
3.MySQL8 + Replication 主备库部署方案
1、在 MySQL 主备集群的全部节点上安装 MySQL8 数据库。
有关如何安装 MySQL8 数据库,请阅读文章《RedHat/CentOS8【MySQL8】安装、配置和管理》,文章地址【https://www.jianshu.com/p/b68e2120a068】。
2、在 MySQL 主备集群上部署 MySQL 主从库。
有关如何部署 MySQL8 主备数据库,请阅读文章《数据库架构之【MySQL8+Replication】RDBMS 主从库读写分离方案》,文章地址【https://www.jianshu.com/p/af9d16ce00f9】。
4.MHA Node 安装和配置
以 "MySQL 主备集群" 中的 "主库" 为例:
1、安装 EPEL 的 Yum 源。
使用文本编辑器创建仓库配置文件:
[centos@Master ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
在文件中编写以下内容并保存:
[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
更新 Yum 源:
[centos@Master ~]$ sudo dnf clean all
[centos@Master ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 3.7 MB/s | 6.9 MB 00:01
元数据缓存已建立。
EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。
2、打开 MHA Node 下载页面【https://github.com/yoshinorim/mha4mysql-node/releases】,下载并安装 RPM 安装包到用户主目录中。
3、安装 MHA Node。
[centos@Master ~ ]$ sudo dnf localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm
程序安装目录是 "/usr/bin",安装程序:
安装程序 | 功能说明 |
---|---|
save_binary_logs | 保存和复制主库的二进制日志 |
apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的从库 |
filter_mysqlbinlog | 去除不必要的ROLLBACK事件(MHA已不再使用这个工具) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
4、创建 MHA 管理用户并加入到 "mysql" 组,设置登录口令。
[centos@Master ~ ]$ sudo useradd -G mysql mha
[centos@Master ~ ]$ sudo passwd mha
5、为 MHA 管理用户增加"/sbin/ipconfig"指令的管理员免密运行权限。
使用文本编辑器打开"/etc/sudoers"文件:
[centos@Master ~]$ sudo gedit /etc/sudoers
在文件尾部追加以下内容并保存:
mha ALL=NOPASSWD: /sbin/ifconfig
注意: "MySQL 主备集群" 中的所有数据库节点上全部需要按照以上步骤配置后,再进行后续配置。
6、为 MHA 管理用户创建本地和远程数据库节点的 SSH 互信。
1)生成本地节点秘钥文件:
[centos@Master ~]$ su mha
[mha@Master ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mha/.ssh/id_rsa):
Created directory '/home/mha/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mha/.ssh/id_rsa.
Your public key has been saved in /home/mha/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:mT2GpWyqAFIezVDcSIAdah5BtcctnOgjGaDRk1FUkdk mha@Master
......
2)创建本地及远程节点登录信息加密文件。注意所有节点都需要创建本地及远程节点登录信息加密文件:
[mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.20
[mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.21
[mha@Master ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.22
注意: "MySQL 主备集群" 中的所有数据库节点上全部需要按照以上步骤配置。
5.MHA Mnager 安装和配置
1、安装 EPEL 的 Yum 源。
使用文本编辑器创建仓库配置文件:
[centos@MHA ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
在文件中编写以下内容并保存:
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7
更新 Yum 源:
[centos@Master ~]$ sudo yum clean all
[centos@Master ~]$ sudo yum makecache
Loading mirror speeds from cached hostfile
epel | 4.7 kB 00:00
元数据缓存已建立
EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。
2、打开 MHA Manager 下载页面【https://github.com/yoshinorim/mha4mysql-manager/releases】,下载并安装 RPM 安装包和 TAR 包到用户主目录中。
3、安装 MHA Node 和 MHA Manager。
[centos@MHA ~ ]$ sudo yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[centos@MHA ~ ]$ sudo yum localinstall mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
程序安装目录是 "/usr/bin",安装程序:
安装程序 | 功能说明 |
---|---|
masterha_check_ssh | 检查 MHA 的 SSH 配置状况 |
masterha_check_repl | 检查 MySQL 复制状况 |
masterha_manger | 启动 MHA |
masterha_check_status | 检测当前 MHA 运行状态 |
masterha_master_monitor | 检测主库是否宕机 |
masterha_master_switch | 控制故障转移(自动或者手动) |
masterha_conf_host | 添加或删除配置的节点信息 |
save_binary_logs | 保存和复制主库的二进制日志 |
apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的从库 |
filter_mysqlbinlog | 去除不必要的ROLLBACK事件(MHA已不再使用这个工具) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
4、解压 MHA Manager 的 TAR 包。
[centos@MHA ~ ]$ tar -zxvf mha4mysql-manager-0.58.tar.gz
5、创建 MHA Manager 的配置目录、脚本目录。
[centos@MHA ~ ]$ sudo mkdir -p /etc/masterha
[centos@MHA ~ ]$ sudo mkdir -p /script/masterha
6、从 MHA Manager 的 TAR 包中配置文件模板拷贝到 "/etc/masterha" 目录下。
[centos@MHA ~ ]$ sudo cp ~/mha4mysql-manager-0.58/samples/conf/* /etc/masterha
[centos@MHA ~ ]$ sudo cp ~/mha4mysql-manager-0.58/samples/scripts/* /script/masterha
7、为 MHA Manager 程序管理用户(本例为 centos 用户)创建本地和远程数据库节点的 SSH 互信。
1)生成本地节点秘钥文件:
[centos@MHA ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/centos/.ssh/id_rsa.
Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZNkHt8/68enFM68bdcWSxGzV88xv3Bs9dtDLGF1IyNI centos@MHA
......
2)创建 MySQL 主备集群节点登录信息加密文件:
[mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.20
[mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.21
[mha@MHA ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub mha@192.168.0.22
8、创建工作目录,并将所有者授予 MHA Manager 程序管理用户(本例为 centos 用户)。
[centos@MHA ~ ]$ sudo mkdir -p /var/log/masterha/app1
[centos@MHA ~ ]$ sudo chown -R centos:centos /var/log/masterha
9、设置 MHA Manager 配置文件参数。
使用文本编辑器创建配置文件:
[centos@MHA ~ ]$ sudo gedit /etc/masterha/app1.cnf
编辑或验证文件中的以下参数并保存:
# 服务器通用参数。
[server default]
# 工作目录。
manager_workdir=/var/log/masterha/app1
# 日志目录。
manager_log=/var/log/masterha/app1/manager.log
# MySQL 管理用户账号。
user=root
# MySQL 管理用户口令。
password=password
# MySQL Replication 用户账号。
repl_user=repl
# MySQL Replication 用户口令。
repl_password=password
# SSH 远程控制端口号。
ssh_port=22
# SSH 远程控制用户账号。
ssh_user=mha
# 设置远端 MySQL 数据库保存 binlog 的位置。在 my.cnf 文件中使用 log-bin 参数设置,默认情况下在数据存储目录。
master_binlog_dir=/data/mysql/data
# 设置远端 MySQL 主库在发生切换时 binlog 的保存位置。
remote_workdir=/tmp
# 实现多路由监测备选主库的可用性。
secondary_check_script= masterha_secondary_check -s 192.168.0.20 -s 192.168.0.21
# 监控主库,设置发送 PING 包的时间间隔,默认是3秒,尝试3次不成功,则自动进行切换操作。
ping_interval=3
# 自动故障切换 VIP 时调用的脚本。(一般需要编辑该脚本实现 VIP 的漂移)
master_ip_failover_script= /script/masterha/master_ip_failover
# 人工切换 VIP 时调用的脚本。(可不指定)
# master_ip_online_change_script= /script/masterha/master_ip_online_change
# 设置故障发生后关闭故障主机时调用的脚本。(可不指定)
# shutdown_script= /script/masterha/power_manager
# 设置发生切换后发送的报警的脚本。(可不指定)
# report_script= /script/masterha/send_report
# MySQL节点配置-1
[server1]
# MySQL 实例的 IP或 DNS 。
hostname=192.168.0.20
# MySQL 实例的端口号。
port=3306
# 设置为 1 时,主库故障时,优先提升当前节点为新的主库。
candidate_master=1
# 默认情况下,如果当前从库落后主库 100M 的 relaylog 将不会提升当前从库作为一个新的主库,设置为 0 时,MHA触发切换时将会忽略复制延时,一般与 candidate_master=1 组合使用。
check_repl_delay=0
# MySQL节点配置-2
[server2]
hostname=192.168.0.21
# MySQL节点配置≥3
[server3]
hostname=192.168.0.22
# 设置为 1 时,不会提升当前节点为新的主库。
no_master=1
注意,MHA 管理端可以同时管理多个 MySQL 主备集群。每个集群需要配置单独的配置文件,如: "app1.cnf" 和 "app2.cnf" 。
10、编辑 MHA Manager 自动故障切换 VIP 时调用的脚本。
使用文本编辑器创建配置文件:
[centos@MHA ~ ]$ sudo gedit /script/masterha/master_ip_failover
编辑或验证文件中的以下参数并保存:
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.0.11/24';
my $key = '0';
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
`ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
11、在 MySQL 主库节点上初始化绑定 VIP 。
[centos@MHA ~ ]$ /script/masterha/master_ip_failover --command=start --new_master_host=192.168.0.20 --ssh_user=mha
12、检查 SSH 配置有效性。
[centos@MHA ~ ]$ masterha_check_ssh --conf=/etc/masterha/app1.cnf
13、检查 MySQL 配置有效性。
[centos@MHA ~ ]$ masterha_check_repl --conf=/etc/masterha/app1.cnf
14、启动 MHA Mnanger 。启动 MHA Manager 之前,应当保证在 MySQL 主备集群中的所有节点已准备就绪。
[centos@MHA ~ ]$ masterha_manager --conf=/etc/masterha/app1.cnf
或者后台运行
[centos@MHA ~ ]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf > /dev/null
注意:不建议设置为开机自启动。
15、检查 MySQL 配置有效性。
[centos@MHA ~ ]$ masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:3333) is running(0:PING_OK), master:192.168.0.20
16、手工切换主节点。
[centos@MHA ~ ]$ masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.0.21 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
5.MHA 故障恢复
1、查看新的主库节点配置信息。
[centos@Slaver-1 ~]$ mysql -u root -p
Enter password:
mysql>use mysql;
mysql>show master status\G;
# 响应信息。其中 "File" 和 "Position" 字段的数据值在配置从库节点时需要使用。
*************************** 1. row ***************************
File: binlog.000006
Position: 812
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
2、查看故障主库节点配置信息。
[centos@Master ~]$ mysql -u root -p
Enter password:
mysql>use mysql;
mysql>show master status\G;
# 响应信息。其中 "File" 和 "Position" 字段的数据值在配置从库节点时需要使用。
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 155
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
3、修改故障主库的配置文件,追加只读设置。
使用文本编辑器打开配置文件:
[centos@Master ~]$ sudo gedit /etc/my.cnf
追加或验证文件中的以下参数并保存:
# 表示开启超级用户(如 root 用户)的数据库只读模式。
super_read_only=on
# 表示开启普通用户的数据库只读模式。
read_only=on
4、重新启动故障主库。
[centos@Master ~]$ sudo systemctl restart mysqld.service
5、将故障主库降级为从库。
[centos@Master ~]$ mysql -u root -p
Enter password:
# 设置新主库的关联信息,注意"master_log_file"需要指定新主库的文件,"master_log_pos"需要指定故障主库的位置。
mysql>change master to master_host='192.168.0.21',master_port=3306,master_user='repl',master_password='password',master_log_file='binlog.000006',master_log_pos=155
# 启动从库同步。
mysql>start slave;
# 查看从库状态。
mysql>show slave status\G;
# 响应信息。正常情况下 "Slave_IO_Running" 和 "Slave_SQL_Running" 都应为 Yes 。
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.21
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000006
Read_Master_Log_Pos: 1205
Relay_Log_File: Master-relay-bin.000004
Relay_Log_Pos: 493
Relay_Master_Log_File: binlog.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
网友评论