Nginx 使用 Keepalived 搭建 nginx 高可用

一、环境准备

两台装有 nginx 的 CentOS 虚拟机。

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html

二、原理

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

三、安装

1)安装 keepalived

# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived

  2)配置

使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf

# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
  •  nginx1 上 keepalived.conf:
! Configuration File for keepalived

global_defs {
   router_id lb1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
}
  • global_defs:全局配置标识。
  • router_id:路由器标识,一般不用改,也可以写成每个主机自己的主机名。
  • vrrp_instance:一个 vrrp_instance 就是定义一个虚拟路由器的,VI_1 是实例名称。
  • state:指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备服务器。
  • interface:指定检测网络的网卡接口。就比如下图的 ens33。

  • virtual_router_id:虚拟路由标识,数字形式,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance下,master 和 backup 必须一致。
  • priority:节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。
  • advert_int:用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒。
  • auth_type:预共享密钥认证,同一个虚拟路由器的 keepalived 节点必须一样。
  • auth_pass:设置密钥。
  • virtual_ipaddress:设置虚拟IP地址,可以设置多种形式:
  • 10.0.0.100 不指定网卡,默认为 eth0,注意:不指定/prefix,默认为/32;
  • 10.0.0.101/24 dev eth1 指定 VIP 的网卡;
  • 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的网卡 label。
  • nginx2 上 keepalived.conf:
! Configuration File for keepalived

global_defs {
   router_id lb2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
}

3)启动

# 启动 MASTER 服务器 keepalived 并设置为开机自启动
[root@nginx1 keepalived]# systemctl enable keepalived --now
[root@nginx1 keepalived]# systemctl status keepalived
[root@nginx1 keepalived]# ip a

会发现 MASTER 服务器多出了 192.168.40.80 这个IP。

# 启动 BACKUP 服务器 keepalived 并设置为开机自启动
[root@nginx2 keepalived]# systemctl enable keepalived --now
[root@nginx2 keepalived]# systemctl status keepalived
[root@nginx2 keepalived]# ip a

备份服务器并不持有 VIP。

 4)访问

此时访问 VIP,请求都是被打到 MASTER 上的 nginx。

 5)故障测试

# 停掉 MASTER
[root@nginx1 ~]# init 0

 此时 VIP 飘移到 BACKUP。

6)重启 MASTER

 此时 VIP 又漂移回来了。

四、定制脚本

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。

先重新启动 nginx

[root@nginx1 ~]# systemctl start nginx

1)修改 keepalived.conf

  •  nginx1 上 keepalived.onf:
! Configuration File for keepalived

global_defs {
   router_id lb1
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
    track_script {
        check_nginx
    } 
}
  •  nginx2 上 keepalived.conf:
! Configuration File for keepalived

global_defs {
   router_id lb2
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
    track_script {
        check_nginx
    } 
}

2)重启 keepalived

[root@nginx1 keepalived]# sudo systemctl restart keepalived

[root@nginx2 keepalived]# sudo systemctl restart keepalived

3)停掉 MASTER 

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 VIP 这次终于被迁移到 BACKUP。

五、应用场景

Keepalived + Nginx 的组合有很多应用场景:

在进行NginxKeepalived配置优化以提升高可用集群性能和可靠性时,你应该关注几个关键方面: 参考资源链接:[六服务器部署:nginx+keepalived实现高可用+tomcat与mysql/redis集群](https://wenku.youkuaiyun.com/doc/4gobxjaxd4?spm=1055.2569.3001.10343) 1. **Nginx的优化**: - **调整工作进程数**:根据CPU核心数设置合适的worker_processes,通常为CPU核心数或核心数的倍数。 - **设置worker_connections**:worker_connections乘以worker_processes决定了Nginx能够处理的最大并发连接数,需根据服务器硬件性能进行调整。 - **优化缓存策略**:合理配置proxy_cache_path和proxy_temp_path,使用proxy_cache来缓存静态资源,减少后端服务器负载。 2. **Keepalived的优化**: - **虚拟IP管理**:确保虚拟IP的配置能够快速故障转移,调整vrrp_sync_group和track_interface确保网络状态的准确反映。 - **高可用性检查**:配置健康检查脚本,利用脚本的返回值来判断服务是否健康,并据此进行故障转移。 - **权重调节**:根据服务的实际情况调整各服务实例的优先级(priority)和权重(weight),实现负载均衡的优化。 3. **Tomcat集群优化**: - **连接池配置**:优化Tomcat的数据库连接池设置,如调整initialSize、minIdle、maxActive等参数,提高数据库连接的复用效率。 - **JVM调优**:合理设置JVM参数,如堆内存大小(-Xms和-Xmx),以及垃圾回收策略(-XX:+UseG1GC),减少GC对服务的影响。 4. **MySQL集群优化**: - **查询优化**:分析并优化慢查询,合理建立索引,减少不必要的全表扫描。 - **配置文件调整**:修改`***f`配置文件,调整thread_cache_size、table_open_cache等参数,提升数据库性能。 5. **Redis实例优化**: - **内存管理**:合理配置maxmemory参数限制Redis使用的最大内存,并选择合适的淘汰策略。 - **持久化策略**:根据应用对数据持久化的需求,调整RDB快照和AOF日志的配置,平衡性能与数据安全。 优化配置后,建议进行压力测试,以确保系统能够应对实际的访问负载。通过持续监控系统性能,及时调整参数,可以确保高可用集群稳定运行。 为了深入了解如何进行这些配置优化,推荐阅读《六服务器部署:nginx+keepalived实现高可用+tomcat与mysql/redis集群》。这本书详细介绍了如何在多个服务器上部署和优化高可用性集群,涵盖了从基础部署到性能调优的各个方面,是解决你当前问题的宝贵资源。 参考资源链接:[六服务器部署:nginx+keepalived实现高可用+tomcat与mysql/redis集群](https://wenku.youkuaiyun.com/doc/4gobxjaxd4?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值