LVS (Linux Virtual Server)

LVS 是基于Linux操作系统实现的一个高性能、高可用、负载均衡服务器。其可以将网络流量分发到多台服务器上,使得网络服务可以线性扩展,从而在大量用户请求时仍能保持较好的响应速度。

DR (Direct Routing)

Direct Routing 模式是LVS的工作模式之一,它是基于MAC地址的负载均衡。在这种模式下,客户端请求只经过负载均衡器到达真实服务器,而响应数据则直接从真实服务器返回给客户端,不经过负载均衡器。

Keepalived

Keepalived 是用于健康检查和故障恢复的软件。通常与LVS结合使用,以提供高可用性。如果主LVS服务器故障,Keepalived可以将服务切换到备用LVS服务器。

实验环境

服务器

主机名

IP地址

操作系统

管理节点

node11

192.168.80.11

Centos7.9

管理节点

node12

192.168.80.12

Centos7.9

登陆节点

node17

192.168.80.17

Centos7.9

登陆节点

node18

192.168.80.18

Centos7.9

实验步骤

在node11和node12上分别执行命令安装keepalived

yum -y install keepalived

在node11上修改配置文件/etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf
global_defs {
   #指定本机keepalaved名字(主从不能重复)
   router_id LVS_MASTER
}
​
vrrp_instance VI_1 {
    #声明成主服务器(MASTER)/声明成从服务器(SLAVE)
    state MASTER
    #定义相应网卡接口名称
    interface eth0
    #虚拟路由ID(主从应同步)
    virtual_router_id 51
    #Keepalaved主从服务器优先级(主服务器必须大于从服务器)
    priority 100
    #检查间隔,默认1秒
    advert_int 1
​
    authentication {
        #设置身份验证方式(PASS或HA)
        auth_type PASS
        #身份验证密码
        auth_pass 1111
    }
​
    virtual_ipaddress {
        #指定负载调度器(指定VIP的地址)
        192.168.80.188
    }
}
​
#定义虚拟主机(指定VIP地址以及端口)
virtual_server 192.168.80.188 22 {
    #服务器轮询间隔时间
    delay_loop 6
    #指定rr轮询算法
    lb_algo rr
    #指定DR模式
    lb_kind DR
    #指定数据转发协议
    protocol TCP
​
    #定义真实后端主机(指定IP地址以及端口)
    real_server 192.168.80.17 22 {
        #设置服务器权重
        weight 1
        #对真实后端主机TCP健康检查
        TCP_CHECK {
            #连接超时时间
            connect_timeout 3
            #重试时间间隔
            delay_before_retry 3
            #健康检查的连接端口
            connect_port 22
            #重试次数
            retry 3
        }
    }
​
    real_server 192.168.80.18 22 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 22
            #重试次数
            retry 3
        }
    }
}

在node12上修改配置文件/etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_BACKUP
}
​
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
​
    authentication {
        auth_type PASS
        auth_pass 1111
    }
​
    virtual_ipaddress {
        192.168.80.188
    }
}
​
virtual_server 192.168.80.188 22 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
​
    real_server 192.168.80.17 22 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 22
            retry 3
        }
    }
​
    real_server 192.168.80.18 22 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 22
            retry 3
        }
    }
}

在node11和node12上分别执行命令启动keepalived服务

systemctl start keepalived && systemctl enable keepalived && systemctl status keepalived

在登录节点node17、node18分别部署realserver.sh脚本

vim /root/realserver.sh
#!/bin/bash
#引入函数库,提供各种实用功能
.   /etc/rc.d/init.d/functions
​
#设置虚拟IP地址
VIP=192.168.80.188
#获取当前主机名
host=` /bin/hostname `
 
case  "$1"  in
     start)
         #关闭lo(本地回环接口)并立即重新启动它
         /sbin/ifconfig  lo down
         /sbin/ifconfig  lo up
         #设置ARP忽略和声明参数
         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/all/arp_ignore
         echo  2 >  /proc/sys/net/ipv4/conf/all/arp_announce
​
         #将VIP配置为lo接口的别名
         /sbin/ifconfig  lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
         #为VIP添加静态路由,使其通过lo:0接口路由
         /sbin/route  add -host $VIP dev lo:0
         echo  "LVS-DR real server Running."
     ;;
 
     stop)
         #删除lo:0别名接口
         /sbin/ifconfig  lo:0 down
         #将ARP设置恢复为默认值
         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/all/arp_ignore
         echo  0 >  /proc/sys/net/ipv4/conf/all/arp_announce
         echo  "LVS-DR real server Stopped."
     ;;
 
     status)
         #检查lo:0是否配置了VIP和路由
         islothere=` /sbin/ifconfig  lo:0 |  grep  $VIP`
         isrothere=` netstat  -rn |  grep  "lo:0"  |  grep  $VIP`
         #如果lo:0或路由不存在,则显示停止状态,否则显示正在运行
         if  [ !  "$islothere"  -o !  "isrothere"  ]; then
             # Either the route or the lo:0 device
             # not found.
             echo  "LVS-DR real server Stopped."
         else
             echo  "LVS-DR real server Running."
         fi
     ;;
 
     *)
         #如果没有给定已知参数,输出使用方法
         echo  "$0: Usage: $0 {start|status|stop}"
         exit  1
     ;;
esac

在登录节点node17、node18分别执行realserver.sh脚本

chmod 700 /root/realserver.sh
bash /root/realserver.sh start