LVS的安装与使用
第1章 LVS原理及介绍
1.1 LVS简介
LVS是Linux Virtual Server的简写,意思就是Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。
LVS项目介绍:
LVS项目主页:http://www.linuxvirtualserver.org/
LVS项目介绍:http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的体系结构:http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP负载均衡技术:http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的负载调度:http://www.linuxvirtualserver.org/zh/lvs4.html
LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。
q LVS技术点小结:
1、真正实现调度的工具是IPVS,工作在Linux内核层面。
2、LVS自带的IPVS命令行管理工具是ipvsadm。
3、keepalived实现管理IPVS及负载均衡器的高可用。
4、Red hat工具Piranha WEB管理实现调度的工具IPVS。
1.2 简单术语介绍
术语简写 |
术语含义 |
CIP |
客户端的IP地址,client ip |
DIP |
负载均衡器对应的实际IP地址 |
VIP |
需在均衡器提供服务的地址 |
RIP |
提供服务的节点地址 |
LB |
负载均衡服务器 |
RS |
节点服务器,Real Server |
1.3 DR模式介绍(Direct Routing)
1、通过在调度器LB上修改数据包的目的MAC地址实现转发,注意,源IP地址任然是CIP,目的地址任然是VIP。
2、请求报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式比)。
3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有的RS节点和调度器LB只能在一个局域网LAN中(小缺点)。
4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题。
5、强调下:RS节点的默认网关不需要是调度器LB的DIP,而是直接IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。
6、由于DR模式的调度器仅进行了目的的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端口(和NAT要区别)。
7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
8、总的来说DR模式效率很高,但是配置也比较麻烦,因此,访问量不是特别大的情况下可以用haproxy或者nginx取代。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发1万以下都可以考虑使用haproxy/nginx(LVS NAT模式)。
9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。
注:直接路由,最大的特点是不更改源IP和目标IP,改变的是MAC地址
1.4 LVS集群算法
算法 |
说明 |
rr |
轮循调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法很简单,但是只适合于RS节点处理性能相差不大的情况。 |
wrr |
加权轮循调度(Weighted Round-Robin),它将依据不同的RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数。 |
wlc |
加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值依次为Wi(I=1..n),当前的TCP连接次数依次为Ti(I=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。 |
dh |
目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
sh |
源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS。 |
第2章 LVS的安装与配置
2.1 服务规划
2.1.1 服务器规划表
LVS服务器 |
2台 |
负载转发四层TCP请求 |
HTTP服务器 |
2台 |
负载提供HTTP服务 |
说明:总共需要4台服务器完成本次项目 |
2.1.2 主机IP规划表
服务器说明 |
IP地址 |
主机名称规则 |
LVS服务器 |
10.0.0.18/24 |
lb01 |
LVS服务器 |
10.0.0.19/24 |
lb02 |
Nginx服务器 |
10.0.0.16/24 |
nginx |
Apache服务器 |
10.0.0.17/24 |
apache |
10.0.0.21/24 |
虚拟IP地址 |
2.1.3 主机名解析
172.16.1.16 nginx
172.16.1.17 apache
172.16.1.18 lb01
172.16.1.19 lb02
2.2 安装环境
q 操作系统版本
[[email protected] ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [[email protected] ~]# uname -r 2.6.32-431.el6.x86_64 [[email protected] ~]# uname -m x86_64
q LVS软件版本
[[email protected] ~]# rpm -qa ipvsadm ipvsadm-1.26-4.el6.x86_64
2.3 软件安装
2.3.1 安装LVS服务
LVS可以通过yum命令安装,或者通过源码编译的方式安装,在此选择yum安装。分别在两台LVS服务器安装LVS服务,安装过程如下:
q 查看是否已安装inotify
[[email protected] ~]# rpm -qa ipvsadm [[email protected] ~]#
#<==这里如果没有任何返回值就表明没有安装
q 使用yum命令安装软件
[[email protected] ~]# yum -y install ipvsadm Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile *****自动安装过程略**** Installed: ipvsadm.x86_64 0:1.26-4.el6 Complete! #<==安装完成 [[email protected] ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #<==创立软链接 [[email protected] ~]# ll /usr/src/linux
注:如果没有/usr/src/kernels/2.6.32-431.el6.x86_64路径,可能是因为缺少kernel-devel-2.6.18-164.el5软件包,可以通过命令yum -y install kernerl-devel 安装。
q 检测是否安装完毕
[[email protected] ~]# rpm -qa ipvsadm ipvsadm-1.26-4.el6.x86_64
q 查看内核是否有ip_vs服务运行
[[email protected] ~]# lsmod | grep ip_vs ip_vs 125220 0 libcrc32c 1246 1 ip_vs ipv6 317340 285 ip_vs
注:如果没有以上三个输出,可以使用命令ipvsadm或者modprobe ip_vs重新加载。
2.3.2 安装其他服务
1)在nginx服务器安装nginx服务,能正常提供访问;
2)在apache服务器安装apache服务,能正常提供访问;
3)在lb01和lb02安装keepalived服务。
[[email protected] ~]# curl nginx www [[email protected] ~]# curl apache apache.www
第3章 配置LVS集群
3.1 手动配置LVS服务
3.1.1 服务端配置
为LVS服务器添加一个虚拟IP地址:
ip addr add 10.0.0.21/24 dev eth0 label eth0:0
清空以前的旧配置:
ipvsadm --help #<==查看ipvsadm的配置参数 ipvsadm -C #<==清空所有配置
添加一个虚拟vserver:
ipvsadm -A -t 10.0.0.21:80 -s wrr
参数说明:
-A:--add-service,表示添加一个虚拟服务器
-t:--tcp-service,指定这是一个tcp的虚拟服务器
-u:--udp-service,指定这是一个udp的虚拟服务器
10.0.0.21:80:表示提供服务的ip地址以及端口号
-s:--scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc
为服务器添加real server:
ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.16:80 -g -w 1 ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.17:80 -g -w 1
3.1.2 节点端配置
需要添加到LVS负载均衡器的节点都需做如下配置:
q 绑定VIP
在网卡lo绑定虚拟IP,该虚拟IP同LVS服务器的虚拟IP,即10.0.0.21/24
ip addr add 10.0.0.21/32 dev lo label lo:0 route add -host 10.0.0.21 dev lo
q 设置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
q 抑制参数说明
arp_ignore:定义目标地址为本地IP的ARP询问不同的应答模式 |
|
0 |
默认值,回应任何网络接口上对任何本地IP地址的arp查询请求 |
1 |
只回答目标IP地址是来访网络接口本地地址的ARP查询请求 |
2 |
只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。 |
3 |
不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。 |
4-7 |
保留未使用。 |
8 |
不回应所有(本地地址)的arp查询 |
arp_announce:对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制。确定不同程序的限制,宣布对来自本地源IP地址发出的ARP请求接口。 |
|
0 |
默认值,在任意网络接口(eth0,eth1,lo)上任何本地地址。 |
1 |
尽量避免不在该网络子网段的地址作出arp回应。当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访者IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。 |
2 |
对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有网络接口的子网中外出访问子网中包目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地VIP地址作为优先的网络接口 |
3.1.3 结果服务验证
访问10.0.0.21:80,查看结果是否轮循。
[[email protected] ~]# curl 10.0.0.21:80 apache.www [[email protected] ~]# curl 10.0.0.21:80 www [[email protected] ~]# curl 10.0.0.21:80 apache.www [[email protected] ~]# curl 10.0.0.21:80 www
3.2 keepalived配置LVS服务
除了手动配置LVS服务器之外,使用keepalived管理LVS是一种更好的选择。keepalived默认就集成了管理LVS的功能,其配置LVS虚拟服务器内容如下:
############################### # LVS的配置部分 # ############################### virtual_server 10.0.0.21 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 #persistence_timeout 50 protocol TCP real_server 10.0.0.16 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.17 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
原文地址:http://blog.51cto.com/13178102/2063272