MHA安装部署

1.概述

       MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

       MHA工作原理总结为以下几条:

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

(2)识别含有最新更新的slave;

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

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

(5)提升一个slave为新master;

(6)使用其他的slave连接新的master进行复制。

       本文主要讲述生产线上MHA安装部署步骤,以及生产线上MHA安装部署规范。

安装MHA步骤

安装部署要求先安装MySQL一主多从架构,MySQL主从部署此处不作详述。

安装前环境准备

apt-get install -y libdbd-mysql-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl libmodule-install-perl

apt-get install -y perl-modules

cpan Module::Install

以上3步骤安装MHA相关依赖包。

配置ssh免密登录

MHA需要通过管理机名密登录到其它主机实现相关操作,因此需要配置各主机间的名密登录。包括:管理机能免密登录到主、从机,主从库之前能名密登录。

执行ssh-keygen,按下回车,即可生成公钥。

cd /root/.ssh

cat id_rsa.pub 

查看生成公钥。

              然后将相关内容追加至远程主机/root/.ssh/authorized_keys文件下。

              执行ssh 10.1.8.70查看登录是否正常。然后根据需要,配置各主机间名密登录。


安装manager

安装manager需要下载MHA软件包,但源码包:

/usr/local/share/perl/5.18.2/MHA/DBHelper.pm

/usr/local/share/perl/5.18.2/MHA/HealthCheck.pm

两个文件有bug,导致MHA连接数据库失败而造成数据库切换失败。

需要修改HealthCheck.pm文件第98行:

将   "DBI:mysql:;host=[$self->{ip}];" 修改成:

"DBI:mysql:;host=$self->{ip};"

即将中括号”[]”去掉,否则数据库连接会失败。

同样,DBHelper.pm文件,158 198现行需要同样作出修改。

以下给出修改后的源码包:

解压安装

tar –xzvf mha4mysql-manager-master-debug.tar

cd mha4mysql-manager-master

执行:perl Makefile.PL

make && make install

安装node

根据2.1节所述安装相关perl模块。然后上传node包:

解压:unzip  mha4mysql-node-master-0.57.zip

cd mha4mysql-node-master

perl Makefile.PL

make && make install

2.5数据库权限配置

       1.配置同步权限:从库也需要给主库相关的权限:

GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'10.1.8.71' IDENTIFIED BY PASSWORD  '*AAB87B764AC144C101917F99B63F1B2A46B41D1C' ;

2.主从库给MHA管理机root权限:

       create user 'hauser'@'10.1.8.72' identified by PASSWORD '*87EB1403CFDEF808C504AE04319E580EF2177C18';

GRANT ALL PRIVILEGES ON *.* TO 'hauser'@'10.1.8.72' ;

   MHA配置文件

主要config文件参数

[server default]

manager_workdir=/data/mha/worddir   ##manager工作目录

remote_workdir=/data/mha/remote/   ##保存远程binlog目录

manager_log=/data/mha/log/managerlog/mha-armdb.log  ##MHA日志

ssh_user=root        ##连接远程所用用户

ssh_port=22         ##ssh端口

repl_user=repuser    ##复制user

repl_password=repuser21cn   ##复制密码

#multi_tier_slave=1

ping_interval=1 

ping_type=CONNECT

master_ip_failover_script="/opt/MHA/worddir/armdb/master_ip_failover   --orig_master_ssh_port=22"      ###自动切换脚本

#master_ip_online_change_script=/opt/MHA/mha_work_dir/master_ip_online_change 

#secondary_check_script=masterha_secondary_check -s 192.168.76.134 --user=root      ##备机作切换,防止脑裂(此处由于资源限制没有设置)

[server1]

user=hauser    ##MHA远程登录MySQLoot权限

password=xxxxx    ##MHA远程登录MySQL

candidate_master=1    ##是否可以选为主

ignore_fail=1        

check_repl_delay = 1

hostname=10.1.8.70

#ip=10.1.8.70

port=3301

master_binlog_dir=/data/mysql/mysql3301/logs/binlog/   ##MySQLbinlog位置

[server2]

user=hauser

password=xxx

candidate_master=1

ignore_fail=1

check_repl_delay = 1

hostname=10.1.8.71

#ip=10.1.8.71

port=3301

master_binlog_dir=/data/mysql/mysql3301/logs/binlog/

自动切换脚本

自动切换脚本详见附件,此处需要注意的是:

my $vip = '10.1.8.74/24';

my $key = "2";

my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";

my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

切换脚本需要修改VIP,其中VIP需要指定子网掩码。

运行MHA

nohup /usr/local/bin/masterha_manager    --conf=/opt/MHA/worddir/armdb/mha-armdb.cnf   --ignore_last_failover  < /dev/null > /opt/MHA/worddir/armdb/manager.log 2>&1 &

MySQL relay log purge

1.数据库新增权限:

grant super,reload on *.* to hauser@10.1.8.70 identified by xxxxxxxx;

grant  select on mysql.slave_relay_log_info to hauser@10.1.8.70 identified by 'cisnewLYMwnL';

2. 改/usr/local/bin/purge_relay_logs

/usr/local/bin/purge_relay_logs源码(目前 只发现0.57有这个BUG,需要按下面的方法修改一下)

将第178行: my $dsn = "DBI:mysql:;host=[$opt{host}];port=$opt{port}";

改成:  my $dsn = "DBI:mysql:;host=$opt{host};port=$opt{port}";

3.建脚本

cat>/data/pufan/scripts/clearRelay

#!/usr/bin/perl

use 5.10.1;

use strict;

use POSIX;

use File::Path qw( mkpath );

my $user="hauser";

my $passwd="xxxxxx";

my $host="10.1.8.71";

my $port=3301;

my $purge="/usr/local/bin/purge_relay_logs";

my $logPath="/data/mha/arm/logs";

mkpath "$logPath/tmpRelayLog" ||die;

my $year_month_day=strftime("%Y%m%d",localtime());

open ERROR,'>>',"$logPath/purge_relay_logs.log.$year_month_day" or die "$!\n";

!system "$purge --user=$user --password=$passwd  --host=$host  --port=$port  --workdir=$logPath/tmpRelayLog --disable_relay_log_purge >> $logPath/purge_relay_logs.log.$year_month_day 2>&1" or print ERROR "\n purge error !\n";

加入crontab

#MHA clear mysql relay log

0 6 * * * perl /data/pufan/scripts/clearRelay &

生产部署规范

本章主要说明MHA生产部署规范,主要包括各目录规范;权限管理规范;配置文件规范等。

目录规范

配置文件目录:

/opt/MHA/worddir/

该目录下,根据不同项目,创建不同目录及配置文件,以arm为例,配置文件及配置目录为:/opt/MHA/worddir/armdb/mha-armdb.cnf

数据目录:/data/mha

log:保存日志文件

remote:保存远程binlog文件

worddir:mha工作目录

权限管理规范

1.配置文件有比较敏感信息,需要设置权限位为600。

2.mha管理数据库用户hauser需要指定给mha主机权限,不能出现通配符。

运行规范

统一放后台运行:

nohup /usr/local/bin/masterha_manager    --conf=/opt/MHA/worddir/armdb/mha-armdb.cnf   --ignore_last_failover  < /dev/null > /opt/MHA/worddir/armdb/manager.log 2>&1 &

切换测试

部署好MHA后,关掉主库,观察切换情况,查看日志输出。若切换失败,查看日志并排查原因。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容