利用lvs+keepalived实现负载均衡

原理

当客户端向服务器请求服务时,前端负载均衡服务器接受请求,此时先是根据lvs的调度算法来决定将请求发送给哪个服务器节点,然后根据自己的工作模式(3种)来决定如何将请求发送给节点服务器,节点服务器又如何将处理结果发送给客户端。
由于lvs/DR模式使用最广,故此处只介绍lvs的DR模式:
客户端向服务器请求服务,此时源IP为CIP,目的IP为VIP,请求到达负载端时,根据lvs的调度算法(10种)决定将请求发送给哪个RS,再根据lvs的DR工作模式(DR模式下,不修改IP地址,不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址)将数据帧发送给RS,RS响应完毕之后直接将响应发送给客户端,不需要经过LB。

keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

         其中的专业术语
        LB:                                     负载均衡器
        DS:Director Server。        指的是前端负载均衡器。
        RS:Real Server。            后端真实的工作服务器。
        VIP:                        向外部直接面向用户请求,作为用户请求的目标的IP地址。
        DIP:Director Server IP,    主要用于和内部主机通讯的IP地址。
        RIP:Real Server IP,        后端服务器的IP地址。
        CIP:Client IP,             客户端的IP地址。

实现步骤:

  • 1、四台虚拟机,两台做前端负载(一台主,一台备),两台做后台真实服务器,IP地址分配如下:
    • DR1:192.168.64.21
    • DR2:192.168.64.22
    • RS1:192.168.64.61
    • RS2:192.168.64.62
    • VIP:192.168.64.23
  • 2、虚拟机启动后看是否安装有ipvsadm,keepalived,httpd,否则自行利用yum安装。(ipvsadm是用作规则配置与查看的,keepalived用作检查服务器是否健康,http用作测试)。注意要关闭selinux和防火墙,否则可能出现问题。
  • 3、在DR1上配置/etc/keepalived/keepalived.conf(配置了此文件,不再需要配置ipvsadm)
global_defs {
    router_id LVS_Server 指定标识该机器的route_id
}
vrrp_instance VI_1 {
        state MASTER                                 #指定该keepalived节点的初始状态
        interface eth0                                   # 实例绑定的VIP接口,用于发送VRRP包
        virtual_router_id 51                          # 指定VRRP实例ID
        priority 100                                      #指定优先级,优先级高的将成为MASTER
      #  nopreempt                                       #设置为不抢占。默认是抢占的
        advert_int 1 
        authentication {
            auth_type PASS                         #指定认证方式
            auth_pass password                  #指定认证所使用的密码。
        }
        virtual_ipaddress {  
            192.168.64.23            #指定VIP地址
        }
    }
    virtual_server 192.168.64.23 80  {
        delay_loop 3  
        lvs_sched rr                                    #LVS的调度算法
        lvs_method                                #LVS 模式
       nat_mask 255.255.255.0
       persistence_timeout 50                    #在50秒内会被连接到同一台真实服务器
        protocol TCP                                   #4层协议
        real_server 192.168.64.61 80 {
            weight 1
            TCP_CHECK {
                connect_port 80
                connect_timeout 3
                nb_get_retry 3                          #get尝试次数
                delay_before_retry 10               #在尝试之前延迟多长时间
            }
        }
        real_server 192.168.64.23 80 {                    #注:在真实服务器设置的端口必须与虚拟机设置的端口一致
            weight 1
            TCP_CHECK {
                connect_port 80
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 10
            }
        }
    }
  • 直接将DR1的keepalived的配置文件拷贝至DR2的/etc/keepalived/keepalived.conf,并做以下修改:
    vrrp_instaance的state由MASTER改为BACKUP
    priority 的值由100 改为90
  • 在DR1和DR2上 sysctl –w net.ipv4.ip_forward=1 (cat /proc/sys/net/ipv4/ip_forward 查看确认为1则不需要),RS则不需要
  • 手动在rs端绑定虚拟IP(也可以使用脚本)
    ip addr add 192.168.64.23 dev lo label lo:0
    手动在rs端抑制arp响应
    cat >>/etc/sysctl.conf<.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.lo.arp_ignore=1
    net.ipv4.conf.lo.arp_announec=2
    EOF
    sysctl -p
  • 分别在几台虚拟机设置hosts文件,并保持一致。
  • 4、开启服务:
  • 在两台DR上分别开启keepalived,network和httpd服务,(http也可不开),在两台RS上开启httpd,network服务,在客户端开启httpd服务用作测试。
  • 在RS1上执行
        echo  "192.168.64.61" >> /var/www/html/index.html
  • 在RS2上执行
        echo "192.168.64.62" >> /var/www/html/index.html
  • 5、测试
    在客户端浏览器上输入http://192.168.64.23,不断进行刷新,可以看到交替显示192.168.64.61和192.168.64.62(可能会长时间登录一台服务器,这与keepalived.conf里面persistence_timeout 50 的设置有关,还可能是浏览器缓存的问题。)

    在DR1上查看“ipvsadm -L -n” ,如果各个服务器都正常则可以看到两个连接成功的服务器,使用”ip a”可以看到虚拟IP192.168.64.23在DR1上,在DR2上查看则不显示虚拟IP,此时,模拟DR1断网,则只能在DR2上看到虚拟IP了,若恢复DR1的网络,则只能在DR1上看到虚拟IP,这样就利用keepalived实现了高可用。

  • 6、出现的问题及解决方案:
    如果所有设置没问题却只能在DR1或DR2上看到一个连接的服务器,则注意查看keepalived.conf的TCP_CHECK {},此处应有空格。
    每次对DR上的规则做修改之后一定要重新启动keepalived的服务,可以使用“ipvsadm -C”清除规则

你可能感兴趣的:(keepalived,lvs)