mysql高可用方案mha_mysql高可用方案MHA

一、MHA优缺点

优点:

1、  MHA自动化主服务器故障转移,快速将从服务器晋级为主服务器(通常在10-30s),而不影响复制的一致性,不会有性能损耗,容易安装,不必更改现有的部署环境,适用于任何存储引擎。

2、  MHA提供在线主服务器切换,改变先正运行的主服务器到另外一台上,这个过程只需0.5-2s的时间,这个时间内数据无法写入。MHA Manager通过ssh连接mysql slave服务器。

3、  使用半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此他们彼此保持一致性。

缺点:

1、    虽然MHA试图从宕机的主服务器上保存二进制日志,但也会有问题。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失最新数据。

2、    当主DB故障,切换到另外的服务器上后,即使恢复了原来的主DB,也不能立即加入整套MHA系统中,得重新部署。而且当发生一次切换后,管理节点的监控进程就会自动退出,需要用脚本来自动启动。另外还得删除app1.failover.complete这个文件,否则新的主DB出现问题MHA就不会切换了。

MHA节点包含三个脚本,依赖perl模块;

save_binary_logs:保存和复制当掉的主服务器二进制日志;

apply_diff_relay_logs:识别差异的relay log事件,并应用于其他salve服务器;

purge_relay_logs:清除relay log文件;

yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

2.下载管理端:wget

3.配置管理节点的配置文件:

vim /etc/app.cnf

[server default]

user=mhauser

password=mhauser123

manager_workdir=/masterha/app1

manager_log=/masterha/app1/manager.log

remote_workdir=/masterha/app1

ssh_user=root

repl_user=rep

repl_password=rep123

ping_interval=1

[server1]

hostname=192.168.0.183

ssh_port=2208

master_binlog_dir=/data

no_master=1

[server2]

hostname=192.168.0.201

ssh_port=2208

master_binlog_dir=/data

candidate_master=1

[server3]

hostname=192.168.0.200

ssh_port=2208

master_binlog_dir=/data

candidate_master=1

4.将0.183 0.200 0.201 三台机器建立ssh无密钥登录:

分别每台执行:ssh-keygen -t rsa

分别在每台机器/root/.ssh目录下创建:authorized_keys

把本机的与其他的两台机器的/root/.ssh/id_rsa.pub内容全部复制到authorized_keys内,三台机器同样的操作

5.测试ssh无密钥登录是否成功

管理端:

[iyunv@mongodb1 .ssh]# masterha_check_ssh --conf=/etc/app.cnf

Wed Aug 21 12:39:18 2013 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Wed Aug 21 12:39:18 2013 - [info] Reading application default configurations from /etc/app.cnf..

Wed Aug 21 12:39:18 2013 - [info] Reading server configurations from /etc/app.cnf..

Wed Aug 21 12:39:18 2013 - [info] Starting SSH connection tests..

Wed Aug 21 12:39:26 2013 - [debug]

Wed Aug 21 12:39:18 2013 - [debug]  Connecting via SSH from

从添加主库信息

slave stop;

change master to master_host='192.168.0.200',master_user='slave',master_password='jinslavecin',master_port=3307,master_log_file='binlog3307.000005',master_log_pos=358;

set read_only=1

set relay_log_purge=0

7.添加管理账号,并验证同步

每台服务器添加管理账号:

grant all on *.* to

Thu Aug 22 17:03:56 2013 - [info] Checking replication health on 192.168.0.201..

Thu Aug 22 17:03:56 2013 - [info]  ok.

Thu Aug 22 17:03:56 2013 - [info] Checking replication health on 192.168.0.183..

Thu Aug 22 17:03:56 2013 - [info]  ok.

Thu Aug 22 17:03:56 2013 - [warning] master_ip_failover_script is not defined.

Thu Aug 22 17:03:56 2013 - [warning] shutdown_script is not defined.

Thu Aug 22 17:03:56 2013 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

出现上述字样证明同步正常。

可能还会遇到如下错误:

Can’t exec “mysqlbinlog”: No such file or directory at /usr/share/perl5/vendor_perl/MHA/BinlogManager.pm line 99.

mysqlbinlog version not found!

解决办法将mysqlbinlog所在目录放到每台机器的PATH当中.

#vi ~/.bashrc或vi /etc/bashrc,然后在文件末尾添加

PATH="$PATH:/usr/local/mysql/bin"

export PATH

8.启动MHA管理:

nohup masterha_manager --conf=/etc/app3306.cnf /masterha/app1/manager.log 2>&1 &

masterha_stop --conf=/etc/app3306/cnf

9..中继日志文件清理

由于slave机器都设置relay_log_purge=0(禁用中继日志自动清除),因此必须定期对旧的中继日志文件进行清理.

每台slave设置cron job定期清除中继日志:

配置清除relay-log 的计划任务

00 00 * * * /usr/bin/purge_relay_logs --user=root --password=rootpass --disable_relay_log_purge >> /var/log/purge_relay_logs.log 2>&1

10.恢复原来的主服务器

–orig_master_is_new_slave切换时加上此参数是将原master变为slave节点,如果不加此参数,原来的master将不启动

–running_updates_limit=10000 切换时候选master如果有延迟的话,mha切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为s),但是切换的时间长短是由recover时relay日志的大小决定

手动在线切换mha,切换时需要将在运行的mha停掉后才能切换。

在备库先执行DDL,一般先stop slave,一般不记录mysql日志,可以通过set SQL_LOG_BIN = 0实现。然后进行一次主备切换操作,再在原来的主库上执行DDL。这种方法适用于增减索引,如果是增加字段就需要额外注意

ps auxf|grep masterha_manager|grep -v grep|awk '{print $2}'|xargs kill

masterha_master_switch --master_state=alive --conf=/etc/app3306.cnf --orig_master_is_new_slave

11.mha上层可以通过keepalive部署VIP,程序连接数据库使用VIP,从而实现后台数据库的故障切换透明化.master_ip_failover脚本附件中奉上!

在发现主库down,根据输出日志信息,mha做一下操作

1:发现主库不可用,masterha_secondary_check 和save_binary_logs 两脚本检测从库是否可达,检测主库binlog 是否可用。并发出failover 信号。

2:检查主库server1,三次不可通后确认无法使用,确定server1 的mysql 不可用,但主机ssh 可达。

3:开始Dead Master Shutdown Phase 阶段,调用master_ip_failover 脚本.

4:开启master_recovry_phase,找到所有slaves 己读到的binlog 位置,若生产环境下从库读取不一致,则以最新的为准从dead_master 上获取最新的binlog。将dead_master存在但未同步到从上的binlog 保存下来

5:开始Determining New Master Phase 段段,寻找备用master,原则为设置candidate_master, 拥有最新的binlog。标记为no_master 的server永不会设为备主。然后开始failover,mysql 架构由120( 主库) ,121(备主),122为从库。

6:开始New Master Diff Log Generation Phase 阶段,应用差异日志到新主库。确定新主当前的master_log_file,master_log_pos。

7:应用差异日志到所有从库,应用完成后,关闭新主server2 的read_only 选项,对应用可读可写。

8:在所有从库上执行change master。清除新主库的slave 信息,reset slave,完成failover。

9:最后调用send_report 脚本,发送报警短信或是邮件通知dba.

(12)主从配置keepalived ,主从的priority设置不同,权重大的为主状态

[iyunv@centos1 keepalived-1.2.2]# more /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id mha

}

vrrp_script check_run {

script "/root/check_mysql.sh"

interval 1

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

check_run

}

virtual_ipaddress {

192.168.8.123

}

}

[iyunv@centos1 ~] vi check_mysql.sh

#!/bin/bash

MYSQL=/usr/local/mysql/bin/mysql

MYSQL_HOST=127.0.0.1

MYSQL_USER=root

MYSQL_PASSWORD=

CHECK_TIME=3

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1

function check_mysql_helth (){

$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -e "show status;" >/dev/null 2>&1

if [ $? = 0 ] ;then

MYSQL_OK=1

else

MYSQL_OK=0

fi

return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

let "CHECK_TIME -= 1"

check_mysql_helth

if [ $MYSQL_OK = 1 ] ; then

CHECK_TIME=0

exit 0

fi

if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

then

pkill keepalived

exit 1

fi

sleep 1

done

此脚本不能检测MySQL 正常运行,不能正常,就关闭keepalived,释放虚拟IP.

你可能感兴趣的:(mysql高可用方案mha)