您的位置:首页 > 运维架构 > 网站架构

MySQL高可用方案MHA的部署和原理

2017-09-22 16:28 746 查看
http://www.cnblogs.com/ivictor/archive/2017/05/21/5686275.html

MHA(Master High Availability)是一套相对成熟的MySQL高可用方案,能做到在0~30s内自动完成数据库的故障切换操作,在master服务器不宕机的情况下,基本能保证数据的一致性。

它由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。其中,MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave上。MHA Node则运行在每个mysql节点上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它自动将最新数据的slave提升为master,然后将其它所有的slave指向新的master。

在MHA自动故障切换过程中,MHA试图保存master的二进制日志,从而最大程度地保证数据不丢失,当这并不总是可行的,譬如,主服务器硬件故障或无法通过ssh访问,MHA就没法保存二进制日志,这样就只进行了故障转移但丢失了最新数据。可结合MySQL 5.5中推出的半同步复制来降低数据丢失的风险。

MHA软件由两部分组成:Manager工具包和Node工具包,具体说明如下:

MHA Manager:

1. masterha_check_ssh:检查MHA的SSH配置状况

2. masterha_check_repl:检查MySQL的复制状况

3. masterha_manager:启动MHA

4. masterha_check_status:检测当前MHA运行状态

5. masterha_master_monitor:检测master是否宕机

6. masterha_master_switch:控制故障转移(自动或手动)

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

8. masterha_stop:关闭MHA

MHA Node:

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

apply_diff_relay_logs:识别差异的relay log并将差异的event应用到其它slave中

filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用这个工具)

purge_relay_logs:消除中继日志(不会堵塞SQL线程)

另有如下几个脚本需自定义:

1. master_ip_failover:管理VIP

2. master_ip_online_change:

3. masterha_secondary_check:当MHA manager检测到master不可用时,通过masterha_secondary_check脚本来进一步确认,减低误切的风险。

4. send_report:当发生故障切换时,可通过send_report脚本发送告警信息。

集群信息

角色 IP地址 ServerID 类型

Master 192.168.244.10 1 写入

Candicate master 192.168.244.20 2 读

Slave 192.168.244.30 3 读

Monitor host 192.168.244.40 监控集群组

注:操作系统均为RHEL 6.7

其中,master对外提供写服务,备选master提供读服务,slave也提供相关的读服务,一旦master宕机,将会把备选master提升为新的master,slave指向新的master

一、在所有节点上安装MHA node

1. 在MySQL服务器上安装MHA node所需的perl模块(DBD:mysql)

# yum install perl-DBD-MySQL -y

2. 在所有的节点上安装mha node

下载地址为:https://code.google.com/p/mysql-master-ha/wiki/Downloads?tm=2

由于该网址在国内被墙,相关文件下载后,放到了个人网盘中,http://pan.baidu.com/s/1boS31vT,有需要的童鞋可自行下载。

# tar xvf mha4mysql-node-0.56.tar.gz

# cd mha4mysql-node-0.56

# perl Makefile.PL

View Code
通过报错可以看出,是相关依赖包没有安装。

# yum install perl-ExtUtils-MakeMaker -y

# perl Makefile.PL

*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
Can't locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/AutoInstall.pm line 277.


# yum install perl-CPAN -y

# perl Makefile.PL

View Code
# make

# make install

至此,MHA node节点安装完毕,会在/usr/local/bin下生成以下脚本文件

# ll /usr/local/bin/
total 44
-r-xr-xr-x 1 root root 16367 Jul 20 07:00 apply_diff_relay_logs
-r-xr-xr-x 1 root root  4807 Jul 20 07:00 filter_mysqlbinlog
-r-xr-xr-x 1 root root  8261 Jul 20 07:00 purge_relay_logs
-r-xr-xr-x 1 root root  7525 Jul 20 07:00 save_binary_logs


二、在Monitor host节点上部署MHA Manager

# tar xvf mha4mysql-manager-0.56.tar.gz

# cd mha4mysql-manager-0.56

# perl Makefile.PL

View Code
# make

# make install

执行完毕后,会在/usr/local/bin下新增以下几个文件

View Code

七、查看整个集群的状态

在Monitor host上执行

# masterha_check_repl --conf=/etc/masterha/app1.cnf

View Code
报错很明显,Candicate master和Slave都没有启动log-bin,如果没有启动的话,后续就无法提升为主

设置log-bin后,重新执行:

View Code
检查通过~

八、 检查MHA Manager的状态

# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).


如果正常,会显示“PING_OK”,否则会显示“NOT_RUNNING”,代表MHA监控还没有开启。

九、开启MHA Manager监控

# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /masterha/app1/manager.log 2>&1 &

其中,

remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的IP将会从配置文件中移除。

ignore_last_failover:在默认情况下,MHA发生切换后将会在/masterha/app1下产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件且两次切换的时间间隔不足8小时的话,将不允许触发切换。除非在第一次切换后手动rm -rf /masterha/app1/app1.failover.complete。该参数代表忽略上次MHA触发切换产生的文件。

查看MHA Manager监控是否正常

# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:1873) is running(0:PING_OK), master:192.168.244.10


十、 关闭MHA Manager监控

# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+  Exit 1                  nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /masterha/app1/manager.log 2>&1


至此,MHA部分配置完毕,下面,来配置VIP。

十一、VIP配置

VIP配置可以采用两种方式,一是通过引入Keepalived来管理VIP,另一种是在脚本中手动管理。

对于keepalived管理VIP,存在脑裂情况,即当主从网络出现问题时,slave会抢占VIP,这样会导致主从数据库都持有VIP,造成IP冲突,所以在网络不是很好的情况下,不建议采用keepalived服务。

在实际生产中使用较多的也是第二种,即在脚本中手动管理VIP,所以,对keepalived不感兴趣的童鞋可直接跳过第一种方式。

1. keepalived管理VIP

1> 安装keepalived

因为我这里设置了Candicate master,故只在Master和Candicate master上安装。

如果没有Candicate master,两个Slave的地位平等,则两个Slave上都需安装keepalived。

# wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
# tar xvf keepalived-1.2.24.tar.gz

# cd keepalived-1.2.24

# ./configure --prefix=/usr/local/keepalived

# make

# make install

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# mkdir /etc/keepalived

# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

2> 为keepalived设置单独的日志文件(非必需)

keepalived的日志默认是输出到/var/log/message中

# vim /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -d -S 0"


设置syslog

# vim /etc/rsyslog.conf

添加如下内容:

local0.*           /var/log/keepalived.log


# service rsyslog restart

2> 配置keepalived

在Master上修改

# vim /etc/keepalived/keepalived.conf

View Code
关于keepalived的参数的详细介绍,可参考:

LVS+Keepalived搭建MyCAT高可用负载均衡集群

keepalived工作原理和配置说明

将配置文件scp到Candicate master上

# scp /etc/keepalived/keepalived.conf 192.168.244.20:/etc/keepalived/

只需将配置文件中的priority设置为90

注意:我们为什么在这里设置keepalived为backup模式呢?

在master-backup模式下,如果主库宕掉,VIP会自动漂移到Slave上,当主库修复,keepalived启动后,还会将VIP抢过来,即使设置了nopreempt(不抢占)的方

式,该动作仍会发生。但在backup-backup模式下,当主库修改,并启动keepalived后,并不会抢占新主的VIP,即便原主的priority高于新主的。

3> 启动keepalived

先在Master上启动

# service keepalived start

env: /etc/init.d/keepalived: Permission denied


# chmod +x /etc/init.d/keepalived

# service keepalived start

查看绑定情况

# ip a

View Code
可见,VIP(192168.244.188)已经绑定到Master的eth0网卡上了。

启动Candicate master的keepalived

# service keepalived start

4> MHA中引入keepalived

编辑/usr/local/bin/master_ip_failover

相对于原文件,修改地方为93-95行

View Code

2. 通过脚本的方式管理VIP

编辑/usr/local/bin/master_ip_failover

View Code

master_ip_failover

View Code

masterha_secondary_check

View Code

send_report

View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: