1、概述
上篇文章《架构设计:负载均衡层设计方案(4)——LVS 原理》(http://blog.csdn.net/yinwenjie/article/details/46845997),我们介绍了 LVS 的工作模式,和每一种模式的具体工作过程。这篇文章中,我们将介绍单一 LVS 节点的安装方式。比起上一篇文章,这一片要提到的安装和配置就是非常简单的了,只要您了解原理,实践就是从容的事情。
您可以在您的电脑上使用 VMware 虚拟机,按照下面介绍的过程一步一步实践。我们将采用两台虚拟机,一台作为 LVS 节点,另外一台安装了 Nginx 的服务器作为 Real Server 节点。
2、LVS-NAT 模式安装
2.1、准备工作——LVS Server:
LVS Server:LSV Server 有两张网卡。
- eth0:192.168.100.10:这张网卡对应一个封闭的内网,不能访问外网资源,外网也不能直接通过这个 IP 访问这台主机
eth1:192.168.220.100:这张网卡设置的 IP 可以访问外网,也可以被外网访问。eth1 的网关:192.168.220.1。
以下是设置的eth0 ip信息, [root@lvs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="static" HWADDR="00:0C:29:3E:4A:4F" ONBOOT="yes" TYPE="Ethernet" IPADDR="192.168.100.10" NETMASK="255.255.255.0" ==================================== 以下是设置的eth1 ip信息 [root@lvs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE="eth1" BOOTPROTO="static" HWADDR="00:0C:29:3E:4A:59" ONBOOT="yes" TYPE="Ethernet" IPADDR="192.168.220.100" NETMASK="255.255.255.0" GATEWAY="192.168.220.1"
记得设置完成后,要重启 network 服务:
[root@lvs1 ~]# service network restart
ping ping 更健康(说明到外网的网管工作是正常的):
[root@lvs1 ~]# ping 192.168.220.1
PING 192.168.220.1 (192.168.220.1) 56(84) bytes of data.
64 bytes from 192.168.220.1: icmp_seq=1 ttl=128 time=0.447 ms
64 bytes from 192.168.220.1: icmp_seq=2 ttl=128 time=0.154 ms
另外还可以通过 route 命令检查:
[root@lvs1 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 1 0 0 eth0
192.168.220.0 * 255.255.255.0 U 1 0 0 eth1
default 192.168.220.1 0.0.0.0 UG 0 0 0 eth1
注意,route 表中有一项 eth1 的 default 的信息,指向 192.168.220.1。说明路由配置是正确的。
2.2、准备工作——Real Server:
Real Server:Real Server 有一张网卡,在一个封闭的内网环境中。
eth0:192.168.100.11:这样 LVS Server 和 Real Server 就组成了一个相对封闭的局域网络。注意按照我们介绍的 NAT 原理,Real Server 的 eth0 的默认网关要设置成 Lvs Server:192.168.100.10.
在 Real Server 上运行了一个 Nginx 程序,在 80 端口上。这样以便在后续的过程中,测试 LVS-NAT 的工作是否正常。
以下是设置的 Real Server eth0 的 IP 信息:
[root@vm1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
HWADDR="00:0C:29:45:04:32"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=192.168.100.11
NETMASK=255.255.255.0
GATEWAY="192.168.100.10"
一定注意 Real Server 的网管要设置到 LVS 的 IP:192.168.100.10。接着,看看 Nginx 是不是工作正常的:
当然,同样的 ping ping 更健康:
[root@vm1 ~]# ping 192.168.100.10
PING 192.168.100.10 (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10: icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from 192.168.100.10: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.100.10: icmp_seq=3 ttl=64 time=0.227 ms
另外一个检查方式,也可以通过 route 命令:
[root@vm1 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.100.10 0.0.0.0 UG 0 0 0 eth0
注意,默认的路由指向 192.168.100.10。
完成准备工作后,我们可以开始安装和配置 LVS 了。
2.3、开始安装和配置 LVS-NAT 模式:
ipvsadm 是一个 LVS 的管理程序。我们队 LVS 的配置都是通过这个管理程序进行实现的。首先我们要安装 ipvsadm:
yum -y install ipvsadm
然后开始配置。首先我们要设置 LVS 机器支持 IP 转发功能。注意默认 IP 转发功能是关闭的,重启机器后,又会关闭:
[root@lvs1 ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward
然后我们查看一下,是否改写成功:
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
注意,如果您使用 vim 或者 vi 命令,改写文件,是不会成功的。因为这个文件存在于内存。不在硬盘上。所以只能通过 echo 这样的命令改写。
接下来执行如下的命令:
[root@lvs1 ~]# ipvsadm -At 192.168.220.100:80 -s rr
[root@lvs1 ~]# ipvsadm -at 192.168.220.100:80 -r 192.168.100.11 -m
我们来解释一下其中的参数:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务。
-s --scheduler scheduler 使用的调度算法,可选项包括:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq(关于调度算法我们在上篇文章中已经详细介绍了)
-r --real-server server-address 真实的服务器[Real-Server:port]。
-m --masquerading 指定LVS 的工作模式为NAT 模式。
当然 ipvsadm 还包括很多参数,后面慢慢讲,然后再本文章的最后部分,会给出一个比较完整的参数汇总。最后我们测试一下:
我们在相对于 Real Server 的外网,通过 192.168.220.100 的 LVS Server IP 访问到了 Real Server 上的 Nginx 服务。安装和配置成功。
2.4、关于 iptables 和重启服务的说明
在配置 LVA-NAT 过程中,建议关闭 LVS 和 Real Server 的防火墙服务。这样可以避免不必要的错误发生,增加一次配置成功的几率。但是正常生产环境中,LVS 的防火墙根据实际情况最好还是要打开。
请注意,刚才使用 ipvsadm 配置的信息,在 LVS 服务器重启后,就会失效。包括 ip_forward 的配置。所以,最好制作一个脚本文件,并加入到 / etc/profile 中:
vim /usr/lvsshell.sh
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -At 192.168.220.100:80 -s rr
ipvsadm -at 192.168.220.100:80 -r 192.168.100.11 -m
3、LVS-DR 模式安装
3.1、准备工作——LVS Server
为了让您了解 LVS 的另外设置方式,本次我们使用 VIP 的方式,而不是两张网卡的方式(当然您也可以用两张网卡的方式)。VIP 的方式是后面我们将讲到的 LVS + Keepalived 组合工作模式的常用方式。所谓 VIP 就死虚拟 IP,是指这个 IP 不会固定捆绑到某一个网卡设备,而是通过 ifconfig 命令绑定,并在 “适当时候” 这种绑定关系会随之变化:
DIP:192.168.220.137
VIP:192.168.220.100
首先我们看看在没有设置 VIP 之前,LVS 主机上的 IP 信息:
[root@lvs1 ~]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:3E:4A:59
inet addr:192.168.220.137 Bcast:192.168.220.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe3e:4a59/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2612 errors:0 dropped:0 overruns:0 frame:0
TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:159165 (155.4 KiB) TX bytes:8761 (8.5 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:210 errors:0 dropped:0 overruns:0 frame:0
TX packets:210 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16944 (16.5 KiB) TX bytes:16944 (16.5 KiB)
然后我们来设置 VIP 信息:
[root@lvs1 ~]# ifconfig eth1:0 192.168.220.100 broadcast 192.168.220.100 netmask 255.255.255.255 up
[root@lvs1 ~]# route add -host 192.168.220.100 dev eth1:0
路由表会有新的路由信息:
[root@lvs1 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.100 * 255.255.255.255 UH 0 0 0 eth1
192.168.100.0 * 255.255.255.0 U 1 0 0 eth0
192.168.220.0 * 255.255.255.0 U 1 0 0 eth1
default 192.168.220.1 0.0.0.0 UG 0 0 0 eth1
这时,通过一个外网 IP,可以 ping 通这个 VIP(下面这个 DOS 系统是 VM 的母机):
C:\Users\yinwenjie> ping 192.168.220.100
正在 Ping 192.168.220.100 具有 32 字节的数据:
来自 192.168.220.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.220.100 的回复: 字节=32 时间<1ms TTL=64
以上,我们完成了 LVS 主机设置 LVS-DR 工作模式的准备工作。注意:
- 在您设置过程中,防火前最好关闭,但在正式生产环境中,LVS 的防火强最好打开。
- VIP 信息在 LVS 主机重启后,会消失。所以您最好将设置 VIP 的命令做成一个脚本。
3.2、准备工作——Real Server
RIP:192.168.220.132
真实服务器的准备工作,需要保证真实服务器能够访问外网网关,并且保证由 LVS 改写的报文能够被 Real Server 处理(请参见我的上一篇介绍 LVS 原理的博文),这就需要做一个回环 IP。首先我们看看没有开始设置之前的 IP 信息:
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:FC:91:FC
inet addr:192.168.220.132 Bcast:192.168.220.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fefc:91fc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2384 errors:0 dropped:0 overruns:0 frame:0
TX packets:1564 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1551652 (1.4 MiB) TX bytes:144642 (141.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:44 errors:0 dropped:0 overruns:0 frame:0
TX packets:44 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3361 (3.2 KiB) TX bytes:3361 (3.2 KiB)
使用 route 命令,查看原始 route 信息:
[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.220.1 0.0.0.0 UG 0 0 0 eth0
另外,这台 Real Server 上有一个 Nginx,以保证我们观测 LVS-DR 的运行情况。我们在外网使用 192.168.220.132 这个 IP,能够访问到 Nginx 的页面:
接下来,我们开始设置 Real Server 上的回环 IP,首先关闭这台机器进行 ARP 查询的功能,否则,Real Server 会在路由器或者交换机上去查询 192.168.220.100 这个 IP 对应的 MAC 地址(注意,以下的信息都会被还原):
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
然后可以设置回环 IP 了:
[root@vm3 ~]# ifconfig lo:0 192.168.220.100 broadcast 192.168.220.100 netmask 255.255.255.255 up
[root@vm3 ~]# route add -host 192.168.220.100 dev lo:0
检查新的路由信息:
[root@vm3 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.100 * 255.255.255.255 UH 0 0 0 lo
192.168.220.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.220.1 0.0.0.0 UG 0 0 0 eth0
以上设置完成。完成后,您需要通过 ping 命令,检查一下网关是否可用(最好可以瓶 ping 一下外网的某个地址,例如 163.com)。LVS-DR 模式下,Real Server 是直接向请求方返回结果,所以一定要保证网关时可用的。
3.3、开始安装和配置 LVS-DR 模式
在验证了 LVS Server 和 Real Server 都准备好以后,就可以进行 LVS-DR 模式的设置了。LVS 管理软件 ipvsadm 的安装我们就不敷述了,在 LVS-NAT 的小结中有关于 LVS 管理软件安装的介绍。
[root@lvs1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@lvs1 ~]# ipvsadm -C
[root@lvs1 ~]# ipvsadm -At 192.168.220.100:81 -s rr
[root@lvs1 ~]# ipvsadm -at 192.168.220.100:81 -r 192.168.220.132 -g
介绍一下新出现的参数:
- -g –gatewaying 指定 LVS 的工作模式为直接路由模式 DR 模式(也是 LVS 默认的模式)
配置完成,是不是很简单。接下来,我们就可以在外网,通过 192.168.220.100 这个 IP 访问 132 这台 Real Server 上的 Nginx 服务了:
4、LVS-TUN 模式安装
LVS-TUN 模式的安装我不打算再花很大的篇幅讲了,在您通过上一篇文章了解了 DR 和 TUN 的不同以后,其配置的过程都是差不多的,只不过一个可以跨越子网,一个不能。所以 LVS-TUN 模式的安装和配置请首先参考 LVS-DR 模式。
5、IPVSADM 参数汇总
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为 - R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是 master 或 backup,用来说明 LVS Router 是 master 或是 backup。在这个功能上也可以采用 keepalived 的 VRRP 功能。
–stop-daemon 停止同步守护进程
-t –tcp-service service-address 说明虚拟服务器提供的是 tcp 的服务 [vip:port] or [real-server-ip:port]
-u –udp-service service-address 说明虚拟服务器提供的是 udp 的服务 [vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 说明是经过 iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,选项:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默认的调度算法是: wlc.
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为 300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器 [Real-Server:port]
-g –gatewaying 指定 LVS 的工作模式为直接路由模式 DR 模式(也是 LVS 默认的模式)
-i –ipip 指定 LVS 的工作模式为隧道模式
-m –masquerading 指定 LVS 的工作模式为 NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
-c
–connection 显示 LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示 tcp tcpfin udp 的 timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出 IP 地址和端口的数字形式
好吧,这个就是我网上抄的。
6、后文介绍
LVS 的设置实际上没有什么难度,充其量是一个高级玩意儿,是解决特定问题的特定方法。您需要的基础知识涉及到 IP 协议、子网分割、IP 映射、Linux 脚本等基本知识。打通任督二脉才是您的根本。
LVS 的设置过程中肯定会遇到实际问题,特别是您头几次配置。别慌,别怕,透过现象猜测本质,一个一个的解决问题。就我的经验总结,无非几种问题分类:
- 网关不通
- 回环 IP 设置问题
- 防火墙问题
- VIP 设置问题
- 网段或者子网问题
通过包括这篇博客在内的这几篇文章,您已经分别了解了 Nginx、LVS 的功能、原理、特 点和工作模式。后面一篇文章,我们将把这些负载层的技术混合在一起,介绍 Nginx + Keepalived、LVS + Keepalived、LVS + Keepalived + Nginx 的安装和配置方式。
(本人这个月 “持之以恒” 奖已经拿到了,笑一个:哈哈哈)
补充一下:由于工作的原因,期间可能还会推出一篇关于 Apache Camel 的文章,就算提前进入业务通信层的讨论吧。不过这个看当时的时间安排。目前情况下还是以负载均衡层的讨论为主线。