高可用集群Keepalived + nginx

时间:2022-12-19 11:04:22
一、相关概念及原理
      1、高可用集群,High Availability Cluster,简称HA Cluster,简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统 就是集群的节点(node)。高可用性集群(HA cluster)是指如单系统一样地运行并支持(计算机)持续正常运行的一个主机群。高可用集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损 失。如果某个节点失效,它的备援节点将在几 秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机。高可用集群软件的主要作用就是实现故障检查和业务切换的自动化。总而言之,高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。
      2、Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
     3、VRRP  Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用
      4、Keepalived和其他高可用组件
Corosync、Keepalived 的区别
 Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync区别较大,Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总而言之,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。
一般用corosync,因为corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在以后的开发当中更倾向于corosync,所以现在corosync+pacemaker是最佳组合。


二、服务安装及配置
       1、安装nginx及配置负载均衡(两台虚拟机都需要安装及配置)
        
编译安装 : ./configure  --prefix=/usr/local/lnmp/nginx/  --with-http_ssl_module --with-http_stub_status_module  --with-threads  --with-file-aio
         make & make install 
         并做软链接方便后续操作 
         nginx  启动nginx  nginx -t 检查有无语法错误 nginx -s reload  重启nginx

        

       2、安装keepalived(两台虚拟机都需要安装及配置)

tar zxf  keepalived-1.2.22.tar.gz   -C /mnt
   cd  /mnt/keepalived-1.2.
   ./configure --prefix=/usr/local/lnmp/keepalived
    make & make install
    制作软链接 ln /usr/local/lnmp/keepalived/sbin/keepalived   /usr/sbin/keepalived
    启动服务  keepalived
    keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
     编辑配置文件:
vim /usr/local/lnmp/keepalived/etc/keepalived/keepalved.conf

! Configuration File for keepalived

vrrp_script chk_nginx {
#    script "killall -0 nginx"
    script "/mnt/check_nginx.sh"
    interval 2
    weight -5
    fall 3  
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 172.25.254.1
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.2
    }
    track_script {
       chk_nginx
    }
}

3、nginx
监控 脚本
 该脚本检测ngnix的运行状态,并在nginx进程不存在时尝试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。

vim /mnt/check_nginx.sh :

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/lnmp/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

  三、测试

172.25.254.1 & 172.25.254.2 虚拟机上的nginx & keepalived 都启动 此时虚拟IP在 172.25.254.1上

server1:
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7a:e2:08 brd ff:ff:ff:ff:ff:ff
    inet 172.25.254.1/24 brd 172.25.254.255 scope global eth0
    inet 172.25.254.12/24 scope global secondary eth0
    inet6 fe80::5054:ff:fee0:4919/64 scope link
       valid_lft forever preferred_lft forever                                     

server2:                                                             
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:c9:c8:0a brd ff:ff:ff:ff:ff:ff
    inet 172.25.254.2/24 brd 172.25.254.255 scope global eth0
    inet6 fe80::5054:ff:fe23:a232/64 scope link
       valid_lft forever preferred_lft forever 

当关闭172.25.254.1的nginx 时 虚拟IP会转移到172.25.254.2上