HAProxy + Keepalived + Nginx 高可用负载均衡系统

news2025/5/13 18:14:54

1. 项目背景

在现代Web应用中,高可用性和负载均衡是两个至关重要的需求。本项目旨在通过HAProxy实现流量分发,通过Keepalived实现高可用性,通过Nginx提供后端服务。该架构能够确保在单点故障的情况下,系统仍然能够正常运行,并且能够均衡地分配流量到多个后端服务器。

2. 环境准备

2.1 服务器配置

角色IP 地址服务器名称功能描述
HAProxy 主节点192.168.65.131haproxy-master负载均衡器(主)
HAProxy 备节点192.168.65.132haproxy-backup负载均衡器(备)
后端 Web 服务器 1192.168.65.133webserver1提供 Web 服务
后端 Web 服务器 2192.168.65.134webserver2提供 Web 服务
虚拟 IP192.168.65.100-用于 Keepalived 高可用

2.2 软件需求

服务器角色需要安装的软件
HAProxy 主节点HAProxy, Keepalived
HAProxy 备节点HAProxy, Keepalived
后端 Web 服务器Nginx

3. 服务器网络环境配置

3.1 设置静态IP地址

为确保服务器在重启后仍能保持固定的网络配置,在rhel9系统中,需要为每台服务器设置静态IP地址。编辑 /etc/NetworkManager/system-connections/ens160.nmconnection文件:

[ipv4]
address1=192.168.65.131/24,192.168.65.2
dns=8.8.8.8;
method=manual

3.2 配置主机名和主机映射

为便于在集群环境中快速识别和管理各服务器,需要为每台服务器配置主机名。

HAProxy 主节点(192.168.65.131)
  1. 设置主机名

    sudo hostnamectl set-hostname haproxy-master
  2. 更新 /etc/hosts 文件

    sudo vi /etc/hosts

    添加以下内容:

    127.0.0.1   haproxy-master
    192.168.65.131 haproxy-master
    192.168.65.132 haproxy-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
HAProxy 备节点(192.168.65.132)
  1. 设置主机名

    sudo hostnamectl set-hostname haproxy-backup
  2. 更新 /etc/hosts 文件

    sudo vi /etc/hosts

    添加以下内容:

    127.0.0.1   haproxy-backup
    192.168.65.131 haproxy-master
    192.168.65.132 haproxy-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
后端 Web 服务器 1(192.168.65.133)
  1. 设置主机名

    sudo hostnamectl set-hostname webserver1
  2. 更新 /etc/hosts 文件

    sudo vi /etc/hosts

    添加以下内容:

    127.0.0.1   webserver1
    192.168.65.131 haproxy-master
    192.168.65.132 haproxy-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
后端 Web 服务器 2(192.168.65.134)
  1. 设置主机名

    sudo hostnamectl set-hostname webserver2
  2. 更新 /etc/hosts 文件

    sudo vi /etc/hosts

    添加以下内容:

    127.0.0.1   webserver2
    192.168.65.131 haproxy-master
    192.168.65.132 haproxy-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2

3.3 永久关闭selinux 

sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

重启并查看

reboot
getenforce

3.4 配置防火墙规则

为保障网络安全,需要优化防火墙规则,开启必要的服务端口,同时关闭不必要的端口。使用 firewalld 配置防火墙:

# 开启HAProxy的80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

# 开启Keepalived的VRRP端口
firewall-cmd --zone=public --add-port=112/udp --permanent
firewall-cmd --reload

3.5 实现SSH免密登录

为提高运维效率并减少人为错误,需要实现SSH免密登录。生成SSH密钥对,并将公钥复制到所有服务器:

# 在主节点生成密钥对
ssh-keygen -t rsa

# 将公钥复制到其他服务器
ssh-copy-id haproxy-backup
ssh-copy-id webserver1
ssh-copy-id webserver2

4. 软件安装与配置

4.1 HAProxy 主节点和备节点配置

4.1.1 安装 HAProxy 和 Keepalived

在HAProxy主节点和备节点上安装必要的软件:

yum install -y haproxy keepalived
4.1.2 配置 HAProxy

编辑 /etc/haproxy/haproxy.cfg 文件,配置HAProxy以实现流量分发到后端Web服务器:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance roundrobin
    server web1 192.168.65.133:80 check
    server web2 192.168.65.134:80 check
4.1.3 配置 Keepalived

编辑 /etc/keepalived/keepalived.conf 文件,配置Keepalived以实现主备切换,确保高可用性:

主节点(192.168.65.131)

global_defs {
     router_id SERVER1
}
vrrp_instance VI_1 {
      state MASTER
      interface ens160
      virtual_router_id 51
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1234
      }
      virtual_ipaddress {
          192.168.65.100
      }
}

备节点(192.168.65.132)

global_defs {
     router_id SERVER2
}
vrrp_instance VI_1 {
      state BACKUP
      interface ens160
      virtual_router_id 51
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1234
      }
      virtual_ipaddress {
          192.168.65.100
      }
}
4.1.4 启动服务

启动并启用HAProxy和Keepalived服务,确保配置生效:

sudo systemctl enable haproxy
sudo systemctl start haproxy
sudo systemctl enable keepalived
sudo systemctl start keepalived

 keepalived主节点(192.168.65.131):成功获取vip:192.168.100 

 keepalived备节点(192.168.65.132):没有获取vip,正常

4.2 后端 Web 服务器配置

4.2.1 安装 Nginx

在后端Web服务器上安装Nginx,为用户提供Web服务:

sudo yum install -y nginx
4.2.2 配置 Nginx

编辑 /etc/nginx/conf.d/test1.conf/etc/nginx/conf.d/test2.conf 文件,配置Nginx以响应HTTP请求,并返回服务器标识信息:

Web服务器1(192.168.65.133)

server {
    listen 80;
    location / {
        return 200 "Welcome to Web Server webserver1\n";
    }
}

Web服务器2(192.168.65.134)

server {
    listen 80;
    location / {
        return 200 "Welcome to Web Server webserver2\n";
    }
}
4.2.3 启动 Nginx并测试

启动并启用Nginx服务,确保其正常运行:

sudo systemctl enable nginx
sudo systemctl start nginx

5. 测试与验证

5.1 验证 HAProxy 和 Keepalived

5.1.1 正常访问测试

验证客户端是否能够通过虚拟IP正常访问后端服务器:

curl 192.168.65.100

预期结果: 返回 Welcome to Web Server webserver1 或 Welcome to Web Server webserver2。

5.1.2 主节点故障模拟

验证在主节点故障时,备节点是否能够正常接管虚拟IP:

  1. 在主节点(192.168.65.131)上停止Keepalived服务

    systemctl stop keepalived
  2. 在客户端再次访问虚拟IP,观察响应内容。

预期结果: 备节点接管虚拟IP,客户端仍能正常访问后端服务器。

主节点(192.168.65.131)失去vip 

 备用节点(192.168.65.132)成功获取vip 

5.2 验证 Nginx

验证后端服务器的Nginx服务是否正常运行:

curl http://192.168.65.133
curl http://192.168.65.134

预期结果: 分别返回 Welcome to Web Server webserver1和 Welcome to Web Server webserver2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.12 note

Leetcode 图 邻接矩阵的dfs遍历 class Solution { private: vector<vector<int>> paths; vector<int> path; void dfs(vector<vector<int>>& graph, int node) { // 到n - 1结点了保存 if (node graph.size() - 1)…

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…

OBS studio 减少音频中的杂音(噪音)

1. 在混音器中关闭除 麦克风 之外的所有的音频输入设备 2.在滤镜中增加“噪声抑制”和“噪声门限”

智能手表 MCU 任务调度图

智能手表 MCU 任务调度图 处理器平台&#xff1a;ARM Cortex-M33 系统架构&#xff1a;事件驱动 多任务 RTOS RTOS&#xff1a;FreeRTOS&#xff08;或同类实时内核&#xff09; 一、任务调度概览 任务名称优先级周期性功能描述App_MainTask中否主循环调度器&#xff0c;系统…

S7-1500——零基础入门2、PLC的硬件架构

PLC的硬件架构 一,西门子PLC概述二,CPU介绍三,数字量模块介绍四,模拟量模块介绍五,其他模块介绍一,西门子PLC概述 本节主要内容 西门子PLC硬件架构,主要内容包括PLC概述、组成、功能及S7-1500 demo的组成与安装演示。 介绍了PLC的定义、功能、应用场合,以及与继电器控…

【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器

在微服务架构日益普及的当下&#xff0c;对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中&#xff0c;如何使用 Skywalking 实现对系统的性能监控和分布式追踪&#xff0c;以及在这过程中的一些关键技术点和实践经验。 1 分布式链路追踪概述 在微服…

利用“Flower”实现联邦机器学习的实战指南

一个很尴尬的现状就是我们用于训练 AI 模型的数据快要用完了。所以我们在大量的使用合成数据&#xff01; 据估计&#xff0c;目前公开可用的高质量训练标记大约有 40 万亿到 90 万亿个&#xff0c;其中流行的 FineWeb 数据集包含 15 万亿个标记&#xff0c;仅限于英语。 作为…

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性&#xff1f; 幂等性是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;无论同一操作执行多少次&#xff0c;这些请求…

软件设计师-错题笔记-系统开发与运行

1. 解析&#xff1a; A&#xff1a;模块是结构图的基本成分之一&#xff0c;用矩形表示 B&#xff1a;调用表示模块之间的调用关系&#xff0c;通过箭头等符号在结构图中体现 C&#xff1a;数据用于表示模块之间的传递的信息&#xff0c;在结构图中会涉及数据的流向等表示 …

C#简易Modbus从站仿真器

C#使用NModbus库&#xff0c;编写从站仿真器&#xff0c;支持Modbus TCP访问&#xff0c;支持多个从站地址和动态启用/停用从站&#xff08;模拟离线&#xff09;&#xff0c;支持数据变化&#xff0c;可以很方便实现&#xff0c;最终效果如图所示。 项目采用.net framework 4.…

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 &#xff08;1&#xff09;候选框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取与微调 2.1 特征提取 2.2 网络微调&#xff08;Fine-tuning&#xff09; …

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…

一键解锁嵌入式UI开发——LVGL的“万能配方”

面对碎片化的嵌入式硬件生态&#xff0c;LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异&#xff0c;配合丰富的预置控件&#xff08;如按钮、图表、滑动条&#xff09;与动态渲染引擎&#xff0c;让工程师无需深入图形学原理&#xff0c;效率提升肉眼可见。 L…

智慧城市综合运营管理系统Axure原型

这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面&#xff0c;通过统一标准接入各类业务系统&#xff0c;实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心&#xff0c;为其提供一个直观、便捷、高效的协同服务平台…

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…

可视化图解算法37:序列化二叉树-II

1. 题目 描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树&#xff0c;不对序列化之后的字符串进行约束&#xff0c;但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指&#xff1a;把一棵二叉树按照某种遍…

C++GO语言微服务和服务发现②

01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令&#xff1a;micro new --type srv test66 框架默认自带服务发现&#xff1a;mdns。 使用consul服务发现&#xff1a; 1. 初始consul服务发现&…

【Web前端开发】CSS基础

2.CSS 2.1CSS概念 CSS是一组样式设置的规则&#xff0c;称为层叠样式表&#xff0c;用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制&#xff0c;实现美化页面的效果&#xff0c;也能够做到页面的样式和结构分离。 2.2基本语法 通常都是&#xff…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

一、工具简介 git commit --amend是Git版本控制系统的核心补救命令&#xff0c;主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录&#xff0c;而是通过覆盖原提交实现版本历史的整洁性&#xff0c;特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…

PTA:jmu-ds-最短路径

给定一个有向图&#xff0c;规定源点为0&#xff0c;求源点0到其他顶点最短路径。###你要实现的 函数接口定义&#xff1a; void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例&#xff1a; #include <stdio.h> #include <iostream> …