egjd 发表于 2013-9-13 09:51:52

使用keepalived搭建mysql主从备份、切换

mysql master/slave结构最大的缺点:当master宕机时不能切换到slave,这样就影响了业务的运行。为了弥补这个缺陷,我采用了keepalived+master/master结构。如图:



安装keepalived
tar zxf keepalived-1.2.8.tar.gzcd keepalived-1.2.8./configure --prefix=/opt/app/keepalived-1.2.8makemake install
在192.168.110.128上配置文件keepalived.conf
! Configuration File for keepalivedglobal_defs {   router_id MYSQL-HA}vrrp_instance keepalive_mysql {    state MASTER    interface eth0    virtual_router_id 51    priority 100    advert_int 1    preempt    authentication {      auth_type PASS      auth_pass 1111    }    virtual_ipaddress {      192.168.110.8/24    }}

在192.168.110.137上配置文件keepalived.conf





! Configuration File for keepalivedglobal_defs {    router_id MYSQL-HA}vrrp_instance keepalive_mysql {    state BACKUP    interface eth0    virtual_router_id 51    priority 99    advert_int 1    nopreempt    authentication {      auth_type PASS      auth_pass 1111    }    virtual_ipaddress {      192.168.110.8/24    }}说明:
配置上注意priority的值,192.168.110.128是master,优先级要高。
preempt表示抢占服务,当192.168.110.128恢复后,重新把服务抢过来。
keepalived默认网卡eth0和自身服务出现问题时才会切换。

通过编写脚本来监控mysql的状态进而控制keeepalived服务




#!/bin/bashMYSQL="/usr/bin/mysql"MYSQL_HOST=127.0.0.1MYSQL_USER=adminMYSQL_PASSWORD=adminLOG_FILE="/opt/app/keepalived/check_mysql.log"MYSQL_OK=1 # mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0check_mysql_helth(){$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p${MYSQL_PASSWORD} -e "show status" &>/dev/nullif [ $? = 0 ] ; then    MYSQL_OK=1else    MYSQL_OK=0fi                                                                                                                                                                                                                                                                                                return $MYSQL_OK}while :doCHECK_TIME=3while [ $CHECK_TIME -ne 0 ]do    let "CHECK_TIME -= 1"    check_mysql_helth    [ $MYSQL_OK == 1 ] && break                                                                                                                                                                                                                                                                                                if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]; then      pkill keepalived      echo `date --date=today +"%Y-%M-%d %H:%m:%S"` - - mysql invaild. keepalived stop. >> $LOG_FILE    fidonedone说明:

通过监控mysql服务状态来控制keepalived服务,这里mysql停掉则kill掉keepalived。

分别在两台机器上执行下面命令




shell>/opt/app/keepalived/sbin/keepalived -f/opt/app/keepalived/etc/keepalived/keepalived.conf -Dshell>nohup sh /opt/app/keepalived/bin/check_mysql.sh &把第二条命令写入/etc/rc.local。


测试:
> ip addr


>killall mysqld
查看192.168.110.137


此时192.168.110.137充当临时服务器。

恢复192.168.110.128上的业务后查看

此时业务被192.168.110.128抢占过来,192.168.110.137充当备份、临时服务器。


遗留的问题:
本来在keepalived使用vrrp_script和strack_script来监控这个脚本,但是测试过几遍脚本都不运行。
网上很多人都谈到这个问题,我不知道其他人怎么成功的
服务切换时可能会造成数据的部分丢失,但相比master/slave的缺点,这个不值一提,毕竟每个方案
不是完美的,只是根据业务场合来衡量。

qianqianling 发表于 2013-9-14 13:43:50

一时的冲动,子孙的危机!

zuier 发表于 2013-9-15 01:38:27

比我有才的都没我帅,比我帅的都没我有才!

yanqiufang 发表于 2013-9-18 00:24:34

如果没有毛片,中国的性教育简直就是一片空白!

高峰之巅 发表于 2013-9-18 09:55:59

啥时硬件也可以COPY就好了!

hb_sz 发表于 2013-9-19 19:55:42

走,MM,咱们化蝶去……

华风 发表于 2013-9-21 02:08:20

微机原理闹危机,随机过程随机过,实变函数学十遍,汇编语言不会编!
页: [1]
查看完整版本: 使用keepalived搭建mysql主从备份、切换