1. 总结负载均衡常见的算法

  • 轮询 (Round Robin):按顺序将请求依次分配给后端服务器,适合服务器性能相近的场景。

  • 加权轮询 (Weighted Round Robin):在轮询的基础上,根据服务器的权重分配请求。

  • 随机 (Random):随机选择一台服务器处理请求,简单但不考虑负载。

  • 加权随机 (Weighted Random):在随机的基础上,根据服务器的权重进行随机选择。

  • 源IP哈希 (Source IP Hash):根据请求的源IP地址进行哈希计算,将请求分配给特定的服务器。
    最少连接算法(Least Connections)

    最少连接算法是一种动态调整的负载均衡算法。其思路是尽可能将请求分配到当前空闲连接数最少的后端服务器,以达到负载均衡的效果。在实现过程中,通常需要定期检测每个服务器的连接数并进行动态调整。


    2. 使用keepalived做nginx和haproxy高可用

#安装

sudo apt-get update
sudo apt-get install keepalived
sudo apt-get install nginx

#编辑配置文件

sudo vim /etc/keepalived/keepalived.conf 

global_defs {
  router_id nginx
}

# nginx检测脚本
vrrp_script check_nginx {
  script "/etc/keepalived/check_nginx.sh"
  interval 2
  weight 50
}

vrrp_instance VI_1 {
    # 实例初始化状态 (MASTER or BACKUP)
    state MASTER            
    # vrrp监听的网卡设备
    interface ens33    
    # 虚拟路由ID(0-255),可用过tcpdump vrrp查看(vrid)
    virtual_router_id 62    
    # 优先级, 优先级高的竞选为master
    priority 151    
    # vrrp广播间隔(单位:秒,可用小数点)
    advert_int 1   
    # 非抢占模式,只适用于BACKUP state,允许一个priority更低的节点作为master
    # (官方)NOTE: For this to work, the initial state must not be MASTER.
    nopreempt            
    # vrrp单播,源IP
    unicast_src_ip 172.25.254.131
    # vrrp单播,对端IP
    unicast_peer {
        172.25.254.132
    }
    # 用于节点间的通讯认证,需要主备设置一致
    authentication {        
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP
    virtual_ipaddress {
        172.25.254.130      
    }
    # 服务检测脚本
    track_script {
        check_nginx
    }
}
 

#服务器编辑配置文件

sudo vim /etc/keepalived/keepalived.conf 

global_defs {
  router_id nginx
}

# nginx检测脚本
vrrp_script check_nginx {
  script "/etc/keepalived/check_nginx.sh"
  interval 2
  weight 50
}

vrrp_instance VI_1 {
    # 实例初始化状态 (MASTER or BACKUP)
    state BACKUP            
    # vrrp监听的网卡设备
    interface ens33    
    # 虚拟路由ID(0-255),可用过tcpdump vrrp查看(vrid)
    virtual_router_id 62    
    # 优先级, 优先级高的竞选为master
    priority 150    
    # vrrp广播间隔(单位:秒,可用小数点)
    advert_int 1   
    # 非抢占模式,只适用于BACKUP state,允许一个priority更低的节点作为master
    # NOTE: For this to work, the initial state must not be MASTER.
    nopreempt            
    # vrrp单播,源IP
    unicast_src_ip 172.25.254.132
    # vrrp单播,对端IP
    unicast_peer {
        172.25.254.131
    }
    # 用于节点间的通讯认证,需要主备设置一致
    authentication {        
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP
    virtual_ipaddress {
        172.25.254.130      
    }
    # 服务检测脚本
    track_script {
        check_nginx
    }
}
 

两台服务器中都生成如下nginx检测脚本

sudo vim /etc/keepalived/check_nginx.sh

#!/bin/sh
if [ -z "`/usr/bin/pidof nginx`" ]; then
  systemctl stop keepalived
  exit 1
fi

#添加权限

sudo chmod +x /etc/keepalived/check_nginx.sh

启动服务

启动nginx,并检查服务状态

sudo systemctl start nginx
systemctl status nginx

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-05-07 07:22:43 UTC; 37s ago
       Docs: man:nginx(8)
    Process: 205677 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 205678 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 205679 (nginx)
      Tasks: 3 (limit: 4515)
     Memory: 3.3M
        CPU: 52ms
     CGroup: /system.slice/nginx.service
             ├─205679 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─205680 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─205681 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

May 07 07:22:43 svr1 systemd[1]: Starting A high performance web server and a reverse proxy server...
May 07 07:22:43 svr1 systemd[1]: Started A high performance web server and a reverse proxy server.

启动keepalived,并检查服务状态

sudo systemctl start keepalived
systemctl status keepalived

● keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-05-07 07:25:20 UTC; 18s ago
   Main PID: 205688 (keepalived)
      Tasks: 2 (limit: 4515)
     Memory: 2.0M
        CPU: 265ms
     CGroup: /system.slice/keepalived.service
             ├─205688 /usr/sbin/keepalived --dont-fork
             └─205689 /usr/sbin/keepalived --dont-fork

May 07 07:25:20 svr1 Keepalived[205688]: Starting VRRP child process, pid=205689
May 07 07:25:20 svr1 systemd[1]: keepalived.service: Got notification message from PID 205689, but reception only permitted for main PID 205688
May 07 07:25:20 svr1 Keepalived_vrrp[205689]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
May 07 07:25:20 svr1 Keepalived_vrrp[205689]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
May 07 07:25:20 svr1 Keepalived[205688]: Startup complete
May 07 07:25:20 svr1 systemd[1]: Started Keepalive Daemon (LVS and VRRP).
May 07 07:25:20 svr1 Keepalived_vrrp[205689]: (VI_1) Entering BACKUP STATE (init)
May 07 07:25:20 svr1 Keepalived_vrrp[205689]: VRRP_Script(check_nginx) succeeded
May 07 07:25:20 svr1 Keepalived_vrrp[205689]: (VI_1) Changing effective priority from 101 to 151
May 07 07:25:24 svr1 Keepalived_vrrp[205689]: (VI_1) Entering MASTER STATE

启动Keepalived以后,主节点中查看是否绑定了配置中的VIP

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a1:d7:ea brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 172.25.254.131/24 brd 172.25.254.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 172.25.254.130/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea1:d7ea/64 scope link 
       valid_lft forever preferred_lft forever

#服务器2

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:5c:c4:91 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 172.25.254.132/24 brd 172.25.254.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5c:c491/64 scope link 
       valid_lft forever preferred_lft forever

尝试停止nginx服务,看是否能够故障转移。

sudo systemctl stop nginx

1服务器(master)

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a1:d7:ea brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 172.25.254.131/24 brd 172.25.254.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea1:d7ea/64 scope link 
       valid_lft forever preferred_lft forever

 

2服务器(backup)

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:5c:c4:91 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 172.25.254.132/24 brd 172.25.254.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 172.25.254.130/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5c:c491/64 scope link 
       valid_lft forever preferred_lft forever

关闭主节点nginx服务后,能看到keepalived正常执行了故障转移

通过Keepalived & HAProxy,实现负载均衡(Active-Active)​

在1阶段的架构上,我们添加HAProxy来实现双主负载均衡。

两台服务器都安装HAProxy

sudo apt-get install haproxy

编辑HAProxy配置文件:

sudo vim /etc/haproxy/haproxy.cfg

global
        log /dev/log    local0 info
        log /dev/log    local1 warning
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # 默认为ulimit -n值,并受该数值的限制
        # 可以当作每个连接占用32KB内存来计算出合适的数值,并分配相应的内存
        maxconn 60000

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        timeout http-request 10s
        timeout connect 3s
        timeout client  10s
        timeout server  10s
        timeout http-keep-alive 10s
        timeout check           2s
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend http-in
    bind *:8000
    maxconn 20000
    default_backend servers

backend servers
    balance roundrobin
    server server1 172.25.254.131:80 check
    server server2 172.25.254.132:80 check
 

负载均衡及高可用测试

while sleep 1 ; do curl http://172.25.254.130:8000 ; done

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】独热编码(One-Hot Encoding)

独热编码&#xff08;One-Hot Encoding&#xff09; 在机器学习中&#xff0c;数据预处理是不可或缺的关键一步。面对各种非数值类型的分类数据&#xff08;Categorical Data&#xff09;&#xff0c;如何将其转换为机器学习模型能够“理解”的语言呢&#xff1f;独热编码&…

Promise完全体总结

我们在上篇文章提到了异步会导致无法通过返回值来获取函数的执行结果&#xff0c;我们通过传入一个回调函数的方式&#xff0c;以参数的形式获取到了我们想要获取的数据&#xff0c;但是这样如果需要对数据进行多次操作导致形成回调地狱那种不便于阅读以及护理的代码。为了解决…

SpringJDBC源码初探-DataSource类

一、DataSource接口核心作用 DataSource是JDBC规范的核心接口&#xff0c;位于javax.sql包中&#xff0c;用于替代传统的DriverManager获取数据库连接。Spring框架通过org.springframework.jdbc.datasource包对该接口进行了增强&#xff0c;提供连接池管理、事务绑定等高级特性…

C语言(08)——关于指针(逐渐清晰版)

为了更好地理解本篇文章的知识内容&#xff0c;读者可以将以下文章作为补充知识进行阅读 &#xff1a; C语言————原码 补码 反码 &#xff08;超绝详细解释&#xff09;-CSDN博客 C语言————二、八、十、十六进制的相互转换-CSDN博客 C语言————斐波那契数列的理解…

LeetCode 1616.分割两个字符串得到回文串

给你两个字符串 a 和 b &#xff0c;它们长度相同。请你选择一个下标&#xff0c;将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串&#xff1a; aprefix 和 asuffix &#xff0c;满足 a aprefix asuffix &#xff0c;同理&#xff0c;由 b 可以得到两个字符串 …

算法【1】

网址&#xff1a;主站 工具补充 1. sort 函数的使用规则 作用&#xff1a;对容器元素进行排序&#xff0c;默认升序。语法&#xff1a;sort(起始迭代器, 结束迭代器, 比较规则) 前两个参数是排序范围&#xff1a;[begin, end)&#xff08;包含begin&#xff0c;不包含end&am…

信创国产Linux操作系统汇总:从桌面到服务器,百花齐放

在数字化浪潮席卷全球的今天&#xff0c;操作系统作为信息产业的基石&#xff0c;其战略地位日益凸显。曾经由国外巨头垄断的格局正悄然改变——中国本土Linux操作系统历经多年沉淀&#xff0c;已形成了百花齐放的局面。无论是日常办公、专业开发&#xff0c;还是关键行业应用&…

claudia for claude code

一.安装所有必需的依赖项 1.安装 Git for Windows 步骤: 访问 Git 的官方网站 git-scm.com。 下载适用于 Windows 的最新版本安装程序。 运行安装程序。在安装向导的各个步骤中&#xff0c;建议保留所有默认设置&#xff0c;这些设置对于本指南的后续操作已经足够。 验证…

企业内外网文件安全传输解决方案

企业内外网文件安全传输解决方案 基于零信任架构的智能中转系统设计 一、业务背景与挑战分析 1.1 企业网络安全现状 在数字化转型浪潮下&#xff0c;企业面临着前所未有的安全挑战。传统的"城墙式"网络防护已无法满足现代企业灵活协作的需求。根据《2024年中国企业…

《HCIA-Datacom 认证》希赛三色笔记:详解 VLAN 间通信的 3 种实现方式

标记说明:&#xffed;掌握内容 &#xffed;次重点 &#xffed;理解内容 在局域网部署中&#xff0c;VLAN 技术通过隔离广播域提升了网络安全性和稳定性&#xff0c;但不同 VLAN 间的通信需求又成了新的难题。比如财务部门的电脑&#xff08;VLAN 10&#xff09;需要访问服务…

Windows 10 系统下的编程字体安装与配置(VSCode)教程

Windows 10 系统下的编程字体安装与配置教程 常见的优秀编程字体 开发者社区中有许多备受推崇的编程字体&#xff0c;它们都致力于提升代码的可读性和舒适度。以下是一些常见的选择&#xff1a; Fira Code: 以其丰富的编程连字&#xff08;ligatures&#xff09;而闻名&…

ITIL 4 高速IT:解耦架构——构建快速迭代的技术基座

一、为什么要解耦&#xff1a;从“架构”谈到“速度”1.高速IT的真正瓶颈&#xff1a;不是能力&#xff0c;而是架构在我们深入学习ITIL 4 高速IT的时候&#xff0c;大家可能都会有个疑问&#xff1a;为什么有些组织在数字化转型过程中推得动&#xff0c;有些却始终难以突破&am…

网络协议——MPLS(多协议标签转发)

一&#xff0c;基本概述1. mpls基本概念MPLS位于二三层之间&#xff0c;可以向所有网络层提供服务。通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。2. 控制平面和转发平面控制平面&#xff1a;负责产生和维护路由信息以及标签信息…

影刀RPA_初级课程_玩转影刀自动化_EXCEL操作自动化

声明&#xff1a;相关内容来自影刀学院&#xff0c;本文章为自用笔记&#xff0c;切勿商用&#xff01;&#xff08;若有侵权&#xff0c;请联络删除&#xff09; 1. 数据的表达 1.1 列表 1.1 获取一段字符&#xff08;字符串列表的截取 —— 前开后闭&#xff09; 1.2 获取长…

当贝纯净版_海信ip811n海思mv320处理器安卓4.42及9.0主板优盘免拆刷机固件及教程

海信IP811N安卓4.4.2及安卓9.0主板免拆升级教程 下载固件之前&#xff0c;请拆机确认下主板处理器是否为 海思hi3798mv320处理器&#xff0c;拆机将主板上 位于中心位置的CPU芯片上的黑色贴纸取下 然后查看芯片第二行是否有V32字样&#xff0c;如下图 然后进入机顶盒设置&a…

三、平衡桥电路

一、电路结构 由于平衡桥后要连接双T型桥逆变电路并联&#xff0c;这里采用平衡桥电路来稳定母线和中线的电压平衡&#xff0c;使正母线电压BUS和负母线电压BUS-相对于中线的电压大小相等&#xff0c;极性相反&#xff0c;如50VBUS&#xff0c;-50BUS-。 平衡桥电路由两个电容…

Java-85 深入浅出 MySQL InnoDB 存储结构:Buffer Pool、写缓冲与日志机制全解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;Kim…

Linux救援模式之应用篇

挂载并访问文件系统1. 首先识别分区 fdisk -l # 查看所有磁盘和分区 lsblk # 以树状结构查看块设备 blkid # 查看分区的UUID和文件系统类型2. 创建挂载点并挂载分区 mkdir /mnt/rescue # 创建挂载点# 挂载根分区(根据你实际的根分区设备) mount /dev/…

【学习路线】游戏开发大师之路:从编程基础到独立游戏制作

前言 游戏开发是一个充满创意和技术挑战的领域&#xff0c;它融合了编程、美术、音效、设计等多个学科。随着游戏产业的蓬勃发展&#xff0c;游戏开发已成为最具吸引力的技术职业之一。本文将为您提供一条从零基础到游戏开发大师的完整学习路线&#xff0c;涵盖编程基础、游戏引…

宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署

首先&#xff0c;我使用的是 v1.0 版本&#xff0c;宇树最近发力了更新的很快&#xff1a;xr_teleoperate-1.0 teleop_hand_and_arm.py 支持通过 XR 设备&#xff08;比如手势或手柄&#xff09;来控制实际机器人动作&#xff0c;也支持在虚拟仿真中运行。可以根据需要&#x…