负载均衡之LVS(一)

LVS的介绍

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

LVS集群的特点

ip负载均衡与负载调度算法

负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR,详述如下: 

LVS/NAT

VS/NAT: 即(Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。

LVS/TUN

VS/TUN :即(Virtual Server via IP Tunneling) 
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

LVS/DR

VS/DR: 即(Virtual Server via Direct Routing) 
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。

负载调度算法

l 轮叫调度(Round Robin)
“轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。

l 加权轮叫调度(Weighted Round Robin) 
“加权轮叫”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。 

l 最少链接调度(Least Connections) 
“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。 

l 加权最少链接调度(Weighted Least Connections) 
“加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

等等。。。。。。。。。。。。。。。。。。。。。。。。。。。

实验环境介绍

lb01 系统centos 6.8 10.0.0.5 172.16.1.5 
lb02 系统centos 6.8 10.0.0.6 172.16.1.6
web01 系统centos 6.8 10.0.0.8 172.16.1.8 
web02 系统centos 6.8 10.0.0.7 172.16.1.7

[root@web01 ~]# cat /etc/redhat-release

CentOS release 6.8 (Final)

[root@web01 ~]# uname -r

2.6.32-642.el6.x86_64

[root@web01 ~]# uname -m

x86_64

环境准备安装nginx

yum -y install pcre pcre-devel openssl openssl-devel

cd /home/oldboy/tools/

wget -q http://nginx.org/download/nginx-1.6.3.tar.gz

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

useradd -s /sbin/nologin -M www

./configure  --user=www --group=www --prefix=/application/nginx-1.10.2 --with-http_stub_status_module  --with-http_ssl_module

make &&make install

ln -s /application/nginx-1.10.2 /application/nginx

mkdir -p /application/nginx/html/{www,blog}

for dir in www blog;do echo "`hostname` $dir" >/application/nginx/html/$dir/xiaoyu.html;done

for dir in www blog;do cat /application/nginx/html/$dir/xiaoyu.html;done

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

   server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
    }
    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
        access_log  logs/access_blog.log  main;
    }
}

/application/nginx/sbin/nginx -t

/application/nginx/sbin/nginx

测试

[root@web01 ~]# curl -H Host:www.etiantian.org 10.0.0.8/xiaoyu.html

web01 www

[root@web01 ~]# curl -H Host:blog.etiantian.org 10.0.0.8/xiaoyu.html

web01 blog

[root@web01 ~]# curl -H Host:www.etiantian.org 10.0.0.7/xiaoyu.html

web02 www

[root@web01 ~]# curl -H Host:blog.etiantian.org 10.0.0.7/xiaoyu.html

web02 blog

配置LVS

yum安装ipvsadm

yum install -y ipvsadm

[root@lb01 ~]# rpm -qa ipvsadm

ipvsadm-1.26-4.el6.x86_64

[root@lb01 ~]# rpm -ql ipvsadm

/etc/rc.d/init.d/ipvsadm

/etc/sysconfig/ipvsadm-config

/sbin/ipvsadm

/sbin/ipvsadm-restore

/sbin/ipvsadm-save

/usr/share/doc/ipvsadm-1.26

/usr/share/doc/ipvsadm-1.26/README

/usr/share/man/man8/ipvsadm-restore.8.gz

/usr/share/man/man8/ipvsadm-save.8.gz

/usr/share/man/man8/ipvsadm.8.gz

在Director Server上绑定一个虚拟IP(也叫VIP),此IP用于对外提供服务

[root@lb01 ~]# ln -s   /usr/src/kernels/$(uname -r) /usr/src/linux

[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0

[root@lb01 ~]# ip a s eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:c2:74:6e brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.3/24 scope global secondary eth0:0

    inet6 fe80::20c:29ff:fec2:746e/64 scope link

       valid_lft forever preferred_lft forever

启用系统的包转发功能

[root@lb01 ~]# sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#g' /etc/sysctl.conf
[root@lb01 ~]# sysctl -p

ipvsadm的参数

-A        --》添加虚拟服务选项

-E        --》编辑虚拟服务选项

-D         --》删除虚拟服务

-C         ---》清除整个表

-R          --》从stdin恢复规则

-S           ——》规则保存到标准输出

-a          ——》添加真实服务器选项

-e        ——》编辑真正的服务器选项

-d          ---》删除的服务器

-L|-l       ---》名单表

-Z         --》零计数器在服务或所有服务

-start-daemon    ---》开始连接守护进程同步

-stop-daemon    ---》停止连接守护进程同步

-h         --》显示帮助信息

-t ——》说明虚拟主机提供的是tcp服务

-u    --》说明虚拟主机提供的是UDP服务

-f  --》说明是经过的iptables标记过的服务类型

-s  --》使用调度算法

-p ---》持久服务

-r  ---》真实的服务器

-g  ---》指定LVS的工作模式为直接路由模式

-i  --》指定LVS的工作模式为隧道模式

-m  ---》指定LVS的工作模式为NAT模式

-w ---》真实服务器的权值

-c  ---》显示LVS目前的连接数

-timeout  ---》显示tcp、tcpfin、udp的timeout值

--daemon  --》显示同步守护进程状态

--stats   --》显示统计信息

--rate  ---》显示速率信息

--sort --》对虚拟服务器和真实服务器排序输出

-n  ---》输出ip地址和端口的数字形式

LVS/DR模式规则

ipvsadm -C   ----》清除ipvsadm以前的设置

ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20   --》添加一个新的虚拟IP记录10.0.0.3,其持续服务之间是20秒

ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1

ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

启动LVS服务

ipvsadm

ipvsadm 规则的备份和恢复。

[root@lb01 ~]# ipvsadm-save -n

-A -t 10.0.0.3:80 -s wrr -p 20

-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1

-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

[root@lb01 ~]# ipvsadm-save -n >/tmp/ipvsadm-dr.save

[root@lb01 ~]# cat /tmp/ipvsadm-dr.save

-A -t 10.0.0.3:80 -s wrr -p 20

-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1

-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

[root@lb01 ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.0.0.3:80 wrr persistent 20

  -> 10.0.0.7:80                  Route   1      0          0         

  -> 10.0.0.8:80                  Route   1      0          0         

[root@lb01 ~]# ipvsadm -C

[root@lb01 ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@lb01 ~]# ipvsadm-restore </tmp/ipvsadm-dr.save

[root@lb01 ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.0.0.3:80 wrr persistent 20

  -> 10.0.0.7:80                  Route   1      0          0         

  -> 10.0.0.8:80                  Route   1      0          0     

配置web01、web02

在回环设备上绑定了一个虚拟IP地址,与Director Server上的虚拟IP保持互通

[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0

[root@web01 ~]# ip a s lo

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 10.0.0.3/32 scope global lo:0

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p

测试

添加hosts解析 windows  

10.0.0.3  www.etiantian.org  blog.etiantian.org

过20秒后再次刷新浏览器

 

猜你喜欢

转载自www.cnblogs.com/HByang/p/9155687.html