首页 > 代码库 > 3-1 LVS-NAT集群
3-1 LVS-NAT集群
---- (整理)By 小甘丶
什么是集群:
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。(Cluster就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点node)。
LVS:
Linux Virtual Server的简写,意即Linux虚拟服务器
是一个虚拟的服务器集群系统,此项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
集群宗旨:
可伸缩性(Scalability);可靠性(Reliability);可管理性(Manageability)
可伸缩性(Scalability):20台计算机为我们提供服务,可缩可减,可增可拓
可靠性(Reliability):万一部分计算机出现问题,并不影响对用户提供服务
可管理性(Manageability):统一管理
集群分类
负载均衡集群:Load Balance集群,简称LB
当一台服务器无法满足需求的时候,两台或多台服务器同时为客户端提供服务,以分担需求,提供轮询工作查询
高可用集群:High Availability集群,简称HA
比如一台服务器出现故障的时候,但是不影响客户端体验,另外一台服务器担当这台服务器的工作!
高性能集群:High Perfermance Computing集群,简称HPC
一台计算机是4路,那么100台计算机同时来辅助计算处理,就是400颗CPU!
硬件集群和软件集群
硬件:F5负载均衡器 https://f5.com/
软件:LVS (工作在OSI第四层,传输层) Nginx(工作在OSI第七应用层)
LVS:
英文官方网站:http://www.linuxvirtualserver.org/
中文官方网站:http://zh.linuxvirtualserver.org/
http://www.linux-vs.org/zh/
ipvsadm/ipvs 类似: iptables/netfilter
LVS集群的三层结构
1:负载调度器/分发器 (load balancer) director
他是整个集群对外的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的,我们称这个IP为虚拟IP,Virtual IP=VIP。
2:服务器池 (Server Pool)
也就是下图中的RealServer Group,是一组真正执行客户请求的服务器,执行程序可以是一组WEB,FTP,MAIL和DNS等等。RIP
3:共享存储(Shared Storage)
它是为服务器池提供的一个共享存储区,这样很容易使得服务器拥有相同的内容,提供相同的服务!
LVS包转发方式
LVS有四种转发方式:NAT(网络地址映射)、IP Tunneling(IP 隧道)、Direct Routing(直路由),Full-NAT(全NAT)。不同的转发模式决定了不同的Cluster的网络结构
NAT:
NAT方式支持任何操作系统,以及私有网络,并且只需要一个Internet IP即可!缺点是整个系统的性能受到限制,因为执行NAT的过程每一次都需要重写包,有一定的延迟。另外,大部分应用有80%的数据是从服务器流向客户端,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成非常大的压力,成为新的瓶颈!大致数据上:真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的瓶颈!
IP Tunneling
Director(分发器)分配请求到不同的Real Server,Real Server处理请求后直接回应给客户端,这样director负载均衡器处理客户端与服务器的一半链接。IP Tunneling技术极大的提高了director的调度处理能力 ,同时也极大的提高了系统能容纳的最大节点数,可以超过100个节点,Real Server可以在任何LAN和WAN上运行,这就意味着允许地理上的分布(由于通过IP Tuneling封装后,封装后的IP包的目的地址为Real Server的IP地址,那么只要Real Server的地址路由可达,Real Server在什么网络里都可以,这样可以减少对于公网IP地址的消耗,但是因为处理IP Tunneling封装和解封装的开销,那么效率就不如DR模式),这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户端直接通讯(每个Real Server必须绑定VIP),并且所有服务器必须支持IP隧道协议!
Direct Routing
与IP Tuneling类似,只不过IP Tuneling工作在第三层,而DR工作在第二层,数据链路层。负载均衡器(LB)仅处理了一半的链接,避免了新的瓶颈,同时增加了系统的可伸缩性。Direct Routing与IP Tuneling相比没有IP封装的开销,但是由于采用物理层修改MAC地址技术,所以所有服务器必须在一个物理网段!
LVS-NAT工作原理
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可?期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器?
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:扩展性有限。当服务器节点增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
关于集群中的IP名称缩写
名称 | 缩写 | 说明 |
虚拟IP地址(Virtual IP address) | VIP | VIP为Director用户向客户端提供服务的IP地址 |
真实IP地址(Real Server IP address) | RIP | 在集群下面节点上使用的IP地址 |
Director IP地址(Director IP Address) | DIP | Director用于连接内外网的IP地址,物理网卡上的IP地址 |
客户端IP地址(Client Ip Address) | CIP | 客户端用户请求集群服务器的IP地址,改地址用作发送给集群请求的源IP地址 |
图解LVS-NAT工作原理-数据包流动过程文字描述:
客户端访问服务器,访问请求到达调度器,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的Real Server;Real Server的相应包通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
步骤一:客户端访问VIP1的网站
发送的请求包是源地址是自己的IP地址CIP,目标地址直接访问的是Director的VIP,请求显示某一个页面,是不去直接访问RealServer里面的IP地址(RealServer的IP地址是私有的IP地址,需要经过NAT的方式将内部IP地址转化之后的VIP才能在公网上运作)
步骤二:客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;
步骤三:真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
第四步: 经过了Director,Source IP:VIP1 DSTIP: CIP1
1: request: S: CIP D:VIP
2: director: S: CIP D:RIP
3: replay: S: RIP D:CIP
4: ditector:S: VIP D:CIP
实验环境
配置分发器
配置网路环境,gan61.cn配置成分发器,gan62.cn和gan63.cn为提供服务的真实服务器
为gan61.cn添加一块网卡,用于模拟内网,采用vmnet4模式
添加一张网卡 eth1 : 模式vmnet4 模拟内网
eth0 原网卡,模式bridge 模拟公网
配置新添加的网卡IP
[root@gan61 ~]# cd /etc/sysconfig/network-scripts/
[root@gan61 ~]# cp ifcfg-eth0 ifcfg-eth1
[root@gan61 ~]# vim ifcfg-eth1
1 DEVICE=eth1
2 TYPE=Ethernet
3 ONBOOT=yes
4 NM_CONTROLLED=yes
5 BOOTPROTO=static
6 IPADDR=192.168.1.111
7 PREFIX=24
[root@gan61 ~]# service network restart # 重启网络服务!使IP生效
[root@gan61 ~]# ip addr # 查看网卡IP信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:77:74:1a brd ff:ff:ff:ff:ff:ff
inet 192.168.31.61/24 brd 192.168.31.255 scope global eth0
inet6 fe80::20c:29ff:fe77:741a/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:77:74:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.111/24 brd 192.168.1.255 scope global eth1
inet6 fe80::20c:29ff:fe77:7424/64 scope link
valid_lft forever preferred_lft forever
[root@gan61 ~]# vim /etc/sysctl.conf # 打开路由转发功能
#将
……
net.ipv4.ip_forward = 0
……
#改为
net.ipv4.ip_forward = 1
[root@gan61 ~]# sysctl -p # 加载配置,是指sysctl.conf里面的配置生效
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@gan61 ~]# yum -y install ipvsadm # 安装LVS管理工具
[root@gan61 ~]# ipvsadm -A -t 192.168.31.61:80 -s rr # 配置ipv规则
# 添加虚拟服务器IP
# rr表示轮询,round-robin
# -A,表示添加; -t,表示TCP的服务,后面书写格式为VIP:Port; -s设置调度算法
[root@gan61 ~]# ipvsadm -a -t 192.168.31.61:80 -r 192.168.1.62 -m
[root@gan61 ~]# ipvsadm -a -t 192.168.31.61:80 -r 192.168.31.63 -m
# 添加Real Server
# -a,表示添加real server的地址;
# -r表示realserver地址;
# -m表示masquerade,也就是NAT方式LVS
[root@gan61 ~]# ipvsadm -L # 查看当前ipvsadm规则
# 配置及查看内核IPVS表和算法的工具类似于iptables
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP gan61.cn:http rr
-> 192.168.1.62:http Masq 1 0 0
-> 192.168.31.63:http Masq 1 0 0
InActConn 指非活跃连接数, TCP ESTABLISH 状态以外的连接都称为不活跃连接。例如处于 SYN_RECV 状态的连接,处于 TIME_WAIT 状态的连接等
[root@gan61 ~]# /etc/init.d/ipvsadm save #保存IPvsadm规则
# 保存ipvsadm规则,到/etc/sysconfig/ipvsadm
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@gan61 ~]# chkconfig ipvsadm on
配置Real Server
配置 Real Server web服务
[root@gan62 ~]# yum -y install httpd # 安装Httpd服务
[root@gan62 ~]# echo "<h1><em>This is Gan62.cn</em></h1>" > /var/www/html/index.html # 创建测试页面
[root@gan62 ~]# chkconfig httpd on # 设置开机自启动
[root@gan62 ~]# service httpd start # 启动服务
Starting httpd: [ OK ]
[root@gan63 ~]# yum -y install httpd # 安装Httpd服务
[root@gan63 ~]# echo "<h1><em>This is Gan62.cn</em></h1>" > /var/www/html/index.html # 创建测试页面
[root@gan63 ~]# chkconfig httpd on # 设置开机自启动
[root@gan63 ~]# service httpd start # 启动服务
Starting httpd: [ OK ]
****************************************************************
拓展:TCP三次握手:
ESTABLISH ESTABLISH
TCP四次挥手
****************************************************************
Real Server配置IP
Gan62.cn:
IP地址:192.168.1.62,网关192.168.1.62,DNS 192.168.1.111
Gan63.cn:
IP地址:192.168.31.63,网关192.168.31.63,DNS 192.168.1.111
调整gan62.cn 和 gan63.cn 的网卡模式为 vmnet4
[root@gan62 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
1 DEVICE=eth0
2 TYPE=Ethernet
3 ONBOOT=yes
4 NM_CONTROLLED=yes
5 BOOTPROTO=static
6 IPADDR=192.168.1.62
7 PREFIX=24
8 GATEWAY=192.168.1.111
[root@gan62 ~]# service network restart && service httpd restart
[root@gan63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
1 DEVICE=eth0
2 TYPE=Ethernet
3 ONBOOT=yes
4 NM_CONTROLLED=yes
5 BOOTPROTO=static
6 IPADDR=192.168.31.63
7 PREFIX=24
8 GATEWAY=192.168.1.111
[root@gan63 ~]# service network restart && service httpd restart
真实环境应该使用由对应的存储池,然后和我们的REAL SERVER共享,来使得我们所访问的资源是同步的
测试集群
物理机模拟客户端,浏览器访问http://192.168.31.63,使用F5键刷新
按F5刷新,测试结果是会在两个页面之间切换
ipvsadm:USAGE:
Usage:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
ipvsadm其他参数
--add-service -A # add virtual service with option
#在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器
--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
#启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采keepalived 的VRRP 功能。
--stop-daemon # stop connection sync daemon
#停止同步守护进程
--help -h # display this help message
#显示帮助信息
ipvsadm其他选项
--tcp-service -t service-address # service-address is host[:port]
#说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
--udp-service -u service-address # service-address is host[:port]
#说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
--fwmark-service -f fwmark # fwmark is an integer greater than zero
#说明是经过iptables 标记过的服务类型。
--scheduler -s scheduler
# one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc.
#使用的调度算法,有这样几个选项,默认的调度算法是: wlc.
--persistent -p [timeout] # persistent service
#持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒
--netmask -M netmask # persistent granularity mask
--real-server -r server-address # server-address is host (and port)
#真实的服务器[Real-Server:port]
--gatewaying -g gatewaying (direct routing) (default)
#指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
--ipip -i ipip encapsulation (tunneling)
#指定LVS 的工作模式为隧道模式
--masquerading -m masquerading (NAT)
#指定LVS 的工作模式为NAT 模式
- -weight -w weight # capacity of real server
#真实服务器的权值
--u-threshold -x uthreshold # upper threshold of connections
--l-threshold -y lthreshold # lower threshold of connections
--mcast-interface interface # multicast interface for connection sync
#指定组播的同步接口
--syncid sid # syncid for connection sync (default=255)
--connection -c # output of current IPVS connections
#显示LVS 目前的连接 如:ipvsadm -L -c
--timeout # output of timeout (tcp tcpfin udp)
#显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon # output of daemon information
#显示同步守护进程状态
--stats # output of statistics information
#显示统计信息
--rate # output of rate information
#显示速率信息
--thresholds # output of thresholds information
--persistent-conn # output of persistent connection info
--sort # sorting output of service/server entries
#对虚拟服务器和真实服务器排序输出
--ops -O # one-packet scheduling
--numeric -n # numeric output of addresses and ports
#输出IP 地址和端口的数字形式
Ipvsadm命令实例
[root@gan61 ~]# ipvsadm -L -n –c # 查看客户端连接分发器和Real Server的情况
IPVS connection entries
pro expire state source virtual destination
TCP 01:57 TIME_WAIT 192.168.31.228:52955 192.168.31.63:80 192.168.1.63:80
TCP 01:57 TIME_WAIT 192.168.31.228:52953 192.168.31.63:80 192.168.1.63:80
TCP 01:58 TIME_WAIT 192.168.31.228:52959 192.168.31.63:80 192.168.1.63:80
TCP 01:57 TIME_WAIT 192.168.31.228:52952 192.168.31.63:80 192.168.1.62:80
TCP 01:57 TIME_WAIT 192.168.31.228:52956 192.168.31.63:80 192.168.1.62:80
TCP 01:57 TIME_WAIT 192.168.31.228:52954 192.168.31.63:80 192.168.1.62:80
TCP 01:55 TIME_WAIT 192.168.31.228:52951 192.168.31.63:80 192.168.1.63:80
TCP 01:58 TIME_WAIT 192.168.31.228:52958 192.168.31.63:80 192.168.1.62:80
TCP 01:57 TIME_WAIT 192.168.31.228:52957 192.168.31.63:80 192.168.1.63:80
[root@gan61 ~]# ipvsadm -Z # 清空当前虚拟服务表的计数器
[root@gan61 ~]# 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.31.63:80 13 73 58 7729 5222
-> 192.168.1.62:80 7 36 28 4023 2564
-> 192.168.1.63:80 6 37 30 3706 2658
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)
[root@gan61 ~]# ipvsadm -L -n --rate # 查看速率
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.31.63:80 1 9 7 897 712
-> 192.168.1.62:80 1 4 3 419 333
-> 192.168.1.63:80 1 5 4 478 379
CPS (current connection rate) 每秒连接数
InPPS (current in packet rate) 每秒的入包个数
OutPPS (current out packet rate) 每秒的出包个数
InBPS (current in byte rate) 每秒入流量(字节)
OutBPS (current out byte rate) 每秒入流量(字节)
[root@gan61 ~]# ipvsadm -d -t 192.168.31.63:80 -r 192.168.1.62 # 删除一台RS
[root@gan61 ~]# ipvsadm -C # 清空规则
总结:
1:一组计算机为我们的用户提供同一类服务
1000台:统一管理
node:节点
2:集群特性
可伸缩性(Scalability);可靠性(Reliability);可管理性(Manageability)
可伸缩性(Scalability):20台计算机为我们提供服务,可缩可减,可增可拓
可靠性(Reliability):万一部分计算机出现问题,并不影响对用户提供服务
可管理性(Manageability):统一管理
3:层次化
可以通过IP(来源IP),由那些服务器为用户提供服务
通过不同的程序,为用户提供服务
html
jsp
php
png
jeg
mp4
avi
asp
net
数据层,为用户提供服务
网络层(传输层)-->应用层--->数据层[分割]
4:集群的类型
负载均衡集群:Load Balance 集群,简称 LB,当一台服务器无法满足需求的时候,两台或多台服务器同时为客户端提供服务,以分担需求,提供轮询(RR)工作查询
拓展伸缩
高可用集群:High Availability 集群,简称 HA,比如一台服务器出现故障的时候,但是不影响客户端体验,另外一台服务器担当这台服务器的工作! realserver 前段代理的高可用 作用:避免单点故障
高性能集群:High Perfermance Computing 集群,简称 HPC,一台计算机是 4路,那么 100 台计算机同时来辅助计算处理,就是 400 颗 CPU! hadoop
5:分布式
分散布局合一
分布式计算
分布式应用
分布式存储
6:集群的类型
软件集群
lvs(传输层)
Nginx(应用层)
haproxy(应用层)
硬件集群
F5
A10
Array
Redware
Netscaler
HA
heartbeat
keepalived
corosync+pacemaker
RHCS
HPC
hadoop
6:国内比较知名开源软件
tengine(Nginx的二次开发)
TFS
LVS (full-nat)
都和淘宝逃不了关系 章文松
7:LVS介绍
物理层-->数据链路层-->网络--->传输层-->会话层--->表示层--->应用层
BIT MAC IP application
L4:四层路由,四层交换
根据目标地址和目标端口是先求转发
LVS:Linux Virtual Server
iptables/netfilter
ipvsadm/ipvs
tcp/udp
IP:PORT
8:三层结构
load balancer :负载调度器
Server Pool: 服务器池,web,FTP,mail,DNS
Shared Storage: 共享存储
9:相关术语
director:分发器,负载调度器,也就是load balancer
real server:真正为用户提供服务器服务器
IP
VIP:Virtual IP,真正对外提供服务的IP,也就是DNS解析的地址IP
DIP:Director IP,面对我们后端真实服务器的IP
RIP:Realserver IP
CIP:Client IP
ipvs:ip virtual server
10:LVS的类型
LVS包的转发方式
lvs-nat[network Address translation]
lvs-dr [direct Routing]
lvs-tun [tunneling]
3-1 LVS-NAT集群