美文网首页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