mysql 主库高可用_数据库架构之【MySQL8+MHA】RDBMS 主从库高可用方案

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.集群部署拓扑图

5537841848bc

集群部署拓扑图

网络资源规划:

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系统提供大量的额外软件包。

5537841848bc

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系统提供大量的额外软件包。

5537841848bc

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

......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值