keepalived+lvs

来源:互联网 发布:js 数组 map方法 编辑:程序博客网 时间:2024/05/29 16:44

arptables命令用来设置、维护和检查Linux内核中的arp包过滤规则表。

 

-A:向规则链中追加规则;

-D:从指定的链中删除规则;

-l:向规则链中插入一条新的规则;

 -R:替换指定规则;

-P:设置规则链的默认策略;

-F:刷新指定规则链,将其中的所有规则链删除,但是不改变规则链的默认策略;

 -Z:将规则链计数器清零;

-L:显示规则链中的规则列表;

 -X:删除指定的空用户自定义规则链;

 -h:显示指令帮助信息;

 -j:指定满足规则的添加时的目标;

 -s:指定要匹配ARP包的源ip地址;

 -d:指定要匹配ARP包的目的IP地址。

 

来自: http://man.linuxde.net/arptables

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LVS 是一个开源的软件,可以实现LINUX平台下的简单负载均衡。首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

 

IPVS是LVS集群系统的核心软件,它的主要作用是:

 

 

 

安装在Load Balancer上,把发往Virtual IP的请求转发到Real Server上。

 

 

 

IPVS的负载均衡机制有三种,这里使用IP Tunneling机制:

一,NAT模式(VS-NAT)

 

原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。

 

优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。

 

缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

 

二、IP隧道模式(VS-TUN)

 

原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

 

优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

 

缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

 

三、直接路由模式(VS-DR)

 

原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

 

优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

 

缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。

 

 

Virtual Server via NAT

 

Virtual Server via IP Tunneling

 

Virtual Server via Direct Routing

 

 

 

 

 

 

 

IPVS的负载调度算法有十种:

 

轮叫(Round Robin)

 

加权轮叫(Weighted Round Robin)

 

最少链接(Least Connections)

 

加权最少链接(Weighted Least Connections)

 

基于局部性的最少链接(Locality-Based Least Connections)

 

带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

 

目标地址散列(Destination Hashing )

 

源地址散列(Source Hashing)

 

最短期望延迟(Shortest Expected Delay)

 

无须队列等待(Never Queue)

 

 

 

 

 

lvS的特点是:

 

1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生;

 

2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;

 

3、工作稳定,自身有完整的双机热备方案;

 

4、无流量,保证了均衡器IO的性能不会收到大流量的影响;

 

5、应用范围比较广,可以对所有应用做负载均衡;

 

6、LVS需要向IDC多申请一个IP来做Visual IP,因此需要一定的网络知识,所以对操作人的要求比较高。

 

 

Nginx的特点是:

 

1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;

 

2、Nginx对网络的依赖比较小;

 

3、Nginx安装和配置比较简单,测试起来比较方便;

 

4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;

 

5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测;

 

6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;

 

7、Nginx能支持http和Email,这样就在适用范围上面小很多;

 

8、不支持Session的保持、对Big request header的支持不是很好,另外默认的只有Round-robin和IP-hash两种负载均衡算法。

 

 

HAProxy的特点是:

 

1、HAProxy是工作在网络7层之上。

 

2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作

 

3、支持url检测后端的服务器出问题的检测会有很好的帮助。

 

4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现

 

5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。

 

6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。

 

 

 

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现

 

VRRP)虚拟路由器冗余协议是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。 VRRP 包封装在 IP 包中发送。 详细参数   VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种容错协议。通常,一个网络内的所有主机都设置一条缺省路由(如图3-1所示,10.100.10.1),这样,主机发出的目的地址不在本网段的报文将被通过缺省路由发往路由器RouterA,从而实现了主机与外部网络的通信。当路由器RouterA 坏掉时,本网段内所有以RouterA 为缺省路由下一跳的主机将断掉与外部的通信。VRRP 就是为解决上述问题而提出的,它为具有多播或广播能力的局域网(如:以太网)设计。我们结合下图来看一下VRRP 的实现原理。VRRP 将局域网的一组路由器(包括一个Master 即活动路由器和若干个Backup 即备份路...

 

 

 

 

 

 

 

lvs

 

 

需要四台虚拟机 server1/2/3/4

server2 作为调度器

关掉其他所有服务   开启httpd 服务

 

 

server2

 netstat -anplet

   /etc/init.d/httpd start

    ipvsadm

   ip addr add 172.25.19.100/24 dev eth0  添加vip  

    ip addr show  

    ipvsadm -A -t 172.25.19.100:80 -s rr    添加服务,算法为轮询

    ipvsadm -a -t 172.25.19.100:80 -r 172.25.19.3:80 -g  

    ipvsadm -a -t 172.25.19.100:80 -r 172.25.19.4:80 -g

    ipvsadm -l

 

server3/4

 yum install httpd -y

    /etc/init.d/httpd  start

     cd /var/www/html/

     vim index.html

     ip addr add 172.25.19.100/24 dev eth0

    

     yum install arptables_jf -y

    [ arptables -A IN -d 172.25.19.100 -j DROP

     arptables -A OUT -s 172.25.19.100 -j mangle --mangle-ip-s 172.25.19.3]

    

 

    [ arptables -A IN -d 172.25.19.100 -j DROP

     arptables -A OUT -s 172.25.19.100 -j mangle --mangle-ip-s 172.25.19.4]

 

   

  /etc/init.d/arptables_jf save

     arptables -nL

物理机浏览器  访问   172.25.19. 100  测试     没有健康检查

 

#lvs负载均衡realserver上      server3/4    必须要有vip 172.25.9.100

server3/4  必须有vip  172.25.19.100/24  ip addr add 172.25.19.100/24 dev eth0

 

 

 

 

 

keepalived

 

server1

 

/etc/init.d/heartbeat stop

    chkconfig  heartbeat off

    cd

    netstat -anplet

    tar  zxf keepalived-1.2.24.tar.gz

   cd keepalived-1.2.24

    ./configure  --prefix=/usr/local/keepalived

    yum  install -y libnl-devel

    ./configure  --prefix=/usr/local/keepalived

    cd

    yum install -y libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm

    cd keepalived-1.2.24

    ./configure  --prefix=/usr/local/keepalived

    make

    make instal

    scp -r /usr/local/keepalived/  172.25.19.2:/usr/local/

 

server1/2

 

必要的软链接

    ln -s /usr/local/keepalived/etc/keepalived/ /etc/  配置文件

    ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  启动脚本

    chmod +x /etc/init.d/keepalived                            执行权限

    /etc/init.d/keepalived status                              报错

    ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  必要文件

     ln -s /usr/local/keepalived/sbin/keepalived /sbin/   二进制命令文件

      /etc/init.d/keepalived status 应该成功了

 

server1

 cd /etc/keepalived/

   ls

   vim keepalived.conf

global_defs {

   notification_email {

        root@localhost    第五行

   }

   notification_email_from                    keepalived@server1.example.com

   smtp_server                                 172.25.19.1

  .........

 virtual_router_id 19

........

 virtual_ipaddress {

        172.25.19.100

}

.........

 

virtual_server 172.25.19.100 80 {

    delay_loop 6

    lb_algo rr

   

 lb_kind DR

#persistence_timeout 50

    protocol TCP

 

    real_server 172.25.19.3 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

        real_server 172.25.19.4 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

  }                                                             

 

}

下面全部删掉,会影响

 

 

 

 

   scp keepalived.conf  172.25.19.2:/etc/keepalived/

    

server2

 

cd /etc/keepalived/

vim keepalived.conf

vrrp_instance VI_1 {

state BACKUP

    interface eth0

    virtual_router_id 19

priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

 

 

 

 

   /etc/init.d/keepalived  start

    ip addr show

    /etc/init.d/keepalived  stop

 

    /etc/init.d/keepalived  start

    tail -f /var/log/messages

    ip addr show

    ipvsadm -l

 

server1

    tail -f /var/log/messages

    ip addr show

    /etc/init.d/keepalived stop

    /etc/init.d/keepalived start

    ip addr show

    /etc/init.d/keepalived stop

    /etc/init.d/keepalived start

    ip addr show

是有健康检查

 

对服务端       /etc/init.d/ipvsadm           stop    检查不出来了

对服务端       /etc/init.d/httpd              stop   不能检查

 

lvs负载均衡后端 /etc/init.d/httpd      stop   有检测

 

 

 

 

 

 

 

 

 

 

 

 

                                                                 heartbeat+ldirectord高可用

 

 

 

server1/2  需要装过heartbeat

 

 find  / -name ldirectord.cf

    cd /usr/share/doc/ldirectord-3.9.5/

    vim ldirectord.cf

virtual=172.25.19.100:80

        real=172.25.19.3:80 gate

        real=172.25.19.4:80 gate

        fallback=127.0.0.1:80 gate

        service=http

        scheduler=rr

      #persistent=600

      #netmask=255.255.255.255

        protocol=tcp

        checktype=negotiate

        checkport=80

        request="index.html"

   #       receive="Test Page"

   #       virtualhost=www.x.y.z

 

 

    mv ldirectord.cf   /etc/ha.d/

    cd /etc/ha.d/

    ls

 

ldirectord是有健康检测的 对real server 可以检测,开启ldirectord等于开启ipvsadm,所以不用再开启ipvsadm的

 

    /etc/init.d/ipvsadm  stop

    ipvsadm -L

    /etc/init.d/ldirectord  start

    ipvsadm -l

   

 

 

 

 vim haresources

server1.example.com IPaddr::172.25.19.100/24/eth0  ldirectord httpd

 

    scp haresources  ldirectord.cf   172.25.19.2:/etc/ha.d/

    /etc/init.d/ldirectord stop

    chkconfig  ldirectord off

   

 server1/2 是没有 :ip addr del 172.25.19.100/24 dev eth0)

 

 

 

 

 

 

server1/2

 

 

    /etc/init.d/heartbeat start

    ipvsadm -l

   tail -f /var/log/messages

    ipvsadm -l

server3/4  必须有vip  172.25.19.100/24  ip addr add 172.25.19.100/24 dev eth0

 

 

 

 

 

 

 

 

 

 

                            

 

                                                          编译内核

 

 

 

kernel

rpm -ivh  kernel-2.6.32-220.23.1.el6.src.rpm

 

 cd rpmbuild/SOURCES/SPECS/

yum install -y rpm-build

rpmbuild -bp  kernel.spec

 

yum install -y patchutils xmlto asciidoc  elfutils-libelf-devel zlib-devel binutils-devel newt-devel python-devel perl hmaccalc gcc perl-ExtUtils-Embed

rpm -ivh asciidoc-8.4.5-4.1.el6.noarch.rpm  newt-devel-0.52.11-3.el6.x86_64.rpm  slang-devel-2.2.1-1.el6.x86_64.rpm

rpmbuild -bp  kernel.spec

 

tar zxf Lvs-fullnat-synproxy.tar.gz

cd  /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64

cp /root/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch .

patch -p1 < lvs-2.6.32-220.23.1.el6.patch

 

vim Makefile

EXTRAVERSION = -220.23.1.el6

 

    make

    make modules_install

    make install

vim  /boot/grub/grub.conf

default=0

..............

     root (hd0,0)

        kernel /vmlinuz-2.6.32-220.23.1.el6 ro root=/dev/mapper/vg_server-LogVol00 rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_server/LogVol00 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM 【nohz=off】  rhgb quiet

............................

        initrd /initramfs-2.6.32-220.23.1.el6.img

title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64)

 

 

reboot

 

yum remove ipvsadm -y

   cd

    cd lvs-fullnat-synproxy/

    ls

    tar zxf lvs-tools.tar.gz

    ls

    cd tools/

    ls

    cd keepalived/

   ./configure  --with-kernel-dir=/lib/modules/2.6.32-220.23.1.el6/build/

    yum install openssl-devel -y

    ./configure  --with-kernel-dir=/lib/modules/2.6.32-220.23.1.el6/build/

    yum install popt-devel -y

   ./configure  --with-kernel-dir=/lib/modules/2.6.32-220.23.1.el6/build/

    make

    cd ..

    cd ipvsadm/

    ls

    make

    cd ..

    make install

    cd keepalived/

    make install

    cd ..

    cd ipvsadm/

    make install

    ipvsadm -l

   cd ..

   ipvsadm  --help |less

   uit

   ipvsadm  --help

 

 

 

 

                                                  

 

 

 

                                                           haproxy负载均衡

 

 

 yum install haproxy

   cd /etc/haproxy/

   vim haproxy.cfg

        stats uri /status  监控    59行

59行以后全部注释

listen westos *:80

                balance  roundrobin

                server  web1 172.25.19.3:80 check

                server  web2 172.25.19.4:80 check

 

 

 

 

 

 

   /etc/init.d/haproxy start

  vim haproxy.cfg

    /etc/init.d/haproxy start

    vim haproxy.cfg

    /etc/init.d/haproxy start

 

 

 

frontend westos *:80       

acl badhost src 172.25.9.250        #指定该用户访问的服务器

redirect location http://172.25.9.1:8080 if badhost     

default_backend app

 

backend app

   #  balance  roundrobin

        balance source

                server  web1 172.25.9.2:80 check

                server  web2 172.25.9.3:80 check

                server  local 172.25.9.1:8080 backup

 

    #目录分布,

acl url_static       path_beg       -i /images

acl url_static       path_beg       -i .jpg .gif .png .css .js

use_backend an   if url_static          

 

default_backend app             

 

backend an

     balance  roundrobin

#       balance source

                server  web1 172.25.9.2:80 check

backend app

     balance  roundrobin

 

              server  web2 172.25.9.3:80 check

 #               server  local 172.25.9.1:8080 backup

 

 

#上传下载文件

 

frontend westos *:80

#acl badhost src 172.25.9.250

#block if badhost

#errorloc 403 http://172.25.9.1:8080

acl url_static       path_beg       -i /images

acl url_static       path_beg       -i .jpg .gif .png .css .js

        acl read method GET

        acl read method HEAD

        acl write method PUT

        acl write method POST

use_backend an   if url_static

 

default_backend app

 

backend an

     balance  roundrobin

#       balance source

                server  web1 172.25.9.2:80 check

backend app

     balance  roundrobin

                server  web1 172.25.9.2:80 check

 

 

 

 

server2/3   

 

/var/www/html

 

upload  上传需要的目录。上传的东西在里面

 index.php

  upload_file.php