lvs和keepalived安装配置

    本文主要记录下lvs和keepalived安装配置以及使用。由于要做HA集群,还要做LB集群,HA要搭建主从需要2台服务器,LB集群rs服务器也至少需要2台。

    测试环境信息

主机ip

角色

安装软件

192.168.149.137

Lvs+keepalived MASTER

Ipvsadm keepalived

192.168.149.138

Lvs+keepalived MASTER

Ipvsadm keepalived

192.168.149.129

Real server

Nginx(用于测试)

192.168.149.139

Real server

Nginx(用于测试)

192.168.149.150

VIP

 

 一、安装LVS

(1)在137、138上分别执行

yum install ipvsadm –y
ipvsadm   (执行ipvsadm(modprobe ip_vs)把ip_vs模块加载到内核)
lsmod |grep ip_vs   #查看IPVS加载到内核没有

二、安装HA集群

(1)在第一台主dir服务器上安装keepalived

     yum install -y keepalived   (需要提前安装epel)

(2)配置

    LVS的DR模式没有端口转发功能。调度器对包暴露的端口和服务器对外提供的服务使用的端口必须是一致的。

    vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER              #配置主,若是从改成BACKUP
    interface ens33            #注意网卡,须是本机的网卡
    virtual_router_id 51      #id号
    priority 100              #优先级,100最高,若是从改成100以下
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.149.150        #VIP,即对外的IP,用户访问的IP。可以添加多个VIP
    }
}

#下面是配置VIP对应的真实服务器,也可以添加多个VIP配置
virtual_server 192.168.149.150 80 {
    delay_loop 6              #每隔多少秒keepalived监测rs的状态
    lb_algo rr               #设置分发的算法
    lb_kind DR               #设置分发的模式,这里使用DR模式演示
    persistence_timeout 0     #同一个IP连接访问在多少秒内被分发到同一个rs上,这里改成0,如果是60,那么会在60秒内一直被连接到同一个rs上。
    protocol TCP
    #真实服务器的配置,注意IP和端口
    real_server 192.168.149.129 80 {
        weight 100            #权重
        TCP_CHECK {
        connect_timeout 10    #10秒无响应超时
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 }
    #第二台rs服务器
    real_server 192.168.149.139 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 }
 
}




如果需要同时检测后端服务器上2个应用的端口,可以使用如下配置

real_server 192.168.10.119 80 {
        weight 100
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
    }
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 18080
    }
 }
View Code

(3)在第二台从dir安装keepalived

     yum install -y keepalived

    配置将上面的第一台的keepalived.conf文件可以覆盖第二台的文件,然后只需要修改vrrp里面的

vrrp_instance VI_1 {
    state BACKUP              #配置主,若是从改成BACKUP
    interface ens33            #注意网卡,须是本机的网卡
    virtual_router_id 51      #id号
    priority 90              #优先级,100最高,若是从改成100以下

(4)自定义keepalived 日志

    keepalived的日志默认存储在/var/log/messages

    vim /etc/sysconfig/keepalived
    修改 KEEPALIVED_OPTIONS="-D -d -S 0"
    # --dump-conf -d 导出配置数据
    # --log-detail -D 详细日志信息
    # --log-facility -S 设置本地的syslog设备,编号0-7
    # -S 0 表示指定为local0设备

    vim /etc/rsyslog.conf #修改系统日志配置
    local0.* /var/log/keepalived.log #将keepalived产生的所有日志信息存到
    /var/log/keepalived.log文件中
    service rsyslog restart #重启日志服务
    service keepalived restart #重启keepalived

三、安装LB集群

    因为在keepalived里面的算法设置的是DR模式,所以需要根据DR模式设置

    1、在real server 129、139分别安装nginx,并修改html里内容以供测试使用

    2、分别在主从dir上配置DR模式

开启路由转发: echo 1 > /proc/sys/net/ipv4/ip_forward

    3、在real server 129、139上配置DR模式脚本并执行

vim /opt/lvs_dr.sh

#!/bin/bash
vip=192.168.149.150              #虚拟IP
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
#添加主机路由,为了回复数据包的时候经过l0网卡,是数据包的源IP是VIP,不是必须的操作。
route add -host $vip 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

    查看

lo:0      Link encap:Local Loopback  
          inet addr:192.168.149.150  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

4、启动服务

    分别在主从dir上启动keepalived
    systemctl start keepalived
    keepalived正常运行后,会启动3个进程,其中一个是父进程,负责监控其子进程。一个是vrrp子进程,另外一个是checkers子进程。

[root@ ~]# ps -ef | grep keep
root      47386  47323  0 10:47 pts/0    00:00:00 grep --color=auto keep
root     197314      1  0  2018 ?        00:02:52 /usr/sbin/keepalived -D -d -S 0
root     197315 197314  0  2018 ?        00:50:52 /usr/sbin/keepalived -D -d -S 0
root     197316 197314  0  2018 ?        00:18:22 /usr/sbin/keepalived -D -d -S 0

5、查看确认

    可在第一台主dir上看到

    1)ipvsadm -ln 看到规则

[root@localhost opt]# 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.149.150:80 rr
  -> 192.168.149.129:80           Route   100    0          0         
  -> 192.168.149.139:80           Route   100    0          0    

    2)ip addr看到vip

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:33:b3:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.149.137/24 brd 192.168.149.255 scope global noprefixroute dynamic ens33
       valid_lft 1582sec preferred_lft 1582sec
    inet 192.168.149.150/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b44f:9b9c:fc71:cf11/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::3f72:e44a:efb6:34b6/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

四、测试

1、访问vip地址
    正常情况下会一次访问到129,一次访问到139

[root@localhost keepalived]# curl http://192.168.149.150
test1
[root@localhost keepalived]# curl http://192.168.149.150
test2
[root@localhost keepalived]# curl http://192.168.149.150
test1
[root@localhost keepalived]# curl http://192.168.149.150
test2

2、停止129上的nginx
    可以在第一台主dir上,使用ipvsadm -ln 看到没有了192.168.149.129这个规则了

[root@localhost opt]# 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.149.150:80 rr    
  -> 192.168.149.139:80           Route   100    0          0 

    此时访问vip会一直请求到139

[root@localhost keepalived]# curl http://192.168.149.150
test1
[root@localhost keepalived]# curl http://192.168.149.150
test1
[root@localhost keepalived]# curl http://192.168.149.150
test1

3、停掉第一台主dir
    在第一台dir主上:systemctl stop keepalived
    可以看到vip已经到了从的dir 138上

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9b:12:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.149.138/24 brd 192.168.149.255 scope global noprefixroute dynamic ens33
       valid_lft 1573sec preferred_lft 1573sec
    inet 192.168.149.150/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3f72:e44a:efb6:34b6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

    此时访问vip,仍可以正常访问
    开启停掉的第一台主dir
    VIP又重新回到主的dir 137

五、lvs配置persistence_timeout 参说明

    virtual_server配置了persistence_timeout 连接保持,意思就是在这个一定时间内会讲来自同一用户(根据ip来判断的)访问到同一个real server。
    配置连接保持后用户访问到哪个后端由persistence_timeout和lvs的超时共同决定。
    lvs的超时ipvsadm -L --timeout查看:

[root@localhost ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300

    lvs的连接ipvsadm -Lcn查看:

[root@localhost ~]# ipvsadm -Lcn
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:09  FIN_WAIT    x.x.x.x:25420 192.168.10.122:80  192.168.10.120:80
TCP 00:12  NONE        x.x.x.x:0   192.168.10.122:80  192.168.10.120:80

    当一个client访问vip的时候,ipvs或记录一条状态为NONE的信息,expire初始值是persistence_timeout的值,然后根据时钟逐渐变小,在以下记录存在期间,同一client ip连接上来,都会被分配到同一个后端。
    FIN_WAIT的值就是tcp tcpfin udp的超时时间,当NONE的值为0时,如果FIN_WAIT还存在,那么NONE的值会从新变成60秒,再减少,直到FIN_WAIT消失以后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到统一real server。
    注:网上建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收

常用指令

常用命令:

查看LVS上当前的所有连接
# ipvsadm -Lcn   
或者
#cat /proc/net/ip_vs_conn
查看虚拟服务和RealServer上当前的连接数、数据包数和字节数的统计值,则可以使用下面的命令实现:
# ipvsadm -l --stats
查看包传递速率的近似精确值,可以使用下面的命令:
# ipvsadm -l --rate

ip addr  show dev bond0
ip addr
ipvsadm -S -n
命令查看转发规则
ipvsadm -L -n -c
查看timeout
ipvsadm --list --timeout
Timeout (tcp tcpfin udp): 900 120 300
设置timeout
ipvsadm --set 7200 5 60

ipvsadm –set 120 50 50 

/sbin/ifconfig lo:0 down
View Code

LVS DR模型介绍(参考网上文章)

原理图

 

 

    ①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
    ②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
    ③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
    注意:需要设置lo接口的VIP不能响应本地网络内的arp请求。

b IP 包调度过程图

 

 小结

    1、通过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。
    2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)
    3、因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面
    4、RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制。
    5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。
    6、由于 DR 模式的调度器仅做 MAC 地址的改写,所以调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。
    7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。

d 抑制arp

    在LVS DR模式当中,LB和后端的RS共用一个VIP(对外提供服务),为了保证客户端在请求VIP能得到LB的MAC地址,我们需要在后端的RS上配置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

    arp_ignore = 1即不回应不是目标IP是物理网络IP的ARP请求。确保了客户端请求VIP的时候只会得到LB的MAC地址。
    arp_announce = 2即RS在回复客户端的时候,发送的ARP请求不以自己的VIP的为源IP,确保了不会更新上端路由的ARP缓存,从而保证以后客户端请求VIP的时候读取路由器ARP缓存会得到LB的MAC地址。
    说明:
        arp_ignore-INTEGE:
        定义目标地址为本地IP的ARP询问不同的应答模式
        0-(默认值):回应任何网络接口上对本地IP地址的arp查询请求
        1-只回答目标IP地址是来访问网络接口本地地址的ARP查询请求
        2- 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来自网络接口的子网的内。
        3- 不回应网络界面的ARP请求,而且只对设置的唯一和连接地址做出回应。
        4-7- 保留未使用
        8-不回应所有(本地地址)的ARP查询
        arp_announce-INTEGER:
        “0″代表是用ip包的源地址来设置ARP请求的源地址。
        “1″代表不使用ip包的源地址来设置ARP请求的源地址,如果ip包的源地址是和该端口的IP地址相同的子网,那么用ip包的源地址,来设置ARP请求的源地址,否则使用”2″的设置。
        “2″代表不使用ip包的源地址来设置ARP请求的源地址,而由系统来选择最好的接口来发送
        当内网的机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

持久化机制

    用ipvsadm –Lnc 查看

[root@~]# ipvsadm -Lnc|more
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:59  FIN_WAIT    61.154.115.109:8342 192.168.149.150.:80  192.168.149.129:80
TCP 01:54  FIN_WAIT    27.19.208.3:50167  192.168.149.150:80  192.168.149.129:80
TCP 03:57  ESTABLISHED 115.214.236.231:16991 192.168.149.150:80  192.168.149.129:80

    如果用户配置了持久化时间persistence_timeout,当客户端的请求到达LB后,IPVS会在记录表里添加一条state为NONE的连接记录。该连接记录的源IP为客户端IP,端口为0,超时时间为上面所说的持久化时间persistence_timeout,会逐步减小。当NONE的超时时间减到0时,如果IPVS记录中还存在ESTABLISHED或FIN_WAIT状态的连接,则persistence_timeout值会刷新为初始值。

    在该NONE状态的连接记录存在的期间,同一客户端IP的消息都会被调度到同一个RS节点。(NONE状态连接不是表示一条具体的连接,而是代表一个客户端IP过来的连接的模板,源端口用0表示。具体的连接会在IPVS上记录具体的连接状态,会显示具体的源端口)。

    FIN_WAIT前面的超时时间就是tcp|tcpfin|udp中的tcpfin的值。在IPVS记录的每一条连接中,如果客户端发起了FIN断连,则IPVS中记录的连接状态会从ESTABLISHED变为FIN_WAIT。该值超时后,FIN_WAIT状态的记录直接消失。

    还有一个细节要注意,如果用户没有配置持久化时间persistence_timeout,那么在ipvsadm -lnc查询的记录里面是不会生成NONE记录模板的,因为此时不需要持久化。但是!!!ipvsadm -lnc记录中还是会生成ESTABLISHED记录的,后续同一客户端(IP+PORT)的请求都会调度给同一个服务器,直到该连接达到了TCP空闲连接超时时间后,ESTABLISHED记录消失,ipvs才会重新调度该客户端的请求。这个机制是必须的,不能算作持久化(持久化针对的是同一客户端IP,可以是不同端口)。因为TCP在传输的过程中可能出出现报文分片,如果ipvs把来自同一客户端(IP+PORT)的不同分片调度给了不同的服务器,那么服务器收到报文分片后无法重新组合报文。

 

posted @ 2019-06-24 10:37  泉love水  阅读(2786)  评论(0编辑  收藏  举报