CentOS7.8 搭建LVS+keepalived


  LVS Linux virtual server 的简写

Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台实现负载均衡集群功能。Windows只能装客户端, 在19985月由章文嵩博士组织成立,中国内最早自由软件之一

 以下是LVS的官方中文资料

标题                        地址
LVS项目介绍                  http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的体系结构             http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP负载均衡技术      http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的负载调度             http://www.linuxvirtualserver.org/zh/lvs4.html

  ARP 缓存表是双刃剑

1、主机有了ARP缓存表,可以加快ARP解析速度,减少局域网的广播风暴。

2、正是有了ARP缓存表,给恶意黑客带来了攻击服务器的风险,这就是ARP欺骗攻击。

3、切换路由器,负载均衡等设备时,可能会导致短时网络中断。(案例,更换路由器的时候可能会出现,IP连接上了,就是上不了网,这个就是ARP缓存表出现的问题,需要重新缓存每台机器的ARP缓存表,平滑重启每台机器的网卡)

  ARP广播而进行的新地址解析

  linux 下的具体命令

  /sbin/arping -I eth0 -c 3 -s 10.0.0.162 10.0.0.253

  /sbin/arping -U -I eth0 10.0.0.162

  NAME  arping -send ARP REQUEST to a neighbour host

  SYNOPSIS  arping [ -c count] [ -w dead-line ] [ -s source ] -I interdace destination

LVS负载均衡调度技术是在Linux内核中实现的,因此被称之为Linux虚拟服务器

使用该软件配置LVS时,不能直接配置内核中的ipvs 而需要使用ipvs的管理工具ipvsadm进行管理,后面会使用Keepalived软件直接管理ipvs 并不通过ipvsadm来管理ipvs  ipvs的管理工具 ipvsadm管理ipvs

名称

缩写

说明

虚拟IP地址(Virtual ip Address) VIP

VIP

VIPDirector用于向客户端计算机提供服务的IP地址(高可用keepalive)

真实IP地址(Real Server IP Address)

RIP

在集群下面节点上使用的IP地址,物理IP地址。

DirectorIP地址(Directir IP Address)

DIP

Director用于连接外网的IP,物理网卡的IP地址是负载均衡器上的IP

客户端主机IP地址(Client IP Address)

CIP

客户端计算机请求集群服务器的IP地址,作用是发送给集群请求的源IP

LVS集群内部的节点称为真实的服务器Real Server也叫RIP,也叫集群节点,请求集群服务的计算机称为客户端(CIP

LVS的四中工作模式最常用的DR模式

DRDirector Route)路由模式

支持高并发,多达数万
客户端 <-----------<-----------<-----------------<-----------<----网关---<-------------
 | (Client)                                                                         |
 | 客户端访问的是VIP的地址                             绑定lo网卡VIP-32位,抑制ARP响应 |
外网                                  |---->------ Real Server ---------------------->|
 |                                    |绑定lo网卡VIP-32位,抑制ARP响应                 | 
 |           request DMacT            |---->----- Real Server ----------------------->|
 |->--->--->----LVS(LB)------->-------- VLAN  | 接收CIP,响应给网关                    |
            Director (VIP)            |---->----- Real Server------------------------>|
         不更改源和目标地址,会更改目标MAC地址实现转发

DR模式的九大特点

1、通过在调度器上LB上修改数据包的目的的MAC地址实现转发,源IP仍然是客户端的IP,目的IP地址仍然是VIP
2、请求报文警告调度器,而RS响应出来后的报文无需警告调度器LB,因此并发访问量大使用效率很高(和NAT模式比)
3、DR模式是通过MAC地址的改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网中(小缺点)。
4、需要注意RS节点的VIP绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题,抑制没有接网线的那个网卡响应ARP广播。
5、RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(RS带有外网IP地址的情况),理讲,只要RS可以出外网即可,不是必须配置外网IP。
6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此调度器LB无法改变请求报文目的端口(和NAT要区别)。
7、当前调度器LB支持几乎所有的UNIX/LINUX系统,但目前不支持Windows系统,真实服务器RS节点可以是Windows系统
8、总的来说DR模式效率很高,但是配置也比较麻烦,因此访问量不是特别大的公司可以用haproxy/nginx取代,符合运维原则:简单、易用、高效,日1000-2000万PV或请求1万以下都可以考虑aproxy/nginx(LVS NAT模式)。
9、直接对外的访问业务,例如:web服务器做RS节点,RS最好用公网IP地址,不直接对外的业务,如数据库、存储系统节点最后用内部IP地址。

机器IP规划及需要安装的软件

机器名称

IP地址

需要安装的软件

角色

K-l1

192.168.10.181

Ipvsadmkeepalived

Keepalivedmaster

K-l2

192.168.10.182

Ipvsadmkeepalived

Keepalivedslave

RS1

192.168.10.183

nginx

RS2

192.168.10.184

nginx

VIP

192.168.10.188

 

 

 

一:基础优化(所有机器)

1、时间同步
echo "#time sync by fage at 2017-7-22" >>/var/spool/cron/root && echo "*/5 * * * *  /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root && systemctl restart crond.service

2、关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s#SELINUX=enforcing#SELINUX=disable#g /etc/selinux/config

3、更改主机名
hostname K-l1
echo "K-l1" >/etc/hostname

hostname K-l2
echo "K-l2" >/etc/hostname

hostname RS1
echo "RS1" >/etc/hostname

hostname RS2
echo "RS2" >/etc/hostname

4、更改hosts文件
cat >/etc/hosts <


二:安装软件

1RS1RS2 安装 nginx

yum install -y nginx

2K-L1K-L2安装

yum install -y ipvsadm keepalived 

3、配置抑制lo回环响应,RS1RS2上执行

cat lvs-rs.sh 

#!/bin/bash
vip=192.168.10.188
ifconfig  lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev lo:0
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
sysctl -p >/dev/null 2>&1

#执行脚本bash lvs-rs.sh

查看ip a

#复制到另外一台

scp lvs-rs.sh root@192.168.10.184:~

#执行脚本bash lvs-rs.sh

查看ip a

三:keepalived节点配置

主节点master配置

cat /etc/keepalived/keepalived.conf

global_defs{
  router_id LVS_DEVEL
  }
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.188
    }
}

virtual_server 192.168.10.188 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    real_server 192.168.10.183 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.10.184 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

2、keepalived从节点配置文件

cat /etc/keepalived/keepalived.conf

global_defs{
  router_id LVS_DEVEL
  }
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.10.188
    }
}

virtual_server 192.168.10.188 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    real_server 192.168.10.183 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.10.184 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

3Keepalived 2个节点开启流量转发

echo 1 > /proc/sys/net/ipv4/ip_forward

4、启动RS两个节点的nginx

systemctl start nginx

5、启动keepalived,注意先启动主后启动从

systemctl start keepalived.service && systemctl enable keepalived.service

6、测试漂移切换,在keepalived主节点停止keepalived查看

systemctl stop keepalived.service 

[root@K-l1 ~]# systemctl start keepalived.service && systemctl enable keepalived.service
[root@K-l1 ~]# ip a | grep global
    inet 192.168.10.182/24 brd 192.168.10.255 scope global noprefixroute eth0
    inet 192.168.10.188/32 scope global eth0
[root@K-l1 ~]# systemctl stop keepalived.service 
[root@K-l1 ~]# ip a | grep global

keepalived从节点查看IP是否能看到VIP

[root@K-l2 ~]# ip a | grep global
    inet 192.168.10.182/24 brd 192.168.10.255 scope global noprefixroute eth0
    inet 192.168.10.188/32 scope global eth0
[root@K-l2 ~]# 

四:记录keepalived日志

1、修改/etc/sysconfig/keepalived日志保存路径

sed -i s/KEEPALIVED_OPTIONS=\"-D"/KEEPALIVED_OPTIONS=\"-D -d -S 0"/gp /etc/sysconfig/keepalived

2、添加rsyslog记录日志存放位置

echo "local0.*                  /var/log/keepalived.log" >>/etc/rsyslog.conf

3、重启rsyslog日志服务和keepalived服务

systemctl restart rsyslog && systemctl restart keepalived.service

4、检查日志文件是否存在和记录日志

ls /var/log/keepalive.log
tail -3  /var/log/keepalive.log

验证LVS是否部署否成功

在本地或者浏览器测试访问查看是否能查看流量状态

[root@K-l1 ~]# 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.188:80 rr
  -> 192.168.10.183:80            Route   1      3          0         
  -> 192.168.10.184:80            Route   1      3          0         
[root@K-l1 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.188:80                   2       18        0     2371        0
  -> 192.168.10.183:80                   1        6        0      254        0
  -> 192.168.10.184:80                   1       12        0     2117        0
[root@K-l1 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 07:03  ESTABLISHED 192.168.10.1:63628 192.168.10.188:80  192.168.10.183:80
TCP 01:08  FIN_WAIT    192.168.10.1:63695 192.168.10.188:80  192.168.10.184:80
TCP 09:59  ESTABLISHED 192.168.10.1:63669 192.168.10.188:80  192.168.10.184:80
TCP 07:03  ESTABLISHED 192.168.10.1:63627 192.168.10.188:80  192.168.10.184:80
TCP 01:08  FIN_WAIT    192.168.10.1:63696 192.168.10.188:80  192.168.10.183:80
TCP 09:59  ESTABLISHED 192.168.10.1:63670 192.168.10.188:80  192.168.10.183:80
[root@K-l1 ~]# 

至此部署完成