实战keepalived高可用集群解决方案

Keepalived定义

     Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现。

VRRP 协议简介
    VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
    虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。于安全性考虑,VRRP包使用了加密协议进行加密。

keepalived的配置文件
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域:

  • global_defs主要是配置故障发生时的通知对象以及机器标识
  • static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息
  • vrrp_script用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值
  • vrrp_instance用来定义对外提供服务的VIP区域及其相关属性
  • vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致

环境准备
Centos7系统,后端服务器提供web服务。
地址规划:

  • VS1: 172.18.51.7
  • VS2:172.17.51.77
  • RS1:172.18.51.74
  • RS2:172.18.51.75
  • VirtualIP:172.18.51.81

拓扑图:

实战keepalived高可用集群解决方案


     实验目标:   通过keepalived+lvs部署DR类型集群,实现高可用、负载均衡;主、备两台调度器均处于在线状态,当任意一台调度器宕机或出现故障时,VIP会“漂移”到另外一台服务器上,继续提供服务。

安装chrony程序包,部署时间服务器,同步各服务器时间

实战keepalived高可用集群解决方案

RS:提供httpd服务,定义web主页,启动服务


实战keepalived高可用集群解决方案

实战keepalived高可用集群解决方案

VS:当所有real server宕掉时,sorry
server
顶替,定义其主页,启动服务

实战keepalived高可用集群解决方案

实战keepalived高可用集群解决方案


RS的预配置脚本:   

vim setparam.sh
#!/bin/bash
        #
        vip=172.18.51.100
        mask='255.255.255.255'

        case $1 in
        start)
          echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
          echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
          echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
          echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

          ifconfig lo:0 $vip netmask $mask broadcast $vip up
          route add -host $vip dev lo:0
          ;;
        
         stop)
          ifconfig lo:0 down
          echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
          echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
          echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
          echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
          ;;
       
         *) 
          echo "Usage $(basename $0) start|stop"
          exit 1
      ;;
esac

启动 bash -x  setparam.sh start

VS配置:

        vs1和vs2的配置文件,主备模式、优先级不一样,其它地方一致;

VS1

[root@centos7 keepalived]#cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {                          #故障发生时给谁发邮件通知
   root@localhost
}
   notification_email_from keepalived@localhost         #通知邮件从哪个地址发出
   smtp_server 127.0.0.1                              #通知邮件的smtp地址
   smtp_connect_timeout 30                        #连接smtp服务器的超时时间
   vrrp_mcast_group4 224.0.101.24                 # 通过组播地址通告状态和优先级信息
}

vrrp_instance sr1 {
    state MASTER                           #MASTER或BACKUP
    interface ens33                      #节点固有IP(非VIP)的网卡,用来发VRRP包
    virtual_router_id 51                 #取值在0-255之间,用来区分多个instance的VRRP组播
    priority 100                        #设置优先级,选举master,取值范围1-255
    advert_int 1                        #健康查检时间间隔
    authentication {                   #认证区域,认证类型有PASS和HA(IPSEC),密码8位字符
        auth_type PASS
        auth_pass rE+szbuO
    }
        track_interface {    
        ens33                        #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
 }
   # nopreempt                      #非抢占模式
    virtual_ipaddress {    
        172.18.51.81/16 dev ens33 label ens33:0       #配置虚拟IP地址(vip)
    }
}


virtual_server 172.18.51.81 80 {                        
     delay_loop 6                                       #定义延迟轮询时间(单位秒)     
     lb_algo wrr                                        #设定VS的调用算法
     lb_kind DR                                        #设定lvs调度类型
     protocol TCP                                      #工作的协议
     sorry_server 127.0.0.1 80                         #当所有real server宕掉时,sorry server顶替
     real_server 172.18.51.74 80 {                     #真正提供服务的服务器RS1
             weight 1                                  #权重
             HTTP_GET {                                ##设置健康状态检测方法
                     url {                            
                         path /                         #定义要监控的URL;
                         status_code 200                  #判断上述检测机制为健康状态的响应码;
                     }
             connect_timeout 1                          #连接请求的超时时长
             nb_get_retry 3                            #重试次数
             delay_before_retry 1                       #下次重试的延迟时间
             }
     }
     real_server 172.18.51.75 80 {                    #真正提供服务的服务器RS2
             weight 1
             HTTP_GET {
                     url {
                             path /  
                             status_code 200
                     }
             connect_timeout 1
             nb_get_retry 3
             delay_before_retry 1    

             }
     }
}

VS2

[root@centos703 ~]# cd /etc/keepalived/
[root@centos703 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
   root@localhost
}
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   vrrp_mcast_group4 224.0.101.24
}

vrrp_instance sr1 {
     state BACKUP
     interface ens33
     virtual_router_id 51
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass rE+szbuO
    }
        track_interface {
        ens33
}
    nopreempt
    virtual_ipaddress {
       172.18.51.81/16 dev ens33 ens33 label ens33:0
    }
}


virtual_server 172.18.51.81 80 {                        
     delay_loop 6                                       
     lb_algo wrr                                             
     lb_kind DR                                           
     protocol TCP                                       
    sorry_server 127.0.0.1 80                          
    real_server 172.18.51.74 80 {                               
          weight 1                                          
          HTTP_GET {                                               
               url {                                                       
                   path /
                   status_code 200
                     }
            connect_timeout 1                      
            nb_get_retry 3                                      
            delay_before_retry 1                              
            }
     }

     real_server 172.18.51.75 80 {
             weight 1
             HTTP_GET {
                     url {
                             path /  
                             status_code 200
                     }
             connect_timeout 1
             nb_get_retry 3
             delay_before_retry 1    

             }
     }
}

启动服务:systemctl start keepalived.service,自动生成ipvs规则

实战keepalived高可用集群解决方案

通过客户端测试:

real
server正常时访问:轮询

实战keepalived高可用集群解决方案

关闭RS1上httpd 服务:  访问RS2页面

实战keepalived高可用集群解决方案

关闭RS2httpd 服务后,访问页面跳到sorry
server页面:

实战keepalived高可用集群解决方案

原创文章,作者:Mr-Xiao,如若转载,请注明出处:http://www.178linux.com/75935

(0)
Mr-XiaoMr-Xiao
上一篇 2017-05-16 09:28
下一篇 2017-05-16 19:42

相关推荐

  • 第七周-磁盘管理、RAID及Shell脚本练习

    一、创建一个10G分区,并格式为ext4文件系统; (1)、 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; (2)、挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@N1 ~]# mkfs.ext4 -b 2048 -m 2 -L MYDATA /…

    Linux干货 2017-08-13
  • 命令,Linux的独特魅力

    转眼又学了一个星期,那就来分享一下这个星期所学的知识吧! 这个星期学的都是各种命令,而这些命令就如同windoes里面画面上的各种选项,没有这些命令,那么你对它将无从下手。那下面就来看看这些命令的强大功能 help   man help(内部命令帮助),等同于man(外部命令帮助)。当你对一个命令不熟悉时,这两个命令将是你的救命符 选定一个命令,先…

    2017-07-22
  • Linux 第十天: Linux文件查找和压缩

      Linux 第十天: Linux文件查找和压缩                     使用Linux的时候, 经常需要查找文件, 在Linux中, 有很多方法可以做到这一点.…

    Linux干货 2016-08-18
  • shell脚本编程入门

    什么是shell脚本,其实,shell脚本就是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令(包含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能等这些命令的组合起来,以达到我们所想要的目的。 程序编程风格有两种: 过程式:以指令为中心,数据服务于指令。 对象式:以数据为中心,指令服务于数据。 过程…

    Linux干货 2016-08-18
  • 马哥教育网络班20期+第六周博客作业

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; ~]# cp -R /etc/rc.d/rc.sysinit /tmp/ ~]# vim /tmp/rc.sysinit   &nb…

    Linux干货 2016-07-22
  • 第4周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。     ~]# cp -r /etc/skel/ /home/tuser1     ~]# chmod 700 /home/tuser1/ 2、…

    Linux干货 2016-12-25