keepalived結合MHA實現mysql高可用


本例結合本博另一篇文章 MHA-大殺器實現MYSQL單主宕機時,VIP漂移實現高可用,環境請參考上一篇文章


本例使用keepalived-1.1.20.tar.gz版本




[root@node1 keepalived-1.1.20]# ./configure --sysconf=/etc/ #此項表示設置keepalived的根目錄


如果編譯報錯“configure: error: Popt libraries is required” 則yum -y install popt-devel


[root@node1 keepalived-1.1.20]# make && make install


[root@node1 keepalived]# cp /usr/local/sbin/keepalived /usr/sbin/   #拷貝命令文件



#####################主機的配置文件設置####################


[root@node1 keepalived]# cat /etc/keepalived/keepalived.conf 

! Configuration File for keepalived


global_defs {#全局配置項

   router_id node1#本機標識號,設置全局唯一

}

vrrp_script check_run {#設置檢測服務的腳本

script "/root/check_mysql.sh"

interval 1#每隔一秒檢測一次

}


vrrp_instance mha {    #定義keepalived組

    state MASTER#定義本機的keepalived狀態

    interface eth0#設置監聽網卡

    virtual_router_id 100#設置虛擬router-id,所有keepalived的機器都得是一樣

    priority 100   #設置權值,master必須高於backup

    advert_int 5#定義master與backup之間同步檢查間隔,單位是秒

    track_interface {#設置監聽網卡組

eth0

eth1

}

    authentication {#設置keepalived組的驗證類型和密碼,所有主機須一樣

        auth_type PASS

        auth_pass 1111

    }

track_script {#設置服務監測腳本運行

check_run

}

    virtual_ipaddress {#設置VIP

        10.2.16.250/24 

    }

}


#####################備機的配置文件設置####################


[root@node2 ~]# cat /etc/keepalived/keepalived.conf 

! Configuration File for keepalived


global_defs {

   router_id node2

}


vrrp_script check_run {

        script "/root/check_mysql.sh"

        interval 1

}


vrrp_instance mha {

    state BACKUP

    interface eth0

    virtual_router_id 100

    priority 99

    advert_int 5

track_interface {

eth0

eth1

}

 track_interface {

        eth0

        eth1

        }

  track_script {

        check_run

        }

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

10.2.16.250/24

    }

}



mysql服務檢測腳本內容,按需修改:


[root@node2 ~]# cat check_mysql.sh 

#!/bin/bash

MYSQL=/usr/bin/mysql

MYSQL_HOST=127.0.0.1

MYSQL_USER=root

MYSQL_PASSWORD=123456

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;" --password=123456 >/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



啓動Keepalived:


[root@node1 ~]#service keepalived start


啓動日誌:

[root@node1 ~]# tail -f /var/log/messages

Jun 27 11:48:47 node2 Keepalived: Starting VRRP child process, pid=21545

Jun 27 11:48:47 node2 Keepalived_vrrp: Registering Kernel netlink reflector

Jun 27 11:48:47 node2 Keepalived_vrrp: Registering Kernel netlink command channel

Jun 27 11:48:47 node2 Keepalived_vrrp: Registering gratutious ARP shared channel

Jun 27 11:48:47 node2 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.

Jun 27 11:48:47 node2 Keepalived_vrrp: Configuration is using : 65535 Bytes

Jun 27 11:48:47 node2 Keepalived_vrrp: Using LinkWatch kernel netlink reflector...

Jun 27 11:48:47 node2 Keepalived_vrrp: VRRP_Instance(mha) Entering BACKUP STATE

Jun 27 11:48:47 node2 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(9,10)]

Jun 27 11:48:47 node2 Keepalived_vrrp: VRRP_Script(check_run) succeeded



Jun 27 11:49:03 node2 Keepalived_vrrp: VRRP_Instance(mha) Transition to MASTER STATE

Jun 27 11:49:08 node2 Keepalived_vrrp: VRRP_Instance(mha) Entering MASTER STATE

Jun 27 11:49:08 node2 Keepalived_vrrp: VRRP_Instance(mha) setting protocol VIPs.

Jun 27 11:49:08 node2 Keepalived_vrrp: VRRP_Instance(mha) Sending gratuitous ARPs on eth0 for 10.2.16.250

Jun 27 11:49:13 node2 Keepalived_vrrp: VRRP_Instance(mha) Sending gratuitous ARPs on eth0 for 10.2.16.250



查看 VIP:

[root@node1 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:c5:22:55 brd ff:ff:ff:ff:ff:ff

    inet 10.2.16.253/24 brd 10.2.16.255 scope global eth0

inet 10.2.16.250/24 brd 10.2.16.255 scope global eth0

    inet6 fe80::20c:29ff:fec5:2255/64 scope link 

       valid_lft forever preferred_lft forever

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:c5:22:5f brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1

    inet6 fe80::20c:29ff:fec5:225f/64 scope link 

       valid_lft forever preferred_lft forever


  此VIP用ifconfig看不到,但是真實存在的。


##########給keepalived 生成的VIP進行mysql登錄授權###########


注意:兩臺機器都需要執行:


mysql> grant all on *.* to 'root'@'10.2.16.250' identified by '123456';


  

####check_mysql.sh 需要在兩臺機器上都存在


  

  ###############keepalived+mha+check_mysql運行原理#################

  

  實現VIP飄移,需要將node1的Mysql服務停掉,此時keepalived中運行的腳本會檢測mysql,檢測到mysql掛了之後,會pkill keepalived

  當BACKUP-keepalived檢測到主keepalived掛掉之後,會自動啓動VIP,而MHA檢測到master的mysql掛掉之後,也會將Master移至BAKCUP上

  此時所有的權限都移至Mysql-backup上,並且他已經成爲MASTER,接替宕機的master所有工作,從而實現高可用。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章