集群技术的主要分类:
负载均衡集群
一般用于请求负载分发,也就是按一定的算法把不同的请求调度给不同的节点,这些节点提供的都是相同的服务。解决单台服务器压力过大的问题。
硬件解决方案:<----一般都是四层调度,也有些设备支持七层调度。
F5 BIG-IP
NetScaler
Cisco CSS
软件解决方案:
lvs 四层调度(算法非常高明)
nginx 四层或七层调度
Haproxy 四层或七层调度,特色在于七层调度。
软件调度的优势:
软件成本低
硬件技术支持不够迅速
软件的可控性比较强
软件都是基于配置文件
高可用集群
高性能集群
============================================
实验结构:
clients
| | |
调度器
----------------------
| |
web1 web2
LVS:
重量型的,但配置和安装都比较简单。
开源,免费的。
二次开发。
性能非常好,支持高并发处理,吞吐量高
典型应用:红帽,kernel.org,淘宝CDN
目标地址映射
公有网络(Public Network) | 内部网络(Private Network)
client <---->Internet<----> Router/Loadbalancer <----> Web(s)
数据包流向:来回都是同一条路,都必须经过调取器
client 1.1.1.1
LoadBalancer <---
public: 2.2.2.2
private: 10.1.1.1
Web 10.1.1.2 <----real server
Client http://2.2.2.2 --> 访问服务
sp: 1028
dp: 80 <----
sip: 1.1.1.1
dip: 2.2.2.2 <---
iptables -t nat -A PREROUTING -p tcp -d 2.2.2.2 --dport 80 -j DNAT --to 10.1.1.2
----> LB 根据数据包的目标IP和端口来判断是否需要调度(地址映射)
条件满足,需要调度,然后需要在包转发之前进行目标地址的修改或者目标端口的修改
sp: 1028
dp: 80 <----
sip: 1.1.1.1
dip: 10.1.1.2
---->调度给web节点
web响应的数据包:
sp: 80
dp: 1028
sip: 10.1.1.2
dip: 1.1.1.1 <---不同网络,需要把包交给网关,这里的网关就是lb
-->LB
sp: 80
dp: 1028
sip: 2.2.2.2 <---数据包复原
dip: 1.1.1.1
最核心的地方,也是最容易遗忘的点:
后端web节点网关必须指向LB
==================================================================
例子1:使用vs/nat实现负载均衡
clients
| | | Public Network
调度器------------
Private Network
----------------------
| |
web1 web2
LB:
node3.upl.com
10.1.1.21 <---Public
1.1.1.130 <---Private
Real server:
web1 node1.upl.com 1.1.1.128
web2 node2.upl.com 1.1.1.129
一、配置LB
1、打开路由转发
# sysctl -p
2、安装lvs套件
# yum install ipvsadm -y
3、设定规则
# ipvsadm --help
虚拟服务规则:
LB 根据数据包的目标IP和端口来判断是否需要调度(地址映射)
条件满足,需要调度,然后需要在包转发之前进行目标地址的修改或者目标端口的修改
1、添加虚拟服务规则
需要判断dip:10.1.1.21,dp:80
# ipvsadm -A -t 10.1.1.21:80 -s rr
2、添加后端节点real server
# ipvsadm -a -t 10.1.1.21:80 -r 1.1.1.128:80 -m
# ipvsadm -a -t 10.1.1.21:80 -r 1.1.1.129:80 -m
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.21:80 rr
-> 1.1.1.129:80 Masq 1 0 0
-> 1.1.1.128:80 Masq 1 0 0
保存
# service ipvsadm save
二、配置后端real server
1、把网关指向lb
排错:
1、在lb上抓包,目的是判断客户端的包是否发送过来
抓pub网卡:
如果只有过来的,没有回去数据包。说明:real server网关错误,要么调度规则有问题
抓pri网卡:
判断数据包是否被修改了目标IP
2、在real server上抓包
如果数据包来了,说明调度器是正确的。
===========================================================================
A <-----Switch----> B
1.1.1.1 1.1.1.2
sip:1.1.1.1
dip:1.1.1.2
smac:A
dmac:??? <----谁拿了1.1.1.2,把你的MAC告诉我,我的IP是1.1.1.1
arp广播:
sip:1.1.1.1
dip:1.1.1.2
smac:A
dmac:FF:FF:FF:FF:FF:FF
arp应答(单播):
sip:1.1.1.2
dip:1.1.1.1
smac:B
dmac:A
# tcpdump -e arp -i eth1
总结:MAC只是同一个网段的机器通信的时候用到。
一般来说,数据包从哪个网卡发送出来,数据包的SMAC就是该网卡硬件地址。数据包要发送下一个设备的哪张网卡,那么DMAC就是该目标机器网卡的MAC
一个机器(路由器除外)收到数据包,需要判断两个条件才决定是否接受该数据包?
dip是否为自己的IP
dmac是否为自己的MAC
sp:1028
dp:80 <---
sip:3.3.3.129
dip:2.2.2.2 <---- 为了自我欺骗,在lo:0绑定该IP
smac:LB's eth1
dmac:R1's eth0
sp:80
dp:1028
sip:2.2.2.2
dip:3.3.3.129
smac:R1's eth0
dmac: ??
ARP广播:该包是为了上面的数据包而产生的,所有arp广播中的源IP用的是2.2.2.2
谁拿了1.1.1.253,把你的MAC地址告诉我,我的IP是2.2.2.2
所以:arp广播有去没回。
解决:在real server上静态绑定gw的MAC
========================================
Clients
|
eth1 Public 10.1.1.0/24
router ---------------------------------
vmnet1 Private 1.1.1.0/24
|
-----------------------------------
| | |
LB web1 web2
client : http://1.1.1.130
gw: 10.1.1.22
router
eth1 10.1.1.22
vmnet1 1.1.1.1
LB
eth0 1.1.1.130 <---public ip
web1
eth0 1.1.1.128
lo:0 1.1.1.130
gw: 1.1.1.1
web2
eth0 1.1.1.129
lo:0 1.1.1.130
gw: 1.1.1.1
一、配置LB
1、路由转发
2、设定规则
# ipvsadm -C
# ipvsadm -A -t 1.1.1.130:80 -s rr
# ipvsadm -a -t 1.1.1.130:80 -r 1.1.1.128 -g
# ipvsadm -a -t 1.1.1.130:80 -r 1.1.1.129 -g
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 1.1.1.130:80 rr
-> 1.1.1.129:80 Route 1 0 0
-> 1.1.1.128:80 Route 1 0 0
3、静态绑定real server 硬件地址
arp -s 1.1.1.128 xxxxx
arp -s 1.1.1.129 xxxxx
二、配置real server
1、网关
2、自我欺骗,绑定lo:0
LB哪个IP是对外提供服务,这个IP称为public ip,那么lo:0就该绑定该IP
# ifconfig lo:0 1.1.1.130 netmask 255.255.255.255
3、修改内核参数,改变系统对arp包的处理
# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
arp_announce : 0,默认值,arp广播是为了哪个包而产生,广播中源IP就使用该数据包的源IP
arp_announce : 2,arp广播是从哪个网卡发出去,广播中的源IP就是该网卡的IP
# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
arp_ignore :0 ,如果机器从某个网卡收到ARP广播,但该网卡并不是广播中目标IP,但是该机器上其他网卡绑定绑定了该IP,它也会去对ARP广播应答。
arp_ignore :1 ,如果机器从某个网卡收到ARP广播,但该网卡并不是广播中目标IP,但是该机器上其他网卡绑定绑定了该IP,它不会去对ARP广播应答。
双保险:
安装arp防火墙。所有目标IP为public ip的arp广播都不予理睬。
# yum install arptables_jf.i386 -y
# arptables -A IN -d 1.1.1.130 -j DROP
4、静态绑定gw的MAC
# arp -s 1.1.1.1 00:50:56:C0:00:01
客户端测试:
找别的机器,网卡IP 在 10.1.1.0/24
删除vmnet1
# route del -net 1.1.1.0 netmask 255.255.255.0
GW: 10.1.1.22