keepalived :

  1、vrrp协议在Linux主机上以守护进程方式的实现;

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  2、能够根据配置文件自动生成ipvs规则;

  3、对各real server做健康检测;

vrrp: 虚拟路由冗余协议,当主机的下一跳出现故障时,由另一台路由器来代替出现故障的路由器进行工作;

  虚拟路由器:由一个master路由器和多个Backup路由器组成,主机将虚拟路由器当作默认网关。

 

 实验 : keepalived+LVS

 keepalived+LVS 随笔

MASTER:192.168.10.10  directory1  MASTER

BACKUP:   192.168.10.20  dirtrectory2  BACKUP

real server1:192.168.10.30

real server2:192.168.10.40

 

real server1、real server2 做为两台web服务器,进行测试,安装httpd,并配置

real server1:echo "192.168.10.30 real server111" > /var/www/html/index.html

real server2:echo "192.168.10.40 real server222" > /var/www/html/index.html

real server1、real server2 执行脚本如下(跟上start or stop):

#!/bin/bash
case $1 in
start)
        ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
        route add -host 192.168.10.100/32 dev lo:0
        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
        ;;
stop)
        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 -e "input: \033[4;31mstart | stop\033[0m"
        ;;
esac

 

MASTER :

]# yum -y install keepalived

]# yum -y install ipvsadm

]# cp /etc/keepalived/keepalived.conf{,.bak}

]# vim /etc/keepalived/keepalived.con

! 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  #设置连接邮件服务器的超时时间
   router_id LVS_DEVEL   #运行keepalived服务器的一个标识
  # vrrp_skip_check_adv_addr
  # vrrp_strict   #这个必须的注释掉,不然主机ping不通vip,无法实现调度
  # vrrp_garp_interval 0
  # vrrp_gna_interval 0
}

#健康检测
vrrp_script chk_test  #定义名称
{
	script "/etc/keepalived/test.sh"  #定义的这个脚本,会在后面的配置文件中调用
	interval 1  #间隔多少秒探测一次
	weight -2   #触发这个脚本权重-2
}

vrrp_instance VI_1 {
    state MASTER    #MASTER表示主服务器,BACKUP表示备用服务器。
    interface ens33 #网卡名称 
    virtual_router_id 51  #虚拟路由标识,0-255,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的(针对本机)
    priority 100  #定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1  #设定MASTER和BACKUP负载均衡之间同步检查的时间间隔,单位秒
    authentication {
        auth_type PASS  #设定验证类型,主要由PASS和AH两种
        auth_pass 1111  #设置验证密码,在一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {  #设置vip地址,可以设置多个vip,每行一个
        192.168.10.100/32
    }
    track_script {  #调用上面定义的脚本
    chk_test
    }
    #健康状态检测 : 外面定义对应的脚本,往后看
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/krrpalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"

}

#虚拟服务器定义部分
virtual_server 192.168.10.100 80 { #设置虚拟服务器。需要指定的vip和服务器端口,IP和端口之间用空格隔开
    delay_loop 6  #健康检测状态时间,单位秒
    lb_algo rr    #设置调度算法,rr,轮询
    lb_kind DR    #设置LVS实现负载均衡的机制,有NAT、TUN和DR三个模式
    persistence_timeout 50
#会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制。0为不可用

    protocol TCP  #指定转发协议类型,有TCP和UDP两种

           sorry_server 127.0.0.1 80 #当后端realserver全挂掉之后,directory可以将本地的页面提供上去,提示友好界面,如:服务器正在维护……

    real_server 192.168.10.30 80 {
        weight 1
#配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源
        HTTP_GET {
            url {
              path /  #请求地址为/ ,也就是/index.html或者index.php
	      status_code 200 #返回状态吗为200表示为OK
            }
            connect_timeout 3 #连接超时时长,3秒无响应超时
            nb_get_retry 3    #重试次数
            delay_before_retry 3  #重试间隔
  }
} real_server 192.168.0.40 80 { #配置 realserver2 weight 10 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } 文件接下来用不到的部分全部注释 :.,$s@^@#@g

 

]# vim /etc/keepalived/test.sh    #在/etc/keepalived/ 下面创建down文件,就可以实现,不关闭keepalived,实现  vip 切换

#!/bin/bash
[[ -f /etc/keepalived/down ]] && exit 1 || exit 0

  

]# vim /etc/keepalived/notify.sh

#!/bin/bash

vip=192.168.10.100
contact='root@localhost'

notify() {
	mailsubject="`hostname` to be $1: $vip floating"
	mailbody="`date '+%F %T'`: vrrp transition,`hostname` changed to be $1"
	echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in 
	master)
		notify master
		exit 0
		;;
	backup)
		notify backup
		exit 0
		;;
	fault)
		notify fault
		exit 0
		;;
	*)
		echo 'Usage:`basename $0` {master|backup|fault}'
		exit 1
		;;
esac

 

配置sorry_server的页面

]# yum -y install httpd 

]# echo "页面维护中 sorry ......" > /var/www/html/index.html

 

BACKUP 

重复上面MASTER步骤,不过/etc/keepalived/keepalived.conf 中有地方要改

]# vim /etc/keepalived/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
   router_id LVS_DEVEL  
  # vrrp_skip_check_adv_addr
  # vrrp_strict 
  # vrrp_garp_interval 0
  # vrrp_gna_interval 0
}


vrrp_script chk_test
{
	script "/etc/keepalived/test.sh"
	interval 1 
	weight -2 
}

vrrp_instance VI_1 {
    state BACKUP   ########改成BACKUP
    interface ens33
    virtual_router_id 51
    priority 99    ##########优先级 改一下
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass 1111 
    }
    virtual_ipaddress { 
        192.168.10.100/32
    }
    track_script { 
    chk_test
    }

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/krrpalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"

}


virtual_server 192.168.10.100 80 { 
    delay_loop 6 
    lb_algo rr  
    lb_kind DR 
    persistence_timeout 50


    protocol TCP 

    sorry_server 127.0.0.1 80	

    real_server 192.168.10.30 80 {
        weight 1

        HTTP_GET {
            url {
                  path /  
	          status_code 200 
                }
            connect_timeout 3
            nb_get_retry 3  
            delay_before_retry 3
                }  
} real_server 192.168.10.40 80 { weight 10 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }

 

]# systemctl start keepalived

]# ip addr show

[root@node1 keepalived]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:6e:e0:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.10/24 brd 192.168.10.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.10.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6e:e096/64 scope link 
       valid_lft forever preferred_lft forever

 

如果在MASTER这边停掉keepalived ,或者在/etc/keepalived/  touch一个down文件(因为前面配置中加载了自定义的脚本), 都能够是的192.168.10.100这个虚拟IP切换到BACKUP主机

 

#LVS 的规则会自动添加

[root@node1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.100:80 rr
-> 192.168.10.30:80 Route 1 0 0
-> 192.168.10.40:80 Route 1 0 0

轮询效果

[root@node1 keepalived]# curl 192.168.10.100
192.168.10.30 real server111
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.40 real server222
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.30 real server111
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.40 real server222

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄