KeepAlived + Nginx 高可用负载均衡部署

308 阅读5分钟

前言

最近这段时间在看分布式以及高可用集群架构方式,也在部署高可用的集群,在此总结一下这些经验。

总所周知,在公司的业务开始发展的时候我们的承受的流量也会相应增加,从一开始的一台nginx服务器作为代理请求转发已经不足够应付我们日常的流量了,因此我们需要去扛更大的流量。

虽然有人会讲,现在都上云产品了,哪还需要自己搭建服务器集群,或者loadbalance但还是那句,发展肯定是让技术越来越容易上手,精通难,也许你会点几个按钮就能设置好整个集群的入口,当别人一问到其原理的时候该怎么办?

Keepalived

前提,为了VRRP协议能够成功绑定VIP,
建议大家先关闭掉iptables服务

什么是keepalived? keepalived 是一款服务器健康检测工具,如果有服务器死机/故障等问题的时候需要将此机器从整个集群中踢出出去, 而当服务器恢复的时候 还需要把服务器加回集群中。这就是keepalived的主要功能, 把这些工作全部交由机器完成。

关于负载均衡的4层以及7层概念 就不在此简述了。因为这一次主要还是总结部署方式。

对于keepalived有2种方案主从模式 主主模式 两者的区别也就是一前者备用机不工作,后者备用机一起工作。

在配置KeepAlived之前我们先准备2台linux虚拟机作例子

  • 192.168.1.100 master
  • 192.168.1.101 salve

配置keepalived-主从模式

首先我们需要先安装一下keepalived, 在这边我就用最简单的方式去安装了,编译安装的话大家可以参考其他的方式。只不过我贪方便

yum install keepalived

记得两台主机都需要安装一下,然后进入到配置文件中

vim /etc/keepalived/keepalive.conf

进入到配置后你会看到很多配置,在这边我有很多功能我都不需要用到 比如健康检测到通知邮件等。因此这边就skip掉这part,我们可以把那些内容都删掉保留一下这些。

global_defs {
    # 路由id, 當前安裝keepalived節點主機的標識符
   router_id keep_100
}

# 計算機節點
vrrp_instance VI_1 {
    # 狀態,當前的
    state MASTER
    # 當前實例綁定的網卡
    interface eth0
    # 需要保證主備節點一致
    virtual_router_id 51
    # 優先級/權重
    # 誰的優先級高 當master掛了以後,就能成為master
    # 當前為master節點 因此為最高
    priority 100
    # 主備之間同步檢查時間間隔 
    advert_int 1
    # 認證授權的密碼,防止非法節點的進入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # VIP
        192.168.1.161
    }
}

这样就基本上完成了主节点的配置,接下来配置一下salve的配置,基本上都一样

global_defs {
    # 路由id, 當前安裝keepalived節點主機的標識符
   router_id keep_101
}

# 計算機節點
vrrp_instance VI_1 {
    # 这里需要为BACKUP
    state BACKUP
    # 當前實例綁定的網卡
    interface eth0
    # 需要保證主備節點一致
    virtual_router_id 51
    # 優先級/權重
    # 这边设置成50 因为是salve
    priority 50
    # 主備之間同步檢查時間間隔 
    advert_int 1
    # 認證授權的密碼,防止非法節點的進入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # VIP
        192.168.1.161
    }
}

完成以后别忘记重启

systemctl restart keepalived.service

然后我们在master节点上面输入

ip addr

此时我们应该可以看到我们配置的网卡上会把 192.168.1.161 绑定在此网卡上了,很简单吧?

配置服务心跳检测

接下来我们需要配置一下检测 nginx 服务器状态,写一个简单的脚本帮我们检测一下nginx

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判斷nginx是否宕機了,並嘗試重啟
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 3
    # 等待一下,再次檢查,如果沒有啟動成功 就關閉 keepalive 讓它啟動備用機器
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

我们把它保存在 /etc/keepalived/check_nginx_alive.sh 保存完毕后,记得要给该文件设置可执行权限

chmod +x check_nginx_alive.sh

然后我们再回到master节点上的keepalived.conf中配置一下这个脚本定时执行,打开配置文件在内添加

// 添加腳本到master keepalive.conf
vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive.sh"
    interval 2 // 每兩秒執行一次
    weight 10 #如果腳本運行成功,則當前節點的權重 +10

}

再把该脚本配置到我们的instance当中

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 添加心跳检测脚本
    track_script {
        # 这里的名字需要根上方的名字应对
        check_nginx_alive
    }
    virtual_ipaddress {
        192.168.1.161
    }
}

我们配置完成以后也可以试试,把master节点都keepalived stop掉,然后再回到salve的机器上面 ip addr一下你会发现192.168.1.161这个ip地址被绑定到了salve机器的网卡上,这个也就是大家声称的 IP漂移

这样就完成了主从模式的配置。但是你会发现就是所有的请求都只会打在master节点上,salve就完全是个备用机。我们怎么能允许这么浪费呢?因此这个备用机也要加入进来一起服务用户才可以啊

配置keepalived-主主模式(双主热备)

配置完主从模式后,我们再来配置双主模式就非常简单了。就字面上的意思双主模式其实就是两台机器,同时为master,又同时为salve这是什么意思呢? 我们来配置一下你就很快明白了

我们先打开master节点的配置文件, 在下方加入备用机的配置文件

# 这里的instance 记得改成 vi_2
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    # 改成52
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # VIP
        192.168.1.161
    }
}

然后我们再去salve节点配置一个master的conf

# 修改一下 instance名字
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    # 改成52
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # VIP
        192.168.1.161
    }
}

这样就配置完了。 其实很简单 也就是在master上配置salve,在salve上配置master这样就成为了双向节点。互为master,并且也成功的把salve机器也应用了起来。

那么其实现在不会单独的去使用keepalived通常都是搭配lvs一起使用,容我下次再出一片单独讲解 keepalived+LVS的总结。