MySQL数据库Mha高可用集群架构

目录

引言

一、MHA概念

1、什么是 MHA?

2、MHA 的组成

3、MHA 的特点

4、MHA工作原理

二、搭建 MySQL MHA

1、Master、Slave1、Slave2 节点上安装 mysql

2、修改 Master、Slave1、Slave2 节点的主机名

3、修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf

4、在 Master、Slave1、Slave2 节点上都创建两个软链接

5、配置MySQL一主两从

5.1 所有数据库节点进行 mysql 授权

5.2 在 Master 节点查看二进制文件和同步点

5.3 在 Slave1、Slave2 节点执行同步操作

5.4 Slave1、Slave2 节点设置为只读模式

5.5 验证主从同步

6、安装 MHA 软件

6.1 所有服务器上都安装 MHA 依赖的环境

6.2 安装MHA 软件包

6.3 在 MHA manager 节点上安装 manager 组件

7、在所有服务器上配置无密码认证

7.1 在 manager 节点上配置到所有数据库节点的无密码认证

7.2 在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证

7.3 在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证

7.4 在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证

8、在 manager 节点上配置 MHA

8.1 在 manager 节点上复制相关脚本到/usr/local/bin 目录

8.2 复制自动切换时 VIP 管理的脚本到 /usr/local/bin 目录

8.3 修改master_ip_failover脚本

8.4 创建 MHA 软件目录并复制配置文件

9、在Master服务器上手动开启vip

10、在 manager 节点上测试 ssh 无密码认证

11、在 manager 节点上测试 mysql 主从连接情况

12、在 manager 节点上启动 MHA

12.1 查看 MHA 状态,可以看到当前的 master

12.2 查看 MHA 日志,可以看到当前的 master

12.3关闭 manager 服务

三、故障模拟

引言

MySQL 服务器中,单台服务器无法承载服务量就配置多台MySQL服务器,多台 MySQL 服务器或者MySQL 服务器无冗余的情况下,配置主从复制。 MySQL服务器的读和写的压力不均衡可使用 MySQL 的读写分离,MySQL的读写分离中 Msater 存在单点故障,就得用到 MHA。

一、MHA概念

1、什么是 MHA?

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA 的出现就是解决MySQL 单点故障的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

2、MHA 的组成

2.1 MHA Node(数据节点)

MHA Node 运行在每台 MySQL 服务器上。

2.2 MHA Manager(管理节点)

MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。

MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave

提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。

整个故障转移过程对应用程序完全透明。

3、MHA 的特点

自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失

使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性

目前MHA支持一主多从架构,最少三台服务,即一主两从

MHA :为了解决的是故障切换、数据尽可能的保存,以及所有节点日志的一致性

4、MHA工作原理

MHA Manger管理多组主从复制。

MHA工作原理总结如下:

从宕机崩溃的master保存二进制日志事件(binlog events) ;

识别含有最新的更新slave日志

应用差异的中继旦志(relay log到其他的slave

应用从master保存的二进制日志事件

提升一个salve为新的master

使其他的slave连接行的master进行复制。

二、搭建 MySQL MHA

实验思路

MHA架构

数据库安装

一主两从

MHA搭建

故障模拟

主库失效

备选主库成为主库

原故障主库恢复重新加入到MHA成为从库

实验环境

主机       IP地址

MHA manager      192.168.239.128

Master            192.168.239.130

Slave1            192.168.239.129

Slave2            192.168.239.131

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

1、Master、Slave1、Slave2 节点上安装 mysql

netstat -natp | grep 3306

MySQL数据库Mha高可用集群架构_第1张图片

MySQL数据库Mha高可用集群架构_第2张图片

2、修改 Master、Slave1、Slave2 节点的主机名

hostnamectl set-hostname+【名称】

3、修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf

#Master 节点##

vim /etc/my.cnf

[mysqld]

server-id = 1

log_bin = master-bin

log-slave-updates = true

MySQL数据库Mha高可用集群架构_第3张图片

systemctl restart mysqld

##Slave1 节点##

vim /etc/my.cnf

server-id = 2                                           #三台服务器的 server-id 不能一样

log_bin = master-bin  #以防单点故障的时候切换

relay-log = relay-log-bin

relay-log-index = slave-relay-bin.index

MySQL数据库Mha高可用集群架构_第4张图片

systemctl restart mysqld

###Slave2 节点##

vim /etc/my.cnf

server-id = 3                                           #三台服务器的 server-id 不能一样

relay-log = relay-log-bin

relay-log-index = slave-relay-bin.index

MySQL数据库Mha高可用集群架构_第5张图片

systemctl restart mysqld

4、在 Master、Slave1、Slave2 节点上都创建两个软链接

将mysql命令和日志软链接到/usr/sbin,便于系统识别

ln -s /usr/local/mysql/bin/mysql /usr/sbin/

ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

MySQL数据库Mha高可用集群架构_第6张图片

MySQL数据库Mha高可用集群架构_第7张图片

MySQL数据库Mha高可用集群架构_第8张图片

5、配置MySQL一主两从

5.1 所有数据库节点进行 mysql 授权

mysql -uroot -p

grant replication slave on *.* to 'myslave'@'192.168.239.%' identified by '123456';       

#从数据库同步使用

grant all privileges on *.* to 'mha'@'192.168.239.%' identified by 'manager';             

#manager 使用

grant all privileges on *.* to 'mha'@'master' identified by 'manager';                       

#防止从库通过主机名连接不上主库

grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';

grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';

flush privileges;

MySQL数据库Mha高可用集群架构_第9张图片

MySQL数据库Mha高可用集群架构_第10张图片

MySQL数据库Mha高可用集群架构_第11张图片

5.2 在 Master 节点查看二进制文件和同步点

show master status;

MySQL数据库Mha高可用集群架构_第12张图片

5.3 在 Slave1、Slave2 节点执行同步操作

change master to master_host='192.168.239.130',master_user='myslave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=1747;

MySQL数据库Mha高可用集群架构_第13张图片

MySQL数据库Mha高可用集群架构_第14张图片

MySQL数据库Mha高可用集群架构_第15张图片

MySQL数据库Mha高可用集群架构_第16张图片

start slave;

5.4 Slave1、Slave2 节点设置为只读模式

slave1

MySQL数据库Mha高可用集群架构_第17张图片

slave2

MySQL数据库Mha高可用集群架构_第18张图片

5.5 验证主从同步

在 Master 主库插入条数据,测试是否同步

master:

MySQL数据库Mha高可用集群架构_第19张图片

MySQL数据库Mha高可用集群架构_第20张图片

MySQL数据库Mha高可用集群架构_第21张图片

MySQL数据库Mha高可用集群架构_第22张图片

6、安装 MHA 软件

6.1 所有服务器上都安装 MHA 依赖的环境

yum install epel-release --nogpgcheck -y

yum install -y perl-DBD-MySQL \

perl-Config-Tiny \

perl-Log-Dispatch \

perl-Parallel-ForkManager \

perl-ExtUtils-CBuilder \

perl-ExtUtils-MakeMaker \

perl-CPAN

MySQL数据库Mha高可用集群架构_第23张图片

MySQL数据库Mha高可用集群架构_第24张图片

MySQL数据库Mha高可用集群架构_第25张图片

6.2 安装MHA 软件包

在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

cd /opt

tar zxvf mha4mysql-node-0.57.tar.gz

cd mha4mysql-node-0.57

perl Makefile.PL

make && make install

MySQL数据库Mha高可用集群架构_第26张图片

MySQL数据库Mha高可用集群架构_第27张图片

MySQL数据库Mha高可用集群架构_第28张图片

6.3 在 MHA manager 节点上安装 manager 组件

cd /opt

tar zxvf mha4mysql-manager-0.57.tar.gz

cd mha4mysql-manager-0.57

perl Makefile.PL

make && make install

MySQL数据库Mha高可用集群架构_第29张图片

MySQL数据库Mha高可用集群架构_第30张图片

manager组件安装后在/usr/local/bin下面会生成几个工具

主要包括以下几个:

masterha_check_ssh    检查 MHA 的 SSH 配置状况

masterha_check_repl   检查 MySQL 复制状况

masterha_manger 启动 manager的脚本

masterha_check_status 检测当前 MHA 运行状态

masterha_master_monitor   检测 master 是否宕机

masterha_master_switch     控制故障转移(自动或者手动)

masterha_conf_host     添加或删除配置的 server 信息

masterha_stop      关闭manager

扩展:node组件安装后也会在/usr/local/bin 下面会生成几个脚本

这些工具通常由 MHAManager 的脚本触发,无需人为操作,主要如下:

save_binary_logs   保存和复制 master 的二进制日志

apply_diff_relay_logs    识别差异的中继日志事件并将其差异的事件应用于其他的 slave

filter_mysqlbinlog 去除不必要的 ROLLBACK 事件

MySQL数据库Mha高可用集群架构_第31张图片

7、在所有服务器上配置无密码认证

7.1 在 manager 节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa                             #一路按回车键

ssh-copy-id 192.168.239.130     #master

ssh-copy-id 192.168.239.129     #slave1

ssh-copy-id 192.168.239.131     #slave2

MySQL数据库Mha高可用集群架构_第32张图片

MySQL数据库Mha高可用集群架构_第33张图片

MySQL数据库Mha高可用集群架构_第34张图片

MySQL数据库Mha高可用集群架构_第35张图片

7.2 在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证

ssh-keygen -t rsa

ssh-copy-id 192.168.239.129

ssh-copy-id 192.168.239.131

MySQL数据库Mha高可用集群架构_第36张图片

MySQL数据库Mha高可用集群架构_第37张图片

MySQL数据库Mha高可用集群架构_第38张图片

7.3 在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证

ssh-keygen -t rsa

ssh-copy-id 192.168.239.130

ssh-copy-id 192.168.239.131

MySQL数据库Mha高可用集群架构_第39张图片

MySQL数据库Mha高可用集群架构_第40张图片

MySQL数据库Mha高可用集群架构_第41张图片

7.4 在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证

ssh-keygen -t rsa

ssh-copy-id 192.168.239.130

ssh-copy-id 192.168.239.129

MySQL数据库Mha高可用集群架构_第42张图片

MySQL数据库Mha高可用集群架构_第43张图片

MySQL数据库Mha高可用集群架构_第44张图片

8、在 manager 节点上配置 MHA

8.1 在 manager 节点上复制相关脚本到/usr/local/bin 目录

ll /usr/local/bin/scripts/

MySQL数据库Mha高可用集群架构_第45张图片

master_ip_failover 自动切换时 VIP 管理的脚本

master_ip_online_change    在线切换时 vip 的管理

power_manager   故障发生后关闭主机的脚本

send_report   因故障切换后发送报警的脚本

8.2 复制自动切换时 VIP 管理的脚本到 /usr/local/bin 目录

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

MySQL数据库Mha高可用集群架构_第46张图片

8.3 修改master_ip_failover脚本

vim /usr/local/bin/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.239.100';                                                              #指定vip的地址

my $brdc = '192.168.239.255';                                                     #指定vip的广播地址

my $ifdev = 'ens33';                                                                    #指定vip绑定的网卡

my $key = '1';                                                                             #指定vip绑定的虚拟网卡序列号

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";            #代表此变量值为ifconfig ens33:1 192.168.109.100

my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";          #代表此变量值为ifconfig ens33:1 192.168.10.100 down

my $exit_code = 0;                                                                             #指定退出状态码为0

#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";

#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";

##################################################################################

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 {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

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 $ssh_user\@$new_master_host \" $ssh_start_vip \"`;

}

## A simple system call that disable the VIP on the old_master

sub stop_vip() {

`ssh $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";

}

MySQL数据库Mha高可用集群架构_第47张图片

8.4 创建 MHA 软件目录并复制配置文件

使用app1.cnf配置文件来管理 mysql 节点服务器,配置文件一般放在/etc/目录下

mkdir /etc/masterha

cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha

MySQL数据库Mha高可用集群架构_第48张图片

vim /etc/masterha/app1.cnf                            #删除原有内容,直接复制并修改节点服务器的IP地址

[server default]

manager_log=/var/log/masterha/app1/manager.log

manager_workdir=/var/log/masterha/app1

master_binlog_dir=/usr/local/mysql/data

master_ip_failover_script=/usr/local/bin/master_ip_failover

master_ip_online_change_script=/usr/local/bin/master_ip_online_change

password=manager

ping_interval=1

remote_workdir=/tmp

repl_password=123456

repl_user=myslave

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.239.129 -s 192.168.239.131

shutdown_script=""

ssh_user=root

user=mha

[server1]

hostname=192.168.239.130

port=3306

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.239.129

port=3306

[server3]

hostname=192.168.239.131

port=3306

9、在Master服务器上手动开启vip

ifconfig ens33:1 192.168.109.100/24

ifconfig

MySQL数据库Mha高可用集群架构_第49张图片

10、在 manager 节点上测试 ssh 无密码认证

如果正常最后会输出 successfully,如下所示。

masterha_check_ssh -conf=/etc/masterha/app1.cnf

MySQL数据库Mha高可用集群架构_第50张图片

11、在 manager 节点上测试 mysql 主从连接情况

最后出现 MySQL Replication Health is OK 字样说明正常。

MySQL数据库Mha高可用集群架构_第51张图片

12、在 manager 节点上启动 MHA

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

MySQL数据库Mha高可用集群架构_第52张图片

12.1 查看 MHA 状态,可以看到当前的 master

MySQL数据库Mha高可用集群架构_第53张图片

12.2 查看 MHA 日志,可以看到当前的 master

cat /var/log/masterha/app1/manager.log | grep "current master"

12.3关闭 manager 服务

masterha_stop --conf=/etc/masterha/app1.cnf

或者可以直接采用 kill 进程 ID 的方式关闭

三、故障模拟

1、在 manager 节点上监控观察日志记录

tail -f /var/log/masterha/app1/manager.log

MySQL数据库Mha高可用集群架构_第54张图片

2、模拟master节点故障关闭服务

正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。

MySQL数据库Mha高可用集群架构_第55张图片

3、查看manager节点动态日志

4、故障切换备选主库的算法

一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。

数据一致的情况下,按照配置文件顺序,选择备选主库。

设定有权重(candidate_master=1),按照权重强制指定备选主。

默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。

如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。

四、故障修复

1.systemctl restart mysqld

2、修复主从

mysql -u root -p

show master status;

MySQL数据库Mha高可用集群架构_第56张图片

change master to master_host='192.168.239.129',master_user='myslave',master_password='123456',master_log_file='master-bin.000006',master_log_pos=154;

start slave;

show slave status\G

MySQL数据库Mha高可用集群架构_第57张图片

3、在 manager 节点上修改配置文件app1.cnf

再把这个记录添加进去,因为它检测掉失效时候会自动消失

vim /etc/masterha/app1.cnf                            #删除原有内容,直接复制并修改节点服务器的IP地址

[server default]

manager_log=/var/log/masterha/app1/manager.log

manager_workdir=/var/log/masterha/app1

master_binlog_dir=/usr/local/mysql/data

master_ip_failover_script=/usr/local/bin/master_ip_failover

master_ip_online_change_script=/usr/local/bin/master_ip_online_change

password=manager

ping_interval=1

remote_workdir=/tmp

repl_password=123456

repl_user=myslave

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.109.12 -s 192.168.109.14

shutdown_script=""

ssh_user=root

user=mha

[server1]

hostname=192.168.109.13

port=3306

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.109.12

port=3306

[server3]

hostname=192.168.109.14

port=3306

下图是master主机down掉后文件产生的变化

MySQL数据库Mha高可用集群架构_第58张图片

对其进行修改

MySQL数据库Mha高可用集群架构_第59张图片

4、在 manager 节点上启动 MHA

masterha_stop --conf=/etc/masterha/app1.cnf

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

masterha_check_status --conf=/etc/masterha/app1.cnf

你可能感兴趣的:(Linux,服务器,mysql,数据库)