[lvs说明]

官方文档:http://www.linuxvirtualserver.org/zh

[lvs准备]

[root@ceshiapp ~]# lsmod | grep ip_vs

[root@ceshiapp ~]#

lsmod是检查内核运行状况,表明没有运行ipvsadm

[root@ceshiapp ~]# uname -r

3.10.0-327.el7.x86_64

[root@ceshiapp ~]# ln -s /usr/src/kernels/3.10.0-327.13.1.el7.x86_64/ /usr/src/linux 

注意:1.lvs安装一定要设定这个软连接,否则编译的时候会报错。

  2.在/usr/src/kernel/下没有内核版本信息,则需要安装kernel-devel包,并且内核信息一定跟uname -r 对应。

    3.编译安装前  yum install -y libnl* popt*

[lvs安装]

[root@ceshiapp ~]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz 

CentOS-5.x版本的推荐安装ipvsadm-1.24版本。

CentOS-6.x版本的推荐安装ipvsadm-1.26版本。

这里在CentOS-7.x下就下载最新的一个版本

[root@ceshiapp srv]# tar xf ipvsadm-1.26.tar.gz

[root@ceshiapp ipvsadm-1.26]# make

[root@ceshiapp ipvsadm-1.26]# make install

编译安装,如果失败,缺包就yum install -y libnl* popt*;

注意此时在lsmod | grep ip_vs 依旧是没有的,因为ipvsadm并没有运行

[root@ceshiapp ipvsadm-1.26]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

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

ip_vs                 140944  0

nf_conntrack          105745  1 ip_vs

libcrc32c              12644  2 xfs,ip_vs

ipvsadm运行接下来配置。

[lvs配置]

lvs配置主要用ipvsadm管理,这里以DR模式为例子设置lvs

[ipvsadm参数说明]

命令选项解释说明:

Commands:

命令格式有长的短的,两者都被允许使用

长选项

短选项

解释说明

--add-service

-A

add virtual service with options

在内核的虚拟服务器表中添加一条心的虚拟服务器记录。也就是增加一个服务器,可以说是添加一个VIP

--edit-service

-E

edit virtual service with options

编辑虚拟服务器记录。

--delete-service

-D

delete virtual service

删除一条虚拟服务器记录。

--clear

-C

clear the whole table

清空内核虚拟服务器表中的所有记录。

--restore

-R

restore rules from stdin

恢复虚拟服务器规则。

--save

-S

save rules to stdout

保存虚拟服务器规则,输出为R选项可读的格式

--add-server

-a

add real server with options

在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器。

--edit-server

-e

edit real server with options

编辑一条虚拟服务器记录中的某条真实服务器记录。

--delete-server

-d

delete real server

删除一条虚拟服务器记录中的某条真实服务器记录。

--list

-L|-l

list the table

显示内核虚拟服务器列表

--zero

-Z

zero counters in a service or all services

虚拟服务器计数器清零。

--set tcp tcpfin udp


set connection timeout values

设置连接超时

--start-daemon


start connection sync daemon

启动同步守护进程。他后面可以是masterbackup,用来说明LVS Routermaster或是backup。在这个功能上也可以采用keepalivedVRRP功能。

--stop-daemon


stop connection sync daemon

停止同步守护进程

--help

-h

display this help message

显示帮助信息

Options:

--tcp-service

-t

service-address is host[:port]

说明虚拟服务器提供的是tcp的服务[vip:port]or [ip:port]

--udp-service

-u

service-address is host[:port]

说明虚拟服务器提供的是udp的服务

--fwmark-service

-f

fwmark is an integer greater than zero

说明是经过iptables标记过的服务类型

--ipv6

-6

fwmark entry uses IPv6

使用ipv6

--scheduler

-s

one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

the default scheduler is wlc.

使用的调度算法,默认的算法是wlc

--pe

engine

alternate persistence engine may be sip,not set by default.

 

--persistent

 

-p

[timeout]persistent service

持久温度的服务。意思是同一个客户多次访请求被同一台RS节点处理。默认300

--netmask

-M

[netmask]persistent granularity mask

--real-server

-r

server-address is host (and port)

真实服务器

--gatewaying

-g

gatewaying (direct routing) (default)

DR模式,也是默认的模式

--ipip

-i

ipip encapsulation (tunneling)

TUN模式

--masquerading

-m

masquerading (NAT).

NAT模式

--weight


capacity of real server

真实服务器的权值

--u-threshold


-x uthreshold        

upper threshold of connections

增加持久连接数

--l-threshold


-y lthreshold        

lower threshold of connections

降低持久连接数

--mcast-interface


multicast interface for connection sync

指定组

--syncid sid


syncid for connection sync (default=255)

--connection

-c

output of current IPVS connections

显示IPVS连接

--timeout


output of timeout(tcp tcpfin udp)

显示超时信息

--daemon


output of daemon information

--stats


output of statistics information

显示统计信息

--rate


output of rate information

显示速率信息

--exact


expand numbers (display exact values)

--thresholds


output of thresholds information

显示超时时间信息

--persistent-conn


output of persistent connection info

显示持久连接信息

--nosort


disable sorting output of service/server entries

--sort


does nothing, for backwards compatibility

后台做处理

--ops

-o

one-packet scheduling

一个包

--numeric

-n

numeric output of addresses and ports

以数字形式输出地址和端口

[ipvsadm使用说明]

Usage:

① ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]

这里的t|u|f 表示tcpudpiptables标记,下面与这里一致

[root@ceshiapp lvs]# ipvsadm -A -t 192.168.131.200:80 -s wlc

  [root@ceshiapp lvs]# ipvsadm -E -t 192.168.131.200:80 -s wwc

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

 [root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

[root@ceshiapp lvs]# ipvsadm -D -t 192.168.131.200:80

[root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

         ipvsadm -C

清除所有规则,注意是所有,与iptables -F功能类似

[root@ceshiapp lvs]# ipvsadm -L

 IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

[root@ceshiapp lvs]# ipvsadm -C

[root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

         ipvsadm -R

    载入保存在文件中的规则

 [root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@ceshiapp lvs]# ipvsadm -R < a

[root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

        ipvsadm -S [-n]

   保存规则到指定文件

  [root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

[root@ceshiapp lvs]# > a

[root@ceshiapp lvs]# cat a

[root@ceshiapp lvs]# ipvsadm -S > a

[root@ceshiapp lvs]# cat a

-A -t 192.168.131.200:http -s wlc

⑥ ipvsadm -a|e -t|u|f service-address -r server-address [options]

添加RS节点。-a为添加,-e为编辑,与-E类似这里就不对-e进行专门的说明了。

[root@ceshiapp lvs]# ipvsadm -a -t 192.168.131.200:80 -r 192.168.131.133 -g -w 5

[root@ceshiapp lvs]# ipvsadm -L    

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

  -> 192.168.131.133:http         Route   5      0          0

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

 这里表示删除一个RS节点。

[root@ceshiapp lvs]# ipvsadm -L    

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

   -> 192.168.131.133:http         Route   5      0          0         

[root@ceshiapp lvs]# ipvsadm -d -t 192.168.131.200:80 -r 192.168.131.133  

[root@ceshiapp lvs]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.131.200:http wlc

⑧ ipvsadm -L|l [options]

  显示虚拟服务器信息

 常用的选项[options]

-n  数字格式显示主机地址和端口

--stats  统计数据

--rate  速率

--timeout  显示tcptcpfinudp的会话超时时长

-c 显示当前ipvs连接情况.

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

⑩ ipvsadm --set tcp tcpfin udp

  设置tcptcpfinudp的超时时间

11 ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]

12 ipvsadm --stop-daemon state

13 ipvsadm -h

查看ipvsadm的帮助信息

[lvs实战]

这里以DR模式为例子实际配置集群。

DR模式数据传输图:

 LVS配置_第1张图片

① 配置DNS

按照实际的配置,这里会涉及到DNS解析的问题。一般会自建立DNS服务器或者购买域名,由于时间关系,这里提及一下。之后的访问以IP为主。

② 配置LVS虚拟IP VIP

[root@ceshiapp lvs]# ifconfig eno16777736:0 192.168.131.200/24 up

[root@ceshiapp lvs]# ifconfig

eno16777736:0: flags=4163  mtu 1500

        inet 192.168.131.200  netmask 255.255.255.0  broadcast 192.168.131.255

        ether 00:0c:29:68:85:ca  txqueuelen 1000  (Ethernet)

#特别提示:ifconfig eno16777736:0 192.168.131.200 netmask 255.255.255.0 up或或者网上也有添加主机路由的方法          

route add -host 192.168.131.200 dev eno16777736 

LVS配置_第2张图片

Ping通,说明配置OK了。       

① 手工添加2台RS

服务端配置:

[root@ceshiapp lvs]# ipvsadm -C

[root@ceshiapp lvs]# ipvsadm --set 30 5 60                       

[root@ceshiapp lvs]# ipvsadm -A -t 192.168.131.200:80 -s rr -p 20

[root@ceshiapp lvs]# ipvsadm -a -t 192.168.131.200:80 -r 192.168.131.133 -g -w 3

[root@ceshiapp lvs]# ipvsadm -a -t 192.168.131.200:80 -r 192.168.131.135 -g -w 3

[root@ceshiapp lvs]# 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.131.200:80 rr persistent 20

  -> 192.168.131.133:80           Route   3      0          0         

  -> 192.168.131.135:80           Route   3      0          0     

RS配置:

[root@ceshiapp_master ~]# ifconfig lo:0 192.168.131.200/32 up

route add -host 192.168.131.200 dev lo   

ARP协议是一种地址解析协议,在LVS-DR模式中,负载均衡服务器与真实服务器在同一个局域网内,所以必须要抑制真实服务器的ARP广播,不然会导致用户无法访问,造成严重的后果。

① 抑制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: 定义对目标地址为本地的IP的ARP询问不同的应答模式

    0(默认值):只要本地配置的有相应地址,就给予响应;

1:仅在请求的目标地址配置在到达的接口上的时候,才给予响应;DR模型使用

2:仅响应目标IP地址是来访问网络接口本地地址的ARP查询请求,且IP必须在该网络接口的子网段内;

3:不回应改网络界面的ARP请求,而只对设置的唯一和连接地址做回应;

4-7:保留未使用;

8:不回应所有。

arp_announce:对网络接口上,本地IP地址的发出的ARP回应做出相应级别的限制

    0(默认):将本地任何接口上的任何地址向外通告;

    1:试图仅向目标网络通告与其网络匹配的地址;

    2:仅向与本地接口上地址匹配的网络进行通告;DR模型使用

② 测试LVS服务的转发

首先在客户端浏览器访问RS地址是否正常,然后访问DR的VIP地址,多次测试出现不同的结果说明LVS服务正常。

提示:测试过程中,会话保持的时间,浏览器缓存等可能会影响测试。

③ ipvsadm生产环境常用命令组合

  ipvsadm -Ln –stats

  ipvsadm -Lnc

  ipvsadm -Ln --thresholds

  ipvsadm -Ln  --timeout

[keepalived+lvs负载均衡及高可用服务]

KeepAlived起初是专门为LVS设计的,专门用来监控LVS集群系统服务节点的状态,后来加入了VRRP的功能,因此除了LVS服务,也可以作为其他服务(nginx,haproxy)的高可用软件,keepalived的主要功能有2个:healthcheck健康检查 & failover失败接管。

VRRP协议,全程Virtual Router Redundancy Protocol,中文名,虚拟路由器冗余协议,VRRP的出现就是为了解决静态路由的单点故障,VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器。

[keepalived实战高可用]

[keepalived安装与配置]

Keepalived官方站点:www.keepalived.org

① 内核的连接

② 下载解压 ./configure 3个Yes  make && make install

Use IPVS Framework       : No #表示使用IPVS框架

IPVS sync daemon support : No #支持IPVS同步

Use VRRP Framework       : Yes # 使用VRRP框架

lvs_sync_daemon_interface

编译的时候出现3个或者以上的Yes说明是OK的。高版本的keepalived编译后出现多个Yes。本人这里实用CentOS7编译安装keepalived一直出现各种内核编译报错的问题,目前还没有解决,因此这里用理论点的知识说明一下keepalived高可用以及与lvs的整合。

③ 关于keepalived日志的问题

keepalived日志一般在/var/log/messages里面,但是messages里面整个系统的日志都在难免查看的时候会有些不方便,因此这里可以到系统日志设置

目录在/etc/rsyslog.conf 中添加local0.*  /var/log/keepalived.log

*表示keepalived的所有日志,重启服务之后keepalived的日志就在你指定的目录/var/log/keepalived.log中了。

keepalived单实例配置

! Configuration File for keepalived 

global_defs {

   notification_email {

     XXX@qq.com  #接受的邮件地址

   }

   notification_email_from [email protected] #发送地址

   smtp_server smtp.qq.com#smtp服务器

   smtp_connect_timeout 30 #连接超时时间

   router_id LVS_7 # 路由id,这是一个全局设定,定义该设备的一个名称

}

上述这些配置是配置发生故障时的通知对象以及设备的标识,但是基本上我们会通话其他手段去监控keepalived这个软件。

vrrp_instance VI_1 { #第一个实例

    state MASTER   #名称master  如果是备的话 BACKUP

    interface eth0 #网络接口

    virtual_router_id 55 #虚拟路由IP,主备必须一致。用来区分多实例的组播。

    priority 150 # 权值吧。主的要比备的高。 算一种竞争机制,判断谁是主

    advert_int 1 # 健康检查时间 单位是秒

    authentication {#认证区域

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.131.200/24 #VIP 虚拟IP

    }

}

这里再贴出来BACKUP的配置信息,可以对比一下:

! Configuration File for keepalived

 

global_defs {

   notification_email {

   [email protected]

   }

   notification_email_from [email protected]

   smtp_server smtp.qq.com

   smtp_connect_timeout 30

   router_id LVS_2

}

 

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.131.200/24

    }

}

如果配置多实例可以与上述实例的配置文件相似,就是再添加一个实例,对应的地方改动一下,尤其是virtual_router_id要不同,否则keepalived会报错。

[keepalived+lvs]

上面已经实现了lvs和keepalived,这里来说明一下keepalived是如何像ipvsadm一样来管理lvs的。

下面贴上配置文件来说明:

Virtual_server 192.168.131.200 80 {

Delay_loop 6

Lb_algo wrr

Lb_kind DR

Net_mask 255.255.255.0

Persistence_timeout 300

Protocol TCP

# ipvsadm -A -t 192.168.131.200:80 -s wrr -p 300 -g

Real_server 192.168.131.131 80 {

Weight 1

Tcp_check{

Connect_timeout 8

Nb_get_retry 3 #延迟重试的

Delay_before_retry 3

Connect_port 80

}

}

}

#ipvsadm -a -t 192.168.131.200:80 -r 192.168.131.131 -g -w 1