集群和LVS(第29天)

Cluster

数据的流向:客户端发起http请求,httpd接收请求,并处理。如果请求的是静态数据,httpd直接取出数据并封装成响应报文回应给客户端,如果请求的是动态的数据,则这个请求数据报文要通过httpd发送给application server(可能是fastcgi,可能是uWSGI等),application server处理好的过程中,可能需要连接到存储服务器,比如mysql等,那么application server又要作为数据库服务器的客户端向数据库服务器发起请求。这里有3个节点,web server,application server,mysql server,这些节点都可能因为请求连接的巨量而造成系统瓶颈。

系统扩展的方式:
scale up: 向上扩展,用性能更好的主机取代性能较差的主机,性价比不高
scale out: 向外扩展,添加前端httpd的主机,或者添加php-fpm服务的主机,或者添加提供mysql数据库服务的主机  (添加的主机如何解决数据的同步问题(比如application server各个服务器中session的同步问题,数据库服务器可能使用主从同步,读写分离等,如果不是用读写分离,就可能需要使用分布式数据库。),以及调度分发问题(比如,如何调度各个httpd服务器,可以通过在httpd服务器的前端添加负载均衡调度器组件,该组件也可能成为系统瓶颈,所以负载均衡调度器组件必须准备多个以便于做冗余。还有,负载均衡调度器组件可能坏掉,那么冗余的负载均衡调度器组件如何抢IP地址。))



集群类型:
LB:负载均衡集群,Load Balancing
HA:高可用集群,High Availability,服务一直可用。并且通过冗余解决高可用性的问题。Availability=平均无故障时间/(平均无故障时间+修复时间)
              Availability=90%,95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%
HP:高性能集群,High Performancing,集中式(区别于分布式)



对系统的衡量指标:
可扩展性:某一个层面的服务主机的持续增加会有拐点的,当到达一定的主机量的时候,这些主机之间协调消耗的性能和时间的代价就大于它们带来的性能增加。
可用性
容量:单位时间内能处理的请求数量
性能 :对一个请求的响应时间


系统运维角度:可用 --> 标准化 --> 自动化



构建高可扩展性系统的重要原则:在系统内部尽量避免串行化和交互;


GSLB: Global Service Load Balancing
SLB: Service Load Balancing


CDN搞定80%的静态数据,LB处理20%的请求,这20%的请求可能会有20%是动态请求的。所以,20%的动态请求可能也可以缓存(memcache)。静态数据也可以通过key-value机制缓存起来,key可以是url的哈希,value则表示网页。






总结:
分层:负载均衡层,静态资源层,动态资源层(application server层),数据存储(结构化数据,非结构化数据)
分割:不同功能分发在不同的服务器组,在首页聚合。比如新浪中,首页有新闻组,财经组,国外新闻组等等。
分布式
分布式应用
分布式静态资源
分布式数据和存储
分布式计算



LB(负载均衡)集群的实现:分为硬件和软件
硬件LB:
F5 BIG-IP
Citrix NetScaler
A10 A10
Array
Redware

软件LB:
lvs:linux virtual server
haproxy
nginx
       httpd(proxy模块)
ats (apache traffic server):雅虎开发    http://trafficserver.apache.org/
perlbal:perl语言开发

基于工作的协议层次划分:
传输层:lvs(工作于内核(不受限于套接字),性能高,功能单一,基本只有负载均衡这一功能), haproxy(mode tcp 模拟tcp)
应用层:haproxy, nginx, ats, perlbal     应用层的负载均衡其实就是反向代理



假设某一个站点的并发连接请求是3万,并且该站点的服务器能在1秒钟之内响应完成。一天的并发就是86400秒×30000 等于2592000000,只取白天的8个小时来算2592000000/3=864000000,一天差不多要处理8,6400,0000个的连接数。假设一个页面有10个资源,那么一天的pv就有86400000。



LVS详解:基于TCP/UDP对服务进行负载均衡调度

LVS如下:
1:假设客户端请求服务器的tcp的3306端口,LVS调度器接收该请求。
2:一般来说,请求被网卡接收,数据包到达内核会经过prerouting,然后是input,最后就到达LVS主机上运行着的应用程序。但是LVS主机没有运行这样的应用程序。相反的,LVS主机上有对应的调度规则,这些规则会把请求转发给后端的真正提供服务的主机。所以请求报文不会传输到上层应用的。
所以这个例子中,LVS调度器谎称自己提供了3306端口,但是它本身并不提供这样的服务,LVS的简称由此而来,Linux Virtual Server。


LVS是基于端口做报文转发的,所以也被称之为L4(四层路由),比如客户端请求3306端口,那么就转发到后台的mysql服务器,如果请求80端口,那么就转发到后台的http服务器。


LVS根据请求报文的目标IP和PORT将其转发至后端主机集群中的某一台主机(具体哪一台,则要根据挑选算法选取)

LVS的工作依赖于netfilter。


经由netfilter的报文的走向:
PREROUTING-->> INPUT           进入主机的报文的走向
PREROUTING-->> FORWARD -->> POSTROUTING   转发的报文的走向
OUTPUT -->>  POSTROUTING   从主机发出的报文的走向


LVS工作在INPUT链上,LVS在INPUT链上添加规则,使其转发到POSTROUTING上。
所以经过LVS的报文的走向是这样的,PREROUTING--> INPUT--> POSTROUTING

因此,工作在INPUT链上的LVS要定义如下的一些选项:
1:哪些端口要基于集群方式工作
2:真正提供服务的集群主机有哪些,以便于LVS从中挑选一台来响应客户端的请求
3:从后台提供服务的集群主机中挑选机器的算法


LVS的组成部分有2个:ipvsadm/ipvs
第一个是工作在用户空间的组件ipvsadm,用于让用户定义规则;管理集群服务
第二个是工作在内核空间的组件,称之为ipvs,具体工作在netfilter 的INPUT链上。
ipvsadm是一个命令行工具,管理员通过这个工具编写LVS规则。ipvsadm其实就是调用了ipvs提供的接口。


LVS支持支持TCP, UDP, AH, EST, AH_EST, SCTP等诸多协议;


通过如下的命令查看当前系统是否支持LVS:通过查看内核配置文件确定LVS是否被编译进内核中:
grep -i -A 10 "IPVS"  /boot/config-3.10.0-514.26.1.el7.x86_64


LVS arch:LVS架构:LVS架构如下图:

   调度器:director, dispatcher, balancer
RS: Real Server,真正提供服务的服务器

Client IP: CIP  用来表示客户端的IP地址
Director Virutal IP: VIP:用来表示LVS调度器的虚拟IP地址
Director IP: DIP           用来表示LVS调度器的调度IP
Real Server IP: RIP    用来表示真正提供服务的IP



LVS type:
有如下4种:
   lvs-nat
   lvs-dr(direct routing 直接路由)
   lvs-tun(ip tunneling  ip隧道)
   lvs-fullnat


lvs-nat: 这种类型其实就是DNAT   MASQUERADE
    多目标的DNAT(iptables的DNAT);它通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出的某RS的RIP地址实现转发;
    (1) RS和DIP应该使用私网地址,且RS的网关要指向DIP;
    (2) 请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
    (3) 支持端口映射;
    (4) RS可以使用任意操作系统;
    (5) RS的RIP和Director的DIP必须在同一IP网络;
    (6) 这种方式的请求报文在LVS主机(LVS调度器)中走向是PREROUTING-->INTPUT-->POSTROUTING,响应报文的走向是PREROUTING-->FORWARD-->POSTROUTING.

lvs-dr: direct routing   直接路由    GATEWAY

    它通过修改请求报文的目标MAC地址进行转发;
    Director: 每一个Director都有VIP和DIP
    RSs: 每一个RS都有RIP和VIP,所以这些RS必须隔离针对VIP的ARP广播报文

    (1) 保证前端路由器将目标IP为VIP的请求报文发送给director;
    解决方案:
         静态绑定
        arptables
        修改RS主机内核的参数
    (2) RS的RIP可以使用私有地址;但也可以使用公网地址;
    (3) RS跟Director必须在同一物理网络中;
    (4) 请求报文经由Director调度,但响应报文一定不能经由Director;
    (5) 不支持端口映射;
    (6) RS可以大多数OS;
    (7) RS的网关不能指向DIP;


lvs-tun:  IPIP
不修改请求报文的ip首部,而是通过在原有的ip首部(cip<-->vip)之外,再封装一个ip首部(dip<-->rip);


(1) RIP, DIP, VIP全得是公网地址;
(2) RS的网关的不能指向DIP;
(3) 请求报文必须经由director调度,但响应报文必须不能经由director;
(4) 不支持端口映射;
(5) RS的OS必须支持隧道功能;

lvs-fullnat:
director通过同时修改请求报文的目标地址和源地址进行转发;

(1) VIP是公网地址;RIP和DIP可以是私网地址,二者无须在同一网络中;
(2) RS接收到的请求报文的源地址为DIP,因此要响应给DIP;
(3) 请求报文和响应报文都必须经由Director;
(4) 支持端口映射机制;
(5) RS可以使用任意OS;

中国公司参与开源不积极,阿里巴巴还不错,腾讯这种烂货积极使用开源软件,鲜少回馈开源。

http是stateless(无状态)的:
session的保持的实现方案有session绑定,session集群,session服务器

session绑定:
source ip hash:同一个来源IP的请求都发送至同一个RS中,特点是粒度太粗(因为一个IP背后可能是成千上百个主机,因为运营商通过SNAT让其客户上网)
cookie :通过cookie

session集群: 每一个RS服务器都会同步其他的任何RS的session。

session服务器:每一个RS存储session的时候,不存储session,而是请求一个共享服务,把session存储到这个共享服务器中,这个共享服务器就是session服务器。


lvs scheduler:lvs调度算法
静态方法:仅根据算法本身进行调度;
RR:round robin,轮调
WRR:weighted rr,加权的RR
SH: source hash, 实现session保持的机制;将来自于同一个IP(一批共享同一个IP的运营商用户)的请求始终调度至同一RS;
DH:destination hash, 将对同一个目标的请求始终发往同一个RS;

动态方法:根据算法及各RS的当前负载状态进行调度;
Overhead  表示RS服务器的负载
LC:Least Connection   最少连接    Overhead=Active*256+Inactive
WLC: Weighted LC,加权的最少连接   Overhead=(Active*256+Inactive)/weight
SED: Shortest Expection Delay  最短期望延迟   Overhead=(Active+1)*256/weight
NQ:Never Queue    NQ是SED算法的改进;被SED算法挑选中RS的被排除
LBLC:Locality-Based LC,即为动态的DH算法;正向代理情形下的cache server调度;
LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法;




ipvs的集群服务:
tcp, udp, ah, esp, ah_esp, sctp

(1) 一个ipvs主机可以同时定义多个cluster service;
tcp, udp
(2) 一个cluster service上至少应该有一个real server;

定义时:指明lvs-type, 以及lvs scheduler;




ipvsadm的用法:
管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler]    增加修改
ipvsadm -D -t|u|f service-address         删除

service-address:
tcp: -t ip:port
udp: -u ip:port
fwm: -f mark   表示防火墙标记

-s scheculer:
默认为wlc


管理集群服务中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]  增和改
ipvsadm -d -t|u|f service-address -r server-address   删除

server-address:   RS的地址,就是-r后面跟的server-address
ip[:port]

lvs-type:
-g: gateway, dr
-i: ipip, tun
-m: masquerade, nat

清空和查看:
ipvsadm -C                 CLEAN清空
ipvsadm -L|l [options] LIST查看
-n: numeric,基于数字格式显示地址和端口;
-c: connection,显示ipvs连接;
--stats:统计数据
--rate: 速率
--exact: 精确值 ,不做单位换算
用法举例 ipvsadm -L -n
ipvsadm -L -c
ipvsadm -L -n --stats
ipvsadm -L -n --rate
ipvsadm -L -n --stats

保存和重载:
        ipvsadm -R            重载
        ipvsadm -S [-n]        保存


  置零计数器:
       ipvsadm -Z [-t|u|f service-address]


LVS实验:


lvs-nat实验:



具体环境如下:
中间的director有vip和dip 2个网卡,地址如上图所示。右边的RS1和RS2表示real server。一般来说lvs-net的方式就是为了隐藏RS服务器,所以一般来说RS服务器的ip地址,RIP1和RIP2都是私有地址,并且RS1和RS2的网关指向DIP。

在director主机中添加如下的规则:
ipvsadm -A  -t 172.16.100.9:80 -s rr

然后,在director主机中使用如下的命令查看:
ipvsadm -L  -n

在director主机中添加RS服务器:
ipvsadm -a  -t 172.16.100.9:80 -r 192.168.20.7 -m   对172.16.100.9:80的访问调度至192.168.20.7
ipvsadm -a  -t 172.16.100.9:80 -r 192.168.20.8 -m   对172.16.100.9:80的访问调度至192.168.20.8



然后,在director主机中使用如下的命令查看:
ipvsadm -L  -n
就可以看到有2个RS

在任意主机上,打开浏览器,多次访问http://172.168.100.9,观察效果


保存规则:
ipvsadm -S > /etc/sysconfig/ipvsadm

恢复规则:
ipvsadm -R < /etc/sysconfig/ipvsadm


在director主机中,对规则编辑修改:
ipvsadm -E -t 172.16.100.9:80  -s  sh    修改调度算法为sh


在director主机中,修改RS的监听端口,做端口映射:
ipvsadm -e -t 172.16.100.9:80  -r 192.168.20.7:8080  -m
ipvsadm -e -t 172.16.100.9:80  -r 192.168.20.8:8080  -m

从集群中删除RS服务器:
ipvsadm -d  -t 172.16.100.9:80  -r 192.168.20.7:8080


删除集群服务:
ipvsadm -D -t 172.16.100.9:80



作业:
    nat模型实现http和https两种负载均衡集群;
    ssl:
    RS: 所有的RS都要提供同一个私钥和同一个证书;


lvs-dr实验:
两个内核参数:如下
arp_ignore
arp_announce   arp通告,取值有0,1,2,某个网卡接口有什么地址都通告出去,1表示尽量不通告给非本网络的接口,2表示


arp_ignore=1   表示让RSs忽略目标ip为VIP的arp广播报文
arp_announs=2  表示RSs上的lo接口上的别名vip不通告给rip接口。







具体环境:




director主机上的vip是dip接口上的别名

RSs主机上的vip是lo接口上的别名



director主机上配置如下:
    ~]# ifconfig eno16777736:0 172.16.100.10/32 broadcast 172.16.100.10 up
    ~]# route add -host 172.16.100.10 dev eno16777736:0

RSs主机上配置如下:
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

~]# ifconfig lo:0 172.16.100.10/32 broadcast 172.16.100.10 up
~]# route add -host 172.16.100.10 dev lo:0




作业:
    dr模型实现http和https两种负载均衡集群;
    ssl:
    RS: 都要提供同一个私钥和同一个证书;
    dr模型实现mysql负载均衡集群;

    拓展:规划拓扑实现,VIP与RIP不在同一网络中的集群;

    博客作业:lvs的类型、lvs调度方法、lvs-nat和lvs-dr模型演示;






































评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用