使用keepalive+lvs實現mysql master-master自動故障轉移

1.準備機器,需要至少準備2臺機器
3.配置mysql雙機master-master實現,不再贅述,參見另一篇mysql mmm的博文
2.安裝lvs和keepalived和配置keepalived,參見http://www.keepalived.org/sery-lvs-cluster.pdf,注意lvs的最新版本是1.26,對應的是linux2.6.28以上內核版本,版本需要一致,
否則編譯不通過,查看內核版本命令: uname -r
3. 操作說明:
   1). keepalived啓動後會自動綁定虛ip到物理網卡上,比如eth0。如果主機不同時是mysql主機不需要realserver腳本。
   2). mysql主機,即不需要keepalived服務的主機,只需要安裝lvs模塊,並且需要配置realserver腳本,並且需要啓動此腳本。
       realserver裏配置的虛ip月keepalived裏配置的虛ip保持一致,虛ip一定要被綁定到lo上。這是由lvs/dr模式的處理方式決定的。(使用VS/DR方法:調度器和服務 器組都必須在物理上有一個網卡通過不分斷的局域網相連,如通過交換機或者高速的HUB相連。VIP地址爲調度器和服務器組共享,調度器配置的VIP地址是 對外可見的,用於接收虛擬服務的請求報文;所有的服務器把VIP地址配置在各自的Non-ARP網絡設備上,它對外面是不可見的,只是用於處理目標地址爲 VIP的網絡請求。在VS/DR中,調度器根據各個服務器的負載情況,動態地選擇一臺服務器,不修改也不封裝IP報文,而是將數據幀的MAC地址改爲選出 服務器的MAC地址,再將修改後的數據幀在與服務器組的局域網上發送。因爲數據幀的MAC地址是選出的服務器,所以服務器肯定可以收到這個數據幀,從中可 以獲得該IP報文。當服務器發現報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,然後根據路由表將響應報文直接返回給客戶。
   3).keepalived需要安裝1.2.1版本,否則sorry server的切換會有問題
   4).自動切換原理是:keepalived realserver列表只配置一臺mysql主機,sorry server配置另一臺主機,這樣在realserver正常情況下,sorry server不會被切換,
      只充當備機,只有realserver出故障時才切換到sorry server,keepalived的sorry server天生具有這個特性。
   5). iptables防火牆配置,keepalived的master與backup之間需要保證心跳,這樣才能保證其相互切換,如果iptables不進行特殊配置,則不會正常切換。配置如下:
       -I INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT                                                                                                                                    
       -A INPUT -p 112 -i eth0 -j ACCEPT
       -A OUTPUT -p 112 -o eth0 -j ACCEPT
 4. 具體操作:
 
 1) keepalived master主機和mysql master主機:10.3.1.24
    keepalived backup主機: 10.3.1.18
    mysql slave 主機:10.3.1.23
   
    虛ip:10.3.1.56
   
 2) keepalived master(10.3.1.24)配置:
 
        global_defs {
        lvs_id LVS_HA_MASTER
    }
    vrrp_sync_group DBGROUP {
    group {
        VI_MYSQL
       }
    }
    vrrp_instance VI_MYSQL {                                                                                                                                                           
          state MASTER
          interface eth0
          lvs_sync_daemon_inteface eth0
          virtual_router_id 59
          priority 200
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              10.3.1.56
          }
     }
     
    virtual_server 10.3.1.56 3306 {
       delay_loop 3
       lb_algo wlc
       lb_kind DR
       # persistence_timeout 20
       protocol TCP
      
       sorry_server 10.3.1.23 3306
      
       real_server 127.0.0.1 3306 {
          weight 100
          TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
          }
       }
    }
   
3) mysql master realserver(10.3.1.24)腳本:

        #!/bin/bash
    #desciription : start realserver
    MYSQLHA=10.3.1.56
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
    echo " start LVS of REALServer"
    /sbin/ifconfig lo:0 $MYSQLHA broadcast $MYSQLHA netmask 255.255.255.255 up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
    stop)
    /sbin/ifconfig lo:0 down
    echo "close LVS Directorserver"
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    esac
4) keepalived backup(10.3.1.18)配置:

       global_defs {
        lvs_id LVS_HA_BACKUP  #注意這兒與master不同
    }
    vrrp_sync_group DBGROUP {
    group {
        VI_MYSQL
       }
    }
    vrrp_instance VI_MYSQL { 
          state BACKUP #注意這兒,與master不同
          interface eth0
          lvs_sync_daemon_inteface eth0
          virtual_router_id 59
          priority 100   #注意這兒,與master不同
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              10.3.1.56
          }
     }
     
    virtual_server 10.3.1.56 3306 {
       delay_loop 3
       lb_algo wlc
       lb_kind DR
       # persistence_timeout 20
       protocol TCP
      
       sorry_server 10.3.1.23 3306
      
       real_server 10.3.1.24 3306 {
          weight 100
          TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
          }
       }
    }

5) mysql slave realserver(10.3.1.23)腳本:

        #!/bin/bash
    #desciription : start realserver
    MYSQLHA=10.3.1.56
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
    echo " start LVS of REALServer"
    /sbin/ifconfig lo:0 $MYSQLHA broadcast $MYSQLHA netmask 255.255.255.255 up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
    stop)
    /sbin/ifconfig lo:0 down
    echo "close LVS Directorserver"
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    esac
   
6). 防火牆配置:

   vi /etc/sysconfig/iptables
  
   add:
   -I INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT                                                                                                                                    
   -A INPUT -p 112 -i eth0 -j ACCEPT
   -A OUTPUT -p 112 -o eth0 -j ACCEPT
  
   保存後重啓:service iptables restart
 
 7).啓動
 
 keepalive master: service keepalived start
 mysql master: /usr/local/bin/realserver start
 
 調用ip add 命令會看到:
 
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 10.3.1.56/32 brd 10.3.1.56 scope global lo:0
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether f4:ce:46:b4:35:40 brd ff:ff:ff:ff:ff:ff
    inet 10.3.1.24/8 brd 10.255.255.255 scope global eth0
    inet 10.3.1.56/32 scope global eth0
    inet6 fe80::f6ce:46ff:feb4:3540/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether f4:ce:46:b4:35:44 brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0


keepalived backup啓動: service keepalived start

調用ip add 命令會看到:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    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 qlen 1000
    link/ether f4:ce:46:89:63:98 brd ff:ff:ff:ff:ff:ff
    inet 10.3.1.18/8 brd 10.255.255.255 scope global eth0
    inet6 fe80::f6ce:46ff:fe89:6398/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether f4:ce:46:89:63:9c brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
   
注意不會綁定任何ip


msyql slave: /usr/local/bin/realserver start

調用ip add 命令會看到:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 10.3.1.56/32 brd 10.3.1.56 scope global lo:0
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether f4:ce:46:b4:31:58 brd ff:ff:ff:ff:ff:ff
    inet 10.3.1.23/8 brd 10.255.255.255 scope global eth0
    inet6 fe80::f6ce:46ff:feb4:3158/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether f4:ce:46:b4:31:5c brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0

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