1 Keepalived介绍

Keepalived软件主要是通过VRRP协议实现高可用功能的。

三个重要功能:

1、管理LVS负载均衡软件

2、实现对LVS集群节点健康检查功能(healthcheck

3、作为系统网络服务的高可用功能

1VRRPVirtual Router Redundancy Protocol),为了解决静态路由的单点故障问题而出现

2VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的

3VRRP是用IP组播的方式(224.0.0.18)实现高可用对之间的通信

4)工作时主节点发包,备节点接包,当备节点收不到主节点的数据包时,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级来竞选

5VRRP使用了加密协议加密数据,但Keepalived推荐用明文的方式配置认证类型和密码

2 Keepalived高可用服务搭建准备

安装环境说明

14台服务器:lb01lb02web01web02

2、系统环境:

[root@lb01 ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@lb01 ~]# uname -r
2.6.32-431.el6.x86_64
[root@lb01 ~]# ls -l /application/nginx/
总用量 36
drwx------ 2 nginx root 4096 6月  28 2017 client_body_temp
drwxr-xr-x 3 root  root 4096 3月  28 00:24 conf
drwx------ 2 nginx root 4096 6月  28 2017 fastcgi_temp
drwxr-xr-x 2 root  root 4096 6月  28 2017 html
drwxr-xr-x 2 root  root 4096 5月   1 18:07 logs
drwx------ 2 nginx root 4096 6月  28 2017 proxy_temp
drwxr-xr-x 2 root  root 4096 6月  28 2017 sbin
drwx------ 2 nginx root 4096 6月  28 2017 scgi_temp
drwx------ 2 nginx root 4096 6月  28 2017 uwsgi_temp

开始安装keepalived软件

yum install keepalived –y
[root@lb01 ~]# rpm -qa keepalived
keepalived-1.2.13-5.el6_6.x86_64
 
[root@lb02 ~]# rpm -qa keepalived
keepalived-1.2.13-5.el6_6.x86_64
启动keepalived
/etc/init.d/keepalived start
 
[root@lb01 ~]# ps -ef|grep keep|grep -v grep
root       1855      1  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       1857   1855  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       1858   1855  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
 
[root@lb02 ~]# ps -ef|grep keep|grep -v grep
root       2118      1  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       2120   2118  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       2121   2118  0 20:53 ?        00:00:00 /usr/sbin/keepalived –D
默认情况下会启动三个VIP地址
[root@lb01 ~]# ip addr|grep 192.168
    inet 192.168.4.125/24 brd 192.168.4.255 scope global eth0
    inet 192.168.200.16/32 scope global eth0
    inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
测试完成后,关闭服务
[root@lb01 ~]# /etc/init.d/keepalived stop

 

Keepalived配置文件说明

1)全局定义部分

[root@lb01 ~]# ll /etc/keepalived/keepalived.conf
-rw-r--r-- 1 root root 3562 3月  19 2015 /etc/keepalived/keepalived.conf
[root@lb01 ~]# head -13 /etc/keepalived/keepalived.conf |cat -n
     1  ! Configuration File for keepalived
     2
     3  global_defs {
     4     notification_email {
     5       [email protected]
     6       [email protected]
     7       [email protected]
     8     }
     9     notification_email_from [email protected]
     10     smtp_server 192.168.200.1
     11     smtp_connect_timeout 30
     12     router_id LVS_DEVEL
        13  }

参数说明:

1行,注释

2  空行

3~8行是定义服务故障报警的Email地址

9行,指定发送邮件的发送人

10smtp_server指定发送邮件的smtp服务器

11 连接smtp的超时时间

12 keepalived服务器的路由标识。在一个局域网内,这个标识应该是唯一

 

2VRRP实例定义区块部分

[root@lb01 ~]# head -30 /etc/keepalived/keepalived.conf |cat -n|tail -16
    15  vrrp_instance VI_1 {
    16      state MASTER
    17      interface eth0
    18      virtual_router_id 51
    19      priority 100
    20      advert_int 1
    21      authentication {
    22          auth_type PASS
    23          auth_pass 1111
    24      }
    25      virtual_ipaddress {
    26          192.168.200.16
    27          192.168.200.17
    28          192.168.200.18
    29      }
    30  }

15行定义一个实例名字

16  当前实例VI_1的角色状态,为MASTER

17   网络接口

18virtual_router_id为虚拟路由ID标识,MASTERBACKUP必须一致

19 优先级,数字越大越高

20 同步通知间隔 目前为1

21~24权限认证配置

25~29    为虚拟IP地址

keepalived高可用服务单实例实战

主服务器

[root@lb01 keepalived]# vim keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
配置完毕,启动服务,查看是否有虚拟IP
[root@lb01 keepalived]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@lb01 keepalived]# ip add |grep 192.168.4.130 
    inet 192.168.4.130/24 scope global secondary eth0:1

备服务器

[root@lb02 keepalived]# cat keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
启动服务,检查是否有虚拟IP
[root@lb02 keepalived]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@lb02 keepalived]# ip add|grep 192.168.4.130
[root@lb02 keepalived]#

备节点没有虚拟IP,表示配置正确

 

如果主备都出现了虚拟IP,说明高可用裂脑了,检查:

1、主备之间是否通信正常,若不正常是否有防火墙阻挡

2、主备对应的keepalived.conf配置是否有误,virtual_router_id配置不一致

3、硬件故障:心跳线坏了、网卡坏了、IP配置冲突等

进行高可用主备之间的切换实验

[root@lb01 keepalived]# /etc/init.d/keepalived stop
停止 keepalived:                                          [确定]
[root@lb02 keepalived]# ip add|grep 192.168.4.130
inet 192.168.4.130/24 scope global secondary eth0:1
 
[root@lb01 keepalived]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@lb01 keepalived]# ip add|grep 192.168.4.130
inet 192.168.4.130/24 scope global secondary eth0:1
[root@lb02 keepalived]# ip add|grep 192.168.4.130

nginx负载均衡配合keepalived服务

主备的负载均衡配置一致

[root@lb01 ~]# cat /application/nginx/conf/extra/lb_bbs.conf
server {
        listen     192.168.4.130:80;
        server_name  bbs.etiantian123.org;
        location / {
            proxy_pass http://bbs_server_pools;
            proxy_set_header Host      $host;
        }
    }
[root@lb01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
error_log  logs/error.log;   
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
upstream bbs_server_pools{
  server 192.168.4.121:80   weight=1;
  server 192.168.4.122:80   weight=1;
}
    #include extra/lb_www.conf;
    include extra/lb_bbs.conf;
    include extra/lb_blog.conf;
}

解决监听的网卡上不存在IP地址的问题

nginx配置监听的时候,如果本地的网卡没有这个监听的地址,可能会报错

解决:

/etc/sysctl.conf加入内核参数配置:

net.ipv4.ip_nonlocal_bind = 1

解决高可用只针对物理服务器的问题

如果nginx服务出现问题停止而keepalived服务还在工作,这就会导致用户访问的VIP无法找到对应的服务。

解决办法:

1、写脚本检查

[root@lb01 scripts]# cat check_nginx.sh
#!/bin/sh
while true
do
  if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
  fi
   sleep 5
 done

2、可以使用keepalived的配置文件参数触发写好的监测服务脚本

[root@lb01 scripts]# cat chk_nginx_proxy.sh
#!/bin/sh
  if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
  fi
[root@lb01 scripts]# chmod +x chk_nginx_proxy.sh

此时keepalived的完整配置为:

[root@lb01 keepalived]# vim keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_script chk_nginx_proxy {          《===定义vrrp脚本,检测http端口
script “/server/scripts/chk_nginx_proxy.sh” 《===执行脚本,当nginx服务有问题,停掉keepalived服务
interval 2            《====间隔2秒
weight 2
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
track_script {
chk_nginx_proxy                 《====触发检查
}
}

解决多组keepalived服务器在一个局域网的冲突问题

global_defs {
router_id lb01
vrrp_mcast_group4 224.0.0.19 <===这个就是指定组播地址的配置
}

配置指定文件接受keepalived服务日志

默认情况下keepalived会输出到系统日志/var/log/messages

1)/etc/sysconfig/keepalived第14行KEEPALIVED_OPTIONS="-D"修改为
KEEPALIVED_OPTIONS="-D –d –S 0"
2)修改rsyslog的配置文件
vi /etc/rsyslog.conf
#keepalived
local0.*                                /var/log/keepalived.log
3)完成后,重启rsyslog服务
/etc/init.d/rsyslog restart


监测keepalived裂脑的脚本

[root@lb02 ~]# cat /server/scripts/check_split_brain.sh
#!/bin/sh
lb01_vip=192.168.4.130
lb01_ip=192.168.4.125
while true
do
ping -c -W 3 $lb01_ip &>/dev/null
 if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]
   then
     echo "ha is split brain.warning."
else
     echo "ha is ok"
fi
sleep 5
done

 

3 LVS

LVS负载均衡集群介绍

负载均衡LB提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器带宽、增加吞吐量、加强网络数据能力、提高网络的灵活性和可用性。

搭建负载均衡服务的需求

1)把单点计算机无法承受的大规模并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应时间,提升用户体验。

2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅提高。

37*24的服务保证,任意一个或多个有限后面节点宕机,不会影响业务。

在负载均衡集群中,所有计算机节点都会提供相同的服务。集群负载均衡器截获所有对该服务器的入站请求。然后将这些请求尽可能地平均的在

所有集群节点上。

LVSlinux virtual server

LVSLinux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。

IPVS软件工作层次

LVS负载均衡调度技术是在内核层面完成的。

体系结构与工作原理简单描述

LVS集群负载均衡器接受服务的所有入站客户端的计算机请求,并根据调度算法决定那个集群节点应该处理回复请求。

负载均衡器(LB)有时也被称为LVS Direcotr

LVS虚拟服务器的体系结构,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(load Balancer)

负载调度器能无缝地将网络请求调度到真实的服务器上,从而使得服务器集群的结构对于客户是透明的,客户访问集群系统提供的网络服务就像

访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。

LVS相关术语命名约定

名称                                     缩写    说明

虚拟IP地址(Virtual Ip Address)             VIP     Director用于向客户端计算机提高服务的IP地址。比如www.etiantian.org域名就要解析到VIP上。

真实IP地址(Real Server Ip Address)         RIP     在集群下面节点上使用的IP地址。

DirectorIP地址(Director Ip Address)       DIP     Director用于连接内外网络的IP地址,物理网卡上的IP地址。

客户端主机IP地址(Client Ip Address)        CIP    客户端用于计算机请求集群服务的IP地址,该地址用作发送给集群的请求的源IP地址。

LVS负载均衡集群的3种工作模式介绍

1NAT模式-网络地址转换

(Virtual Server via Network Address Translation(VS/NAT)

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时

报文的源地址被重写,在返回给客户端,完成整个负载调度过程。

提示:VS/NAT模式,很类似公路收费站,来去都要进过LB负载均衡器,通过修改目的地址,端口或源地址或源端口。(10-20台)

2TUN模式-隧道模式

Virtual Server via IP Tunneling (VS/TUN)

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。

为了解决这个问题,调度器把请求报文通过IP隧道(相当于ipipipsec)转发至真实服务器,而真实服务器将响应直接返

回给客户,这样调度器只处理请求报文。由于一般网络应答数据比请求报文大很多,采用VS/TUN技术后,集群系统的最大

吞吐量可以调高10倍。

3DR模式-直接路由模式

Virtual Sever via Direct Routing (VS/DR)

VS/DR通过改写请求报文的MAC地址,将请求发送到真实的服务器,而请求发送到真实的服务器,而真实服务器将响应直接返回给客户。

VS/TUN技术一样,VS/DR技术可极大的提高集群系统的伸缩性。这种方法没有IP隧道的开销,对于集群中真实服务器也没有必须支持

IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连接在统一服务网段上。

LVS的调度算法

LVS调度算法决定了如何在这些集群节点之间分布工作负荷。

Director收到来自客户端的访问它VIP上的集群服务入站请求时,Director必须决定哪个集群节点应该获得请求。

Director可用于做出该决定的调度方法分为两个基本类别:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr,SE,NQ

 

10种调度算法如下:

rr : 轮询调度(Round-Robin),它将请求一次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合与RS处理

性能相差不大的情况。

wrr 加权轮询调度(Weighted Round-Robin),它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到

的连接数将比权值较低的RS更多。相同权值的RS得到相同的连接数。

dh 目的地址哈希调度(Destination Hashing)以目的地址为关键字查找一个静态的hash表来获得需要的RS

sh:  源地址哈希调度(Source Hashing)以源地址为关键字查找一个静态hash表来获得需要的RS

lc:  最小连接数调度(Least-Connection)IPVS表存储了所有的活动连接。把新的连接请求发送到当前连接数最小的RS

wlc: 加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值一次为Wi(l=1..n),当前的TCP连接数依次为

     Ti(l=1..n),依次选取Ti/Wi为最小的RS作为下一个分的的RS

lblcr:基于地址的最小连接数调度(Locality-Based Least-Connect)将来自同一目的地址的请求分配给同一台RS,如果这台服务器

     尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首选考虑。

lblcr: 基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication)对于某一目的地址,对应有一个

      RS子集。对此地址请求,为它分配子集中连接数最小RS;如果子集中所有服务器均已满负荷,则从集群选择一个连接数较小服

      务器。将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。

LVS的调度算法和生产环境选型

一般的网络服务,如HTTPMailMySQL等,常用的调度算法为:

1)基本轮询调度rr算法 2)加权最小连接调度wlc  3)加权轮询调度wrr算法。

基于局部性的最小连接LBLC和带复制的基于局部性最少连接LBLCR主要适用webCache集群。

源地址散列调度和目标地址散列可以结合适用在防火墙集群中,他们可以保证整个系统的唯一出入口。最短预期延迟调度SED和不排列调度

NQ主要是对处理时间相对比较长的网络服务。

 

LVS DR模式具体的调度原理过程:


安装LVS

1、下载相关软件包

[root@lb01 tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

2、安装LVS命令

查看是否存在LVS

[root@lb01 tools]# lsmod |grep ip_vs

检查系统内核版本

[

root@lb01 tools]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@lb01 tools]# uname -r
2.6.32-431.el6.x86_64

做个软链接

[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64
drwxr-xr-x. 22 root root 4096 5月  20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64
[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/linux
drwxr-xr-x. 22 root root 4096 5月  20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64
lrwxrwxrwx   1 root root   39 5月   1 17:34 /usr/src/linux -> /usr/src/kernels/2.6.32-431.el6.x86_64

编译安装

[root@lb01 tools]# tar zxf ipvsadm-1.26.tar.gz
[root@lb01 tools]# cd ipvsadm-1.26
[root@lb01 ipvsadm-1.26]# make
[root@lb01 ipvsadm-1.26]# make install

 

如果出现报错,可能是由于缺少3个组件popt-develpopt-staticlibnl-develyum安装即可

[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs

安装完成后并没有加载到内核

启动LVS

[root@lb01 ipvsadm-1.26]# /sbin/ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs
ip_vs                 125220  0
libcrc32c               1246  1 ip_vs
ipv6                  317340  275 ip_vs

 

配置LVS虚拟IP

[root@lb01 ~]# ifconfig eth0:127 192.168.4.127 netmask 255.255.255.0
[root@lb01 ~]# ifconfig eth0:127
eth0:127  Link encap:Ethernet  HWaddr 00:0C:29:06:6E:89 
          inet addr:192.168.4.127  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
手工执行配置添加LVS服务
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm --set 30 5 60
[root@lb01 ~]# ipvsadm -A -t 192.168.4.127:80 -s wrr -p 20
[root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.122:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.121:80 -g -w 1

查看配置及状态信息

[root@lb01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.4.127:80 wrr persistent 20
  -> 192.168.4.121:80             Route   1      0          0        
  -> 192.168.4.122:80             Route   1      0          0  
[root@lb01 ~]# ipvsadm -L -n  --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.4.127:80                   14       37        0     1892        0
  -> 192.168.4.121:80                    8       22        0     1128        0
  -> 192.168.4.122:80                    6       15        0      764        0

 

删除配置

[root@lb01 ~]# ipvsadm -D -t 192.168.4.127:80
[root@lb01 ~]# ipvsadm -d -t 192.168.4.127:80 -r 192.168.4.121:80

命令相关参数说明

--clear  -C  clear the whole table
--add-service -A add virtual service with options
--tcp-service -t service-address service-address is host[:port]
--scheduler -s   scheduler  one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
--add-server -a add real server with options
--real-server -r server-address server-addres s is host(and port)
--masquerading -m masquerading (NAT)
--gatewaying -g gatewaying(direct routing)(default)
--delete-server -d delete real server
--persistent -p [timeout]   persistent server(会话保持功能)
--set tcp tcpfin udp       set connection timeout values
--weight  -w weight  capacity of real server
[root@lb01 ~]# ipvsadm –help    《===更多命令帮助


 

手工在RS端绑定VIP

[root@lamp01 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up
[root@lamp01 ~]# route add -host 192.168.4.127 dev lo
[root@lnmp02 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up
[root@lnmp02 ~]# route add -host 192.168.4.127 dev lo

 

手工在RS端抑制ARP响应

cat /proc/sys/net/ipv4/conf/lo/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_announce
cat /proc/sys/net/ipv4/conf/lo/arp_announce
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进行测试

LVS自动化脚本

ipvs_server

#!/bin/bash
# function:
# version:1.1
. /etc/init.d/functions
VIP=192.168.4.127
SUBNET=eth0:`echo $VIP|cut -d. -f4`
PORT=80
GW=192.168.4.1
 
#w=3
RIP1=(
        192.168.4.121
     )
#w=1
RIP2=(
        192.168.4.122
     )
IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
IPVSADM=/sbin/ipvsadm
ARPING=/sbin/arping
 
#functions
function usage (){
        local script_name
        script_name=$1
        echo "Usgae : $script_name [ start | stop | restart ]"
        echo ""
        return 1
}
 
function checkCmd (){
        if [ ! -f $1 ]; then
                echo "Can't find "$1
                return 1
        fi
}
 
function checkSubnet (){
        $IFCONFIG |grep "$1"|wc -l
}
 
function ipvsStart (){
        #judge if $SUBNET is exist.
        if [ $(checkSubnet $SUBNET) -ne 0 ]; then
                $IFCONFIG $SUBNET down
        fi
        local rs
        #$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up
        $IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
        #$ROUTE add -host $VIP dev $SUBNET
        $IPVSADM -C
        $IPVSADM -A -t $VIP:$PORT -s wrr -p 60
 
        for ((i=0; i<`echo ${#RIP1[*]}`; i++))
        do
                $IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1
        done
 
        for ((i=0; i<`echo ${#RIP2[*]}`; i++))
        do
                $IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1
        done
        rs=$?
        $IPVSADM >/tmp/wangxin.log
 
        # update MAC
       NetIf=$(echo ${SUBNET}|awk -F ":" '{print $1}')
        $ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/tmp/wangxin.log
        [ $rs -eq 0 ] && action "Ipvsadm start." /bin/true
        return $rs
}
 
function ipvsStop (){
        local rs
       rs=1
        #clean ipvs
       $IFCONFIG $SUBNET down
        $IPVSADM -C
        $IPVSADM -Z
       
        rs=$?
        #$ROUTE del $VIP
       $ARPING -c 1 -I ${NetIf} -s $VIP $GW  >/dev/null 2>&1
        [ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true
        return $rs
}
 
main ()
{
       #judge argv num by wangxin
        if [ $# -ne 1 ]; then
                usage $0
        fi
 
        case "$1" in
                start)
                        ipvsStart
                        ;;
                stop)
                        ipvsStop
                        ;;
                restart)
                        ipvsStop
                        ipvsStart
                        ;;
                *)
                        usage $0
                        ;;
        esac
}
 
#start operating
main $*

ipvs_client

#!/bin/bash
# description: Config realserver lo and apply noarp
VIP=(
        192.168.4.127
     )
 
. /etc/rc.d/init.d/functions
 
case "$1" in
start)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
           /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
        done
        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
           action "Start LVS of RearServer.by wang1xin"
        ;;
stop)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
            interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
            /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
        done
        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
           action "Close LVS of RearServer.by wang2xin"
        ;;
*)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

一个脚本同时实现自动剔除和加入RS

#!/bin/bash
 
PORT="80"
VIP=192.168.4.127
 
RIP=(
    192.168.4.121
    192.168.4.122
)
 
function check_url()
{
 
for ((i=0; i<`echo ${#RIP[*]}`; i++))
do
judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == ‘200‘ && "${judge[2]}"==‘OK‘ ]]
   then
     if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ]
      then
      ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
 
else
      if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ]
      then
      ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
fi
done
}
 
while true
do
check_url
sleep 5
done

4  LVS+keepalived高性能集群应用实战

LVS配置(略)

 

Keepalived配置

主节点

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
virtual_server 192.168.4.130 80 {
    delay_loop 6         
    lb_algo wrr               
    lb_kind DR               
    nat_mask 255.255.255.0
    persistence_timeout 50    
    protocol TCP               
 
    real_server 192.168.4.121 80 {
        weight 1              
        TCP_CHECK {
        connect_timeout 8      
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 192.168.4.122 80 {
        weight 1             
        TCP_CHECK {
        connect_timeout 8      
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

备节点

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
virtual_server 192.168.4.130 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50    
    protocol TCP
 
    real_server 192.168.4.121 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 192.168.4.122 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

5 其他

keepalived+LVS部署问题排错思路

1iptables防火墙问题

2linux负载均衡器转发问题

对于nat模式,linux内核转发及iptables转发功能需要开放,对于DR模式,可以不打开

3RS端抑制ARP问题

4RSlo上绑定业务VIP,每个RS都要绑定

5RSlo上绑定的业务VIP,有时lo接口VIP会丢失

解决办法:

aipvs_client完整脚本启动命令放入rc.local

b)通过nagios监控RS端上绑定的业务VIP做监控报警

c)把RSlo上绑定的业务VIP做成网卡配置文件提供服务

如:/etc/sysconfig/network-scripts/ifcfg-lo:123

6、确保client用户、directorRS 三者之间任意两者业务服务可访问

可用wget telnet等命令来监测

7ipvsadm -L -n来检查LVS真是服务器情况及VIP连接及配置

8、检查keepalived配置文件是否配置正确

9、查看系统日志/var/log/messages

10、通过tcpdump命令跟踪数据包流向

11、注意LVS配置的语法,尤其是大括号问题

 

keepalived+LVS生产环境负载均衡维护思路

1、业务高峰期尽量不修改负载均衡配置,以免发生故障

2、修改keepalived.conf时,备份

3、将keepalived.conf的配置下载下来,保留原始文件再进行修改,对比,然后传到服务器

4、替换正式配置文件后,主负载均衡器可以先执行/etc/init.d/keepalived stop,把业务切换到备份负载均衡器上

 

LVS负载均衡器的多台RS上线方案

1)通过ipvsadm命令下线机器

2)通过url做健康检查,然后,移走健康检查文件。这样director会把此RS从转发池中移除

 

LVS性能调优

1、关闭iptables,换硬件防火墙

大流量时,iptables是一个性能瓶颈

2、调整连接超时时间

3、内核优化

4、网卡优化

5TCP/IP优化

6、硬件优化

7、增大哈希表,ip_vs_conn_tab_bits调到20

通过重启,向内核传递参数来调整