Keepalived简介

什么是Keepalived:keepalived可以实现服务 的高可用或热备,用来防止单点故障的问题;而Keepalived的核心VRRP协议,VRRP协议主要实现了在路由器或三层交换机处的冗 余;Keepalived就是使用VRRP协议来实现高可用的;下面一起来看一下Keepalived的原理图:

LVS+Keepalived实现高可用负载均衡

 

Keepalived启动后会有三个进程:

父进程:内存管理,子进程管理

子进程:VRRP子进程

子进程:healthchecker子进程

由上图可知:两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程 度,例如HTTP,LVS等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告, 并且去掉虚拟IP,转换为BACKUP状态


环境介绍

230731940

系统版本:CentOS 6_x86_64

LVS_DR模式:WEB1与WEB2服务器的网关不能设置为LVS调度器


一、安装配置LVS+Keepalived

1、在Master与Backup服务器上分别安装Ipvsadm、Keepalived软件包、这里使用的是rpm包安装方式

[root@master ~] # yum -y install ipvsadm keepalived
[root@backup ~] # yum -y install ipvsadm keepalived
注释:这里安装Ipvsadm工具主要是为了查看lvs规则使用,不安装ipvsadm工具也能成功配置规则,但不方式查看

2、修改Master的主配置文件

[root@master ~] # vim /etc/keepalived/keepalived.conf
! Configuration File  for  keepalived
global_defs {
    notification_email {       #设置报警通知邮件地址,可以设置多个
     root@localhost
    }
    notification_email_from admin@allen.com   #设置邮件的发送地址
    smtp_server 127.0.0.1         #设置smtp server的地址,该地址必须是存在的
    smtp_connect_timeout 30       #设置连接smtp server的超时时间
    router_id LVS_ALLEN           #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
}
vrrp_instance lvs_allen {        #定义VRRP实例,实例名自定义
     state MASTER                 #指定Keepalived的角色,MASTER为主服务器,BACKUP为备用服务器
     interface eth0               #指定HA监测的接口
     virtual_router_id 68         #虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
     priority 100                 #优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
     advert_int 1                 #设置主备之间同步检查的时间间隔单位秒
     authentication {             #设置验证类型和密码
         auth_type PASS           #验证类型有两种{PASS|HA}
         auth_pass 1689           #设置验证密码,在一个实例中主备密码保持一样
     }
     virtual_ipaddress {          #定义虚拟IP地址,可以有多个,每行一个
     172.16.14.10
     }
}
virtual_server 172.16.14.10 80 {     #设置虚拟服务器,需要指定虚拟IP与服务端口,用空格分隔
     delay_loop 6                 #设置健康状态检查时间,单位为秒
     lb_algo rr                   #设置负载高度算法,rr为轮询
     lb_kind DR                   #设置LVS实现负载均衡的机制,可以为{NAT|TUN|DR}三种
     nat_mask 255.255.0.0         #设置掩码
     persistence_timeout 50       #会话保持时间,单位为秒;这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案
     protocol TCP                 #指定转发协议类型可以设置{TCP|UDP}两种
     real_server 172.16.14.3 80 {     #服务服务节点,需要指定Real_server的IP与端口,用空格分隔
         weight 1                 #配置服务节点的权重,数字越大,权重越高
         HTTP_GET {               #设置检测Realserver的方式为Http协议
             url {          
               path /
           status_code 200    #设定返回状态码为200表示Realserver是存活的
             }
             connect_timeout 3    #设置响应超时时间
             nb_get_retry 3       #设置超时重试次数
             delay_before_retry 3  #设置超时后重试间隔
         }
     }
     real_server 172.16.14.4 80 {
         weight 1
         HTTP_GET {
             url {
               path /
           status_code 200
             }
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
         }
     }
}

3、将Master服务器上的主配置文件拷贝到Backup服务器稍作修改

[root@backup ~] # scp 172.16.14.1:/etc/keepalived/keepalived.conf /etc/keepalived/
######修改如下两项
[root@backup ~] # vim /etc/keepalived/keepalived.conf
state BACKUP
priority 98

4、启动两台服务器上的Keepalived服务并设置为开机自启动

######MASER服务器
[root@master ~] # service keepalived start
Starting keepalived:                                       [  OK  ]
[root@master ~] # chkconfig keepalived on
[root@master ~] # chkconfig --list keepalived
keepalived      0:off   1:off   2:on    3:on    4:on    5:on    6:off
######BACKUP服务器
[root@backup ~] # vim /etc/keepalived/keepalived.conf
[root@backup ~] # service keepalived start
Starting keepalived:                                       [  OK  ]
[root@backup ~] # chkconfig keepalived on
[root@backup ~] # chkconfig --list keepalived
keepalived      0:off   1:off   2:on    3:on    4:on    5:on    6:off

5、开启Master与Backup服务器的路由转发功能

[root@master ~] # sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
[root@backup ~] # sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
######执行如下命令使其生效
sysctl -p

二、安装Httpd并设置好Realserver

1、为后端服务器WEB1安装Httpd服务并启动服务,这里使用的rpm包安装

[root@web1 ~] # yum -y install httpd
######为web1提供测试页
[root@web1 ~] # echo '<h1>WEB1 http://www.tshare365.com</h1> 欢迎关注我的技术博客' > /var/www/html/index.html
[root@web1 ~] # service httpd start
[root@web1 ~] # chkconfig httpd on
[root@web1 ~] # chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

2、访问测试WEB1服务器

2

3、为后端服务器WEB2安装Httpd服务并启动服务,这里使用的rpm包安装

[root@web2 ~] # yum -y install httpd
######为web2提供测试页
[root@web2 ~] # echo '<h1>WEB1 http://www.tshare365.com</h1> 欢迎关注我的技术博客' > /var/www/html/index.html
[root@web2 ~] # service httpd start
[root@web2 ~] # chkconfig httpd on
[root@web2 ~] # chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

4、访问测试WEB2服务器

3

5、为两台Realserver提供Sysv格式的脚本来自动修改内核参数与虚拟IP并运行脚本

[root@web1 ~] # vim /etc/init.d/lvs
#!/bin/bash
#ALLEN http://502245466.blog.51cto.com
# chkconfig: - 88 66
# Script to start LVS DR real server.
# description: LVS DR real server
#
.   /etc/rc .d /init .d /functions
VIP=172.16.14.10
host=` /bin/hostname `
case  "$1"  in
start)
        # Start LVS-DR real server on this machine.
         /sbin/ifconfig  lo down
         /sbin/ifconfig  lo up
         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
         /sbin/ifconfig  lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
         /sbin/route  add -host $VIP dev lo:0
;;
stop)
         # Stop LVS-DR real server loopback device(s).
         /sbin/ifconfig  lo:0 down
         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
;;
status)
         # Status of LVS-DR real server.
         islothere=` /sbin/ifconfig  lo:0 |  grep  $VIP`
         isrothere=` netstat  -rn |  grep  "lo:0"  grep  $VIP`
         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
;;
*)
             # Invalid entry.
             echo  "$0: Usage: $0 {start|status|stop}"
             exit  1
;;
esac
注释:脚本中的VIP定义的是虚拟IP地址
====================================================================
[root@web1 ~] # chmod +x /etc/init.d/lvs
[root@web1 ~] # chkconfig --add lvs
[root@web1 ~] # chkconfig lvs on
[root@web1 ~] # chkconfig --list lvs
lvs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@web1 ~] # service lvs start
[root@web1 ~] # service lvs status
LVS-DR real server Running.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
######为WEB2提供脚本
[root@web2 ~] # scp -p 172.16.14.3:/etc/init.d/lvs /etc/init.d/
[root@web2 ~] # chkconfig --add lvs
[root@web2 ~] # chkconfig lvs on
[root@web2 ~] # chkconfig --list lvs
lvs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@web2 ~] # service lvs start
[root@web2 ~] # service lvs status
LVS-DR real server Running.

三、验证服务

1、查看当前Master服务器的IP地址及LVS规则

[root@master ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link /ether  00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
     inet 172.16.14.1 /16  brd 172.16.255.255 scope global eth0
     inet 172.16.14.10 /32  scope global eth0
     inet6 fe80::20c:29ff:fe2c:1a24 /64  scope link
        valid_lft forever preferred_lft forever
######由上可见虚拟IP地址已经在Master主机上启动
========================================================================
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.14.10:80 rr persistent 50
   -> 172.16.14.3:80               Route   1      0          0     
   -> 172.16.14.4:80               Route   1      0          0     
######从规则中可以看出虚拟IP与Port及调度算法为rr;其中有两个Realserver

2、访问测试服务器是否正常提供服务

45

由上可知,使用的是rr调度算法,在访问测试时可能需要多访问几次或换个浏览器来测试访问

3、模拟Master服务器出现故障,将Master主机上的Keepalived服务停止,查看Backup服务器是否接管所有服务

[root@master ~] # service keepalived stop
Stopping keepalived:                                       [  OK  ]
----------------------------------------------------------------------
[root@master ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link /ether  00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
     inet 172.16.14.1 /16  brd 172.16.255.255 scope global eth0
     inet6 fe80::20c:29ff:fe2c:1a24 /64  scope link
        valid_lft forever preferred_lft forever
----------------------------------------------------------------------
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
######由上可见Master服务器上已删除虚拟IP与LVS规则
======================================================================
[root@backup ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link /ether  00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
     inet 172.16.14.2 /16  brd 172.16.255.255 scope global eth0
     inet 172.16.14.10 /32  scope global eth0
     inet6 fe80::20c:29ff:feec:f63f /64  scope link
        valid_lft forever preferred_lft forever
######由上可见,虚拟IP地址已成功在Backup服务器启动
----------------------------------------------------------------------
[root@backup ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.14.10:80 rr persistent 50
   -> 172.16.14.3:80               Route   1      0          0   
   -> 172.16.14.4:80               Route   1      0          0
######LVS的规则也已成功配置在Backup服务器上面

4、再次访问测试服务器是否正常提供服务

4 5

5、假如Master服务器修复好已重新上线,则虚拟IP地址与LVS规则会重新配置到Master服务器上而在Backup服务器上删除

######查看Master服务器
[root@master ~] # service keepalived start
Starting keepalived:                                       [  OK  ]
----------------------------------------------------------------------
[root@master ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link /ether  00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
     inet 172.16.14.1 /16  brd 172.16.255.255 scope global eth0
     inet 172.16.14.10 /32  scope global eth0
     inet6 fe80::20c:29ff:fe2c:1a24 /64  scope link
        valid_lft forever preferred_lft forever
----------------------------------------------------------------------
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.14.10:80 rr persistent 50
   -> 172.16.14.3:80               Route   1      0          0     
   -> 172.16.14.4:80               Route   1      0          0
######由上可见,虚拟IP地址与LVS规则又重新配置到Master服务器上面
======================================================================
######查看Backup服务器
[root@backup ~] # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link /ether  00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
     inet 172.16.14.2 /16  brd 172.16.255.255 scope global eth0
     inet6 fe80::20c:29ff:feec:f63f /64  scope link
        valid_lft forever preferred_lft forever
----------------------------------------------------------------------
[root@backup ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.14.10:80 rr persistent 50
   -> 172.16.14.3:80               Route   1      0          0     
   -> 172.16.14.4:80               Route   1      0          0
######由上可见,虚拟IP地址已经删除,但是LVS规则还存在,这对我们是没有影响的,没有了IP地址只有规则也是不生效的

6、如果后端Realserver出现故障,则LVS规则会清除相应Realserver的规则

[root@web1 ~] # service httpd stop
Stopping httpd:                                            [  OK  ]
------------------------------------------------------------------------
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.14.10:80 rr persistent 50
   -> 172.16.14.4:80               Route   1      0          0
######由上可见,停止了WEB1服务器的Httpd服务;查看LVS规则中已经清除了WEB1服务器的规则;如果将WEB1重新上线,则LVS会自动将规则添加上这里就不再测试

注意:

如果在是实际环境中使用Keepalived做高可用集群解决方案时,为了解决脑裂的问题,我们需要把MASTER与BACKUP服务器的Keepalived的主配置文件(keepalived.conf)中的 "state" 状态都改为 "BACKUP" 优先级 "priority" 选项的值不要设置为相同,可以设置一个数值大另一个数值小;如优先级分别为:priority 100 priority 98

到此Keepalived+LVS实现高可用负载均衡集群已全部完成,感谢各位博友的关注与支持,后面会持续更新其他内容,如果遇到什么问题,请留言!



一、LVS概述

 1.LVSLinux Virtual Server

         四层交换(路由)根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法);

                                           不能够实现应用层的负载均衡

          lvs(又称ipvs),基于内核中的防火墙netfilter实现

  2.lvs集群术语:

vsVirtual  Server

虚拟服务,可称为DirectorDispatcher分发器、Balancer负载均衡器

rsReal  Server

真实服务器

CIPClient  IP

客户端IP

VIPDirector  Virtual IP

等同于FIP(流动IP),负载均衡器虚拟IP

DIPDirector  IP

调度IP(第二张网卡IP地址)

RIPReal  Server IP

真实服务器IP

 3.LVSipvsadm/ipvs

     (1)ipvsadm: CLI工具

              用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;# yum install -y ipvsadm

     (2)ipvs:内核存在(CentOS默认支持)

               工作于内核上的netfilterINPUT钩子之上的程序代码;其集群功能依赖于ipvsadm定义的集群服务器规则;

               支持基于TCPUDPSCTPAHESTAH_EST等协议的众多服务;

 

  4.负载均衡集群中设计时的要点:

      (1)session保持

     session sticky (iphash)IP地址绑定,来源IP记录在ip hash表作统一调度

     session cluster(multicast/broadcast/unicast):广播集群同步(复制)session,只适用于小规模场景

     session server ()session服务器

       (2)数据共享(提供一致性存储)

     1) 共享存储;

  NAS:Network Attached Storage (文件级别),网络附加存储,文件服务器

  SAN:Storage Area Network (块级别),存储区域网络

  DS:Distributed Storage,分布式春初

      2) 数据同步:rsync … ...

 

 

 

二、LVS模型

 1.lvs-nat:地址伪装模型

        多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现;

        客户端主机发起请求报文CIP指向VIP,通过内核的核心网卡间转发功能,VIP会将请求交给DIP进行调度,DIP根据设定的算法进行负载均衡给后端的RS主机的RIP,在这个过程中DIP调度功能会将目标IP地址重写为RIP。请求和返回请求读要调度DIP来进行转换操作。

wKioL1auNzHD-B8xAAD_ySoQeQM843.png

    (1)RIP和DIP应该使用私网地址,RS的网状应该指向DIP;

    (2)请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈(响应报文大)

    (3) 支持端口映射(转发)

    (4) VS必须为Linux,RS可以任意操作系统

    (5)RS的RIP与Director的DIP必须在同一IP网络;

 

 

 2.lvs-dr(direct routing直接路由):网关模型

        通过修改请求报文的MAC地址进行转发;IP首部不会发生变化(源IP为CIP,目标IP始终为VIP)

    客户端发起请求,经过层层路由到达离VS服务器最近的交换机,通过交换机转发给VS服务器,由VS服务器负载均衡转发请求给RS服务器。在此过程中VIP修改MAC地址调度请求给真实主机。在此过程中通过ARP协议在一个局域网中广播寻找真实主机的MAC地址。每个RS真实主机的网卡会一个别名地址VIP,实现全过程源地址为CIP,目标地址为VIP不变。调度基于寻找MAC。网关模型中的所有主机均要能与外网通信。这样RS主机就能够直接响应客户机。

wKiom1auNubgM1pFAAF_3RNQS9I904.png

    (1)确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;

解决方案:

    1)静态绑定;

    2)禁止RS响应VIP的ARP请求;

a) arptables上定义

b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;

    (2)RS的RIP可以使用私有地址,也可以使用公网地址;

RIP使用私有地址可以通过在之前加一个路由器的方式和外网通信,直接响应客户机

    (3)RS跟Director必须在同一物理网络中;

    (4)请求报文必须由Director调度,但响应报文必须不能经由Director;

    (5) 不支持端口映射;

    (6) 各RS可以使用大多数的操作系统

 

 3.lvs-tun(ip tunneling)IP隧道模型

         转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原有的IP首部这外再次封装一个IP首部(源IP为DIP,目标IP为RIP);

    (1)RIP,DIP,VIP全得是公网地址;

    (2)RS的网关不能也不可能指向DIP;

    (3)请求报文经由Director调度,但响应报文将直接发给CIP;

    (4) 不支持端口映射;

    (5)RS的OS必须支持IP隧道功能;

 

 4.lvs-fullnat:完整模型(同时改变请求报文的源IP和目标IP)

         通过同时修改请求报文的源IP地址(cip-->dip)和目标IP地址(vip--> rip)实现转发;

      注意:前三种为标准类型,第四种为后添加类型,内核默认可能不支持,需自编译内核

    (1)VIP是公网地址;RIP和DIP是私网地址,且可以不在同一IP网络中,但需要通过路由互相通信;

    (2)RS收到的请求报文的源IP为DIP,因此其响应报文将发送给DIP;

    (3)请求报文和响应报文都必须经由director;

    (4) 支持端口映射;

    (5) RS可使用任意OS;

 

 

 

 

三、LVS scheduler调度算法

  1.静态方法:仅根据算法本身进行调度

      (1)RR round robin,轮询机制,依次分配请求,方式简单但时负载均衡的效果一般

      (2)WRR weighted rr,加权轮询,权重越大承担负载越大

      (3)SH source ip hash,源地址哈希,将来自同一个ip请求通过记录在ip hsash表中绑定在同一个服务器,实现session保持

                   缺点:调度粒度大,对负载均衡效果差;session黏性不同,连接时长保持不同

      (4)DH desination ip hash,目标地址哈希。能实现连接追踪,但不考虑负载均衡效果

正向web代理,负载均衡内网用户对互联网的请求;

Client--> Director --> Web Cache Server(正向代理)

 

  2.动态方法:根据算法及各RS当前的负载状态进行评估

Overhead

负载值,VS转发时记录每个RSActiveInactive数量(甚至权重)进行算法计算

Active

活动链接值,当发起新请求后保持在ESTABLISHED状态时,仍有请求响应

Inactive

非活动链接值,在ESTABLISHED状态时,尚未断开保持空闲等待状态

   (1)LCleast connection,最少连接

            Overhead=Active*256+Inactive

              后端的RS谁的连接少就分发请求至那台RSoverhead一样则自上而下轮询列表中的RS

   (2)WLCweighted least connection,加权最小连接

              Overhead=(Active*256+Inactive)/weight计算结果小的将为选中的下一跳RS服务器

             缺点:当Overhead一样时,自上而下轮询响应,权重小的若在列表上方则其会响应

   (3)SEDShortest Expection Delay,最短期望延迟

               Overhead=(Active+1)*256/weight

              缺点:解决WLC问题,但时无法确保权重小的主机一定响应

   (4)NQnever Queue,永不排队,SED算法改进

            RS权重大小排列,每台RS服务器先分配一个请求,其余的按照权重大小计算分配

   (5)LBLCLocality-Based LC,基于本地的最少连接,动态的 DH连接算法

   (6)LBLCRLBLC with Replication,带复制功能的LBLC

 

 

 

四、ipvsadm命令

  1.管理集群服务:

        ipvsadm  -A|E -t|u|f  service-address  [-s scheduler][-p [timeout]]

        ipvsadm  -D -t|u|f service-address

   -A:添加-E:修改-D:删除

 service-address

服务地址和 -t|u|f 结合使用,具体格式如下

  -t, tcp, vip:port  

 TCPipport

  -u, udp, vip:port

 UDPipport

  -f, fwm, MARK   

防火墙标记

   -s scheduler:默认为WLC调度算法,可省

  -p [timeout] :超出时长,持久连接相关,默认时长为300

  2.管理集群服务上的RS:

ipvsadm-a|e  -t|u|f service-address -rserver-address [-g|i|m] [-w weight]

ipvsadm -d -t|u|f service-address -rserver-address

-a:添加一个RS-e:修改一个RS-d:删除一个RS

server-address指的是rip[:port],端口可省表示与之前的service-address相同,只有nat模式支持端口映射才会使用

[-g|i|m]

   -g:GATEWAY (默认)lvs-dr模型

   -i: IPIP lvs-tun隧道模型

   -m: MASQUERADElvs-nat模型

  3.查看

          ipvsadm -L|l[options]

-n:numeric,数字格式显示地址和端口;

-c:connection,显示ipvs连接;

--stats:显示统计数据;

--rate:速率

--exact:精确值,不经过单位换算的数值

  4.清空规则:

ipvsadm  -C

  5.数器清零:

            ipvsadm  -Z [-t|u|f service-address]

  6.保存和重载:

保存:

ipvsadm-S  > /PATH/TO/SOME_RULE_FILE

ipvsadm-save  > /PATH/TO/SOME_RULE_FILE

重载:

ipvsadm  -R < /PATH/FROM/SOME_RULE_FILE

ipvsadm-restore< /PATH/FROM/SOME_RULE_FILE

         注意:需要结合重定向一起使用,从自定义的规则文件中导入导出

附录(ipvsadm -h):

ipvsadm-A|E -t|u|f service-address [-s scheduler]

[-p[timeout]] [-M netmask] [-b sched-flags]

ipvsadm-D -t|u|f service-address

ipvsadm-C

ipvsadm-R

ipvsadm-S [-n]

ipvsadm-a|e -t|u|f service-address -r server-address

[-g|i|m][-w weight] [-x upper] [-y lower]

ipvsadm-d -t|u|f service-address -r server-address

ipvsadm-L|l [options]

ipvsadm-Z [-t|u|f service-address]

ipvsadm--set tcp tcpfin udp

ipvsadm-h



五、lvs-nat模型构建

 1.lvs-nat模型示意图

          本次构建的lvs-nat模型的示意图如下,其中所有的服务器和测试客户端均使用VMware虚拟机模拟,所使用的CentOS 7

          VS内核都支持ipvs功能,且安装ipvsadm控制书写lvs规则工具。

          RS端两台服务器为httpd服务器做请求的负载均衡。

     注意;

1) 客户端可以使用Windows上的浏览器,会后缓存影响结果,所以采用CentOS上的curl命令请求http协议显示更加直观

2) DIP上不能配置iptables规则

wKioL1auNzOAsYX7AACvHD7S6gs173.png

 

2.VS网卡配置

   (1)增加网卡

         "虚拟机设置"中增加一个网络适配器设备,并将其自定义特定网络为VMnet2模式,此处为了模拟负载均衡服务器的两张网卡处于不同网段

wKiom1auNueRtgRJAAE-3b_c9xM927.jpg

   (2)配置VS两张网卡的IP地址

            [root@localhost ~]# nmtui      # CentOS 7 文本图形界面配置网卡命令

[root@localhost ~]# systemctl start network.service

wKioL1auNzSiX6fYAABeYoB3gY0988.png

注意:

      网络适配器1(172.16.249.57)模拟为外网网卡,网络适配器2(192.168.100.1)模拟为内网,且该网卡的Ip地址要和RS服务器得ip在同一网段,DIP作为RIP的网络调度(网关),无需配置GATEWAY

       [root@localhost~]# ifconfig

wKioL1auNzWhfl-nAAIcovgnHnU989.jpg

 

 3.RS网卡配置

          此处使用两台CentOS 7虚拟机作为负载均衡后端真实响应主机,安装RPM包格式httpd服务,并启动服务。nmtui命令配置网卡信息,RS1IP:192.168.100.2RS2IP:192.168.100.3RIPDIP在同一网段,虚拟机网卡和DIP同时匹配值为VMnet2模式,且两台RS服务器主机网关指向DIP192.168.100.1

           [root@localhost~]# yum install -y httpd

[root@localhost ~]# systemctl start httpd.service

注意:安装完成后在各httpd服务器上配置测试页面,/var/www/html/index.html.

[root@localhost ~]# nmtui       # 配置方法同上,此处省略

… ...

[root@localhost ~]# systemctl start network.service

[root@localhost~]# ifconfig

wKiom1auNumTbNfDAAAidSXiMbU520.png

 

  4.测试所有主机是否能够通信

          ping命令测试各节点的通信,例如RIP1VIPDIPRIP2之间是否能够通信

[root@localhost ~]# ping  IPADDR

 

 5.VS主机:核心转发和安装ipvsadm

       (1)安装ipvsadm组件:[root@localhost ~]# yum install -y ipvsadm

       (2)启动网卡间核心转发功能:[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1

      [root@localhost~]# cat /proc/sys/net/ipv4/ip_forward

wKiom1auNumw7qkzAABNmcU71hg039.png

 

  6.VS主机:定义配置lvs-nat服务(此处采用rr算法)

      (1)定义ipvsadm负载均衡集群规则,并查看

             此处定义DIP是以-s指定为rr算法进行轮询调度,-m指定模式为lvs-nat,配置命令如下:

    [root@localhost~]# ipvsadm -A -t 172.16.249.57:80 -s rr

    [root@localhost~]# ipvsadm -a -t 172.16.249.57:80 -r 192.168.100.2:80 -m 

    [root@localhost~]# ipvsadm -a -t 172.16.249.57:80 -r 192.168.100.3:80 -m 

    [root@localhost~]# ipvsadm -L -n

wKioL1auNzaSgL5DAADUsMqbfns717.png

      (2)Client客户机测试

            在客户端主机上使用curl命令对VIP发起请求,负载均衡服务器会将请求按照rr算法依次将请求调度给不同的主机进行处理,依次请求给分发给192.168.100.2192.168.100.3主机响应。

[root@localhost~]# curl http://172.16.249.57

wKiom1auNuqx_sONAAET0Ync_pw514.png

 

   7.VS主机:定义配置lvs-nat服务(此处采用wrr算法)

      (1)定义ipvsadm负载均衡集群规则,并查看

              此处将在上面lvs-natrr的基础上进行修改,改成wrr加权轮询算法;将192.168.100.2的权重设置为1,192.168.100.3的权重设置为3

[root@localhost~]# ipvsadm -E -t 172.16.249.57:80 -s wrr

[root@localhost~]# ipvsadm -e -t 172.16.249.57:80 -r 192.168.100.2 -w 1 -m

[root@localhost~]# ipvsadm -e -t 172.16.249.57:80 -r 192.168.100.3 -w 1 -m

[root@localhost~]# ipvsadm -L -n

wKioL1auNzeAJ6MHAADNWyh0K6U556.png

      (2)Client客户机测试

                在客户端主机用curl发起请求,负载均衡主机VS会将其按照权重大小转发给各个主机,四个请求有三个发给了192.168.100.3请求响应,一个发给了192.168.100.2主机处理。并以此算法做轮询负载请求

[root@localhost~]# curl http://172.16.249.57

wKioL1auNzfQAfClAAEN7fXE3s0557.png

 

 

 

 

六、lvs-dr模型构建

 1.lvs-dr模型示意图

         三台主机为虚拟机CentOS 7,每台主机仅有一块网卡,且使用桥接方式都指向外部网络的网关172.16.100.1

wKiom1auNuyiAcPNAAEIsUxXZpE244.png

  2.配置VSRS服务器的VIP

       此处的VIP均已别名的形式配置在往卡上,VS是配置在对外通信的DIP的网卡上;RS配置在lo本地回环网卡

   注意:此时配置的VIP的子网掩码必须为255.255.255.255,广播地址为自己本身

           VS[root@localhost~]# ifconfig eno16777736:0 172.16.50.50 netmask 255.255.255.255 broadcast172.16.50.50 up

           RS[root@localhost~]# ifconfig lo:0 172.16.50.50 netmask 255.255.255.255broadcast 172.16.50.50 up

 

 3.RS服务器上配置路由

          [root@localhost~]# route add -host 172.16.50.50 dev lo:0

wKiom1auNuyRe_EJAACP0tXZM9M565.png

 

 4.RS服务器配置APR内核参数修改

      [root@localhost~]# ll /proc/sys/net/ipv4/conf

wKioL1auNzmS1JGFAABuW7dj2A4055.png

    (1)ARP响应行为和ARP解析行为内核参数:

         1)arp_annouce定义通告级别

   0:默认级别,将本地的任何接口上的配置的地址都在网络中通告

   1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以

   2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信)

         2)arp_ignore定义响应级别(0-8九个级别),响应时忽略方式

   0:都全都响应

   1:只对从本接口进入的请求响应,且本接口地址是个网络地址

    … …

 注释:一般使用arp_annouce=2arp_ignore=1

    (2)配置各RS主机参数

             注意:all必须配置、eno16777736(本地)lo两个可以同时全部配置或者配置其中一个

     RealServer内核参数:

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

#echo 1 > /proc/sys/net/ipv4/conf/INTERFACE/arp_ignore

# echo 2 > /proc/sys/net/ipv4/conf/INTERFACE/arp_announce

注意:INTERFACE为你的物理接口;此处网卡接口指的是eno16777736lo

wKiom1auNu3SpFUuAAB5pmjFDbs464.png

 

 5.VS主机:定义配置lvs-dr模式(此处采用rr算法)

   (1)配置查看

[root@localhost~]# ipvsadm -A -t 172.16.50.50:80 -s rr

[root@localhost~]# ipvsadm -a -t 172.16.50.50:80 -r 172.16.200.10 -g

[root@localhost~]# ipvsadm -a -t 172.16.50.50:80 -r 172.16.200.11 -g

[root@localhost~]# ipvsadm -L -n

wKioL1auNzmifYUrAADM1ZEP1_8290.png

   (2)测试

         [root@localhost~]# curl http://172.16.50.50

             因为基于rr算法调度,依次分发给RS主机

 

 

 

 

七、通过防火墙标记来定义lvs

 1.FWM防火墙标记功能

         防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义

         FWM基于iptablesmangle表实现防护墙标记功能,定义标记做策略路由

   2.FWM定义集群的方式

(1)在director上netfilter的mangle表的PREROUTING定义用于"打标"的规则

~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK--set-mark #

$vip:VIP地址

$protocol:协议

$port:协议端口

(2)基于FWM定义集群服务:

~]#ipvsadm -A -f # -s scheduler

  3.实例演示

[root@localhost~]# iptables -t mangle -A PREROUTING -d 172.16.50.50 -p tcp --dport 80 -j MARK--set-mark 5

[root@localhost~]# ipvsadm -A -f 5 -s rr

[root@localhost~]# ipvsadm -a -f 5 -r 172.16.200.10 -g

[root@localhost~]# ipvsadm -a -f 5 -r 172.16.200.11 -g

wKioL1auNzqgLzSvAACERDj7aaM665.png

 

 

 

 

八、LVS持久连接功能lvs persistence

 1.lvs persistence功能

        无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;实现方式和lvs调度的十种算法无关,通过lvs持久连接模板(hash)实现,当超过自定义的可持节连接时长候再根据LVS算法本身进行调度。

        ipvsadm命令中-p选项实现,在-p后不指定具体数字(单位:),默认为300,到时候会自动延长2分钟,对于web本身就是15

 

  2.模式

   (1)每端持久(PPC)

            客户端对同一服务端口发起请求,会基于该服务的端口实现请求在一段时间内对同一RS服务器持久连接;

         例如:有两台主机做为RS服务器做httphssh的两种服务的集群,仅http做每端口持久,Client请求会实现绑定在,但是22号端口请求不会绑定在同一台RS

   (2)每客户端持久(PCC):定义tcp或udp协议的0号端口为集群服务端口

              director会将用户的任何请求都识别为集群服务,并向RS进行调度;同一客户端的请求任何端口都发往同一台第一次选定的RS服务器

   (3)防火墙标记持久(PFWMC)

           将两个或两个以上服务通过防火墙打标绑定在一起,这些服务的请求实现同时定向与同一台RS服务器,服务绑定同一RS

   实例:

      lvs-dr模式下以rr算法绑定httphttps服务

~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK--set-mark 99

~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 443 -j MARK--set-mark 99

~]#ipvsadm -A -f 99 -s rr -p

~]#ipvsadm -a -f 99 -r 172.16.100.68 -g

~]#ipvsadm -a -f 99 -r 172.16.100.69 -g

     



附录:LVS-DR类型RS脚本示例

#!/bin/bash

#

vip=172.16.50.50

interface="lo:0"

case$1 in

start)

echo1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig$interface $vip broadcast $vip netmask 255.255.255.255 up

routeadd -host $vip dev $interface

;;

stop)

echo0 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo0 > /proc/sys/net/ipv4/conf/all/arp_announce

echo0 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig$interface down

;;

status)

ififconfig lo:0 |grep $vip &> /dev/null; then

echo"ipvs is running."

else

echo"ipvs is stopped."

fi

;;

*)

echo"Usage: `basename $0` {start|stop|status}"

exit1

esac

详见: http://tshare365.com/archives/711.html