LVS+Keepalived

1.  规划环境:

主机名称

服务器名称

IP

用途

centosnode1

LVS_Master

192.168.188.223

提供负载均衡

centosnode2

LVS_Backup

192.168.188.226

提供负载均衡

LVS-DR-VIP

192.168.188.100

网站的VIP地址

centosnode3

Web1服务器

192.168.188.227

提供Web服务

centosnode4

Web2服务器

192.168.188.228

提供Web服务

2.  配置LVS_Master的Keepalived实现LVS负载均衡:

[root@centosnode1 ~]# vim /etc/keepalived/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 MASTER
}

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

    virtual_ipaddress {
        192.168.188.100  ##设置vip
    }
}

virtual_server 192.168.188.100 80 {  ##定义虚拟服务,需指定IP地址和端口,空格隔开
    delay_loop 6  ##定义RS运行情况监测时间间隔
    lb_algo rr  ##设置负载均衡算法
    lb_kind DR  ##设置lvs的工作模式
    persistence_timeout 50   ##定义会话保持时间,S为单位
    protocol TCP  ##指定转发协议

    real_server 192.168.188.227 80 {  ##定义真实服务器IP地址和端口
        weight 1   ##定义RS的权重
        TCP_CHECK {  ##设置健康检查方式
          connect_timeout 8  ##定义超出8s连接超时
          nb_get_retry 3  ##定义重试次数
          delay_before_retry 3  ##定义重试时间间隔
          connect_port 80  ##定义健康检查端口
        }
    }
}

virtual_server 192.168.188.100 80 {  ##定义虚拟服务,需指定IP地址和端口,空格隔开
    delay_loop 6  ##定义RS运行情况监测时间间隔
    lb_algo rr  ##设置负载均衡算法
    lb_kind DR  ##设置lvs的工作模式
    persistence_timeout 50  ##定义会话保持时间,S为单位
    protocol TCP  ##指定转发协议

    real_server 192.168.188.228 80 {  ##定义真实服务器IP地址和端口
        weight 1  ##定义RS的权重
        TCP_CHECK {  ##设置健康检查方式
          connect_timeout 8  ##定义超出8s连接超时
          nb_get_retry 3  ##定义重试次数
          delay_before_retry 3  ##定义重试时间间隔
          connect_port 80  ##定义健康检查端口
        }
    }
}

3.  配置LVS_Backup的Keepalived实现LVS负载均衡:

[root@centosnode2 ~]# vim /etc/keepalived/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 MASTER
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.188.100  ##设置vip
    }
}

virtual_server 192.168.188.100 80 {  ##定义虚拟服务,需指定IP地址和端口,空格隔开
    delay_loop 6  ##定义RS运行情况监测时间间隔
    lb_algo rr  ##设置负载均衡算法
    lb_kind DR  ##设置lvs的工作模式
    persistence_timeout 50   ##定义会话保持时间,S为单位
    protocol TCP  ##指定转发协议

    real_server 192.168.188.227 80 {  ##配置后端真实服务器
        weight 1
        TCP_CHECK {  ##设置健康检查方式
          connect_timeout 8
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80 
        }
    }
}

virtual_server 192.168.188.100 80 {  ##定义虚拟服务,需指定IP地址和端口,空格隔开
    delay_loop 6  ##定义RS运行情况监测时间间隔
    lb_algo rr  ##设置负载均衡算法
    lb_kind DR  ##设置lvs的工作模式
    persistence_timeout 50  ##定义会话保持时间,S为单位
    protocol TCP  ##指定转发协议

    real_server 192.168.188.228 80 {  ##配置后端真实服务器
        weight 1
        TCP_CHECK {  ##设置健康检查方式
          connect_timeout 8
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80 
        }
    }
}

4.  后端多台服务器做acl限制,这里通过shell脚本来对后端服务器做acl限制

[root@centosnode3 ~]# vim /etc/init.d/lvs_rs 

#!/bin/bash 
# Startup script handle the initialisation of LVS 
# chkconfig: - 28 72 
# description: Initialise the Linux Virtual Server for DR 
### BEGIN INIT INFO # Provides: ipvsadm 
# Required-Start: $local_fs $network $named 
# Required-Stop: $local_fs $remote_fs $network 
# Short-Description: Initialise the Linux Virtual Server 
# Description: The Linux Virtual Server is a highly scalable and highly 
# available server built on a cluster of real servers, with the load 
# balancer running on Linux. 
# description: start LVS of DR-RIP 
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.188.100
. /etc/rc.d/init.d/functions
start() {
        PID=`ifconfig | grep lo:10 | wc -l`
        if [ $PID -ne 0 ];
        then
                echo "The LVS-DR-RIP Server is already running !" 
        else
                /sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
                /sbin/route add -host $VIP dev lo:10
                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/eth0/arp_ignore
                echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
                echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                /bin/touch $LOCK
                echo "starting LVS-DR-RIP server is ok !" 
        fi
}

stop() {
        /sbin/route del -host $VIP dev lo:10
        /sbin/ifconfig lo:10 down >/dev/null
        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/eth0/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        rm -rf $LOCK
        echo "stopping LVS-DR-RIP server is ok !" 
}

status() {
        if [ -e $LOCK ];
        then
                echo "The LVS-DR-RIP Server is already running !" 
        else
                echo "The LVS-DR-RIP Server is not running !" 
        fi
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        status)
                status
                ;;
        *)
                echo "Usage: $1 {start|stop|restart|status}" 
                exit 1
esac
exit 0

5.  启动多台后端服务器" /etc/init.d/lvs_rs "脚本:

##赋予脚本执行权限
[root@centosnode3 ~]# chmod +x /etc/init.d/lvs_rs

##启动脚本
[root@centosnode3 ~]# /etc/init.d/lvs_rs start

6.  启动centosnode1和centosnode2的lvs和keepalived服务:

##启动lvs
[root@centosnode1 ~]# systemctl start ipvsadm.service 

##启动keepalived
[root@centosnode1 ~]# systemctl start keepalived.service 

7.  开启后端两台web服务器,并设置web页面:

##设置web1服务器页面
[root@centosnode3 ~]# echo "this is page ip : 192.168.188.227" > /var/www/html/index.html

##启动web1的httpd服务
[root@centosnode3 ~]# systemctl start httpd

##设置web2服务器页面
[root@centosnode3 ~]# echo "this is page ip : 192.168.188.228" > /var/www/html/index.html

##启动web2的httpd服务
[root@centosnode3 ~]# systemctl start httpd

8.  查看LVS状态:

[root@centosnode1 ~]# 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.188.100:80 rr persistent 50
  -> 192.168.188.227:80           Route   1      0          0         
  -> 192.168.188.228:80           Route   1      0          0         

9.  测试LVS负载均衡是否正常:

[root@centosnode5 ~]# curl 192.168.188.100
this is page ip : 192.168.188.227
[root@centosnode5 ~]# curl 192.168.188.100
this is page ip : 192.168.188.228

10.  测试LVS健康检查:

##监控lvs状态
[root@centosnode1 ~]# watch ipvsadm -ln

 当前两台后端服务器都正常运行,使其中一台后端服务器的httpd服务关闭,模拟服务器故障,观察LVS健康检查是否正常。

[root@centosnode3 ~]# systemctl stop httpd

 11.  测试keepalived故障转移是否正常,是否会发生ip飘移:

由此可见当前vip地址在centosnode1主机上,然后模拟服务器故障,停掉keepalived服务。

[root@centosnode1 ~]# systemctl stop keepalived.service

 

再次查看vip,发现vip飘移到了centosnode2主机上。可以将centosnode1主机的keepalived服务再次开启,会发现vip又会飘移到了centosnode1主机上,因为keepalived默认配置抢占主服务器,优先级高的服务器,将抢占到vip。

 补充:1.  real_server中健康检查的方式:

        1>.  TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。

        2>.  HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。

        3>.  SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连。

        4>.  MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

                0) 检测成功。

                1) 检测失败,将从服务器池中移除。
                2-255 )检测成功;如果有设置 misc_dynamic ,权重自动调整为 退出码 -2 ,如退出码为 200 ,权重自动调整为198=200-2
        5>.  SMTP_CHECK :用来检测邮件服务的 smtp。
2.  健康检查的相关选项:
delay_loop 隔多长时间做一次健康检测,单位为秒 

connect_timeout 连接超时时间,单位为秒 

nb_get_retry 检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。 

delay_before_retry 失败重试的间隔时间,单位为秒

3.  健康检查的相关配置:

        1>.  以上示例就是TCP健康检查。

        2>.  HTTP_GET|SSL_GET:

HTTP_GET | SSL_GET 
{
url { 
path /  #HTTP/SSL 检查的url 可以是多个 
方式一:digest <STRING>  #HTTP/SSL 检查后的摘要信息 用工具genhash生成 
方式二:status_code 200  #HTTP/SSL 检查返回的状态码 
}
connect_port 80  #连接端口 
bindto <IPADD> 
connect_timeout 3  #连接超时时间 
nb_get_retry 3  #重连次数 
delay_before_retry 2  #连接间隔时间 
}

其中digest的摘要需要通过genhash工具得到:genhash工具使keepalived安装包中自带的。

##查看genhash工具版本
[root@centosnode1 ~]# ./genhash -h

##生成检查后的摘要信息

命令格式:genhash -s要生成摘要的后端服务器地址 -p 要生成摘要的端口 -u 检查的url

[root@centosnode1 ~]# genhash -s192.168.188.227 -p 80 -u /index.html
MD5SUM = ab9d2b22ae01e991a259a08feb1f1629

[root@centosnode1 ~]# genhash -s192.168.188.228 -p 80 -u /index.html
MD5SUM = 639870c3471db8868e37dcf972ea0df3

示例:

virtual_server 192.168.188.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.188.227 80 {
        weight 1

        HTTP_GET {
          url {
            path /index.html
            digest ab9d2b22ae01e991a259a08feb1f1629
          }
          connect_timeout 8
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80
        }
    }
}

virtual_server 192.168.188.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.188.228 80 {
        weight 1

        HTTP_GET {
          url {
            path /index.html
            digest 639870c3471db8868e37dcf972ea0df3
          }
          connect_timeout 8
          nb_get_retry 3
          delay_before_retry 3
          connect_port 80
        }
    }
}

        3>.  MISC:

MISC_CHECK { 
misc_path <STRING>|<QUOTED-STRING>  #外部程序或者脚本绝对路径 
misc_timeout <INT>  #执行脚本的超时时间 
misc_dynamic  #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的 权重(weight). 
#返回0:健康检查OK,权重不被修改 
#返回1:健康检查失败,权重设为0 
#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值