集群简介

什么是集群

一组是通过高速网络互联的计算组,并以单一系统的模式加以管理。

将很多服务器集中起来一起,提供同一种服务,在客户端看来就像是只有一个服务器

可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益

任务调度是集群系统中的核心技术


集群:由一组机器提供相同的服务通过网线连接

集群目的:

提高性能

降低成本

提高可扩展性

增强可靠性

集群的分类:

高性能计算集群HPC(主要用于科学)

负载均衡集群LB(平均分摊)

高可用集群HA(需要两台服务器一个主一个备,避免单点故障)


LB的实现:LVS软件 Haproxy软件 (nginx)

HA的实现:Keepalived软件

LVS:它是一段内核代码,不提供任何功能,但是能够根据用户定义的转发规则将用户对于服务应用的请求转发至后端主机的机制。

LVS:工作在内核的第四层(tcp/udp)层

LVS软件介绍:主要实现高可用的、可伸缩的web、mail、cache、和media等网络服务。


LVS集群组成

前端:负载均衡层

中间:服务器群组层

底端:数据共享存储层

  

LVS术语

Diector Server 调试服务器

Real Server 真实服务器

VIP 虚拟ip地址

RIP 真实IP地址

DIP 调试器连接节点服务器的ip地址

cip 客户ip地址


LVS工作模式

VS/NAT 网络地址转换模式(有两个网段的IP一个私有和一个公有)

用户的请求到达的前端的调度器,调度器本身不提供服务,只是提供某种方法从后端realserver中挑选出一个服务角色来响应用户请求,这些服务器是隐藏在调度器背后的,因此他们是通过地址转换,将用户请求逐个分发到后端realserver,当用户的请求被realserver处理了之后,这个请求需要将请求再次发给调度器,再由调度器封装报文(源VIP 目标CIP)发送给client


无论是客户的请求还是服务端的响应都必须经过调度器(director)


如果调度器的并发量非常大的话,(请求非常小,响应比较大)如果后端的relaserver非常的多,调度器可能会成为性能瓶颈的,因为调度器本身也需要大量的系统资源来响应用户的请求(CPU+网络吞吐)


其好处:只需要一个公网地址即可响应用户的请求


NAT模式特性总结:


·.realserver应该使用私有ip地址


·一般realsever的网关应该指向DIP,不然的话无法保证响应报文经过director


·RIP要和DIP应该在同一网段内


·进出的报文,无论请求还是响应都要经过Directory


·支持端口映射


·realserver可以使用任意系统,只要端口对应即可


在高负载下,directory可能会成为性能瓶颈,所以不使用于并发很高的应用场景




在nat模式下在集群节点下经过哪些链:


当一个请求到达的时候,请求刚进入本地会到prerouting,而后目标地址就是本机vip地址,于是送往input链,但是在input链上工作的有ipvs,而且ipvs会有规则结果会分发到postrouting


NAT模型回复的报文会经过prerouting ,目标地址是CIP所以通过preting到达fowward到postrouting并返回给用户


其报文走向流程:


入站报文:prerouting--> input(强行改变流程) --> postrouting


出站报文:响应时候先进行prerouting--> forward --> postrouting



VS/DR直接路由模式(分发器在发请求给服务器时,不直接回包给分发器,而是直接发给客户,但客户端必须要有VIP)

·用户通过访问其域名解析到其IP地址(VIP)

·用户向目标VIP发送请求,这是Director接收到请求,此时源IP是用户的IP地址,其目标MAC是Director的MAC地址

·LVS会根据其相关算法选择一台active的服务器,将此RIP所在网卡的MAC地址作为目标的MAC地址,此时源MAC地址是Director的MAC地址,目标MAC地址是realserver的MAC地址

·realserver收到了数据包,并且分析数据包,如果发现目标IP地址(VIP)与本地的lo(环回接口)匹配,于是就会处理这个报文,广播到LAN中,此时源MAC地址是realserver的MAC地址,目标IP地址是用户的IP


其特性:

·realserver可以使用私有地址,但建议使用公网地址,

·realserver的网关一定不能指向DIP,否则没有意义了

·RIP和DIP要在同一物理网络内,一定不能跨越路由设备的

·入站报文经过directory,出站则由realserver直接响应

·不能做端口映射

·realserver必须绑定lo地址,跨越支持大多数常见OS

DR模型限定了主机必须在同一物理网络内

VS/TUN隧道模式(用来做LB集群时服务器在不同地点)

隧道模式则类似于***的方式,使用网络分层的原理

TUN的工作流程:

用户发来的数据包的基础上,封装一个新的IP头标记(此IP头只有目的IP部) 发给REALSERVER

REALSERVER收到后,先把Director发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过Director


需要注意的是:由于REALSERVER需要对DR发过来的数据包进行还原,也就是说必须支持IPTUNNEL协议所以,在 REALSERVER的内核中,必须编译支持IPTUNNEL这个选项



集群及LVS简介_集群


负载均衡调试算法

轮询 :平均分配(rr)

加权轮询:根据权重值轮询,根据比例值(wrr)

最少连接:看谁的连接数少就分发给谁(lc)

加权最少连接:根据权重值去选择最少的连接数(wlc)




LVS-NAT集群


安装软件

LVS的ip负载均衡技术是通过IPVS模块实现的

IPVS模块已成为Linux组成部分


sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。

-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。

语法

sysctl(选项)(参数)

查看所有可读变量:

sysctl -a



开启内核路由转发功能

sysctl -a | grep ip_forward

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl -p 开启路由转发


添加网关:

route add default gw 网关地址

删除网关:

route del default gw 网关地址

查看网关:

route -n


注:做这些之前需要将NetworkManager关了在生产环境一般也不开


配置分发器:

  1. 安装软件包

    ipvsadm

  2. 服务名和软包同名

  3. 命名是ipvsadm创建集群管理集群


创建虚拟服务器

查看集群ipvsadm -Ln(加n以数字显示)

添加虚拟服务器  -A

设置群集地址(VIP,Virtual IP)  -t

指定负载调度算法 -s

    

ipvsadm用法:

添加、删除服务器节点

-a 添加真实服务器

-d删除真实服务器

-r指定真实服务器(Real Server)的地址

-m 使用NAT模式;-g、-i 分别对就DR、TUN模式

-w为节点服务器设置权重,默认为1

 

保存配置ipvsadm -S

清除所有配置ipvsadm -C

ipvsadm -Ln --stats 查看详细信息 

conns接收连接数 InPkts 输入数据包outpkts输出数据包 inbytes输入字节数 outbytes输出字节数

watch -n 1 ipvsadm -Ln --status 每隔一秒显示信息

清空计数器ipvsadm -Z

/etc/sysconfig/ipvsadm-config

保存到自己的主配置文件里让它开机启动:ipvsadm -S > /etc/sysconfig/ipvsadm

IPVS_SAVE_ON_STOP="no" 默认配置文件不保存改为yes

缺点:一旦调度器坏了服务集群就没法用了,成为了数据传输的瓶颈。为了解决这问题我们需要用LVS/DR技术

/etc/sysconfig/ipvsadm将ipvsadm -S 保存到那里面就可以用systemctl restart ipvsadm

LVS-DR集群

  1. 设置分发器

    ifconfig eth0:1 192.168.4.254 绑定接口如何想让他开机生效可以放在/etc/rc.local

  2. 保存当前配置到主配置文件里

    ipvsadm -S > /etc/sysconfig/

  3. 创建虚拟服务

    ipvsadm -A -t 192.168.4.253:80 -s rr

  4. 添加realserver

    ipvsadm -a -t 192.168.4.253:80 -r 192.168.4.52:80 -g

    ipvsadm -a -t 192.168.4.253:80 -r 192.168.4.53:80 -g(默认不写-g就是DR模式)

  5. 保存配置

    ipvsadm -S > /etc/sysconig/ipvsadm

  6. 查看状态信息

    ipvsadm -Ln

    如果出现Route字样就表示是DR模式

二、配置realserver

 1、修改网络接口的内核参数

  cd /proc/sys/net/ipv4/conf/

  lo/arp_ignore将这里面的值改为1

  lo/arp_announce将这里面的值改为2

  all/arp_ignore将这里面的值改为1

  all/arp_announce将这里面的值改为2

  如果要永久生效记到写到/etc/rc.local写绝对路径

 2、在本机的lo接口绑定vip地址每台都要设置

  删除绑定的vip地址 ifdown lo:1

  ifconfig lo:1 192.168.4.253/32要永久生效写到/etc/rc.local

 3、运行网站服务编写网页文件    

 


扩展LVS:

LVS服务做LB集群时,不能够对realserver服务做健康行检查

解决办法,在分发器上定期执行监测脚本

vim /root/checklvs.sh

#!/bin/bash

如何知道realserver 80 是不是开放状态可以用nmap去检查

nmap -sS -n -p 80 192.168.4.53 在这个命令里去过滤open 如果是open就是打开不是就是关闭的把他的值给一个变量nmap -sS -n -p 80 192.168.4.53  | grep open

当realserver 80 不是开放状态的时候就在本机执行删除realserver的命令

ipvsadm -d -t 192.168.4.253:80 -r 192.168.4.x

当realserver 80 是开放状态的时候在把删除realserver的命令添加到虚拟服务里

ipvsadm -a -t 192.168.4.253:80 -r 192.168.4.x:80



DR工作原理

(1)当用户请求到达交换机时,其报文源ip是cip 目标ip是vip

而Director将请求转发至realserver的时候报文中的源ip是CIP,目标地址是VIP(因为修改目标MAC)

(2)当报文送到以后它只将目标MAC改为了RIP所对应的MAC地址(将报文的帧重新交给交换机的时候,交换机会根据目标MAC重新发往realserver,当realserver收到请求之后目标地址由于是VIP,因此为了让realserver接收目标地址为vip的报文,在每个realserver必须配置vip的地址,不然不匹配报文无法接收,也就意味着每个realserver都必须配置vip)

(3)事实上路由器将报文转发至directory之前要先进行arp广播请求,arp广播的意义是将vip转换为mac地址,那么按理来讲我们的realserver都配置了vip,也就意味着所有配置vip的主机都能响应其报文,很显然这么就乱套了,所以我们就期望进来的请求只到达directory,不然负载均衡就没有意义了

方案如下:

·前端路由不做解析,明确指定directory

·arp-tables限制响应

(4)当realserver处理完请求后将直接返回给CIP

那么我们来总结一下:

通告级别

默认情况下,linux发布通告相当毫无遮掩,将自己的ip及mac地址统统通告出去

响应级别

通告完之后通常对方知道我们的mac和ip,于是将mac和ip的地址缓存至本地,为了保证其地址的有效性通常缓存都是有一定的周期时间,一般来讲是360(官方文档说明是300秒,但ipvs显示的是360秒)秒,当360秒之后如果双方没有进行任何通信,那么则将缓存清空,假设经过一定时间内要进行双方通信,但在arp列表里没有缓存,则再次进行发送广播,对方收到之后则对其响应,并将mac地址响应给对方,并且响应方式也是广播的


通告/响应级别是可以通过linux内核级别来调整的

在kernel2.4.26之后所具备的两个设备标志,我们被称为设备网卡的识别标识

用于调整arp协议栈的工作模式的

arp_ignore  用于定义通告限制级别

arp_annouce 用于定义响应级别

arp_announce

共有3个值:

0:默认值,表示默认情况下只要主机接入至网络中,它会把每个接口以及接口IP和mac对应关系向本地网络通告

1:尽可能避免不将地址通告本地网络

2:只通告直连接口到本地网络

一般模式选择2

arp_ignore

共有8个值,重点是1

0:只要本地网络有此ip则直接通告

1:仅接收在本地接口的ip地址


因此,我们所需要的值就是

arp_ignore=1

arp_announce=2


禁止RS上的vip直接跟前端路由通信的三种方案

1.修改路由,使用静态arp

2.在RS上使用arptables 禁止响应对vip的广播请求

3.在RS上修改其内核参数,并将vip配置在与RIP不同的接口的别名上比如lo:0

通常代价比较低,用的比较广泛的是第三种方案,直接绑定lo环回地址


linux还有一种特性,尽管配置了vip也禁止了vip的响应请求,当请求报文到达以后,realserver要对其封装响应,响应直接发送至客户端,这时我们需要考虑两个问题:

1:响应报文从哪个接口出去,则将哪个接口的地址当做源地址,报文响应出去的时候其源地址是RIP,但CIP一定是期望VIP响应的

(过程中会通过一条特定的路由设定来实现),


2.如果rip vip dip都在同一网段内,那么可以轻松实现,直接将网关指向路由即可

但如果rip、dip不跟vip在同一网络内,无论如何各realserver的网关一定不能指向directory,必须要准备另一个路由设备,比如将网关指向与RIP在同一网段内

最终外网接口有可能通过其他路由到达互联网也有可能到达出口路由器,前提是必须能与RIP进行通信才可以


如果在生产环境内只有一个公网ip其余的使用私有ip,所以只能用公网ip当做vip,既然只有一个公网ip,那么rip和dip都是私有地址,与vip不在同一网段,所以这时候必须要配置一个本地网关,通过地址转换(路由)到互联网中去