linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

发布于 2018-04-10  331 次阅读


负载均衡集群介绍

主流开源软件 LVS、keepalived、haproxy、nginx 等

其中 LVS 属于 4 层(网络 OSI 7 层模型),nginx 属于 7 层,haproxy 既可以认为是 4 层,也可以当做 7 层使用

keepalived 的负载均衡功能其实就是 lvs

lvs 这种 4 层的负载均衡是可以分发除 80 外的其他端口通信的,比如 MySQL 的,而 nginx 仅仅支持 http,https,mail,haproxy 也支持 MySQL 这种

相比较来说,LVS 这种 4 层的更稳定,能承受更多的请求,而 nginx 这种 7 层的更加灵活,能实现更多的个性化需求

图片为网络 OSI 7 层模型(由下往上数)

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

LVS 介绍

LVS 是由国人章文嵩开发

流行度不亚于 apache 的 httpd,基于 TCP/IP 做的路由和转发,稳定性和效率很高

LVS 最新版本基于 Linux 内核 2.6,有好多年不更新了

LVS 有三种常见的模式:NAT、DR、IP Tunnel

LVS 架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称 rs)

LVS NAT 模式

这种模式借助 iptables 的 nat 表来实现

用户的请求到分发器后,通过预设的 iptables 规则,把请求的数据包转发到后端的 rs 上去

rs 需要设定网关为分发器的内网 ip

用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈

这种模式对 Load Balancer 要求很大,RS 十台以下比较适合,提升 Load Balancer 硬件配置或者使用万兆光纤之类的可以有效提高效率

在 nat 模式中,只需要分发器有公网 ip 即可,所以比较节省公网 ip 资源

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

LVS IP Tunnel 模式

这种模式,需要有一个公共的 IP 配置在分发器和所有 rs 上,我们把它叫做 vip

客户端请求的目标 IP 为 vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标 IP 改为 rs 的 IP,这样数据包就到了 rs 上

rs 接收数据包后,会还原原始数据包,这样目标 IP 为 vip,因为所有 rs 上配置了这个 vip,所以它会认为是它自己

IP Tunnel 模式要求 Load Balancer 和每台 RS 上都有一个相同的 IP(vip,可以理解为公网 IP),但 Load Balancer 只负责分发请求,不负责回应请求,所以 Load Balancer 的性能更高,回应请求由被分发了请求的 RS 负责

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

LVS DR 模式

这种模式,也需要有一个公共的 IP 配置在分发器和所有 rs 上,也就是 vip

和 IP Tunnel 不同的是,它会把数据包的 MAC 地址修改为 rs 的 MAC 地址

rs 接收数据包后,会还原原始数据包,这样目标 IP 为 vip,因为所有 rs 上配置了这个 vip,所以它会认为是它自己

IP Tunnel 更改的是 IP 地址,DR 更改的是 MAC 地址

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

LVS 的调度算法

轮询 Round-Robin  rr

----用户的请求过来,会均衡的分发到 RS

加权轮询 Weight Round-Robin wrr

----利用权重分发请求到 RS(权重越大,请求数越大)

最小连接 Least-Connection lc

----把请求分发到目前请求数最少的 RS 上

加权最小连接 Weight Least-Connection wlc

----把请求分发到目前请求数最少的 RS 上,但是根据权重来定义

基于局部性的最小连接 Locality-Based Least Connections lblc

带复制的基于局部性最小连接 Locality-Based Least Connections with Replication  lblcr

目标地址散列调度 Destination Hashing dh

源地址散列调度 Source Hashing  sh

----主要明白前四种,后四种了解即可

LVS NAT 模式搭建

第一步

做实验,准备三台机器,设置正确

am-01:其中当 172.17.1.240 为其内网 IP,172.18.0.236 为其公网 IP

am-02:其中当 172.17.1.242 为其内网 IP,网关为 am-01 的内网 IP

am-03:其中当 172.17.1.243 为其内网 IP,网关为 am-01 的内网 IP

01:

am-01 添加新的网卡,因为是用 VMware 做的实验,所以直接新增网卡并设置一个适当的 IP 用作外网地址

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

linux 学习笔记-063-linux 集群架构-负载均衡集群介绍,LVS 介绍及其调度算法,NAT 模式搭建 LVS

02:

设置 am-01 的新增网卡 IP 地址

[root@am-01:~#] vim /etc/sysconfig/network-scripts/ifcfg-ens36

TYPE=Ethernet

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

NAME=ens36

ONBOOT=yes

HWADDR=00:0C:29:08:AC:4F

UUID=418da202-9a8c-b73c-e8a1-397e00f3c6b2

IPADDR=172.18.0.236

PREFIX=23

GATEWAY=172.18.0.1

DNS1=172.18.0.1

DNS2=8.8.8.8

[root@am-01:~#] service network restart

Restarting network (via systemctl):                        [  确定  ]

[root@am-01:~#] ifconfig

eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.17.1.240  netmask 255.255.255.0  broadcast 172.17.1.255

        inet6 fe80::20c:29ff:fe08:ac45  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:08:ac:45  txqueuelen 1000  (Ethernet)

        RX packets 14046  bytes 1092482 (1.0 MiB)

        RX errors 0  dropped 7  overruns 0  frame 0

        TX packets 1008  bytes 301659 (294.5 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.18.0.236  netmask 255.255.254.0  broadcast 172.18.1.255

        inet6 fe80::20c:29ff:fe08:ac4f  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:08:ac:4f  txqueuelen 1000  (Ethernet)

        RX packets 5154  bytes 398909 (389.5 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 88  bytes 8668 (8.4 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10<host>

        loop  txqueuelen 0  (Local Loopback)

        RX packets 14  bytes 976 (976.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 14  bytes 976 (976.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

03:

am-02 和 am-03 是克隆的 am-01,克隆完还需要修改 IP 地址等

克隆虚拟机参考链接:https://www.itwordsweb.com/87.html

04:

清空所有机器防火墙规则,关闭 friewalld(我这里只做 am-01 的操作,其他的机器参照着做就可以了),关闭 SElinux

注:如果 Centos7 没有 iptables,需要安装一下并启动(因为我都是克隆的 am-01,而 am-01 已经装好 iptables,所以此处省略不提)

[root@am-01:~#] iptables -F

[root@am-01:~#] iptables -nvL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination        



Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination        



Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination 

[root@am-01:~#] systemctl stop firewalld

[root@am-01:~#] systemctl disable firewalld

[root@am-01:~#] vim /etc/selinux/config

SELINUX=disabled

05:

修改 am-02 和 am-03 的网关为 172.17.1.240

[root@am-02:~#] vim /etc/sysconfig/network-scripts/ifcfg-eno01

GATEWAY=172.17.1.240

[root@am-02:~#] service network restart

Restarting network (via systemctl):                        [  确定  ]

[root@am-02:~#] route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.17.1.240    0.0.0.0         UG    100    0        0 eno16777736

172.17.1.0      0.0.0.0         255.255.255.0   U     100    0        0 eno16777736
[root@am-03:~#] vim /etc/sysconfig/network-scripts/ifcfg-eno01

GATEWAY=172.17.1.240

[root@am-03:~#] service network restart

Restarting network (via systemctl):                        [  确定  ]

[root@am-03:~#] route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.17.1.240    0.0.0.0         UG    100    0        0 ens33

172.17.1.0      0.0.0.0         255.255.255.0   U     100    0        0 ens33

第二步

01:

在 Load Balancer(am-01)上安装 ipvsadm

ipvsadm 是一个实现 LVS 的工具

[root@am-01:~#] yum -y install ipvsadm

02:

编辑脚本,LVS 都是以脚本的形式执行任务(注意修改 IP 地址为你的,还有网卡名称)

[root@am-01:~#] vim /usr/local/sbin/lvs_nat.sh

#! /bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

# 开启路由转发功能,不开启的话,之后的 iptables 无法生效,数据包无法转发到后面的 RS 上

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# 关闭 icmp 的重定向,伪装操作,为了能成功把数据包转发到 RS 上

echo 0 > /proc/sys/net/ipv4/conf/eno16777736/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/ens36/send_redirects

# 注意区分网卡名字,我这里两个网卡分别为 eno16777736 和 ens36

iptables -t nat -F

iptables -t nat -X

iptables -t nat -A POSTROUTING -s 172.17.1.0/24  -j MASQUERADE

# 设置 nat 防火墙,设置路由转发规则

IPVSADM='/usr/sbin/ipvsadm'

$IPVSADM -C

$IPVSADM -A -t 172.18.0.236:80 -s wlc -p 3

$IPVSADM -a -t 172.18.0.236:80 -r 172.17.1.242:80 -m -w 1

$IPVSADM -a -t 172.18.0.236:80 -r 172.17.1.243:80 -m -w 1

# 设置 ipvsadm,其中 wlc 中的 lc 就是算法,-C 表示清空规则,-A -t 指定时 NAT 模式,后面跟外网 IP,-s 指定算法,-p 指定超时时间,这里指定 3 秒内的请求都分发给一个 RS

#最后两句,-r 指定 RS 地址,-m 说明是 NAT 模式,-w 指定权重

03:

执行一下脚本,发现没输出任何信息,这就对了,如果有信息输出,那么就很有可能是有错误

[root@am-01:~#] sh /usr/local/sbin/lvs_nat.sh

04:

两台 RS 都安装 Nginx

[root@am-02:~#] yum -y install nginx

[root@am-02:~#] service nginx start

Redirecting to /bin/systemctl start nginx.service

[root@am-02:~#] ps -aux | grep nginx

root       2742  0.0  0.2 122900  2104 ?        Ss   05:32   0:00 nginx: master process /usr/sbin/nginx

nginx      2743  0.0  0.3 123364  3136 ?        S    05:32   0:00 nginx: worker process

nginx      2744  0.0  0.3 123364  3136 ?        S    05:32   0:00 nginx: worker process

root       2746  0.0  0.0 112672   980 pts/0    S+   05:32   0:00 grep --color=auto nginx
[root@am-03:~#] yum -y install nginx

[root@am-03:~#] service nginx start

[root@am-03:~#] ps -aux | grep nginx

root      14368  0.0  0.2 122900  2104 ?        Ss   05:36   0:00 nginx: master process /usr/sbin/nginx

nginx     14369  0.0  0.3 123364  3136 ?        S    05:36   0:00 nginx: worker process

nginx     14370  0.0  0.3 123364  3136 ?        S    05:36   0:00 nginx: worker process

root      14372  0.0  0.0 112672   976 pts/0    S+   05:36   0:00 grep --color=auto nginx

05:

修改两台 RS 的默认页面

[root@am-02:~#] vim /usr/share/nginx/html/index.html

RS 01

[root@am-02:~#] curl localhost

RS 01
[root@am-03:~#] vim /usr/share/nginx/html/index.html

RS 02

[root@am-03:~#] curl localhost

RS 02

06:

这里为了实验效果,先把脚本的超时时间去掉,修改调度算法为 rr,并重启脚本

[root@am-01:~#] vim /usr/local/sbin/lvs_nat.sh

$IPVSADM -A -t 172.18.0.236:80 -s wrr

$IPVSADM -A -t 172.18.0.236:80 -s wlc

[root@am-01:~#] !sh

sh /usr/local/sbin/lvs_nat.sh

使用 curl 访问公网 IP(am-01 设置的虚拟公网 IP),可以见到,因为设置的是 rr,所以访问请求的分发很均衡

[root@am-01:~#] curl 172.18.0.236

RS 02

[root@am-01:~#] curl 172.18.0.236

RS 01

[root@am-01:~#] curl 172.18.0.236

RS 02

[root@am-01:~#] curl 172.18.0.236

RS 01

扩展

lvs 三种模式详解:

http://www.it165.net/admin/html/201401/2248.html

lvs 几种算法:

http://www.aminglinux.com/bbs/thread-7407-1-1.html

关于 arp_ignore 和 arp_announce:

http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

lvs 原理相关的:

http://blog.csdn.net/pi9nc/article/details/23380589