keepalived+lvs+负载均衡的windows实现

时间:2022-07-16 03:12:03

       关于这方面的文章网上一大堆,但是大部分都是写keepalived的配置问题,并没有说明白原理方面的东西,如果配置上稍微有点问题,都不知道问题出在什么地方,下面我写下keepalived的常用配置以及lvs的原理、负责均衡的工作原理。

1.keepalived和lvs是干什么的    

        LVS 是 Linux  Virtual Server ,Linux 虚拟服务器;是一个虚拟的 服务器集群 【多台机器 LB IP】;常用与实现外网对 一台虚拟主机的访问时,而虚拟主机负责将请求转移到真实的主机上面来,这样就实现了对外公开一个ip节点,内部有多个真实的服务器负责处理请求。
        keepalived主要用作realserver的健康状态的检查,和负责均衡主备机之间的failover的实现。主要用于上面lvs的辅助,上的多节点真实服务器处理同一个虚拟ip(lvs服务器)的请求时,如果真实服务器宕机,但是lvs并不能自动响应,不在将请求分配到这台真实的服务器节点上面来,而keepalived就实现了这样的功能,当真是的服务器节点宕机,keepalived的健康检查机制检查到了宕机的服务器不能再提供服务了,keepalived就将这个节点从虚拟ip(lvs服务器)上面剔除,保证对外提供的服务能够稳健的运行。

2.lvs的几种常见的模式(读懂这一部分需要有TCP封包的基础知识)

        DR模式(Direct Routing)【这个模式比较常用】

       (1)基本工作原理
                    1)client发送请求【package】到VIP(lvs服务器,下面统一用VIP,不再解释)
                    2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,把此请求的封包中的dest MAC地址(目的MAC地址)修改为realserver的MAC地址,将这个数据包广播到VIP所在的整个网段上面,ARP协议会将package发送到realserver上面(根据MAC地址),然后lvs服务器会将这个src ip-----> realserver之间的联系记录下来(为什么需要记录?因为client只能看见VIP并不能看见后面的realserver这个服务器,是lvs负责将请求转发到realserver服务器上面),此次链接没有断开之前,这个client发出的所有请求都将转发到这个realserver上面。
                    3)realserver收到package之后解析里面的dest ip(目的ip地址,对你没看到错就是解析这个ip,你要注意到这个时候解析到的这个ip地址是VIP的ip地址,因为client发出的请求是给VIP这个服务器的,而DR这个模式并没有将目的 ip转换为realserver的ip,所以这个模式的realserver需要配置一个环回适配器,下面的答疑环节还要解释这个问题,以及具体的配置方法都会给出)
                    4)因为realserver已经配置了VIP的环回适配器,所以当realserver收到这个package之后认为这个package是发送到本机的,然后realserver受理这个请求,然后将请求的结果发送出去(这个结果是通过环回适配器发送出去的,所以DR这个模式realserver和client是有直接通讯的【不太安全,但是比较快】)
        (2)注意事项:
                1)realserver必须绑定VIP的地址,就是每台realserver必须要配置环回适配器(将适配器的ip地址配置为VIP的地址)
                2)realserver和VIP必须在同一个网段(怎么判断是不是在同一个网段,可以去网上百度下子网掩码和ipv4,也可以看下我下面的博客)

         NAT模式:
        (1)基本原理:

                    1)client发送请求【package】到VIP;

                    2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,将收到 package的dest ip地址修改为realserver的ip地址;

                    3)realserver收到这个package之后,判断这个dest ip是本机ip就处理这个请求,然后将请求的结果发送到VIP;

                    4)VIP收到请求结果之后将请求结果的dest ip改为client ip,将src ip改为VIP;


           FULL NAT模式:

            (1)基本原理:

                     1)client发送请求【package】到VIP;

                    2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,将收到 package的dest ip地址修改为realserver的ip地址,将src ip修改为VIP的ip地址;

                   3)realserver收到这个package之后,判断是发送给自己的,然后就处理这个请求,将请求的结果发送到VIP上面;

                    4)VIP收到请求结果之后将请求结果的src ip修改为VIP的ip地址,将dest ip修改为clien的ip地址;

            

        IP TUNNEL模式:

                (1)基本原理:

                     1)client发送请求【package】到VIP;

                    2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,VIP会将收到的package重新包装到一个新的ip包里面,新的dest ip是realserver的ip地址;

                    3)realserver收到package之后,判断dest ip是本机,于是处理package,然后发现里面那层package的dest ip是VIP然后判断是不是本机(这里还是需要绑定VIP的ip地址到本机要不然直接就将封包丢弃了)

3.keepalived常用配置和说明

        keepalived的配置全都在keepalived.conf的配置文件中;
#全局定义块
global_defs {
    # 邮件通知配置
    notification_email {
        email1
        email2
    }#这个括号里面的内容是服务器故障的通知对象
    notification_email_from email       #指定发件人
    smtp_server host                    #指定smtp服务器地址
    smtp_connect_timeout num            #制定smtp服务器链接超时

    lvs_id string
    router_id string    ## 标识本节点的字条串,通常为hostname
}

#VRRP 实例定义块
vrrp_sync_group string { 
    group {
        string
        string
    }
}

vrrp_instance string {
    state MASTER|BACKUP         #指定该keepalived的初始状态
    virtual_router_id num        
    interface string            #vrrp实例绑定的接口

    mcast_src_ip @IP             #指定发送组播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
    priority num                #指定优先级,优先级高的将成为MASTER。
    advert_int num                #指定发送VRRP通告的间隔。单位是秒。
    nopreempt                    #设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。
    smtp_alert                   
    authentication {
        auth_type PASS|AH
        auth_pass string
    }

    virtual_ipaddress {  # Block limited to 20 IP addresses @IP
        @IP             #这里填写VIP服务器的对外的IP地址
        @IP
    }
}

#虚拟服务器定义块
virtual_server (@IP PORT)|(fwmark num) { 
    delay_loop num                        #健康检查的时间间隔。
    lb_algo rr|wrr|lc|wlc|sh|dh|lblc      #LVS调度算法。
    lb_kind NAT|DR|TUN                    #lvs工作模式,具体的原理见上面
    persistence_timeout num               #持久化超时时间,单位是秒。默认是6分钟。
    protocol TCP|UDP                      #4层协议。
    real_server @IP PORT { 
        weight num                        #给服务器指定权重。默认是1.
        notify_down /path/script.sh       #当服务器健康检查失败时,执行的脚本。
        TCP_CHECK { 
            connect_port num 
            connect_timeout num
        }
    }

    real_server @IP PORT {
        weight num
        MISC_CHECK {
            misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
        }
    }

    real_server @IP PORT {
        weight num
        HTTP_GET|SSL_GET {
            url { 
                # You can add multiple url block path alphanum
                digest alphanum
            }
            connect_port num
            connect_timeout num 
            nb_get_retry num 
            delay_before_retry num
        }
    }
}

4.答疑:

        1)为什么windows的真实主机需要配置IP地址为VIP的环回适配器?
            答:lvs的工作模式需要,lvs中DR,IP TUNNER工作模式,lvs服务器转发到realserver的package中的dest ip为VIP的IP地址,所以在windows中需要配置这个ip;而且在windows中需要执行下面的脚本
        
netsh interface ipv4 set interface "realserver网络接口名称" weakhostreceive=enabled
netsh interface ipv4 set interface "realserver网络接口名称" weakhostsend=enabled
netsh interface ipv4 set interface "环回网络接口名称" weakhostreceive=enabled
netsh interface ipv4 set interface "环回网络接口名称" weakhostsend=enabled
        2)为什么需要在windows上面执行上面的脚本
            答:因为在上面的lvs工作模式下,realserver收到封包之后,需要确认封包是传给本机的,这个时候接收封包的接口是realserver网络接口,而收到的封包是传送给VIP的,windows在默认情况下环回接口和真实接口是不能通信的,也就是说不输入上面的命令,realserver是没有办法识别封包是传送给本机的,当执行上面的脚本之后,realserver的真实接口和环回接口可以正常的通信了,就可以接收封包了。