美文网首页Linux系统运维
【实战演练】Linux操作系统14-keepalived实现Ng

【实战演练】Linux操作系统14-keepalived实现Ng

作者: 工程师Waiting | 来源:发表于2020-05-23 18:46 被阅读0次

    本文欢迎转载,转载请注明出处和作者。

    理论部分,在之前的文章已经说明过了,详见《【理论研究】业务系统高可用及负载均衡》。

    上一篇已经讲述通过单台Nginx服务器对2/多台Apache服务器做负载均衡,但是Nginx本身却存在单点故障隐患。

    如前面理论所述,解决上述问题,本篇介绍通过安装keepalive,对Nginx服务器做高可用HA。

    1、Keepalived简介

    Linux有很多开源的HA软件,keepalived是其中的一款,用keepalived可以用来解决很多应用程序的高可用问题。(如本篇的Nginx,以及后面对LVS、Mysql都可以用Keepalived来做高可用配置)

    2、LVS、Keepalived、Nginx区别

    LVS是用来做4层的负载均衡的,只能通过IP五元组进行流量分发。

    Keepalived是用来做HA的,可以对任意的程序(需要写脚本)进行检测,然后对该软件做HA,例如可以对LVS、Nginx、Mysql等来做HA。

    Keepalived内嵌LVS模块的,提供VIP的功能。所以如果用了Keepalived,就不需要额外做LVS的Director配置了,但是Realserver的配置还是需要。

    Nginx,是可以做7层的负载均衡。LVS只能对IP五元组进行流量分发,而Nginx可以做到应用级别,例如动静分离(图片、视频)等。

    3、安装Keepalived

    3.1 安装

    yum install keepalived -y
    

    3.2 修改配置文件

    cd /etc/keepalived
    rm keepalived.conf
    #原有的配置文件
    vi keepalived.conf
    #创建新的配置文件
    

    注意配置文件只有一些关键参数必须修改,其他都是默认的。

    Master(主)服务器配置

    global_defs {
        notification_email {
            xxx@xxx.com
        }
        notification_email_from sns-lvs@gmail.com
        smtp_server xxx.xxx.xxx.xxx
        smtp_connection_timeout 30
        router_id LVS_MASTER         # 设置lvs的id,在一个网络应该是唯一的
    }
    
    vrrp_script chk_http_port {
        script "/usr/local/src/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行
        interval 2                          #(检测脚本执行的间隔,单位是秒)
        weight 2
    }
    
    vrrp_instance VI_1 {
        state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
        interface eth1            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),注意如果网卡是eth1,要对应修改。
        virtual_router_id 66        # 虚拟路由编号,主从要一直
        priority 100            # 优先级,数值越大,获取处理请求的优先级越高
        advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
    track_script {
        chk_http_port            #(调用检测脚本)
        }
    
        virtual_ipaddress {
            10.1.30.31        # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    

    注意上面配置中vrrp_script后面定义了一个叫chk_http_port的脚本,而真正脚本实际的路径是/usr/local/src/下面的check_nginx_pid.sh。这个是要后面实际添加的,也就是需要写一个脚本检测nginx服务运行状况。

    下面的tracks_cript设置检测脚本为上面定义的chk_http_port,keepalived启动后会自动按照设置好的时间间隔,周期性调用检测脚本。

    Slave(从)服务器配置

    global_defs {
        notification_email {
            xxx@xxx.com
        }
        notification_email_from sns-lvs@gmail.com
        smtp_server xxx.xxx.xxx.xxx
        smtp_connection_timeout 30
        router_id LVS_BACKUP         # 设置lvs的id,在一个网络应该是唯一的
    }
    
    vrrp_script chk_http_port {
        script "/usr/local/src/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行
        interval 2                          #(检测脚本执行的间隔,单位是秒)
        weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth1            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),注意如果网卡是eth1,要对应修改。
    virtual_router_id 66        # 虚拟路由编号,主从要一致
        priority 99            # 优先级,数值越大,获取处理请求的优先级越高
        advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
    track_script {
        chk_http_port            #(调用检测脚本)
        }
    
        virtual_ipaddress {
            10.1.30.31        # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    

    3.3 编写检测脚本

    编写nginx检测脚本,注意路径与名称要和上面keepalivce.conf中的保持一致。

    vi /usr/local/src/check_nginx_pid.sh
    # vi /usr/local/src/check_nginx_pid.sh
    #!/bin/bash
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then
          /usr/local/nginx/sbin/nginx                #重启nginx
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
                  killall keepalived
          fi
    fi
    

    增加脚本执行权限

    chmod +x /usr/local/src/check_nginx_pid.sh
    

    3.4 启动keepalived服务

    service keepalived start
    

    3.4 测试

    3.4.1 手动停止Nginx

    启动进程后,在30.40输入ip a s查看虚拟IP是否成功挂载。

    ping 虚拟IP测试

    连续通过VIP(10.1.30.31)访问网站,不断刷新测试,发现访问流量已经在两个Apache01与Apache02之间分发。

    然后对Nginx主机手动停止Nginx服务。

    service nginx stop
    

    然后继续通过VIP(10.1.30.31)访问网站,发现网站依然能够正常访问。

    通过ip a s查看,发现30.31还是在nginx01上面。

    原因是这样的:我们设置了一个脚本(check_nginx_pid.sh),利用keepalived周期性自动运行,脚本检测nginx进程是否存活,如果进程异常退出/没有运行,脚本会重新启动nginx进程。

    因此,上面手动停止nginx服务,keepalived并不会将VIP从主Nginx服务器切换到备Nginx服务器,而是通过脚本重启将nginx启动。因此通过VIP访问网站,由于3秒内nginx已经重启启动了,业务仍然能够正常访问。

    3.4.2 手动停止keepalived

    主Nginx服务器手动停止Keepalived

    service keepalived stop
    

    通过ip a s发现VIP已经自动切换到备Nginx服务器了。

    通过VIP访问网站,发现业务正常访问。

    当前,2台Nginx服务器通过keepalived以及nginx检测脚本,实现了HA。但是用户通过VIP访问业务的时候,正常情况下只有1台Nginx负载用户的访问。

    为了让2台Nginx服务器都能承载业务负载,下一篇通过keeaplived自带的LVS模块功能,实现2台Nginx服务器的负载均衡。

    相关文章

      网友评论

        本文标题:【实战演练】Linux操作系统14-keepalived实现Ng

        本文链接:https://www.haomeiwen.com/subject/gwlnohtx.html