LVS+keepalived实现高可用负载均衡集群详解及其实现

集群技术概述:
     LB(负载均衡集群):LVS、Haproxy、Nginx、F5 BigIP
     HA(高可用集群):keepalived、RFCS、Pacemaker、Heartbeat
     HP(高性能集群):Hadoop,spark
Keepalived介绍:
     keepalived 是linux下一个轻量级的高可用解决方案。其与Heartbeat等实现的功能类似,都可以实现服务或者网络的高可用。Heartbeat功能强大,但是部署和使用相对比较麻烦。与heartbeat相比,keepalived主要是通过虚拟路由冗余来实现高可用。其配置相对简单。
     keepalived是专门用来监控集群系统中各个服务节点的状态,根据第3~5层的交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,keepalived就可以检测到,将故障的节点剔除,在故障节点恢复后,又自动将此服务节点重新加入到服务器集群中。
VRRP(虚拟路由器冗余协议)
     其目的是为了解决静态路由器出现的淡点故障问题,通过vrrp可以实现网络不间断地,稳定地运行。
     VRRP可以将两台或多台物理服务器设备虚拟成一个虚拟路由器。这个虚拟拟路由器通过虚拟IP(可以多个)对外提供服务,但是在虚拟路由器内部,多个物理路由器协同工作,同一时间一般只有一台物理服务器对外提供服务,这台物理服务器就叫做MASTER。MASTER一般由选举算法产生,通过其身的虚拟IP对外提供服务。当MASTER故障后,就会将自身的虚拟IP绑定到BACKUP上,由BACKUP进行对外提供服务。那么什么时候BACKUP就知道MASTER故障了呢?这就要靠主备之间的心跳检测了。MASTER每隔段时间就告诉BACKUP,它的信息表示它alive。如果BACKUP过了好久没有收到MASTER的alive信息,就知道MASTER已经挂了,需要切换它进行服务了。
     上述怎么构成一组虚拟路由器呢?它是因为每一个虚拟路由器都有一个唯一标识,称为VRID,一个VRID与一组IP地址构成了一个虚拟路由器。在VRRP中,所有的报文都是通过IP多播的形式发送的。所以在一个虚拟路由器中,MASTER会一直发送vrrp数据包,处于BACKUP的路由器就只管接受MASTER发送过来的数据包即可。同时监控MASTER的运行状态。
     当没有标名哪个路由器为MASTER时,一般多台物理路由器通过优先级选举出MASTER,若优先级也都一样,就会使用IP大的作为MASTER。
keepalived工作原理:
     keepalived通过vrrp实现高可用,并且可以实现对集群中的服务器运行状态的监控以及故障隔离。
     keepalived工作在TCP/IP 参考模型的网络层,传输层,应用层。
     keepalived在网络层通过ICMP想服务器集群的每个节点发送一个ICMP的数据包,如果某个节点没有响应数据包,那么就认为此节点发生了故障,keepalived就会将该节点剔除。
     keepalived在传输层就是利用TCP的端口连接和扫描技术来判断集群的节点是否正常。例如:web默认端口是80,ssh端口是22,keepalived一旦在传输层探测到这些端口没有响应数据包返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组总剔除。
     应用层就是用来运行各种应用服务的,用户可以编写程序来运行keepalived,keepalived就可以根据用户设定的检测各种程序或服务是否允许正常,如果keepalived的监测结果与用户设定的不一致,keepalived就会将对应的服务从服务器中剔除。
keepalived的体系结构

     keepalived体系结构从整体上分为两层,分别是用户层和内核层。
     内核层处于最底层,包括IPVS和NETLINK两个模块。IPVS模块是keepalived引入的一个第三方模块,用来实现基于IP的负载均衡集群。LVS中的Director一般就要安装该软件,用来实现从后端服务器中挑选一个物理服务器来响应客户请求。
     NETLINK主要用于实现一些高级路由框架和一些相关的网络功能,完成用户控件层Netlink Reflector模块发来的各种网络请求。
     用户层有四部分,分别是:Scheduler I/O Multiplexer、Memory Management(Mngt)、Control Plane和Core components。其中,Scheduler I/O Multiplexer是一个I/O复用调度器,负载安排keepalived所有的内部请求。Memory Management(Mngt)提供了一些访问内存的通用方法。Control Plane可以实现对配置文件进行编译和解析。
     Core components是keepalived的核心组件,它包含了一些功能模块,例如WatchDog、Checkers、VRRP Stacks、IPVS wrapper和Netlink Reflector。其中,WatchDog是针对被检测的目标设置一个计数器和一个阈值,WatchDog会自己增加此计数值,然后等待被监控的目标周期性地重置该计数值。一旦被监控目标发生错误,被无法重置此计数值,WatchDog就会检测到,于是就采取对应的恢复措施。Checkers可实现对服务器的运行状态进行检测和故障隔离。VRRP STack可以实现HA集群中的故障切换。IPVS wrapper就是IPVS功能的实现。Netlink Reflector用来实现高可用集群中故障转移是虚拟IP的设置和切换。
搭建前准备:
     1、首先准备四台虚拟机。两台作为keepalived的主从结构(也可以做主主结构),两台作为RS
     2、keepalived准备成DR模式,因为NAT模式中DIP与VIP都需要进行故障切换,相对比较麻烦,在此先不演示。
     3、DIP:192.168.0.121 192.168.0.127
     4、VIP:192.168.0.100
     5、RIP:192.168.0.122 192.168.0.124
     6、保证四台机器时间全部同步,以及firewalld跟selinux全部关闭()
搭建:
1、首先配置两台RS,安装httpd,并添加index.html

yum install httpd
echo "This is 122 rs1 web page" > /var/www/html/index.html
echo "This is 124 rs2 web page" > /var/www/html/index.html

2、配置arp_ignore以及arp_announce(RS1与RS2均需操作)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

3、在lo接口绑定VIP,并添加路由(RS1与RS2均操作)

ifconfig lo:10 192.168.0.100 netmask 255.255.255.255 broadcast 192.168.0.100 up
route add -host 192.168.0.100 dev lo:10

4、启动httpd服务,首先测试两台RS

[root@dr ~]# elinks -dump http://192.168.0.122
                            This is 122 rs1 web page
[root@dr ~]# elinks -dump http://192.168.0.124
                         This is 124 rs2 web test page

5、两台调度器安装keepalived

yum install keepalived

6、配置调度器

! Configuration File for keepalived

global_defs {                    #全局配置
   notification_email {        #设置报警邮件地址
     gaofan@localhost        #该地址可以有多个
   }
   notification_email_from root@localhost    #邮件的发送地址
   smtp_server 127.0.0.1                        #邮件服务器的地址
   smtp_connect_timeout 30        #设置连接SMTP服务器的超时时间
   router_id LVS_DEVEL1                #运行keepalived服务器的一个标识,邮件的主题中的信息
}
vrrp_script chk_mt {            #可以实现对集群功能的监控,实现对集群资源的监控并改变优先级,进而实现主备的切换
  script "[[ -f /etc/keepalived/down  ]] && exit 1 || exit 0"
  interval 1
  weight -2
}
vrrp_instance VI_1 {        #实例1
    state MASTER            #表名该机是MASTER服务器
    interface ens33        #检测的网络接口
    virtual_router_id 61        #虚拟路由标识,同一个vrrp_instance下,MASTER与BACKUP必须是一致的
    priority 100                    #定义优先级
    advert_int 1                    #设定MASTER与BACKUP之间的健康检测时间,默认1s
    authentication {        #验证的类型和密码
        auth_type PASS    #类型
        auth_pass 1111       #密码,主备密码必须相同,一般通过openssl随机生成一串数字
    }
    virtual_ipaddress {        #设置虚拟IP地址
        192.168.0.100/32 dev ens33 label ens33:0
    }
    track_script{
       chk_mt
    }
}

virtual_server 192.168.0.100 80 {        #虚拟服务器
    delay_loop 6        #设置运行情况检查时间,单位s
    lb_algo rr                    #设置负载调度算法,这里用轮询
    lb_kind DR                    #负载均衡机制
    nat_mask 255.255.255.255    #虚拟IP的子网掩码
#   persistence_timeout 50        #会话保持时间
    protocol TCP            #转发协议,分为TCP和UDP
    sorry_server 127.0.0.1 80        #若RS均故障,自己就作为sorry服务器,总比访问不到强,不尴尬!
    real_server 192.168.0.122 80 {    #RS1 定义
        weight 1            #权重,越大,表示该服务器的负载越高
        HTTP_GET {        #RS 的状态检测设置部分,可以使用的方法下面会列举
            url {                    #这里使用探测RS下面的默认Index.html的状态码是否是200
      path /
                status_code 200
            }
            connect_timeout 3        #超时时间
            nb_get_retry 3            #重试次数
            delay_before_retry 3    #重试间隔
        }
    }
         
    real_server 192.168.0.124 80 {
        weight 2
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

拷贝该配置文件给BACKUP调度器,修改下面两处:
state BACKUP
priority 99 (比MASTER低一点即可)

然后再在两台调度器上安装httpd,配置sorry页面。
上述中的对RS的检测可以有如下方式:
     1、HTTP_GET:利用状态码
     2、采用默认TCP_CHECK
     3、采用MD5加密方式
需要使用genhash命令获取到某台RS的某个页面的MD5码
例如:

genhash -s 192.168.0.122 -p 80 -u /test.html
MD5SUM = f5ac8127b3b6b85cdc13f237c6005d80

然后配置处改为:

HTTP_GET{
    url{
        path /test.html        digest f5ac8127b3b6b85cdc13f237c6005d80
    }
}

7、启动两台调度器的keepalived。
8、查看VIP以及ipvs规则,其中ipvs规则两台调度器规则都会产生。

[root@dr keepalived]# ip addr list
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:40:8e:97 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.121/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/32 scope global ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe40:8e97/64 scope link
       valid_lft forever preferred_lft forever
[root@dr keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:80 rr
  -> 192.168.0.122:80             Route   1      0          0         
  -> 192.168.0.124:80             Route   2      0          0         

9、用另一台调度器进行测试

[root@ga keepalived]# for ((i=1;i<=10;i++))
> do
> elinks -dump http://192.168.0.100
> done
                         This is 124 rs2 web test page
                            This is 122 rs1 web page
                         This is 124 rs2 web test page
                            This is 122 rs1 web page
                         This is 124 rs2 web test page
                            This is 122 rs1 web page
                         This is 124 rs2 web test page
                            This is 122 rs1 web page
                         This is 124 rs2 web test page
                            This is 122 rs1 web page

10、降低MASTER优先级,因为我配置文件中有检测,所以当keepalived目录下存在down文件时,MASTER优先级就会减2,从而VIP飘到调度器2
。再次检测。可以看到上述同样的效果,也可以抓包测试。
11、关闭两台RS,测试是否会得到sorry页面。

[root@dr keepalived]# elinks -dump http://192.168.0.100
   Sorry,I am 127 sorry page

12、补充:
上述配置中vrrp_script与track_script是配合使用的。
常用的有如下四种:
     1、使用killall 命令。可以使用killall -0 httpd命令,信号为0就表示对程序或者进程的运行状态的监控,如果发现进程关闭或者其他异常,将返回状态码1,反之,若进程正常,返回0
     2、检测端口运行状态 "</dev/tcp/127.0.0.1/80"表示对本机80端口的状态检测
     3、通过shell检测
     4、通过脚本监控

发布了36 篇原创文章 · 获赞 3 · 访问量 8020

猜你喜欢

转载自blog.csdn.net/qq_41547105/article/details/104282986