从硬件上实现:
1、F5
2、BIG-IP
从软件实现:
1、LVS(工作在tcp/ip的第四层)
2、haproxy
3、ngnix(工作在第七层)
4、varnish
LVS ,即 Linux Virtual Server ,Linux 虚拟服务器;是一个虚拟的服务器集群,是LB集群的一个实现。
1、DR
2、nat
3、ip-tun
4、full-nat
DR:Director Server 指的是前端负载均衡器节点,控制器、调度器
RS:Real Server 后端真实的工作服务器,后台提供服务的主机
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址,控制器上对外开放的ip
DIP:Director Server IP 主要用于和内部主机通讯的IP地址,控制器上连接后端服务器的ip
RIP:Real Server IP 后端服务器的IP地址
CIP:Client IP 访问客户端的IP地址,客户端ip
lvs附着于netfilter,有五个内置的钩子函数
PREROUTING—>INPUT(流向内部)
PREROUTING—>FORWARD—>POSTROUTING(转发)
OUTPUT—> POSTROUTING(流向外部)
1.当用户向负载均衡调度器发起请求,调度器将请求发往至内核空间
2.PREROUTING链首先会受到用户请求,判断目标ip确定是本机ip,将数据包发往INPUT链
3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对。如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,将新的数据包发往POSTROUTING链
4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
lvs工作于INPUT
PREROUTING—>INPUT(lvs在此强行改变数据流向)—> POSTROUTING
lvs组成(两部分)
1、ipvs(ip virrual server):一段代码,工作在内核,是真正生效实现调度的代码,是工作在内核中的netfilter input钩子函数上
2、ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,是工作在用户空间的命令行工具,写具体的规则,用于管理集群服务
它通过修改请求报文的目标mac地址进行转发
1.保证前端路由器将目标IP为VIP的请求报文发送给director(静态绑定 arptables 修改rs主机内核的参数)
2.rs的rip可以使用私有地址,但也可以使用公网地址
3.请求报文经由director调度,但响应的报文一定不能经由director
4.rs跟director必须在同一物理网络中(同一物理网络不等于同网段)
5.RS网关不能指向dip
数据流向:
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址,即实验中配置的172.25.23.100
DIP:Director Server IP 主要用于和内部主机通讯的IP地址,即实验中配置的172.25.23.1,即调度器的内网ip
RIP:Real Server IP 后端服务器的IP地址,后端主机的内网ip,即172.25.23.2和172.25.23.3
CIP:Client IP 访问客户端的IP地址,即用户客户机的ip,此处用真机进行访问,即172.25.23.23
准备三台虚拟机,server1做调度器,server2,server3做后端服务器
server1 server2 server3
内网ip 172.25.23.1 172.25.23.2 172.25.23.3
vip 172.25.23.100 172.25.23.100 172.25.23.100
配置 调度器 阿帕奇 阿帕奇
配置:
1)配置yum源
cd /etc/yum.repos.d/
vim rhel-source.repo
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.23.250/rhel6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.23.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
2)给另两台主机发送配置好的yum源
yum install openssh-clients -y
scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/ ##yum源发给另外两台服务器
scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/
3)配置ipvsadm
yum install ipvsadm -y ##安装ipvsadm
ipvsadm -l ##查看编写规则
lsmod
lsmod|grep ip_vs
ip addr add 172.25.23.100/24 dev eth0 ##给网卡添加内网地址
ipvsadm -A -t 172.25.23.100:80 -s rr ##在lvs中为http协议添加一个vip为100的server,并设置调度方式为Round Robin,即轮询。添加一个集群服务
# -A ##添加
# -E ##修改
# -t ##tcp
# -u ##udp
# -s ##指定调度算法
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -g ##访问100时,转向23.2服务器。给一个集群服务添加一条RS规则
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -g ##访问100时,转向23.3服务器
# -a ##添加
# -e ##修改
# -d ##删除
# -g ##dr模式直接路由gatway
ipvsadm -l
# -c ##列出当前所有的connection
# --stats ##列出统计数据
# --rate ##速率数据
/etc/init.d/ipvsadm save ##保存规则
ipvsadm -l
1)配置阿帕奇i
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
server2
/etc/init.d/httpd restart
2)网卡添加内网地址
ip addr add 172.25.23.100/32 dev eth0 ##给网卡添加内网地址
3)arp规则
yum search arptables
yum install arptables_jf.x86_64 -y ##安装arp防火墙软件
arptables -L ##查看
arptables -A IN -d 172.25.23.100 -j DROP ##写arp规则,询问到此主机100时,访问被丢弃
arptables -A OUT -s 172.25.23.100 -j mangle --mangle-ip-s 172.25.23.2 ##访问100以23.2返回
arptables -L
/etc/init.d/arptables_jf save ##保存规则
yum install openssh-clients -y
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
server3
/etc/init.d/httpd restart
ip addr add 172.25.23.100/32 dev eth0 ##给网卡添加内网地址
yum install arptables_jf.x86_64 -y
arptables -A IN -d 172.25.23.100 -j DROP
arptables -A OUT -s 172.25.23.100 -j mangle --mangle-ip-s 172.25.23.3
arptables -L
/etc/init.d/arptables_jf save
测试:真机充当客户机
curl 172.25.23.100 ##访问
测试效果,在server1上
ipvsadm -L
可以看到轮询
真机上
arp -an|fgrep 100 ##查看访问到那个主机网卡
##配置内核参数
##arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。这两个参数很重要,特别是在LVS的DR场景下,它们的配置直接影响到DR转发是否正常
arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应
0: 如果路由向我的一个网络接口发送广播,请求的是本机上的其他接口,就告知它(默认值)
1:只响应目的IP地址为接收网卡上的本地地址的arp请求,如果路由向我的一个网络接口发送广播,请求的是本机上的其他接口,就拒绝它
arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址
0: 一旦我接入一个网络,就向这个网络内的所有主机通告自己所有的网络接口信息,不隐藏(默认值)
1:一旦我接入一个网络,就将接入网络这一个接口的信息通告其他主机,本机上的其他接口信息可以通告也可以不通告
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址,一旦我接入一个网络,就将接入网络这一个接口的信息通告其他主机,本机上的其他接口信息绝对不通告出去
ipvsadm -C
ip addr add 172.25.23.100/24 dev eth0
ipvsadm -A -t 172.25.23.100:80 -s rr
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -g
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -g
sysctl -a |grep arp_ignore ##修改内核参数
sysctl -a |grep arp_announce ##修改内核参数
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.lo.arp_announce=2
ip addr add 172.25.23.100/32 dev eth0
sysctl -a |grep arp_ignore
sysctl -a |grep arp_announce
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.lo.arp_announce=2
ip addr add 172.25.23.100/32 dev eth0
server1是调度器,临时服务器,server2和server3是后端服务器
vim rhel-source.repo
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.23.250/rhel6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.23.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.23.250/rhel6.5/HighAvailability ##
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
yum clean all
yum repolist
##此处ldirectord-3.9.5-3.1.x86_64.rpm需要从真机复制过来,如果没有需要下载
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
vim /etc/ha.d/ldirectord.cf
25 virtual=172.25.23.100:80 ##访问地址
26 real=172.25.23.2:80 gate ##后端服务器
27 real=172.25.23.3:80 gate ##后端服务器
28 fallback=127.0.0.1:80 gate ##本机
29 service=http
30 scheduler=rr
31 #persistent=600
32 #netmask=255.255.255.255
33 protocol=tcp
34 checktype=negotiate
35 checkport=80
36 request="index.html"
37 #receive="Test Page"
38 #virtualhost=www.x.y.z
ipvsadm -l
ipvsadm -C ##需要刷新一下策略
/etc/init.d/ldirectord restart ##重启
ipvsadm -l ##查看服务器运行状态
#给server1安装阿帕器,当后端服务器故障后,server1临时顶替工作
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html/
vim index.html
server1
/etc/init.d/httpd restart
当server2服务器stop后,客户机(真机)curl 172.25.23.100,一直是server3服务器在工作,当server2,server3同时stop后,server1顶替工作,
用到命令:
server2上
/etc/init.d/httpd stop
/etc/init.d/httpd start
server3上
/etc/init.d/httpd stop
/etc/init.d/httpd star
真机
curl 172.25.23.100
在server1上
ipvsadm -l
可以看到此时哪台服务器在工作
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
不修改请求报文的ip首部(cip—vip),而是通过在原有的ip首部(dip–rip),再封装一个ip首部
1.rip dip vip 全是公网地址
2.rs的网关不能指向dip
3.请求报文必须经由director调度,但响应报文必须不能经由director
4.rs的os必须支持隧道功能
数据流向:
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
/etc/init.d/ldirectord stop ##先把之前实验的关掉
ipvsadm -C ##刷新
ipvsadm -l
modprobe ipip
ip addr show
ip addr del 172.25.23.100/24 dev eth0 ##删除eth0上配置的内网
ip addr add 172.25.23.100/24 dev tunl0 ##给tunl10添加内网网段
ip addr show
ip link set up tunl0 ##开启tunl10
ip addr show
ipvsadm -A -t 172.25.23.100:80 -s rr
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.2:80 -i
ipvsadm -a -t 172.25.23.100:80 -r 172.25.23.3:80 -i
ipvsadm -l
/etc/init.d/ipvsadm save
modprobe ipip
ip addr show
ip addr del 172.25.23.100/32 dev eth0
ip addr add 172.25.23.100/32 dev tunl0 ##添加tunls
ip link set up tunl0
sysctl -a |grep rp_filter ##把内核改为0
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -a |grep rp_filter
sysctl -p ##修改立即生效
modprobe ipip
ip addr show
ip addr del 172.25.23.100/32 dev eth0
ip addr add 172.25.23.100/32 dev tunl0
ip link set up tunl0
sysctl -a |grep rp_filter
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -a |grep rp_filter
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -a |grep rp_filter
sysctl -p
在客户机(真机)curl 172.25.23.100
在server1
ipvsadm -l
能看到轮询效果,并且模式是Tunnel
多目标的DNAT:通过修改请求报文的目标IP地址(同时可能会修改目标端口),至挑选出某RS的RIP地址实现转发
1.RS和DIP应该使用私网地址,且RS的网关要指向DIP
2.请求和响应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈
3.RS可以使用任意OS
4.RS的RIP和Director的DIP必须要在同一IP网络:RS的网关要指向DIP
数据流向:
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
©. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP