集群技术的主要分类:
 
 负载均衡集群
  一般用于请求负载分发,也就是按一定的算法把不同的请求调度给不同的节点,这些节点提供的都是相同的服务。解决单台服务器压力过大的问题。

  硬件解决方案:<----一般都是四层调度,也有些设备支持七层调度。
   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