• Keepalived


    Keepalived

    一、Keepalived相关知识点概述

    1.单服务的风险(单点故障问题)

    企业应用中,单台服务器承担应用存在单点故障的危险;

    单点故障一旦发生,企业服务将发生中断,造成极大的危害和损失。

    2.一个合格的集群应该具备的特性

    1)负载均衡LVS ;NGINX;HAProxy;F5

    2)健康检查 : for 调度器/节点服务器;Keepalived ;Heartbeat

    3)故障转移 : 主备切换工具

    3.VRRP虚拟路由冗余协议

    虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是一种路由容错协议,也可以叫做备份路由协议。

    VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部有多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被设置成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,这种选举角色切换非常之快,因而保证了服务的持续可用性。

    4.健康检查

    健康检查,别名探针

    1)发送心跳消息 ping/pang

    2)TCP端口检查 向一个主机的IP:PORT 发起TCP连接

    3) HTTP URL 检查 向一个主机的 http://IP:PORT/URL路径 发送HTTP GET请求方法,主机响应返回2XX 3XX状态码则认为健康检查正常,如响应返回4XX
    5XX状态码则认为健康检查异常

    检查服务器作用
    节点服务器如果发现有故障的节点就会将其隔离或者剔除集群,待其恢复后再重新加入到集群当中
    负载均衡器会定时检查主服务器的状态(包括主机和服务的状态),如果主服务器故障就自动切换到备服务器上,待主服务器恢复后再重新让主服务器去承载业务请求

    5.脑裂

    定义

    主备服务器同时拥有VIP
    
    • 1

    原因

    主备服务器之间的通信链路中断,导致备服务器无法正常收到主服务器发送的VRRP心跳报文;
    
    • 1

    解决方法

    关闭主服务器或者备服务器其中一个的keepalived服务。
    
    • 1

    如何预防

    1)主服务器与备服务器之间添加双通信链路;
    
    2)在主服务器上定义运行脚本判断与备服务器通信链路是否中断,如果中断则自行关闭keepalived服务;
    
    3)利用第三方监控软件检测是否发生脑裂故障,如果发生则通过监控软件关闭主或者备服务器上的keepalived服务。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二.keepalive

    1.Keepalived介绍

    Keepalived是Linux下一个轻量级别的高可用解决方案,可以实现服务的高可用或热备,用来防止单点故障的问题。

    Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉。

    Keepalived的核心是VRRP协议,支持故障自动切换(Failover), 支持节点健康状态检查(Health Checking)。

    当master主机出现故障时,及时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切换回master节点。

    2.Keepalived体系主要模块及其作用

    Keepalived的主要模块作用
    core模块为Keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析
    vrrp模块是来实现VRRP协议的
    check模块负责健康检查,常见的方式有端口检查及URL检查

    3.keepalived原理

    两台主备机器通过keepalived,虚拟一个IP,也就是VIP(Virtual IP)。

    VIP开始为主机器所有,备份机为空闲状态,同时在两台keepalived之间通信相当于有一条心跳线,通过心跳线互相通信,只要主机器监控(通过脚本)到ngin服务停止,则主机器自己停止keepalived,将VIP交给备份机器处理web请求,直至主机器再次恢复正常,将VIP返还给主机器。

    4.keepalived如何实现故障切换?

    在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP)。

    主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的

    时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

    5.抢占模式和非抢占模式的区别?

    抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。

    非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

    非抢占式俩节点state必须为bakcup,且必须配置nopreempt。

    注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。

    6.Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP?

    Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。

    然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。

    优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。

    三.LVS高可用

    LVS-Master	192.168.82.100
    LVS-Backup	192.168.82.102
    Web-A	192.168.82.103
    Web-B	192.168.82.104
    VIP	192.168.82.188
    Client	192.168.82.200
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.Keepalived构建高可用集群

    前置准备
    
    #关闭防火墙
    systemctl disable firewalld.service --now
    setenforce 0
    
    #调度器安装keepalived
    yum -y install ipvsadm keepalived
    
    #调度器加载ip_vs内核模块
    modprobe ip_vs
    cat /proc/net/ip_vs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    修改配置文件,主服务器
    
    cd /etc/keepalived/
    #备份配置文件
    cp keepalived.conf keepalived.conf.bak
    
    #编辑配置文件
    vim keepalived.conf
    ......
    global_defs {						#定义全局参数
    --10行--修改,邮件服务指向本地
    	smtp_server 127.0.0.1
    --12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
    	router_id LVS_01
    --14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
    	#vrrp_strict
    }
    
    vrrp_instance VI_1 {				#定义VRRP热备实例参数
    --20行--修改,指定热备状态,主为MASTER,备为BACKUP
        state MASTER
    --21行--修改,指定承载vip地址的物理接口
        interface ens33
    --22行--修改,指定虚拟路由器的ID号,每个热备组保持一致	
        virtual_router_id 51
    	#nopreempt		#如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
    --23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
        priority 100
        advert_int 1					#通告间隔秒数(心跳频率)
        authentication {				#定义认证信息,每个热备组保持一致
    		auth_type PASS				#认证类型
    --27行--修改,指定验证密码,主备服务器保持一致
            auth_pass abc123
        }
        virtual_ipaddress {				#指定群集vip地址
            192.168.82.188
        }
    }
    --36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
    virtual_server 192.168.82.188 80 {
        delay_loop 6					#健康检查的间隔时间(秒)
        lb_algo rr						#指定调度算法,轮询(rr)
    --39行--修改,指定群集工作模式,直接路由(DR)
        lb_kind DR
        persistence_timeout 0			#连接保持时间(秒)
        protocol TCP					#应用服务采用的是 TCP协议
    --43行--修改,指定第一个Web节点的地址、端口
        real_server 192.168.82.103 80 {
            weight 1					#节点的权重
    --45行--删除,添加以下健康检查方式		
            TCP_CHECK {
    			connect_port 80			#添加检查的目标端口
    			connect_timeout 3		#添加连接超时(秒)
    			nb_get_retry 3			#添加重试次数
    			delay_before_retry 3	#添加重试间隔
    		}
    	}
    
    	real_server 192.168.82.104 80 {		#添加第二个 Web节点的地址、端口
            weight 1
            TCP_CHECK {
    			connect_port 80
    			connect_timeout 3
    			nb_get_retry 3
    			delay_before_retry 3
    		}
    	}
    ##删除后面多余的配置##
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    修改配置文件,备服务器,和主服务器大致相同

    主备都启动keepalived
    
    systemctl start keepalived
    ip a
    
    • 1
    • 2
    • 3
    • 4

    2.LVS – DR模式构建负载均衡集群

    启动 ipvsadm 服务
    #主DR 192.168.82.100
    ipvsadm-save > /etc/sysconfig/ipvsadm
    systemctl start ipvsadm
    
    ipvsadm -ln
    #如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    #备DR 192.168.82.102
    ipvsadm-save > /etc/sysconfig/ipvsadm
    systemctl start ipvsadm
    
    ipvsadm -ln
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.配置节点服务器,准备测试页面

    systemctl stop firewalld
    setenforce 0
    
    yum -y install httpd
    systemctl start httpd
    
    #建立测试页
    --192.168.80.100---
    echo 'this is test1 web!' > /var/www/html/index.html
    
    --192.168.80.101---
    echo 'this is test2 web!' > /var/www/html/index.html
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.80.188
    NETMASK=255.255.255.255
    
    service network restart 
    ifup lo:0
    ifconfig lo:0
    route add -host 192.168.80.188 dev lo:0 #将VIP和lo:0绑定
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    vim /etc/sysctl.conf
    
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.测试

    浏览器访问VIP地址
    192.168.82.188
    
    • 1
    • 2

    5.关闭主服务器的keepalived服务,测试高可用

    systemctl stop keepalived
    
    然后浏览器访问VIP地址
    192.168.82.188
    
    • 1
    • 2
    • 3
    • 4

    四.nginx高可用

    Nginx-Master	192.168.82.100
    Nginx-Backup	192.168.82.102
    Web-A	192.168.82.103
    Web-B	192.168.82.104
    VIP	192.168.82.188
    Client	192.168.82.200
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.简单的nginx健康检查脚本

    #!/bin/bash
    
    if ! killall -0 nginx
    then
    systemctl stop keepalived
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.主备Keepalived配置

    主
    global_defs {               
       router_id Nginx_01
    }
    vrrp_script check_nginx {
    	script "/etc/keepalived/check_nginx.sh"   #脚本路径和具体使用频率
    	interval 2
        weight -5
        fall 3
        rise 2
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
           192.168.82.188
        }
        track_script {
        	check_nginx   #使用健康检查脚本
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    备
    global_defs {               
       router_id Nginx_02
    }
    vrrp_script check_nginx {
    	script "/etc/keepalived/check_nginx.sh"
    	interval 2
        weight -5
        fall 3
        rise 2
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
          192.168.82.188
        }
        track_script {
        	check_nginx
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    3.Nginx负载均衡配置

    #主备nginx都要配置四层反向代理
    #以主为例
    vim /apps/nginx/conf/nginx.conf
    stream{
    
    upstream phpserver1 {
        server 192.168.82.20:9091;
        server 192.168.82.21:9092;
    }
    
    server {
            listen       80;
            proxy_pass   http://phpserver1;
            }     
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    Topaz Video AI for Mac 视频无损放大软件安装教程【保姆级,操作简单轻松上手】
    《算法通关村—如何基于数组(或者链表)实现栈》
    Linux(Ubuntu)下源码开发整个流程完成版本(下载->编译->模拟器运行)
    Golang 实现 Redis(11): RDB 文件格式
    html页面直接使用elementui Plus时间线 + vue3
    物联网为智慧水资源管理提供的三种创新思路
    计算机网络笔记(湖科大教书匠版本)
    好看又炫酷的网页特效例子收集
    性能测试工具:如何学习JMeter?
    “Redis与Spring整合及缓存优化“
  • 原文地址:https://blog.csdn.net/q1231vev/article/details/133271927