ITPub博客

首页 > 应用开发 > IT综合 > 【Mysql】keepalive的安装与配置

【Mysql】keepalive的安装与配置

原创 IT综合 作者:小亮520cl 时间:2016-07-01 17:47:16 0 删除 编辑
参考文档:
http://blog.jobbole.com/100390/
http://lanlian.blog.51cto.com/6790106/1303195


环境:主库:192.168.6.119
         备库:192.168.6.121
         vip:  192.168.6.120


1 master与slave端都安装keepalive
  1. [root@MYSQL src]# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
  2. [root@MYSQL src]# tar -xf keepalived-1.2.12.tar.gz 
  3. [root@MYSQL src]# cd keepalived-1.2.12
  4. [root@MYSQL src]# yum -y install gcc gcc-c++ gcc-g77 ncurses-devel bison libaio-devel cmake libnl* libpopt* popt-static openssl-devel
  5. [root@MYSQL keepalived-1.2.12]# ./configure
  6. [root@MYSQL keepalived-1.2.12]# make && make install
  7. [root@MYSQL src]#mkdir /etc/keepalived/
  8.  
  9. [root@MYSQL src]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
  10. [root@MYSQL src]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
  11. [root@MYSQL src]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
  12. [root@MYSQL src]#cp /usr/local/sbin/keepalived /usr/sbin/

2. 配置 keepalived
  1. [root@MYSQL keepalived]# vi keepalived.conf 
  2. ! Configuration File for keepalived
  3.  
  4. global_defs {
  5.    notification_email {
  6.      acassen@firewall.loc
  7.      failover@firewall.loc
  8.      sysadmin@firewall.loc
  9.    }
  10.    notification_email_from Alexandre.Cassen@firewall.loc
  11.    smtp_server 192.168.200.1
  12.    smtp_connect_timeout 30
  13.    router_id LVS_DEVEL ##配置是为了标识当前节点,两个节点的此项设置可相同,也可不相同
  14. }

  1. vrrp_script chk_http_port {            ---配合脚本使用,比如说检查nginx是否存活,检查mysql是否存活等 
       script "/usr/local/keepalived/nginx.sh" #在这里添加脚本链接 
       interval 3       #脚本执行间隔 
       weight -2         #脚本结果导致的优先级变更  ###如果检测返回值不为真weight -2 表示减2,权重值降低,backup server权重值(99)>现Master(100-2)的,切换
    }

  1. vrrp_instance VI_1 {
  2.     state MASTER                   #指定A节点为主节点 备用节点上设置为BACKUP即可
  3.     interface eth0
  4.     virtual_router_id 51              #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP
  5.     priority 100              #主节点的优先级(1-254之间),备用节点必须比主节点优先级低 
  6.    ###nopreempt                     ###这个参数也可以防止切换到从库后,主keepalived恢复后自动切换回主库
  7.          advert_int 1
  8.     authentication {             #设置验证信息,两个节点必须一致
  9.         auth_type PASS 
  10.         auth_pass 1111
  11.     }

 track_script {
        chk_http_port     #添加脚本执行
    }
  1. virtual_ipaddress {
  2. 192.168.6.120                   =====vip,指定一个或多个vip
  3.     }
  4. }


上面的脚本简单的查看http进程是否存在,不存在就退出返回假。

点击(此处)折叠或打开

  1. #!/bin/bash
    A=`netstat -nputl|grep -i 80 |wc -l`
    if [ $A -eq 0 ];then
       exit 1;
       #/etc/init.d/keepalived stop
    fi


  1. 实验一:
  2. master与backup ip分别如下
  3. [root@node1 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
        inet 192.168.6.120/32 scope global eth0
        inet6 fe80::a00:27ff:fe7a:c69c/64 scope link 
           valid_lft forever preferred_lft forever
    [root@node2 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
        inet6 fe80::a00:27ff:fe03:1ba1/64 scope link 
           valid_lft forever preferred_lft forever


  4. 关闭主库http
  5. [root@node1 keepalived]# /etc/init.d/httpd stop
    Stopping httpd:                                            [  OK  ]

  6. 主库与从库ip:
  7. [root@node1 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
        inet6 fe80::a00:27ff:fe7a:c69c/64 scope link 
           valid_lft forever preferred_lft forever
  8. [root@node2 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
        inet 192.168.6.120/32 scope global eth0                          ---vip飘到从库了
        inet6 fe80::a00:27ff:fe03:1ba1/64 scope link 
           valid_lft forever preferred_lft forever


  9. 恢复主库http
  10. [root@node1 keepalived]# /etc/init.d/httpd start
    Start
    ing httpd:                                            [  OK  ]
  11. 主库与从库ip:
  12. [root@node1 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
        inet 192.168.6.120/32 scope global eth0                            ---vip又飘回主库了
        inet6 fe80::a00:27ff:fe7a:c69c/64 scope link 
           valid_lft forever preferred_lft forever
    [root@node2 keepalived]# ip a
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
        inet6 fe80::a00:27ff:fe03:1ba1/64 scope link 
           valid_lft forever preferred_lft forever


  13.   nopreempt 参数的作用:静止vip再飘回来(少用,根据情况配置)
    1. node1 node2 vip漂移过程(关闭主库http,恢复主库http) 原因
      无nopreempt  无nopreempt
      node1》node2》node1
      nopreempt 
      无nopreempt
      node1》node2》node2(vip不飘了) node1静止vip飘回去
      无nopreempt
      nopreempt 一直在node1上,飘不动 node2静止vip飘过去
      nopreempt 
      nopreempt 
      一直在nide1上,漂不动 node2静止vip飘过去



实验二:
  1. 配置文件为
    1. [root@node1 keepalived]# more keepalived.conf
      ! Configuration File for keepalived
       
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
      }


      vrrp_script chk_http_port {      
         script "/usr/local/keepalived/nginx.sh"     
      }


      vrrp_instance VI_1 {
          state MASTER
          interface eth0
          virtual_router_id 51    
          priority 99           
               advert_int 1
          authentication {      
              auth_type PASS 
              auth_pass 1111
          }


       track_script {
              chk_http_port    
          }
      virtual_ipaddress {
      192.168.6.120           
          }
      }

    脚本改为:若http服务失效,则kill keepalive进程

    1. #!/bin/bash
      A=`netstat -nputl|grep -i 80 |wc -l`
      if [ $A -eq 0 ];then
         #exit 1;
         /etc/init.d/keepalived stop
      fi

    和实验一的效果一样:vip先飘到从库,恢复http后,启动keepalive后又飘回主库,要想不飘回主库,改小权重

实验一二的区别:一个是通过权重来控制vip的飘逸。一个直接是控制keepalive进程的存活来控制vip的飘逸



3.如何在状态转换时进行通知?
  1. 1.要在状态转换是进行通知,需要定义通知脚本可以在

    vrrp_sync_group{

    }中定义,也可以在

    vrrp_instance{

    }中定义

    通过man keepalived命令可以查看通知脚本定义的两种方法

    第一种

    # to MASTER transition

    notify_master /path/to_master.sh

    # to BACKUP transition

    notify_backup /path/to_backup.sh

    # FAULT transition

    notify_fault "/path/fault.sh VG_1"

    第二种

    #arguments

    # $1 ="GROUP"|"INSTANCE"

    # $2 = name of group or instance

    # $3 = target state of transition

    # ("MASTER"|"BACKUP"|"FAULT")

    notify /path/notify.sh

    下面用一个脚本notify.sh实现状态转换通知的简单示例:

    1. #!/bin/bash
    2. #Author: MageEdu <linuxedu@foxmail.com>
    3. #description: An example of notify script
    4. #
    5. vip=192.168.6.120
    6. contact='root@localhost'
    7. notify(){
    8.     mailsubject="`hostname` to be $1: $vip floating"
    9.     mailbody="`date '+%F %H:%M:%S'`: vrrptransition, `hostname` changed to be $1"
    10.     echo $mailbody | mail -s"$mailsubject" $contact
    11. }
    12. case "$1" in
    13.     master)
    14.         notify master
    15.         exit 0
    16.     ;;
    17.     backup)
    18.         notify backup
    19.         exit 0
    20.     ;;
    21.     fault)
    22.         notify fault
    23.         exit 0
    24.     ;;
    25.     *)
    26.         echo 'Usage: `basename $0`{master|backup|fault}'
    27.         exit 1
    28.     ;;
    29. esac

    chmod +x notify.sh
  2. 主从配置文件修改
    1. [root@node1 keepalived]# more keepalived.conf
    2. ! Configuration File for keepalived
    3.  
    4. global_defs {
    5.    notification_email {
    6.      acassen@firewall.loc
    7.      failover@firewall.loc
    8.      sysadmin@firewall.loc
    9.    }
    10.    notification_email_from Alexandre.Cassen@firewall.loc
    11.    smtp_server 192.168.200.1
    12.    smtp_connect_timeout 30
    13.    router_id LVS_DEVEL
    14. }

    15. vrrp_script chk_http_port {
    16.    script "/usr/local/keepalived/nginx.sh"
    17.    interval 3
    18.    weight -2
    19. }

    20. vrrp_instance VI_1 {
    21.     state MASTER
    22.     interface eth0
    23.     virtual_router_id 51
    24.     priority 99
    25. # nopreempt
    26.          advert_int 1
    27.     authentication {
    28.         auth_type PASS
    29.         auth_pass 1111
    30.     }

    31.  track_script {
    32.         chk_http_port
    33.     }
    34.    

    35.    notify_master "/usr/local/keepalived/notify.sh master"
    36.    notify_backup"/usr/local/keepalived/notify.sh backup"
    37.    notify_fault"/usr/local/keepalived/notify.sh fault"

    38. virtual_ipaddress {
    39. 192.168.6.120
    40.     }
    41. }

  3. 测试:
    1. 关闭主库http服务
    2. [root@node1 ~]# /etc/init.d/httpd stop
    3. Stopping httpd: [ OK ]
    4. [root@node1 ~]# mail
    5. Mail version 8.1 6/6/93. Type ? for help.
    6. "/var/spool/mail/root": 1 message 1 new
    7. >N 1 root@localhost.local Thu Jun 30 21:10 16/716 "node1 to be backup:"

    8. [root@node2 keepalived]# mail
      Mail version 8.1 6/6/93.  Type ? for help.
      "/var/spool/mail/root": 1 message 1 new
      >N  1 root@localhost.local  Thu Jun 30 21:10  16/716   "node2 to be master:"

    9. 恢复主库http服务
    10. [root@node1 ~]# mail
      Mail version 8.1 6/6/93.  Type ? for help.
      "/var/spool/mail/root": 2 messages 1 new 2 unread
       U  1 root@localhost.local  Thu Jun 30 21:10  17/726   "node1 to be backup:"
      >N  2 root@localhost.local  Thu Jun 30 21:12  16/716   "node1 to be master:"

    11.    [root@node2 keepalived]# mail
      Mail version 8.1 6/6/93.  Type ? for help.
      "/var/spool/mail/root": 2 messages 1 new 2 unread
       U  1 root@localhost.local  Thu Jun 30 21:10  17/726   "node2 to be master:"
      >N  2 root@localhost.local  Thu Jun 30 21:12  16/716   "node2 to be backup:"




参考文档
http://kaifly.blog.51cto.com/3209616/1665729   --MySQL主库高可用 -- 双主单活故障自动切换方案
http://www.tuicool.com/articles/nYvuYf      ---
结合keepalived实现redis群集高可用故障自动切换

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-2121347/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1126984