keepalived + LVS

负载均衡和高可用集群

负载均衡

【协议层】http重定向协议实现负载均衡
原理:根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给浏览器,由浏览器重新进行访问。
【协议层】dns域名解析负载均衡
原理:在DNS服务器上配置多个域名对应IP的记录。例如一个域名www.baidu.com对应一组web服务器IP地址,域名解析时经过DNS服务器的算法将一个域名请求分配到合适的真实服务器上。
【协议层】反向代理负载均衡
原理:反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的web服务器处理,处理结果经过反向服务器返回给浏览器。
【网络层】IP负载均衡
原理:在网络层通过修改目标地址进行负载均衡用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器地址,然后将用户请求的目标地址修改成该真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再讲数据返回回去。
【链路层】数据链路层负载均衡
原理:在数据链路层修改Mac地址进行负载均衡。
负载均衡服务器的IP和它所管理的web 服务群的虚拟IP一致;负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址; 通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。

主要技术有LVS keepalived nginx反向代理 haproxy

高可用

高可用的三种模式:
【主从方式】 (非对称方式)
工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。
【双机双工方式】(互备互援)
工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。
【集群工作方式】(多服务器互备方式)
工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。

网站的可用性描述网站可有效访问的特性。网站的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。实现这种高可用架构的主要手段是数据和服务的冗余备份以及失效转移。

主要技术有RHHA pacemaker keepalived haproxy

我们可以做前端使用lvs来做负载均衡,根据lvs的8种调度算法(可设置),分发请求到对应的web服务器集群上。lvs做双机热备,通过keepalived模块能够达到故障自动转移到备份服务器,不间断提供服务。

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS体系结构与工作原理简单描述,LVS集群负载均衡器接受服务的所有入展客户端的请求,然后根据调度算法决定哪个集群节点来处理回复客户端的请求。
LVS的三种工作模式:

1)VS/NAT模式(Network address translation)
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。

2)VS/TUN模式(tunneling)

1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)

3)DR模式(Direct routing)
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

实验环境:rhel6.3 selinux and iptables disabled
实验主机: 172.25.12.250
调度器服务器(LB)
LB1 172.25.12.11
LB1 172.25.12.12
资源服务器(RS)
web1 172.25.12.13
web2 172.25.12.14

所需rpm 包
ipvsadm
keepalived-1.2.20.tar.gz
server11:
[root@server11 /]yum install -y ipvsadm
[root@server11 /]# ipvsadm -l
[root@server11 /]# ip addr add 172.25.12.100/24 dev eth0 增加虚拟IP

[root@server11 /]# ip addr show eth0       查看虚拟IP
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:25:22:25 brd ff:ff:ff:ff:ff:ff
    inet 172.25.12.11/24 brd 172.25.12.255 scope global eth0
    inet 172.25.12.100/24 scope global secondary eth0
    inet6 fe80::5054:ff:fe25:2225/64 scope link
       valid_lft forever preferred_lft forever

[root@server11 /]# ipvsadm -A -t 172.25.12.100:80 -s rr 在调度器上增加轮询策略
[root@server11 /]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.13:80 -g
[root@server11 /]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.14:80 -g
将虚拟IP的请求转给资源服务器
[root@server11 /]# /etc/init.d/ipvsadm save 保存策略

[root@server11 /]# ipvsadm -l   查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.12.100:http rr
  -> server13:http                Route   1      0          0         
  -> server14:http                Route   1      0          0         
[root@server11 /]# /etc/init.d/ipvsadm start
ipvsadm: Clearing the current IPVS table:                  [  OK  ]
ipvsadm: Applying IPVS configuration:                      [  OK  ]

server13 server14
配置real server服务器,禁止arp相应的请求
安装httpd服务
[root@server13 ~]# yum install -y httpd
[root@server13 ~]# cd /var/www/html/
[root@server13 html]# ls
[root@server13 html]# vim index.html
[root@server13 html]# /etc/init.d/httpd start
[root@server13 html]# yum install -y arptables_jf.x86_64
[root@server13 html]# ip addr add 172.25.12.100/32 dev eth0 增加虚拟IP

[root@server13 html]# ip addr show eth0
1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:0e:12:25 brd ff:ff:ff:ff:ff:ff
    inet 172.25.12.13/24 brd 172.25.12.255 scope global eth0
    inet 172.25.12.100/32 scope global eth0
    inet6 fe80::5054:ff:fe0e:1225/64 scope link
       valid_lft forever preferred_lft forever

[root@server13 html]# arptables -A IN -d 172.25.12.100 -j DROP
[root@server13 html]# arptables -A OUT -s 172.25.12.100 -j mangle –mangle-ip-s 172.25.12.13
屏蔽虚拟IP的请求,当接到调度器发来的虚拟IP时将自己的真实IP广播出去

[root@server13 html]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables:          [  OK  ]
[root@server13 html]# /etc/init.d/arptables_jf start
Flushing all current rules and user defined chains:        [  OK  ]
Clearing all current rules and user defined chains:        [  OK  ]
Applying arptables firewall rules:                         [  OK  ]

在真机上测试:

[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server13-</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server13-</h1>
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
curl: (7) Failed connect to 172.25.12.100:80; Connection refused
[root@localhost new]# curl 172.25.12.100
<h1>server14-redhat</h1>
[root@localhost new]# curl 172.25.12.100
curl: (7) Failed connect to 172.25.12.100:80; Connection refused

当server3出现故障时,上述的实验没有健康检查
server11
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/ 将keepalived主程序加入到环境变量
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ keepalived启动脚本变量引用文件
[root@server11 keepalived-1.2.20]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ keepalived启动脚本,放到/etc/init.d/目录下就可以使用命令调用
[root@server11 keepalived-1.2.20]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
[root@server11 keepalived-1.2.20]# cd /etc/keepalived/
[root@server11 keepalived]# vim keepalived.conf

[root@server11 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {  指定keepalived在发生事情的时候,发送邮件告
     root@localhost  指定为本地用户
   }
   notification_email_from keepalived@server11  指定发件人
   smtp_server 127.0.0.1  发送email的smtp地址
   smtp_connect_timeout 30  超时时间
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}

vrrp_instance VI_1 {
    state MASTER   指定当前节点为主节点
    interface eth0   绑定虚拟IP的网络接口
    virtual_router_id 51  VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100   主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1
    authentication {  设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  指定虚拟IP, 两个节点设置必须一样
        172.25.12.100
    }
}

virtual_server 172.25.12.100 80 {
    delay_loop 6
    lb_algo rr        调度策略
    lb_kind DR        工作模式
#    persistence_timeout 50
    protocol TCP

    real_server 172.25.12.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.12.14 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

[root@server11 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@server11 keepalived]# ip addr show eth0

将serve11的配置发送到server12上

[root@server11 keepalived]# scp -r /usr/local/keepalived/ root@172.25.12.12://usr/local
root@172.25.12.12's password:
keepalived                                                    100%  224KB 224.1KB/s   00:00    
keepalived.conf.5                                             100%   27KB  26.7KB/s   00:00    
keepalived.8                                                  100% 4296     4.2KB/s   00:00    
genhash.1                                                     100% 1579     1.5KB/s   00:00    
keepalived.conf.vrrp.static_ipaddress                         100%  591     0.6KB/s   00:00    
keepalived.conf.HTTP_GET.port                                 100%  684     0.7KB/s   00:00    
keepalived.conf.fwmark                                        100%  433     0.4KB/s   00:00    
sample.misccheck.smbcheck.sh                                  100%  323     0.3KB/s   00:00    
keepalived.conf.sample                                        100%  919     0.9KB/s   00:00    
keepalived.conf.misc_check                                    100%  523     0.5KB/s   00:00    
keepalived.conf.vrrp                                          100% 1425     1.4KB/s   00:00    
client.pem                                                    100% 1745     1.7KB/s   00:00    
root.pem                                                      100%  802     0.8KB/s   00:00    
keepalived.conf.vrrp.sync                                     100% 1742     1.7KB/s   00:00    
keepalived.conf.virtualhost                                   100%  887     0.9KB/s   00:00    
keepalived.conf.vrrp.routes                                   100%  979     1.0KB/s   00:00    
keepalived.conf.IPv6                                          100%  895     0.9KB/s   00:00    
keepalived.conf.vrrp.lvs_syncd                                100% 1056     1.0KB/s   00:00    
keepalived.conf.status_code                                   100%  842     0.8KB/s   00:00    
keepalived.conf.vrrp.rules                                    100%  477     0.5KB/s   00:00    
dh1024.pem                                                    100%  245     0.2KB/s   00:00    
keepalived.conf.virtual_server_group                          100% 1087     1.1KB/s   00:00    
keepalived.conf.SSL_GET                                       100% 1587     1.6KB/s   00:00    
keepalived.conf.misc_check_arg                                100%  511     0.5KB/s   00:00    
keepalived.conf.quorum                                        100% 2467     2.4KB/s   00:00    
keepalived.conf.vrrp.localcheck                               100% 3019     3.0KB/s   00:00    
keepalived.conf.SMTP_CHECK                                    100% 2761     2.7KB/s   00:00    
keepalived.conf.vrrp.scripts                                  100% 1145     1.1KB/s   00:00    
keepalived.conf.track_interface                               100%  735     0.7KB/s   00:00    
keepalived.conf.inhibit                                       100%  746     0.7KB/s   00:00    
keepalived.conf                                               100%  997     1.0KB/s   00:00    
keepalived                                                    100% 1308     1.3KB/s   00:00    
keepalived                                                    100%  667     0.7KB/s   00:00    
genhash                                                       100%   40KB  40.0KB/s   00:00

server12
yum install ipvsadm -y
[root@server12 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server12 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server12 ~]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
[root@server12 ~]# cd /etc/keepalived/
[root@server12 keepalived]# vim keepalived.conf

[root@server12 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@server12
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.12.100
    }
}

virtual_server 172.25.12.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
#    persistence_timeout 50
    protocol TCP

    real_server 172.25.12.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.12.14 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

[root@server12 keepalived]# /etc/init.d/keepalived start
Starting keepalived:

测试:
[root@localhost day06]# curl 172.25.12.100
轮询server13 和server14的默认主页
当停调一个服务时另外一个网页不能正常显示。
在调度器上查看策略
[root@server12 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.12.100:http rr
-> server13:http Route 1 0 3
-> server14:http Route 1 0 3

[root@server11 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值