掌握 LVS
一.集群和分布式概念
1.1 集群
在计算机领域,集群早在 1960 年就出现,随着互联网和计算机相关技术的发展,现在
集群这一技术已经在各大互联网公司普及。
1.1.1 集群概念
计算机集群指一组通过计算机网络连接的计算机,它们一起工作,在许多方面,它们可以
被视为一个单一的系统。与网格计算机不同,计算机集群的每个节点都被设置为执行相同
的任务,由特定的软件控制和调度。
1.1.1.1 集群的两个关键特性
集群是一组服务器实体,它们共同提供比单个服务实体更具可伸缩性和可用性的服务平台。
在接受服务的客户端看来,集群类似于单个服务实体,但实际上,集群是由一组服务器组
成的一个集群。与单个服务器相比,集群提供了以下两个关键特性:
Scalability:可伸缩性,也就是集群的性能不局限于单个服务器,新的服务器可以
动态地添加到集群中,从而提高集群的性能。
High availability: 高可用性,也即是集群使得客户能够通过多台服务器冗余避免
突然失去服务。在集群中,相同的服务可以由多个服务器提供。如果一个服务器不可用,
另一个服务器将接管不可用的服务器。集群提供的将错误从一个服务器恢复到另一个服务器
的功能增强了应用程序的可用性。
1.1.1.2 集群的两个能力
为了获得可伸缩性和高可用性,集群必须具备以下两个能力:
Load Balancing:负载均衡,负载均衡可以将任务均匀地分配到集群环境中的计算和
网络资源,使得集群持续健康的对外提供服务。
Error recovery:错误恢复能力,集群中的某节点(某个服务器)由于某种原因执行某
任务的过程中出现错误,执行失败,而另一个服务器自动执行相同的任务,并完成服务。
这样就恢复了错误,使得集群可以持续提供服务。
1.1.1.3 实现集群的两个关键技术
实现集群服务需要两种关键技术:
Cluster address:集群地址,客服端通过访问集群的地址来获取集群内部各服务器
提供的服务,集群对外是只有一个地址的。负责维护整个集群地址的服务器称为负载均衡
器,在客户端访问集群时,其负责将集群的地址转换为集群内部某个计算机的地址,具体
转换到哪个服务器的地址根据调度算法定。
Internal communication: 为了协同工作,实现负载均衡和错误恢复,集群实体间
必须频繁通信,如服务器上的负载均衡器心跳测试信息、服务器之间的任务执行上下文
信息通信等。
使用相同的集群地址,客户机可以访问集群提供的计算服务,集群地址隐藏了每个服务
实体的内部地址,以便客户机所需的计算服务可以分布在各个服务实体之间。内部通信
是集群正常工作的基础,它使集群具有均衡的负载和错误恢复能力。
1.1.2 集群分类
-
集群一般分为三种类型:
- LB:Load Balancing,负载均衡集群
- HA:High Availiablity,高可用集群,避免单点故障 SPOF(single Point Of failure)
-
HPC:High-performance computing 高性能集群
全球 TOP500 计算机 对于高可用集群可以用以下参数度量其可用性:
- MTBF:Mean Time Between Failure 平均无故障时间
- MTTR:Mean Time To Restoration(repair)平均恢复前时间
- A=MTBF/(MTBF+MTTR)
1.1.3 集群设计原则
-
在设计和实现集群时要考虑的因素有很多,关键的有以下四点
- 可扩展性—集群的横向扩展能力
- 可用性—无故障时间(SLA)
- 性能—访问响应时间
- 容量—单位时间内的最大并发吞吐量(例如避免 C10K 并发问题)
1.1.3.1 实现集群时基础设施考虑
-
实现集群时,在基础设施上需要考虑硬件、网络、安全、机房等因素
- 提升硬件资源性能—从入口防火墙到后端 web server 均使用更高性能的硬件资源
- 多域名—DNS 轮询 A 记录解析
- 多入口—将 A 记录解析到多个公网 IP 入口
- 多机房—同城+异地容灾
-
CDN(Content Delivery Network)—基于 GSLB(Global Server Load Balance)
实现全局负载均衡,如:DNS
1.1.3.2 实现集群时业务层面考虑
-
实现集群时,在基业务层面需要考虑
- 分层:安全层、负载层、静态层、动态层、(缓存层、存储层)持久化与非持久化
- 分割:基于功能分割大业务为小服务
- 分布式:对于特殊场景的业务,使用分布式计算
1.2 分布式
1.2.1 分布式系统概念
分布式系统指在许多不同的服务器中部署不同的服务模块,并通过远程调用协作完成特定
任务以提供服务。
一般分布式系统都会部署分布式应用程序和服务,对应用程序和服务进行分层和分段,然后
以分布式方式部署应用程序和服务模块到各个节点。它不仅可以提高并发访问能力,而且可
以减少数据库连接和资源消耗,还可以使不同的应用程序重用公共服务,使业务易于扩展。
1.2.1 分类
分布式存储:
- Ceph
- GlusterFS
- FastDFS
- MogileFS
分布式计算
- hadoop
- Spark
分布式常见应用
- 分布式应用-服务按照功能拆分,使用微服务
- 分布式静态资源–静态资源放在不同的存储集群上
- 分布式数据和存储–使用 key-value 缓存系统
- 分布式计算–对特殊业务使用分布式计算,比如 Hadoop 集群
1.3 集群与分布式区别
分布式系统处理任务是平行的,集群处理任务是串联的。
例如:包含 100 个子任务的客户请求分别到达 10 台分布式服务系统和 10 台集群服务
系统。假设单个任务单台服务器需要 1 分钟完成。那么分布式服务器系统的每台服务器
会花费 1 分钟完成一个任务,接着完成下一个任务,不考虑任务之间的依赖关系。这样
10 分钟后,就完成了 100 个任务;而在集群系统中,总是有 10 个任务被同时分配到
10 台服务器上处理,接着处理后面 10 个任务,这样在 10 分钟后,也完成了 100 个
任务。注意:在分布式中一般不会同时处理 10 个任务后又同时处理下面的 10 个任务。
集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能
没有差别,数据和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务
器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分
布式每台服务器功能加起来,才是完整的业务。
一句话:分布式是通过缩短单个任务的执行时间来提高效率,集群是通过增加单位
时间内执行的任务数量来提高效率。
例如:对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,
后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端
哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服
务器可以顶上来。分布式的每一个节点,都完成不 的业务,如果一个节点垮了,那这个
业务可能就会失败。
1.4 负载均衡集群
-
下面几种硬件可以实现负载均衡集群
- F5 Big-IP
- Citrix Netscaler
- A10 A10 下面几种软件可以实现负载均衡集群
-
lvs
:Linux Virtual Server,阿里四层 SLB (Server Load Balance)使用 -
nginx
:支持七层调度,阿里七层 SLB 使用 Tengine -
haproxy
:支持七层调度 -
ats
:Apache Traffic Server,yahoo 捐助给 apache -
perlbal
:Perl 编写 -
pound
这里的七层和四层指的是网络协议栈的层,比如:nginx 能够调度 http 协议
请求,二 http 为应用层在网络协议栈 ISO 模型的第七层;而 LVS 只能调度
TCP 等请求,TCP 在 ISO 模型的第四层传输层。
-
负载均衡的会话保持
-
session sticky:同一用户调度固定服务器
Source IP:LVS sh 算法(对某一特定服务而言)
Cookie -
session replication:每台服务器拥有全部 session
session multicast cluster -
session server:专门的 session 服务器
Memcached,Redis
1.5 HA–高可用集群
高可用的实现方案已报有两种
-
使用 Virtual Redundant Routing Protocol (VRRP)协议来实现高可用
实现 vrrp 协议的软件如 keepalived,其配合 LVS 是典型的高可用集群的常用实现 -
-
使用 ais 协议,ais 是比较重量级的高可用实现,使用该规范的软件有
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
二.Linux Virtual Server 介绍
2.1 LVS 简介
LVS 是由张文松在 1998 年 5 月启动的自由和开源项目,遵循 GNU 通用公共许
可证(GPL)第 2 版的要求。该项目的任务是使用集群技术为 Linux 构建一个高性
能、高可用的服务器,它提供了良好的可伸缩性、可靠性和可服务性。
LVS 项目的主要工作是开发高级 IP 负载平衡软件(IPVS)、应用程序级负载平衡
软件(KTCPVS)和集群管理组件。
IPVS:在Linux内核中实现的一种高级IP负载平衡软件。IP Virtual Server代码合
已经被合并到版本2.4.x和更新的Linux内核主线。
KTCPVS:在Linux内核中实现应用程序级负载平衡,截至2011年2月仍在开发中。
LVS 可用于构建高度可伸缩和高度可用的网络服务,如 web、电子邮件、媒体和
VoIP 服务,并将可伸缩的网络服务集成到大型可靠的电子商务或电子政府应用程
序中。基于 LVS 的解决方案已经部署在世界各地的许多实际应用程序中,
包括维基百科 Wikipedia。维基百科简化版的架构如下:
2.2 LVS 工作原理
LVS 组件依赖于 Linux Netfilter 框架,其源代码可以在 Linux 内核源代码的
net/netfilter/ipvs
子目录中找到。LVS 能够处理 UDP、TCP 等 4 层协议,
通过检查第 7 层数据包,也可以处理 FTP 被动连接。
用于配置 LVS 的用户空间实用程序称为 ipvsadm,它需要超级用户特权才能运行。
LVS 相关术语
VS
: Virtual Server,负责调度的服务器
RS
: Real Server,负责真正提供服务
VS 根据请求报文的目标 IP 和目标协议及端口将其调度转发至某 RS,根据调度算法
来挑选 RS。LVS 是内核级功能,工作在 INPUT 链的位置,将发往 INPUT 的流量
进行"处理"。
查看内核对 LVS 的支持
[root@steve ~]$grep -i -C 10 ipvs /boot/config-3.10.0-1062.4.1.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
--
CONFIG_IP_SET_HASH_NETNET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
#
# IPVS application helper