Mariadb高可用(四十)

目录

一、概述

(一)概念

(二)组成

(三)特点

(四)工作原理

二、实验要求

三、构建MHA

(一)ssh免密登录

(二)安装mariadb数据库并启动

[1、配置 master 机器](#1、配置 master 机器)

[2、配置 slave1 机器](#2、配置 slave1 机器)

[3、配置 slave2 机器](#3、配置 slave2 机器)

4、分别重启服务和设置开机自启

5、分别赋予权限

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

6.2、停止从库

6.3、进行数据同步

(三)MHA安装

(四)停用master的mariadb服务

(五)故障恢复


一、概述

(一)概念

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

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

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

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

(二)组成

MHA manager 管理节点

MHA node 数据节点,每个节点上都需要安装

(三)特点

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

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

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

(四)工作原理

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

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

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

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

提升一个slave为新的master

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

二、实验

(一)实验介绍

1、实验环境

manager、monitor、master和slave

|-------------------|-------------------|--------------------|
| IP地址 | 搭建 | 主机名 |
| 192.168.11.111/24 | manager节点 monitor | mgt( managerment ) |
| 192.168.11.112/24 | node节点 master | master |
| 192.168.11.113/24 | node节点 slave | slave1 |
| 192.168.11.114/24 | node节点 slave | slave2 |

2、实验拓补图

3、实验介绍

本实验要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。

4、配置过程

4.1、配置 MySQL 一主两从

4.2、安装 MHA 软件

4.3、配置无密码认证

4.4、配置 MySQL MHA 高可用

4.5、模拟 master 故障切换

(二)实验基础配置

关闭防火墙、关闭SELinux、关闭图形化网络、配置静态IP地址

1、配置各台主机的主机名

hostnamectl set-hostname mgt

hostnamectl set-hostname master

hostnamectl set-hostname slave1

hostnamectl set-hostname slave2

2、刷新主机命令

bash

3、分别为四台虚拟机添加本地缓存

vim /etc/hosts

内容:

192.168.11.111 mgt
192.168.11.112 master
192.168.11.113 slave1
192.168.11.114 slave2
scp /etc/hosts 192.168.11.113:/etc/

scp /etc/hosts 192.168.11.113:/etc/

scp /etc/hosts 192.168.11.114:/etc/

三、构建MHA

(一)ssh免密登录

mgt 端 192.168.11.111 需进行的操作

ssh-keygen
ssh-copy-id mgt

查看是否创建成功

注:余下三台机器均将生成密钥对上传至192.168.11.111服务端上,而后进行密钥文件回传,保证互为免密登录

master端 192.168.11.112 需进行的操作

ssh-keygen

ssh-copy-id mgt

slave1 端 192.168.11.113 需进行的操作

ssh-keygen

ssh-copy-id mgt

slave2 端 192.168.11.114 需进行的操作

ssh-keygen

ssh-copy-id mgt

此时我们去IP地址为111的服务端查看密钥对是否接收到

将生成的密钥文件分别在四台机器上进行一次互传

for i in 2 3 4;do scp /root/.ssh/authorized_keys  root@192.168.11.11$i:/root/.ssh/;done

注:此时需要在四台主机上分别进行一次免密登录,从而避免后续使用脚本时发生故障问题。(包括自己本身也需进行一次免密登录)

这里演示一台机器,其余机器同理

(二)安装mariadb数据库并启动

yum install -y mariadb mariadb-server

启动服务

systemctl start mariadb

配置流程

1、配置 master 机器

vim /etc/my.cnf

插入内容:

server-id = 20
log-bin = master-bin
log-slave-updates = true

2、配置 slave1 机器

vim /etc/my.cnf

插入内容:

server-id=30
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

3、配置 slave2 机器

vim /etc/my.cnf

插入内容:

server-id=40
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

4、分别重启服务和设置开机自启

systemctl restart mariadb
systemctl enable mariadb

5、分别赋予权限

master端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

注:本来只需赋予第一条命令即可使用,为了防止出现异常,指定后续三个ip段。

slave1端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

slave2端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

mysql

6.2、停止从库

stop slave;
exit

6.3、进行数据同步

主库查看文件编号,pos值

mysql -e "show master status;"

从库输入命令:(两个从库都是一样的)

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1159;"

分别进入两个从库启动slave

mysql

进入MySQL数据库

start slave;

启动从服务

show slave status\G;
exit

查看状态

主库创建数据库,从库进行查看

mysql -e "create database zn;"

从:(两个从数据库都是一样的命令,在此不过多追述)

mysql -e "show databases;"

此时基本的主从复制已经搭建完成

(三)MHA安装

所有节点安装perl环境(使用此命令两次,升级到最新的epel源)

yum install -y epel-release

下载后续使用安装包缺失的依赖

yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN

node节点

node节点是计算机网络中的一个设备或主机

所有节点安装node

tar xf mha4mysql-node-0.57.tar.gz 
cd mha4mysql-node-0.57/
perl Makefile.PL && make && make install

在一台机器上远程将tar包传给其余三台机器

for i in master slave1 slave2;do scp mha4mysql-node-0.57.tar.gz $i:/root/;done

步骤同上,进行安装

验证:看到脚本就OK

cd /usr/local/bin
ls

manager

tar xf mha4mysql-manager-0.57.tar.gz
cd /root/mha4mysql-manager-0.57
perl Makefile.PL && make && make install
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_failover /usr/local/bin/
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change /usr/local/bin/

脚本说明

cd /root/mha4mysql-manager-0.57/samples/scripts

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

master_ip_online_change 在线切换时 vip 的管理

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

send_report 因故障切换后发送报警的脚本
注:master_ip_failover安装包自带的配置文件有问题,脚本没有写全,需重新进行编辑

这里使用以下命令将其备份

mv master_ip_failover master_ip_failover_bak

然后创建新的文件,并赋予权限

vim 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.11.100';								#指定vip的地址
my $brdc = '192.168.11.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.11.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.11.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";
}

赋予权限:

chmod 755 master_ip_failover
ll

创建配置文件

mkdir /etc/masterha
vim /etc/masterha/app1.cnf

[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123123
ping_interval=1
remote_workdir=/tmp
repl_password=123123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.11.113 -s 192.168.11.114
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.11.112
port=3306

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

[server3]
hostname=192.168.11.114
port=3306

文件内容解析:

  • manager_log:MHA管理器的日志文件路径。
  • manager_workdir:MHA管理器的工作目录。
  • master_binlog_dir:MySQL主服务器的二进制日志目录。
  • master_ip_failover_script:用于执行IP故障切换的脚本路径。
  • master_ip_online_change_script:用于执行在线IP更改的脚本路径。
  • password:MySQL的密码。
  • ping_interval:MHA管理器检测服务器存活状态的时间间隔。
  • remote_workdir:远程主机的工作目录。
  • repl_password:复制用户的密码。
  • repl_user:复制用户的用户名。
  • secondary_check_script:用于检查从服务器的脚本路径。
  • shutdown_script:关机时执行的脚本路径。
  • ssh_user:用于通过SSH连接到服务器的用户名。
  • user:MHA管理器的用户名。

接下来是每个服务器的具体配置:

  • server1:主服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

  • server2:备选主服务器的配置。

  • candidate_master:指示该服务器是否可以成为主服务器的标志。1表示是,0表示否。

  • check_repl_delay:检查复制延迟的时间(以秒为单位)。

  • server3:从服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

mkdir /var/log/masterha/app1 -p

测试MHA

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

显示ok即为成功,没有错误

masterha_check_repl --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 &

命令解析:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| * nohup: 这是一个命令,用于在后台运行指定的命令,并忽略挂起信号。这意味着即使关闭终端也不会停止该进程。 * masterha_manager: 这是要运行的命令或可执行文件的名称,即masterha_manager。 * --conf=/etc/masterha/app1.cnf: 这是指定masterha_manager的配置文件路径和名称。 * --remove_dead_master_conf: 这是masterha_manager的一个选项,用于在故障转移后自动删除已死亡主节点的配置。 * --ignore_last_failover: 这是masterha_manager的一个选项,用于忽略最后一次故障转移。 * < /dev/null: 这是将空设备/dev/null作为masterha_manager的输入。这意味着不会从标准输入读取任何输入。 * > /var/log/masterha/app1/manager.log: 这是将masterha_manager的输出重定向到指定的日志文件,即/var/log/masterha/app1/manager.log。 * 2>&1: 这是将标准错误输出也重定向到与标准输出相同的位置,即将错误信息写入到manager.log中。 * &: 这是一个特殊符号,表示将命令放入后台运行。 因此,这段命令的意思是以后台模式运行masterha_manager,并将其输出重定向到指定的日志文件中。同时,还忽略了最后一次故障转移的记录,自动删除已死亡主节点的配置,并且不从标准输入读取任何输入。 |

查看

jobs

启动时masterIP异常

需要工程手动配置VIP

(四)停用master的mariadb服务,模拟故障

systemctl stop mariadb

在slave1里查看

ip a

注:服务在完成以后自动回掉,此时需手动重启

停止命令

jobs
fg 1

将后台进程掉到前台,ctrl+c进行打断即可

(五)故障恢复

在停掉master以后,配置文件中内容回消失

vim /etc/masterha/app1.cnf 

修改app1.cnf启动配置,添加master主机配置信息

将内容添加进去即可

[server1]
hostname=192.168.11.112
port=3306

分别在slave上重新指定master主机及binlog日志同步信息

master 端进行操作

启动服务

systemctl start mariadb

进入数据库

mysql

停止从库

stop slave;
exit

查看状态

mysql -e "show master status;"

slave1 、2端进行操作

重启服务

systemctl restart mariadb

进入数据库

mysql

停止从服务

stop slave;
exit

同步数据

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000003',master_log_pos=245;"

分别从两个从库进入数据库

mysql

启动

start slave;

查看状态并退出

show slave status\G;
exit

主库创建内容

mysql -e "create database zm;"

从库进行查看

mysql -e "show databases;"

这样可以看到主从复制又恢复原有了

注:但是有一点需要注意,在恢复完毕后,在主的机器上还是看不见设置的虚IP地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。

相关推荐
易云码6 分钟前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
向阳12189 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
newxtc12 分钟前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创
蓝眸少年CY12 分钟前
MySQL 【流程控制】函数
mysql
水月梦镜花14 分钟前
redis:list列表命令和内部编码
数据库·redis·list
荒Huang1 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
海阔天空_20131 小时前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能1 小时前
气爪在自动化装配线中是如何应用的?
运维·自动化
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青1 小时前
数据库交互的本地项目:后台管理系统
数据库·交互