Mariadb高可用(四十)

目录

一、概述

(一)概念

(二)组成

(三)特点

(四)工作原理

二、实验要求

三、构建MHA

(一)ssh免密登录

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

1、配置 master 机器

2、配置 slave1 机器

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/24node节点            mastermaster
192.168.11.113/24node节点             slaveslave1
192.168.11.114/24node节点             slaveslave2

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地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wjy¹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值