02_高并发_03_Keepalived高可用

02_高并发_02_LVS负载均衡这一节做的LVS负载均衡有以下几个缺点:

1. LVS单点故障;
2. RealServer故障的剔除和恢复后的重新注册需要人工干预

引入Keepalived来自动对LVS故障时做故障转移,启用备用的LVS;对RealServer进行健康检查,对RealServer实现自动故障剔除和恢复注册
Keepalived高可用LVS负载均衡拓扑图

简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

工作原理

  • VRRP协议(虚拟路由冗余协议) - Virtual Router Redundancy Protocol
  • IP漂移:master宕机后,VIP自动转移到BACKUP上面
    Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
  • Layer3:Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
  • Layer4: Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
  • Layer5:Layer5对指定的URL执行HTTP GET或SSL_GET,然后使用MD5算法对HTTP GET结果进行求和。
  • MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。

作用

  • 主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
  • 高可用web架构:LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)

根据上一节做的实验,进行改造,添加Keepalived和LVS_BACKUP

  1. 清除node01在上一节做的配置:VIP和ipvs负载
[root@node01 ~]# ifconfig ens33:0 down
[root@node01 ~]# ipvsadm -C
  1. 安装Keepalived
[root@node01 ~]# yum install keepalived -y        -- 安装Keepalived
[root@node01 ~]# cd /etc/keepalived/              -- 备份配置文件
[root@node01 keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3598 7月  30 01:19 keepalived.conf
[root@node01 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@node01 keepalived]# ll
总用量 8
-rw-r--r-- 1 root root 3598 7月  30 01:19 keepalived.conf
-rw-r--r-- 1 root root 3598 8月  12 14:54 keepalived.conf.bak
[root@node01 keepalived]# vi keepalived.conf  --编辑配置文件
  1. man 5 keepalived.conf 查看这个配置文件怎么配置
    global_defs:全局配置,主要配置一些邮件通知
    vrrp_instance:
- state:MASTER或BACKUP
- interface:配置网卡名称,用于发广播包,可以单独创建一个网卡,把数据网和管理网隔离
- priority:优先级,禅让制,越高越优先替换坏掉的MASTER
- virtual_ipaddress:配置vip,相当于上一节的ifconfig eth0:0 vip/24

virtual_server:配置LVS服务监听哪种请求包

相当于上一节的ipvsadm -A -t 192.168.80.100:80 -s rr
- lb_algo: 调度方式,rr
- lb_kind: 工作模式,DR
- persistence_timeout:持久化超时时间,实验时改为0方便看到效果
- real_server:配置RS服务器
相当于上一节的ipvsadm -a -t 192.168.80.100:80 -r 192.168.80.12 -g

配置完后的配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict                 #把这王八蛋注释掉,不然严格遵守vvrp协议,访问不了vip的
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33 
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.100/24 dev ens33 label ens33:0
    }
}

virtual_server 192.168.80.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.80.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.80.13 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

把这个文件远程复制到node04

[root@node01 keepalived]# scp ./keepalived.conf [email protected]:/etc/keepalived/
The authenticity of host '192.168.80.14 (192.168.80.14)' can't be established.
ECDSA key fingerprint is SHA256:ssVmSpeO3/jYpEcQKbkczMO5SeStnq+VORyw8NnY9G4.
ECDSA key fingerprint is MD5:4f:80:d3:fa:e3:1a:8d:9a:98:1a:1c:e4:61:94:1b:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.80.14' (ECDSA) to the list of known hosts.
[email protected]'s password: 
keepalived.conf                    100% 1295   455.2KB/s   00:00

到node04修改state为BACKUP和priority为50

  1. 在node01启动Keepalived
service keepalived start  -- 启动
ifconfig --查看keepalived自动添加了ens33:0,没看到多执行一两遍
ipvsadm -ln  --查看keepalived自动添加了lvs监听和负载
scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/  --远程复制
  1. 在node04上修改keepalived.conf和启动
  2. 模拟LVS master不可用,把ens33网卡down掉,然后到node04观察ifconfig是不是自动装载子网卡,vip漂移到node04,浏览器访问是不是正常
  3. 模拟LVS master正常后,负载又恢复到node01,观察node04的子网卡被卸载,node01自动负载
  4. 如果直接kill掉node01的keepalived,会出现node04装载VIP子网卡,但是node01的VIP子网卡没有卸载,此时同一网络出现两个VIP,有可能造成一个通信过程,包发错,三次握手和四次分手的包打散了。反应了keepalived的简单性,没有互相通信,后期可以用zookeeper来替代。

遇到的问题

  1. VIP本地不能访问,参考https://blog.csdn.net/charthyf/article/details/81456872
vip无法ping通 
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
映射端口无法访问 
vip可ping通后,访问vip映射端口无法访问,直接访问real_server的ip和端口可访问。 
解决这个问题需要对lvs相关知识进行初步了解,详见《LVS手册》http://www.linuxidc.com/Linux/2016-03/129233.htm 
在keepalived.conf中对virtual_server配置有 
lb_kind可以设置为NAT、DR、TUN。这个选项直接关系到你做的 virtual_server和real_server能否进行正确映射。
  1. 转发到node03的real server一直处于SYN_RECV状态,排查后发现没有node03没有在环回网口上配置vip,node03接收到转发过来的包,发现跟自己的ip不对应,把包丢弃了
[root@node01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:53  SYN_RECV    192.168.80.1:59644 192.168.80.100:80  192.168.80.13:80

[root@node03 ~]# ifconfig lo:8 192.168.80.100 netmask 255.255.255.255
  1. 自己实验时,浏览器访问时发现很难实现快速轮询(修改后效果不佳)
    参考https://blog.csdn.net/yanziguishi/article/details/7228700
    通过"ipvsadm -Ln --timeout"可以查看tcp tcpfin udp的超时时间(默认:900 120 300)
    • persistence_timeout 可以通过"ipvsadm -p timeout" 来设置,或修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60
    • tcp tcpfin udp 可以通过"ipvsadm --set 对应超时时间"来设置,ipvsadm --set tcp tcpfin udp。建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收

你可能感兴趣的:(02_高并发_03_Keepalived高可用)