如何使用MySQL MHA源码进行监控检查

分类:编程技术 时间:2024-02-20 15:40 浏览:0 评论:0
0
本文与大家分享如何使用MySQL MHA源码进行监控检查。小编觉得还是比较实用的,所以分享给大家学习一下。希望您读完本文后有所收获。话不多说,下面就和小编一起来看看吧。

1.前言

在研究的同时,我也翻阅了MHA的源码。现在我来整理一下MHA的一些重要内容。既然是高可用工具,那么健康检测就是一项基本任务。只有正确检测到数据库故障才可以进行数据库切换; MHA的布局也是如此:

2、MHA健康检查核心调用函数链

注意这里函数调用链的规则是文件名|方法名。方法名或表示通过读取配置文件来执行其中一个函数

MasterMonitor.pm|MHA::MasterMonitor::main()

    —>MasterMonitor.pm| MHA::MasterMonitor::wait_until_master_is_dead()

    —>MasterMonitor.pm|MHA: :MasterMonitor::wait_until_master_is_unreachable()

                                                                                               ->HealthCheck.pm|eck::ping_select(or)

                                                                                                                                                                                                                                             (或)

3.代码分析

我们主要看HealthCheck.pm|MHA::HealthCheck::wait_until_unreachable的实现

1)这个函数通过了一个死循环,检测4次,sleep ping_interval秒每次(该值在配置文件中指定,参数为ping_interval),如果连续四次失败,则认为数据down

2)如果有第二路检测的话脚本需要第二通道检测脚本来检测主数据库宕机,这就是目的l 停机时间。否则,它只会启动无限循环,结束检测,而不进行切换。

3)这里的GETLOCK(假设是分布式锁)用于保护数据库访问,防止脚本被多次启动

4)该函数调用了三个经过测试的方法,如下:

PING_TYPE_CONNECT(ping_select)、PING_TYPE_INSERT(ping_insert)、PING_TYPE_SELECT(ping select),但是哪一个最好呢?我建议 PING_TYPE_CONNECT。事实上,PING_TYPE_CONNECT 调用 ping_select.t 方法比 PING_TYPE_CONNECT 更可靠

# main function# 返回 1,表示数据库有问题,但不会切换; 0表示数据库有问题,会切换(这里也会返回ssh连接状态,方便确认是网络问题还是数据库问题) subwait_until_unreachable($) { my $self = shift;我的 $log = $self->{logger};我的 $ssh_reachable = 2;我的 $error_count = 0;我的 $master_is_down = 0; eval { while (1) { $self->{_tstart} = [gettimeofday]; if ( $self->{_need_reconnect} ) { #测试连接,如果连接正确则返回0,否则返回1 ##这里是分布式获取锁,如果还有会话且获取分布式锁失败,则连接被认为不成功 my ( $rc, $mysql_err ) =         $self->connect(undef, undef, undef, undef, undef, $error_count); (             #这里并不是访问不了,可能只是权限错误 grep ( $_ == $mysql_err, @MHA::ManagerConst::ALIVE_ERROR_CODES) > 0) {; $log->info("出现 MySQL 错误 $mysql_err,但这不是 MySQL 崩溃。继续运行状况检查.."); #睡一会儿 $self->sleep_until(); # 嗯,如果是权限错误的话如果一直循环到这里,检测同意MySQL正常,接下来会打印权限日志;}} $ error_count ++; $log->warning("连接失败$error_count时间(s)..");P;#进程失败,更新status_file to 20: ping_failing $seld->handle_failing();#超过四次,跳出此循环 if ($error_count>=4) {#返回1表示SSH可达,0表示ssh表示ssh不可达$ ssh_reachable = $self->is_ssh_reachable(); #返回1表示主库已经宕机,0表示没有宕机 $master_is_down = 1 if ($self->is_secondary_down()); #退出循环,最后最后 if ($master_is_down); p; $错误计数 = 0; $self->sleep_until();下一个; ("Ping($self->{ping_type})成功,等待mysql确实响应..");}#释放连接,如果只是ping_type_connect类型 $self->disconnect_if () if ($seld->{ ping_type} eq $ MANA: mana Gerconst :: ping_type_conneCT ); # 父进程派生一个子进程。子进程每隔  秒从 MySQL 查询一次。子进程可能会挂起 # 执行查询。 # DBD::mysql 4.022 或更早版本没有设置读取超时的选项,执行查询可能会超时ke永远。为了避免这种情况,如果子进程在 #  秒内没有退出,父进程将杀死子进程。我的$child_exit_code; ; eval { if ( $self->{ping_type} eq $MHA::ManagerConst::PING_TYPE_CONNECT ) { $child_exit_code = $self->fork_exec( sub { $self->ping_connect() }, "MySQL Ping($self- > {ping_type})"); elsif ( $self->{ping_type} eq $MHA::ManagerConst::PING_TYPE_SELECT ) { $child_exit_code = $self->fork_exec( sub { $self->ping_select() }, " MySQL Ping($self->{ping_type })" ); } Elsif($Self->{ping_type} EQ $MHA::ManagerConst::PING_INSERT) {$Child_exit_code = $Self->Fork_exec(SUB {$Self->Ping_insert()}," mysql ping( $ Seld-> {{ ping_type})" ); else { die "不支持 ping_type!\n"; if ($@) { my $msg = "ping 时发生意外错误!$ @"; ; =0(连续累加4次,即连接有问题) $SELF->UPDATE_STATUS_OK(); if ($error_count> 0) {$error_count = 0;} #handle_fairing 启用第二次路测和 SSH_Check。删除 $ self->kill_sec_check(); $self->kill_ssh_check(); ; # fork_exec $error_count++ 失败; $self ->{_need_reconnect} = 1;cker!"); }; if ($@) { my $msg = "监控主机时出错:$@"; $log->warning($msg); undef $ @; return 2 if ( $self-> {_already_monitored} ); return 1; } #$master_is_down=0, return 1 return 1 except ($master_is_down); #0,$ssh_reachable 返回 1 表示 ssh 可达,0 表示ssh 无法到达 return (0, $ssh_reachable) ;}1; 三种检测机制函数 #此 ping_connect 正常返回 0,出错返回 1 或 2,1 表示连接有问题,2 表示获取失败#修改后的函数调用 ping_selectsub ping_connect($) { my $self = shift; my $log = $self->{logger}; my $dbh; my $rc = 1; my $max_retries = 2; eval { my $ping_start = [gettimeofday]; #连接max_retries次,如果出错则退出 while (!$self->{dbh} && $max_retries--) { eval { $rc = $self- >connect( 1, $self->{间隔}, 0, 0, 1 ); }; if ( !$self->{dbh} && $@ ) { die $@ if ( !$max_retries ); } } # ping_select()正常返回0,错误返回1 $rc = $self->ping_select(); # 保持咨询锁一段时间 # 获取锁可能需要一些时间,所以需要等待一段时间才能释放连接 Time $self->sleep_until( $ping_start, $self->{interval} - 1.5); $self->disconnect_if(); }; if ($@) { my $msg = "MySQL 连接 ping 时出错:$@" ; undef $@; $msg .= $DBI::err if ($DBI::err); $msg .= " ($DBI::errstr)" if ($DBI::errstr); $log->警告($msg) if ($log); $rc = 1; if ($self->{_already_monitored}); 返回 2 return $rc;}#语句 SELECT 1 As Value,正常返回0,错误返回1sub ping_select ($) { my $self = shift;我的 $log = $self->{logger};我的 $dbh = $self->{dbh};我的($query,$sth,$href); eval { $dbh->{RaiseError} = 1; $sth = $dbh->prepare("选择 1 作为值"); $sth->execute(); $href = $sth->fetchrow_hashref;如果(!定义($链接)|| !已定义( $href->{Value} ) || $href->{值} != 1 ) { 死掉; } } ; if ($@) { my $msg = "MySQL select ping 出现错误:"; undef $@; $msg .= $DBI::err if ($DBI::err); $msg .=“($DBI::errstr)” if ($DBI::errstr); $log->警告($msg) if ($log);返回1; } return 0;}#正常返回0,错误返回1。我有一个问题。看来数据库表还没有清理干净。 sub ping_insert($) { 我的 $self = shift;我的 $log = $self->{logger};我的 $dbh = $self->{dbh};我的($query,$sth,$href); eval { $dbh->{RaiseError} = 1; $dbh->do("如果下面不存在则创建数据库"); $dbh->do("如果不存在则创建表 infra.chk_masterha (`key`tinyint NOT NULL 主键,`val` int(10) unsigned NOT NULL DEFAULT '0') engine=MyISAM"  ); $dbh->do("在重复密钥更新 val=unix_timestamp() 上插入 infra.chk_masterha 值(1,unix_timestamp())" ); }; if ($@) { my $msg = "MySQL 插入 ping 时出错:"; undef $@; $msg .= $DBI::err if ($DBI::err); $msg .= " ($DBI::errstr)" if ($DBI::errstr ); $log->警告($msg) if ($log);返回1; } 返回 0;}

IV.总结

1)数据库MHA健康检查,ping_select、ping_insert和ping_connect的最终调用之一。检测时间由ping_interval控制。其中,ping_connect调用ping_select

2)MHA最好配置双向检测,否则就只是MHA主节点ssh从自身。检查主数据库是否正常。 MHA管理节点与主数据库网络之间存在问题。

3)注意:这里仅列出核心功能。其实程序启动的时候,有一些启动状态的检查,基本上就是主库是否可以连接。配置是否正确,从库是否正常等

以上就是如何使用MySQL MHA源码进行监控检查。小编相信有些知识点在我们日常工作中可能会看到或者用到。到达艾维德。希望您能从本文中了解更多信息。更多详情请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何使用MySQL MHA源码进行监控检查

用户评论