【详解】Nginx+keepalived双机热备
Nginx + keepalived 双机热备技术实践
前言
在互联网的高可用性服务中,单一的服务节点往往无法满足业务对稳定性和可用性的要求。双机热备是一种常见的高可用性解决方案,它通过两台服务器同时运行相同的服务,并使用 Keepalived 来实现故障转移,确保在主服务器发生故障时,备服务器能够立即接管服务,从而保证服务的连续性。本文将详细介绍如何在 Nginx 环境中部署双机热备方案。
环境准备
- 两台 Linux 服务器(本文以 CentOS 7 为例)
- Nginx 服务器软件
- Keepalived 软件
- 一个可用的 IPv4 地址段(本文假设为 192.168.1.0/24)
- 两个不同的虚拟 IP 地址(VIP,本文假设为 192.168.1.100 和 192.168.1.101)
步骤概览
- 在两台服务器上安装 Nginx 和 Keepalived。
- 配置 Nginx 以提供相同的服务。
- 配置 Keepalived 以实现故障转移。
- 测试双机热备功能。
安装 Nginx 和 Keepalived
# 安装 Nginx
yum install nginx -y
# 启动 Nginx 并设置开机自启
systemctl start nginx
systemctl enable nginx
# 安装 Keepalived
yum install keepalived -y
配置 Nginx
在两台服务器上配置相同的 Nginx 服务,例如,提供一个简单的 HTTP 服务:
# nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
}
}
确保两台服务器的 Nginx 配置文件完全相同,包括文件路径和配置项。
配置 Keepalived
Keepalived 通过 VRRP(虚拟路由器冗余协议)来实现故障转移。下面是 Keepalived 的配置示例:
# keepalived.conf
! Configuration File for keepalived
# 定义两个虚拟路由器,对应两个 VIP
vrrp_instance VI_1 {
state MASTER # 主服务器设置为 MASTER
interface eth0 # 网卡接口
virtual_router_id 51 # 虚拟路由器 ID,两台服务器必须相同
priority 100 # 优先级,主服务器的优先级应高于备服务器
advert_int 1 # 通告间隔,单位秒
virtual_ipaddress {
192.168.1.100 # 第一个 VIP
}
}
vrrp_instance VI_2 {
state BACKUP # 备服务器设置为 BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
virtual_ipaddress {
192.168.1.101 # 第二个 VIP
}
}
在主服务器上,将 state MASTER
设置为 state BACKUP
,并将 priority
值降低以表明它是备服务器。
启动 Keepalived
# 启动 Keepalived 并设置开机自启
systemctl start keepalived
systemctl enable keepalived
测试双机热备
在测试时,你可以通过在主服务器的 Keepalived 配置中手动设置 state
为 BACKUP
来模拟故障转移。如果一切配置正确,当主服务器发生故障时,备服务器应该能够接管 VIP,并提供服务。
总结
通过 Nginx 和 Keepalived 的结合使用,我们可以在实际的网络服务和负载均衡场景中,Nginx 常被用作 HTTP 和反向代理服务器,而 keepalived 则用于实现高可用性(HA)的解决方案。以下是一个简单的示例,展示了如何在 Nginx 和 keepalived 的配合下实现双机热备。
首先,你需要安装 Nginx 和 keepalived 服务。这个示例假设你已经有了两个服务器,我们称之为 Server A 和 Server B,它们都运行着 Nginx,并且你想要通过 keepalived 来实现它们的双机热备。
Nginx 配置
Nginx 的配置非常简单,你只需要确保 Nginx 在两个服务器上正常运行即可。以下是 Nginx 配置的一个基本示例:
http {
server {
listen 80;
location / {
# 这里是你的应用逻辑
# 例如,返回一个简单的 "Hello World"
return 200 'Hello World';
}
}
}
keepalived 配置
keepalived 的配置稍微复杂一些,你需要在两个服务器上配置不同的角色(vrrp_instance 中的 master 或 backup),并且确保它们能够通过 VIP(Virtual IP Address)进行通信。以下是一个简单的 keepalived 配置示例:
Server A 的 keepalived 配置(作为 master)
# 确保在两个服务器上的配置文件路径相同
[root@server-a ~]# vim /etc/keepalived/keepalived.conf
# 配置文件内容
! Configuration File for keepalived
# 定义一个虚拟路由器ID(VRID),例如10
vrrp_instance VI_1 {
state MASTER # 设置为master
interface eth0 # 指定接口
virtual_router_id 10 # 虚拟路由器ID
priority 200 # 优先级,决定了哪个节点成为主节点
advert_int 1 # 通告间隔,单位秒
# 虚拟IP地址,这是客户端访问的IP
virtual_ipaddress {
192.168.1.100 # 假设这是你的VIP
}
}
# 启动 keepalived
systemctl start keepalived
Server B 的 keepalived 配置(作为 backup)
# 确保在两个服务器上的配置文件路径相同
[root@server-b ~]# vim /etc/keepalived/keepalived.conf
# 配置文件内容
! Configuration File for keepalived
# 定义一个虚拟路由器ID(VRID),例如10
vrrp_instance VI_1 {
state BACKUP # 设置为backup
interface eth0 # 指定接口
virtual_router_id 10 # 虚拟路由器ID
priority 100 # 优先级,低于 Server A 的配置
advert_int 1 # 通告间隔,单位秒
# 虚拟IP地址,这是客户端访问的IP
virtual_ipaddress {
192.168.1.100 # 假设这是你的VIP
}
}
# 启动 keepalived
systemctl start keepalived
配置说明
- 在 keepalived 中,master 节点会一直持有 VIP,直到它不可用或者降级为 backup 节点。
- backup 节点会监控 master 节点,如果 master 节点不可用,backup 节点会接管 VIP 并成为新的 master。
- priority 值决定了节点的优先级,值越高,成为 master 的可能性越大。
- virtual_ipaddress 段定义了 VIP,这是客户端实际访问的 IP 地址。
注意事项
- 确保两台服务器的 keepalived.conf 文件同步更新,特别是在修改配置后。
- 确保 Nginx 在两个服务器上都是正常运行的,并且配置相同,以便在 failover 时服务可以无缝切换。
- 定期测试 failover,以确保 keepalived 配置正确,并且能够在需要时顺利切换。
请注意,这只是一个基本的示例,实际的部署可能需要根据你的网络环境、负载均衡需求和安全要求进行调整。在生产环境中,你可能还需要考虑配置健康检查、安全认证、日志记录等因素。在Nginx+Keepalived的双机热备架构中,您需要配置两个Nginx服务器,以及一个Keepalived实例来管理它们。以下是一个简化的配置示例,包括Nginx配置和Keepalived配置。
Nginx配置
Nginx的配置通常包括以下几个部分:
- 主配置文件:nginx.conf,它包含所有Nginx服务器的全局配置。
- 虚拟主机配置文件:通常位于conf.d或sites-available目录中,每个文件对应一个虚拟主机。
下面是一个简单的Nginx虚拟主机配置示例:
# 假设这个配置文件位于/etc/nginx/conf.d/example.com.conf
upstream backend {
server 192.168.1.100:80; # 第一个Nginx服务器的地址和端口
server 192.168.1.101:80; # 第二个Nginx服务器的地址和端口
# 可以添加更多的服务器到这个列表中
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $http_host;
# 其他代理设置...
}
}
在这个配置中,我们定义了一个名为backend
的上游服务器组,其中包括两个Nginx服务器。然后我们定义了一个监听在80端口的虚拟主机,它将所有的请求代理到backend
服务器组。
Keepalived配置
Keepalived是一个基于VRRP(虚拟路由器冗余协议)的高可用性解决方案。在Nginx+Keepalived的双机热备中,Keepalived用于管理Nginx服务器的健康状态,并确保只有一个Nginx服务器作为主服务器接受客户端请求,而另一个作为备用服务器等待切换。
下面是一个简单的Keepalived配置示例:
# 假设这个配置文件位于/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER; # 设置当前节点为Master
virtual_router_id 51;
priority 101; # 设置优先级,高于备用节点
advert_int 1;
virtual_ipaddress {
192.168.1.10; # 虚拟IP地址,即客户端访问的IP
}
}
在这个配置中,我们定义了一个名为VI_1
的VRRP实例,它将当前节点配置为Master。我们设置了一个虚拟IP地址192.168.1.10
,这是客户端访问的IP地址,实际上是分配给Master节点的。
配置文件的位置和权限
确保Nginx配置文件位于Nginx配置目录下,例如/etc/nginx/conf.d/
,并且拥有正确的权限(通常是root:root
)。Keepalived配置文件通常位于/etc/keepalived/keepalived.conf
,同样需要有正确的权限。
启动和监控
配置完成后,您需要重新启动Nginx和Keepalived服务。使用以下命令来启动和停止服务:
systemctl start nginx
systemctl start keepalived
systemctl stop nginx
systemctl stop keepalived
systemctl status nginx
systemctl status keepalived
使用systemctl status
命令可以检查服务的运行状态。
健康检查和故障转移
Keepalived通过发送VRRP通告来确定节点的健康状态。如果Master节点出现故障,Keepalived会自动将备用节点提升为Master。您可以在Keepalived配置中添加健康检查脚本,以确保只有健康的Nginx服务器才能成为Master。
# 假设这个配置文件位于/etc/keepalived/keepalived.conf
...
check_script chk_nginx {
script "killall -0 nginx || exit 1";
interval 2;
weight 2;
}
vrrp_instance VI_1 {
...
track_script {
chk_nginx;
}
}
在这个例子中,我们定义了一个名为chk_nginx
的健康检查脚本,它通过
- 点赞
- 收藏
- 关注作者
评论(0)