在前面的内容中,我们了解了Nginx反向代理和负载均衡的一些基础概念和应用场景。然而,单一的Nginx服务器可能会面临单点故障的风险,一旦服务器出现问题,整个服务就可能会中断。为了避免这种情况,搭建Nginx高可用集群就显得尤为重要。今天,我们就来一起学习如何通过Keepalived和Nginx搭建一个高可用集群,让你的服务更加稳定可靠。

高可用集群的原理

什么是高可用集群

高可用集群,简单来说,就是通过一组服务器来协同工作,当其中一台服务器出现故障时,其他服务器能够迅速接替它的工作,保证服务的不间断运行。就好比一个团队,即使有成员临时请假,整个团队的工作依然能够正常进行。

Keepalived的作用

Keepalived是一个基于VRRP(虚拟路由冗余协议)的高可用解决方案。它的主要作用是监控服务器的状态,当主服务器出现故障时,能够自动将虚拟IP(VIP)切换到备用服务器上,从而实现服务的无缝切换。举个例子,就像一个自动切换开关,当主电源出现问题时,能够迅速切换到备用电源,保证设备的正常运行。

工作原理

Keepalived通过心跳机制来监控服务器的状态。主服务器和备用服务器之间会定期发送心跳包,如果备用服务器在一定时间内没有收到主服务器的心跳包,就认为主服务器出现了故障,此时备用服务器会将自己提升为主服务器,并接管虚拟IP。同时,Keepalived还会监控Nginx的运行状态,如果Nginx服务停止,Keepalived也会进行相应的切换操作。

Keepalived的配置

安装Keepalived

在开始配置之前,我们需要先安装Keepalived。以CentOS系统为例,可以使用以下命令进行安装:

yum install keepalived -y
主服务器配置

安装完成后,我们需要对主服务器的Keepalived进行配置。编辑/etc/keepalived/keepalived.conf文件,示例配置如下:

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}
virtual_server 192.168.1.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.1.101 80 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f8d06963a18ff99a7acdae
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}
  • state MASTER:表示当前服务器为主服务器。
  • interface eth0:指定监控的网络接口。
  • virtual_router_id 51:虚拟路由ID,主服务器和备用服务器需要保持一致。
  • priority 100:优先级,主服务器的优先级要高于备用服务器。
  • virtual_ipaddress:指定虚拟IP地址。
备用服务器配置

备用服务器的配置与主服务器类似,只是需要将state改为BACKUP,并降低priority的值。示例配置如下:

! Configuration File for keepalived
global_defs {
    router_id LVS_BACKUP
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}
virtual_server 192.168.1.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.1.102 80 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f8d06963a18ff99a7acdae
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}
启动Keepalived服务

配置完成后,我们可以使用以下命令启动Keepalived服务:

systemctl start keepalived
systemctl enable keepalived

搭建Nginx高可用集群的详细步骤

安装Nginx

在主服务器和备用服务器上都需要安装Nginx。以CentOS系统为例,可以使用以下命令进行安装:

yum install nginx -y
配置Nginx

安装完成后,我们需要对Nginx进行简单的配置。编辑/etc/nginx/nginx.conf文件,示例配置如下:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        server_name  _;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}
启动Nginx服务

配置完成后,我们可以使用以下命令启动Nginx服务:

systemctl start nginx
systemctl enable nginx
测试高可用集群

在完成以上配置后,我们可以通过访问虚拟IP地址来测试高可用集群是否正常工作。当主服务器正常运行时,访问虚拟IP地址会显示Nginx的默认页面。此时,我们可以手动停止主服务器的Keepalived服务,模拟主服务器故障的情况:

systemctl stop keepalived

然后再次访问虚拟IP地址,如果仍然能够正常显示页面,说明备用服务器已经成功接管了虚拟IP,高可用集群正常工作。

解决集群切换和故障恢复问题

集群切换问题

在实际使用中,可能会遇到集群切换不及时或者切换失败的问题。这可能是由于网络延迟、心跳包丢失等原因导致的。为了解决这个问题,我们可以适当调整Keepalived的配置参数,如advert_int(心跳间隔时间)和priority(优先级)等。

故障恢复问题

当主服务器故障恢复后,我们希望它能够自动恢复为主服务器。可以通过调整Keepalived的配置,设置nopreempt参数为true,表示不抢占主服务器的位置。示例配置如下:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    nopreempt
    virtual_ipaddress {
        192.168.1.100
    }
}

总结

通过本次实战,我们学习了如何使用Keepalived和Nginx搭建一个高可用集群。掌握了高可用集群的原理、Keepalived的配置方法以及Nginx高可用集群的搭建步骤。通过搭建高可用集群,我们可以有效避免单点故障的风险,提高服务的稳定性和可靠性。

掌握了Nginx高可用集群搭建的内容后,下一节我们将深入学习Nginx的性能优化技巧,进一步完善对本章Nginx反向代理与负载均衡主题的认知。