MySQL数据库的高可用

一、MHA工作原理

1、MHA的工作原理

        1、MHA利用 select 1 as value 指令判断master服务器的健康性,一旦master宕机,MHA从宕机崩溃idmaster保存二进制日志事件(binlog events)

        2、识别含有最新更新的slave

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

        4、应用从master保存的二进制日志事件(binlog events)

        5、提升一个slave为最新的master

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

2、MHA的组成及作用

MHA软件由两部分组成,manager工具包和node工具包:

        manager工具包主要包含以下工具:

                masterha_check_ssh :检查MHA的ssh配置状况

                masterha_check_repl :检查MySQL复制状况

                masterha_manger :启动MHA(主程序)

                masterha_check_status :检查当前MHA运行状态

                masterha_master_monitor :检查master是否宕机

                masterha_master_switch :故障转移(自动或手动)

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

        node工具包:通常由MHA manager的脚本触发,无需人为操作,主要包含:

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

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

                filter_mysqlbinlog :去除不必要的rollback 事件(MHA已不再使用此工具)

                purge_relay_logs :清除中继日志 (不会阻塞SQL线程)

        自定义扩展:

                secondary_check_script: 通过多条网络路由检测master的可用性

                master_ip_ailover_script:更新Application使用的masterip

                shutdown_script: 强制关闭master节点

                report_script: 发送报告

                init_conf_load_script: 加载初始配置参数

                master_ip_online_change_script:更新master节点ip地址

二、配置前提

1、MySQL数据库的主从复制

详细部署请看之前的文章:mysql主从复制及故障修复_mariadb主从复制异常恢复-CSDN博客

验证并提前创建基于MHA服务管理的账号:

show processlist;

show replica status\G

创建基于MHA服务管理的账号:

create user 'mhauser'@'%';
alter user 'mhauser'@'%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'mhauser'@'%';
select user,host,authentication_string from mysql.user;

重置二进制日志

reset master;

2、提前准备好manger和node安装包

安装包下载地址:https://code.google.com/archive/p/mysql-master-ha/downloads

安装sshpass服务,实现MHA服务与MySQL数据库之间基于key密码认证

yum -y install sshpass
cd
rm -rf /root/.ssh
HOSTS="
192.168.10.110
192.168.10.120
192.168.10.130
"
PASS=123456
ssh-keygen -P "" -f /root/.ssh/id_rsa &> /dev/null
for i in $HOSTS;do
    {
        sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i  &> /dev/null
        scp -rp /root/.ssh $i:/root/
    }&
done
echo "免密登录配置成功"

3、准备好邮件服务,以备服务告警

yum -y install postfix

  • 编辑/etc/postfix/main.cf文件。
  • 设置发件人域名,找到myhostnamemydomain参数。例如,如果你的服务器主机名是mail.example.com,则myhostname = mail.example.commydomain = example.com
  • 配置 SMTP 认证,添加或修改以下行:
    • smtpd_sasl_type = dovecot
    • smtpd_sasl_path = private/auth
    • smtpd_sasl_local_domain = $myhostname
    • smtpd_sasl_security_options = noanonymous
    • broken_sasl_auth_clients = yes
  • 告诉 Postfix 使用 Dovecot 进行用户认证(假设已经安装并配置了 Dovecot 用于本地用户认证)。

  • 配置发件人地址和 SMTP 认证信息
    • 编辑/etc/postfix/sasl/sasl_passwd文件,添加以下内容:
      • smtp.qq.com your_email@qq.com:your_smtp_authorization_code
      • 其中your_email@qq.com是你的 QQ 邮箱地址,your_smtp_authorization_code是你从 QQ 邮箱获取的 SMTP 授权码。
    • 运行postmap /etc/postfix/sasl/sasl_passwd命令,将sasl_passwd文件转换为 Postfix 可以使用的数据库格式。

安装s-nail软件包来提供mail命令,编写邮件测试,使其将指定的内容发到自己的邮箱中

编写触发邮件的脚本,并授权

vim /usr/local/bin/postfix.sh

添加授权

chmod +x /usr/local/bin/postfix.sh

三、安装mha服务

1、manager节点

        manager节点安装manager程序包和node包,其他被管理节点安装node包

先将事先准备号的安装包传输到主机上

因为需要安装一些mha的依赖包,隐藏需要进行yum install 对安装包进行安装

yum -y install mha4mysql-manager-0.55-1.el5.noarch.rpm
yum -y install mha4mysql-node-0.54-1.el5.noarch.rpm

2、MHA程序配置

对MHA中所安装的mha程序进行设置

先创建目录,将准备号的app1.cnf 文件放入

mkdir /etc/mastermha

[server default]
user='mhauser'
password='123456'
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user='repluser'
repl_password='123456'
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
report_script=/usr/local/bin/sendmail.sh
check_repl_delay=0
master_binlog_dir=/data/mysql/
[server1]
hostname=192.168.10.110
candidate_master=1
[server2]
hostname=192.168.10.120
candidate_master=1
[server3]
hostname=192.168.10.130

将VIP漂移脚本导入到指定位置,并进行授权

#!/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.10.88/24';
my $gateway = '192.168.10.1';
my $interface = 'eth0';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway > /dev/null 2>&1";
my $ssh_stop_vip = "/sbin/ifconfig $interface:$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 {

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

    if ( $command eq "stop" || $command eq "stopssh" ) {

        # $orig_master_host, $orig_master_ip, $orig_master_port are passed.
        # If you manage master ip address at global catalog database,
        # invalidate orig_master_ip here.
        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" ) {

        # all arguments are passed.
        # If you manage master ip address at global catalog database,
        # activate new_master_ip here.
        # You can also grant write access (create user, set read_only=0, etc) here.
        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";
        `ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}

# A simple system call that enable the VIP on the new master
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";
}

从脚本上可以看到,VIP为192.168.10.88/24

在主MySQL数据库中,设置VIP(只需要在主MySQL数据库上),设置到其本地网卡ens32上

ifconfig ens32:1 192.168.10.88/24

3、检测程序

(1)、检测MHA程序的功能

检查manager管理节点上运行MHA语法和配置检测程序,检测运行环境是否正常

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

出现错误,找不到 SSHCheck.pm 模块

这个模块在 /usr/lib/perl5/vendor_perl/MHA/SSHCheck.pm  下,将其复制到对应的目录下

cp -r /usr/lib/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/

再次运行检测

masterha_check_repl --conf=/etc/mastermha/app1.cnf

检测无误后,开始前台启动MHA进程,并提供主MySQL数据库的通用日志实时监控 

masterha_manager --conf=/etc/mastermha/app1.cnf

生产环境放在后台执行

masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null

打开主MySQL数据库的通用日志实时监控

tail -f node.log

可以看到其每隔1秒检测一次主服务器的状态信息

(2)、查看主从MySQL数据库的读写状态(0为写,1为读)

select @@read_only;

只有主服务器可以正常写入数据,从服务器只能读数据

(3)、停服验证

将主节点进行停服,验证MHA是否将某个从节点升级为主节点

systemctl stop mysqld

原本的主服务器停服后,原本在其上的VIP  10.88已经消失

二原本的10.120从服务器,其原本的读权变为了写权

VIP成功漂移到10.120上

中继日志已删除,IP飘过来

这时原本MHA前台启动的进程,自动退出了,MHA默认是一次性的,要想其继续实现高可用实现VIP迁移,需要手动进行设置

(4)、将原本的主MySQL数据库回归

先在其上添加change master to 使其成为10.120的从服务器

启动从节点复制功能

(5)、对manager管理节点上运行的MHA语法和配置进行检测程序

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

masterha_check_repl --conf=/etc/mastermha/app1.cnf

(6)、对MHA服务进行重新启动检测后台MySQL服务器状态信息

masterha_manager --conf=/etc/mastermha/app1.cnf

将现主服务器120,进行停服测验,VIP是否可以继续进行漂移

service mysqld stop

可以看到VIP并未再次进行漂移,其主要原因是因为,MHA默认为一次性服务策略,当一次服务结束后会生成一个/data/mastermha/app1/app1.failover.complete,文件阻止服务再次进行VIP漂移,因此这时需要进行手动调整,将生成的文件进行删除

对主MySQL服务再次进行停止服务

查看VIP是否漂移到另一备用节点上

成功实现VIP的漂移与再次漂移,如果还想要使得120服务再次进行主从复制,者需要在次在服务器进行change master to 指定主服务器IP以及端口,账号以及密码,二进制日志文件以及从什么节点开始复制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bcprov-jdk15on-1.52.0.jar has unsigned entries - org/bouncycastle/LICENSE

报错界面如上图 解决办法: 1.修改引用jar包,将build.gradle里面的依赖为 implementation org.bouncycastle:bcprov-jdk15on:1.52 2.到maven上下载最新的bcprov-jdk15on-1.52.0.jar,替换文件夹中原有的jar包

C/C++每日一练:实现一个环形队列

队列(queue) 队列是一种先进先出(FIFO,First In First Out) 的数据结构,类似于排队的场景。最先进入队列的元素最先被处理,而后加入的元素则排在队列的末尾。 常见的队列操作: 入队…

第二届中国楚域品牌文化创新发展大会暨楚域尚品发布会在汉圆满落幕

10 月 19 日,“第二届中国楚域品牌文化创新发展大会暨楚域尚品发布会”在武汉市光谷九通海源大酒店隆重举行。本次大会由中国商业文化研究会传承创新工作委员会、楚域品牌文化传承创新工作委员会、华夏品牌文化创新发展大会组委会主办,湖北省企业文化促进…

python爬虫简易入门示例

版本环境 win11python 3.12.4 目标:爬取https://gitee.com/explore的列表内容,并写入txt文本 效果 开始 1.安装依赖 pip install requests beautifulsoup42.编写代码,如下,详见注释 import requests from bs4 import Beauti…

【PFGA】二选一数选器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 verilog FPGA 实验 一、实验原理 二、实验过程 三、实验结果 代码 module mux21(input s,input a,input b,output reg y); always(s or a or b) beginif (~s) beginy<a;end else beginy<…

ollama+ollama-webu在windos上部署的教程

ollamaollama-webu在windos上部署的教程 一、需要准备的环境和代码二、开始部署1. 修改系统变量&#xff1a; 常见问题 首先介绍一下ollama&#xff1a; Ollama 是一种为快速大规模语言模型推理所设计的框架和平台。它旨在帮助用户通过高效的方式运行和管理大型语言模型&#x…

使用AITemplate和AMD GPU的高效图像生成:结合Stable Diffusion模型

Efficient image generation with Stable Diffusion models and AITemplate using AMD GPUs 2024年1月24日&#xff0c;作者是[Douglas Jia] Stable Diffusion 已成为图像生成领域的突破性进展&#xff0c;帮助用户将文本描述转化为引人入胜的视觉输出。 Stable Diffusion 的…

SAP_通用模块-MASS批量操作技巧(二)

业务背景&#xff1a; 前两天写了一篇关于MASS批量操作的文档&#xff0c;当时测试批量扩充物料视图的时候失败了&#xff0c;就没记录进去&#xff0c;然后手头上刚好有一个需求&#xff0c;就是物料已经有基本视图等相关信息的情况下&#xff0c;需要扩充相关的物料视图。方法…

光纤光学——弱导光纤与线偏振模

一、基本思想 弱导光纤&#xff1a;n1≈ n2 , k0n1 ≈ k0n2&#xff0c;亦即&#xff1a; k0n1 ≈ k0 n2 ≈ 光线与纤轴的夹角小&#xff1b;芯区对光场的限制较弱&#xff1b; 消逝场在包层中延伸较远。 弱导光纤场的特点&#xff1a; HEι1,m模式与EHι-1,m色散曲线相近…

1024程序员节·城市聚会·西安,它来了

活动名称 CSDN 1024程序员节城市聚会西安 活动主题 智能进化&#xff1a; 开发者在AI时代的工作与生活变革 活动背景 CSDN一年一度的1024程序员节城市聚会&#xff08;西安站&#xff09;是一场专为程序员打造的盛会。这个活动旨在为西安的开发者们提供一个交流技术、分享…

每日OJ题_牛客_数组变换_贪心+位运算_C++_Java

目录 牛客_数组变换_贪心位运算 题目解析 C代码1暴力 C代码2位运算 Java代码位运算 牛客_数组变换_贪心位运算 数组变换__牛客网 (nowcoder.com) 描述&#xff1a; 牛牛有一个数组&#xff0c;里面的数可能不相等&#xff0c;现在他想把数组变为&#xff1a;所有…

MySQL数据库和表的基本操作

目录 一、数据库的基础知识 背景知识 数据库的基本操作 二、数据类型 字符串类型 数值类型 日期类型 三、表的基本操作 创建表 查看表结构 查看所有表 删除表 一、数据库的基础知识 背景知识 MySQL是一个客户端服务器结构的程序 主动发送数据的这一方&#xff0c;…

【Java】集合补充

常见基础集合汇总 数据结构&#xff1a;栈 数据结构分为&#xff1a; &#xff08;1&#xff09;逻辑结构 &#xff1a;--》思想上的结构--》卧室&#xff0c;厨房&#xff0c;卫生间 ---》线性表&#xff08;数组&#xff0c;链表&#xff09;&#xff0c;图&#xff0c;树&…

近期股市热潮,现有架构模块下金融交易系统如何应对“冲击”?优化思路如下

近期股市热情高涨&#xff0c;激增的交易量挑战的不止是券商&#xff0c;还有交易系统的基础架构是否稳固。9月底&#xff0c;股市牛抬头&#xff0c;瞬时的高并发量一把“撞”崩多家券商的交易应用系统&#xff0c;导致交易停滞。 在这场资本盛宴背后&#xff0c;稳定、高效、…

一家异业联盟平台 两年百亿销售额怎么做到的?

近年来&#xff0c;互联网领域涌现了一颗耀眼的新星——“上海我店”&#xff0c;该平台短时间内交易额突破百亿大关&#xff0c;且用户数量在上月实现了近百万的增长。这一迅猛的扩张速度&#xff0c;自然吸引了众多商家的目光。不过&#xff0c;随着其影响力的提升&#xff0…

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中&#xff0c;填入Name&#xff08;随便填&#xff09;&#xff0c;Repository URL&#xff0c;选择下列的源&#xff0c;一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…

为你的网站增加点灵性:随系统变色

&#x1f33b; 前言 网站切换主题色已经是非常常见的功能了&#xff0c;提供浅色和暗色两种色调可以满足用户的使用习惯&#xff0c;帮助这些用户获得更好的访问体验。但是只能用户手动切换主题。 那如果用户已经将系统切换到了深色模式&#xff0c;当他们打开我们网站的时候…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

有趣的css - 跷跷板加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

YOLO目标检测

文章目录 一、含义二、与传统检测对比1.one-stage的优缺点2.two-stage的优缺点 三、MAP指标1.基本概念2.计算方法3.指标意义 一、含义 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。它的核心…