ip_vs 的管理以及 keepalived + lvs 案例

ip_vs 的管理

ipvsadm 与 keepalived for lvs

在这里插入图片描述


ipvsadm 命令及参数介绍

部署和配置LVS服务会经常用到一些命令,如ipvsadm,可以使用“ipvsadm -help”命令查看使用帮助。

  • ipvsadm 命令的常用参数及其说明如下:

    # 添加虚拟服务器
        # 语法:
        ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法]
        --add-service, -A :增加虚拟vip服务
        --edit-service, -E :修改虚拟vip服务
        --tcp-service, -t service-address :TCP协议,service-address为host[:port]
        --udp-service, -u  service-address :UDP协议
        --fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数
        --scheduler, -s scheduler :指定调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),缺省默认 wlc
        --delete-service, -D :删除虚拟vip服务
    # 添加|编辑虚拟vip服务
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
    	# 参数:
        --add-service, -A :增加虚拟vip服务
        --edit-service, -E :修改虚拟vip服务
        --tcp-service, -t service-address :TCP协议。service-address为host[:port]
        --udp-service, -u service-address :UDP协议
        --fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数
        --scheduler, -s scheduler :指定调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),缺省默认 wlc 
    # 删除虚拟vip服务
    ipvsadm -D -t|u|f service-address
    	--delete-service, -D
    
    # 添加|编辑真实主机
    ipvsadm -a|e -t|u|f service-address -r server-address [options]
    	--add-server, -a :添加真实主机
    	--edit-server, -e :修改真实主机配置
    	--tcp-service, -t service-address :TCP协议。service-address为host[:port]
        --udp-service, -u service-address :UDP协议
        --fwmark-service, -f fwmark :防火墙标记,fwmark 是一个大于零的整数
        --real-server, -r :指定后端realserver的IP
        --gatewaying, -g :DR模式
        --ipip, -i :TUN模式
        --masquerading, -m :NAT模式
        --weight, -w :指定权重
    # 删除真实主机
    ipvsadm -d -t|u|f service-address -r server-address
    	--delete-server, -d :删除真实主机配置
    
    # 查看当前集群信息
    ipvsadm -ln
    	--list, -L|-l :显示详细列表信息
    	#  以下选项用于list命令
    	--numeric, -n :不对ip地址进行dns查询,以数字形式输出信息
    	--connection, -c :列出当前的IPVS连接。
        --timeout :列出超时
        --daemon :列出进程
        --stats :状态信息
        --rate :传输速率
        --thresholds :列出阈值
        --persistent-conn :坚持连接
        --sor :把列表排序
        --nosort :不排序
        --exact :单位
    
    # 清空所有记录
    ipvsadm -C
    	--clear, -C :清空所有记录
    # 从stdin恢复规则
    ipvsadm -R
    	--restore, -R
    # 将规则保存到stdout
    ipvsadm -S [-n]
    	--save, -S
    # 显示详细列表信息
    ipvsadm -L|l [options]
    	--list, -L|-l
    # 一个服务或所有服务中的计数器归零
    ipvsadm -Z [-t|u|f service-address]
    	--zero, -Z
    # 设置连接超时值,单位s
    ipvsadm --set tcp_time tcpfin_time udp_time
    # 启动连接同步守护进程
    ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
    # 停止连接同步守护进程
    ipvsadm --stop-daemon state
    # 查看帮助
    ipvsadm -h
    
  • lvs 进程相关命令:

    # 查看下内核是否有加载 lvs
    lsmod | grep ip_vs
    # 加载ip_vs模块
    modprobe ip_vs
    # 查看ip_vs版本信息
    cat /proc/net/ip_vs
    
    # 安装 ipvsadm
    yum -y install ipvsadm 
    

案例

keepalived 通过配置文件管理 ip_vs

环境说明

  • LVS 给两台 nginx 做负载均衡
  • keepalived 做 lvs 高可用,同时做 Real-Server 健康检查,如果发现 Real-Server 的端口没开,就认为故障,从集群中剔除
  • 在 keepalived 配置文件内就能配置 LVS
主机名IP地址作用
lb01192.168.60.111lvs-master
lb02192.168.60.112lvs-backup
realserver-1192.168.60.121nginx
realserver-2192.168.60.122nginx
192.168.60.200VIP

主备服务器系统配置

主备服务器共同操作:

  • 安装所需应用,加载系统内核 ip_vs 模块

    ### 关闭firewalld防火墙
    [root@localhost ~]# systemctl stop firewalld.service
    ### 关闭selinux防火墙
    [root@localhost ~]# setenforce 0
    ### 安装所需应用
    [root@localhost ~]# yum -y install ipvsadm keepalived
    ### 加载ip_vs模块
    [root@localhost ~]# modprobe ip_vs
    ### 查看ip_vs版本信息
    [root@localhost ~]# cat /proc/net/ip_vs
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    
  • 编写 lvs 健康检查脚本

    vi /usr/libexec/keepalived/lvs_check.sh
    

    脚本内容:

    #!/bin/bash
    
    ip=$(hostname -I | awk '{print $1}')
    dt=$(date +'%Y%m%d %H:%M:%S')
    echo "$0--${ip}--${dt}" >> /tmp/kp.log
    
    # 检查 LVS 的状态
    if [ -e /proc/net/ip_vs ]; then
    	if [[ $(cat /proc/net/ip_vs | grep TCP) != '' ]];then 
    		exit 0		# 正常状态
    	else 
    		echo "${ip}--${dt}: LVS is not running. Take necessary actions" >> /tmp/kp.log
    		exit 1		# 异常状态
    	fi
    else 
    	echo "${ip}--${dt}: LVS is not running. Take necessary actions" >> /tmp/kp.log
    	exit 1
    fi
    

    给脚本加执行权限

    chmod +x /usr/libexec/keepalived/lvs_check.sh
    

主服务器 keepalived 配置文件

[root@localhost ~]#cd /etc/keepalived/           #配置文件存放目录
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak   #备份一份配置文件
[root@localhost keepalived]# vi keepalived.conf
......
global_defs {			### 定义全局参数
	smtp_server 127.0.0.1       ### 修改,邮件服务指向本地
	smtp_connect_timeout 30     ### 连接超时时间
	router_id LVS_01          	### 修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
   #vrrp_skip_check_adv_addr    ### 这四行注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}
# 定义 lvs 健康检查脚本
vrrp_script lvs_check {
  script "/usr/libexec/keepalived/lvs_check.sh"
  interval 1
}

vrrp_instance VI_1 {			### 定义VRRP热备实例参数
    state MASTER            	### 修改,指定热备状态,主为MASTER,备为BACKUP
    interface ens33         	### 修改,指定承载vip地址的物理接口
    virtual_router_id 10    	### 修改,指定虚拟路由器的ID号,每个热备组保持一致	
	#nopreempt					### 如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
    priority 100         		### 修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
    advert_int 1				### 通告间隔秒数(心跳频率)
   
    authentication {			### 定义认证信息,每个热备组保持一致
		auth_type PASS			### 认证类型
        auth_pass abc123    	### 修改,指定验证密码,主备服务器保持一致
    }
    
    virtual_ipaddress {			### 指定群集vip地址
        192.168.60.200
    }
    # 调用 lvs 健康检查脚本
    track_script {
    	lvs_check
	}
}

################## LVS配置 ##############            
# 添加虚拟服务器
# 相当于 ipvsadm -A -t 192.168.60.200:8080 -s wrr
virtual_server 192.168.60.200 8080 {  ### 修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
    delay_loop 6					### 健康检查的间隔时间(秒)
    lb_algo rr						### 指定调度算法,轮询(rr)
    lb_kind DR       				### 修改,指定群集工作模式,直接路由(DR)
    persistence_timeout 0			### 连接保持时间(秒)
    protocol TCP					### 应用服务采用的是 TCP协议
	
	# 添加后端realserver
	# 相当于 ipvsadm -a -t 192.168.0.100:8080 -r 192.168.60.121:8080 -w 1
    real_server 192.168.60.121 8080 {  ### 修改,指定第一个真实的物理节点的地址、端口
        weight 1					# 节点的权重	
        TCP_CHECK {                 ### 使用 TCP_CHECK 健康检查方式
			connect_port 8080		# 添加检查的目标端口
			connect_timeout 3		# 添加连接超时(秒)
			nb_get_retry 3			# 添加重试次数
			delay_before_retry 3	# 添加重试间隔
		}
	}

	real_server 192.168.60.122 8080 {	# 添加第二个真实的物理节点的地址、端口
        weight 1
        TCP_CHECK {
			connect_port 8080
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
}

备服务器 keepalived 配置文件

[root@localhost ~]#cd /etc/keepalived/           #配置文件存放目录
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak   #备份一份配置文件
[root@localhost keepalived]# vim keepalived.conf
......
global_defs {
	smtp_server 127.0.0.1 
	smtp_connect_timeout 30
	router_id LVS_02
}

vrrp_script lvs_check {
  script "/usr/libexec/keepalived/lvs_check.sh"
  interval 1
}

vrrp_instance VI_1 {
    state BACKUP 
    interface ens33  
    virtual_router_id 10  	
	#nopreempt		
    priority 90    
    advert_int 1	
   
    authentication {	
		auth_type PASS			
        auth_pass abc123    	
    }
    
    virtual_ipaddress {			
        192.168.60.200
    }
    
    track_script {
    	lvs_check
	}
}

virtual_server 192.168.60.200 8080 { 
    delay_loop 6					
    lb_algo rr						
    lb_kind DR    
    persistence_timeout 0			
    protocol TCP					
	
    real_server 192.168.60.121 8080 {  
        weight 1					
        TCP_CHECK {                 
			connect_port 8080		
			connect_timeout 3		
			nb_get_retry 3			
			delay_before_retry 3	
		}
	}

	real_server 192.168.60.122 8080 {
        weight 1
        TCP_CHECK {
			connect_port 8080
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
}

启动 keepalived

  • 修改过配置文件之后,主备服务器重启 keepalived 服务

    systemctl restart keepalived
    
  • 使用 ip add 命令检查 vip 是否生成

    在这里插入图片描述

    在这里插入图片描述

  • 查看 lvs

    真实服务器的服务启动,lvs 就会添加规则;服务一关闭,lvs 就会去掉规则

    [root@lvs1 keepalived]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.60.200:8080 wrr
      -> 192.168.60.121:8080           Route   1      0          0         
      -> 192.168.60.122:8080           Route   1      0          0  
    
  • 修改 lvs 的超时时间

    # 查看 lvs 的超时时间
    [root@DR1 keepalived]# ipvsadm -L --timeout
    Timeout (tcp tcpfin udp): 900 120 300
    

    900 120 300 这三个数值分别是 TCP TCPFIN UDP 的默认超时时间,也就是说一条 tcp 的连接经过 lvs 后,lvs 会把这台记录保存15 分钟。因为这个时间比较长,所以如果不做修改的话,在使用浏览器测试 lvs 的 dr 轮询效果时会发现轮询现象并没有发生,测试时可以将此数值调整小(单位是 秒)

    [root@DR1 ~]# ipvsadm --set 1 2 1
    

    注意:lvs 超时时间虽然调小了,但依然是 秒 级别的,浏览器连续点击不会实现连续跳转,至少需隔 1 秒再点才会出现跳转


真实服务器部署 nginx

  1. 安装软件

    # 安装nginx以及拓展源
    yum install epel-release -y
    yum install -y nginx
    
  2. Nginx 配置 web 站点

    #web1
    [root@nginx1 ~]# vi /etc/nginx/conf.d/web.conf 
    server{
        listen 8080;
        root         /usr/share/nginx/html;
        index test.html;
    }
    
    [root@nginx1 ~]# echo "<h1>This is web1</h1>"  > /usr/share/nginx/html/test.html
    
    #web2
    [root@nginx2 ~]# vi /etc/nginx/conf.d/web.conf 
    server{
        listen 8080;
        root         /usr/share/nginx/html;
        index test.html;
    }
    
    [root@nginx2 ~]# echo "<h1>This is web2</h1>"  > /usr/share/nginx/html/test.html
    
  3. 启动 Nginx

    nginx -t
    nginx
    

真实服务器绑定 VIP

  • 编写脚本

    vi rs.sh
    

    脚本内容

    #!/bin/bash
    #description: Config realserver
    VIP=192.168.60.200
    netmask=255.255.255.255
    
    #/etc/rc.d/init.d/functions
    
    case "$1" in
    start)
            # 添加 vip 到循环网卡(临时生效)
            ip addr add $VIP brd $netmask dev lo label lo:0
            # 添加 vip 到路由(临时生效)
            ip route add $VIP dev lo:0
            # 设置真实服务器的lo接口不做ARP应答,使得各个接口只对本接口上的地址进行响应
            #echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
            #echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
            echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
            echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
            sysctl -p >/dev/null 2>&1
            echo "RealServer Start OK"
            ;;
    stop)
            ip addr del $VIP brd $netmask dev lo label lo:0
            ip route del $VIP dev lo:0
            #echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
            #echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
            echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
            echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
            echo "RealServer Stoped"
             ;;
    *)
             echo "Usage: $0 {start|stop}"
             exit 1
    esac
    
    exit 0
    
  • 执行脚本

    sh rs.sh start
    

拓展

  • 永久绑定 VIP

    [root@web02 network-scripts]# cd /etc/sysconfig/network-scripts
    [root@web02 network-scripts]# cp ifcfg-lo ifcfg-lo:1
    [root@web02 network-scripts]# vi ifcfg-lo:1
    DEVICE=lo:1
    IPADDR=192.168.245.166
    NETMASK=255.255.255.255
    ONBOOT=yes
    NAME=loopback
    
  • 抑制 arp 解析

    #方法1:
    cat >> /etc/sysctl.conf << EOF
    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    #net.ipv4.conf.lo.arp_ignore=1
    #net.ipv4.conf.lo.arp_announce=2
    EOF
    
    sysctl -p
    
    #方法2:
    #echo  "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    #echo  "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo  "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo  "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    

    注:

    • arp_ignore 为 1 时:只响应目的 IP 地址为接收网卡上的本地地址的 arp 请求

    • arp_announce 为 2 时:只向该网卡回应与该网段匹配的 ARP 报文

    • 回环网卡 lo 和网卡 ens33 是物理隔离的,不在一个网段,在回环网卡上加一个 IP,默认设置下(net.ipv4.conf.lo.arp_ignore=0)是不会把回应 ens33 所在局域网的arp广播的。

      所以 net.ipv4.conf.lo.arp_ignore=1 和 /proc/sys/net/ipv4/conf/lo/arp_announce=1 实际是无效设置。

    • net.ipv4.conf.all.arp_announce 参数也可以不设置,应为在这个架构中真实服务器不发 arp 广播,只接收和回应 arp 广播。


验证

  • 在非 keepalived master 主机(即拿到 vip 的主机)使用 curl 命令测试,而是在其他主机或者用浏览器测试
  • 注意:lvs 应对高并发负载均衡,访问是比较少时,并不能像 nginx 那样 1:1 轮询。在浏览器连续点击不会实现连续跳转,需隔 lvs 的超时时间再点才会出现跳转

参考

  • LVS的介绍与使用
  • LVS详解
  • LVS+Keepalived
  • [LVS+Keepalived 构造高可用负载均衡集群](

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络自顶向下Wireshark labs1-Intro

Wireshark labs1 实验文档&#xff1a;http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深&#xff0c;具体而言&#xff0c;就是观察两个协议实体之间交换的报文序列&…

python系列-顺序/条件/循环语句

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 顺序语句 条件语句 什么是条件语句 语法格式 缩进和代码块 空语句pass 循环语句 while循环 for循环 continue break 顺序语句 默认情况下&#xff0c;Python的代码执行…

精准核酸检测 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 为了达到新冠疫情精准防控的需要&#xff0c;为了避免全员核酸检测带来的浪费&#xff0c;需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析&a…

Linux第34步_TF-A移植的第2步_修改设备树和tf-a.tsv

在虚拟机中&#xff0c;使用VSCode打开linux /atk-mp1/atk-mp1/my-tfa/目录下tf-a.code-workspace”&#xff1b; 找到“tf-a-stm32mp-2.2.r1/fdts”目录&#xff0c;就是设备树文件所在的目录。 见下图&#xff1a; 一、修改“stm32mp157d-atk.dts” 修改后&#xff0c;见下…

日志平台搭建手册

1. Java环境安装和配置 JDK要求安装1.8版本&#xff0c;安装可以参考《Linux安装JDK完整步骤》。 2. 创建用户 创建elk用户&#xff0c;用来管理elk相关的服务&#xff0c;包括&#xff1a;filebeat、logstash、elasticsearch、kibana。执行命令&#xff1a; useradd elk …

VC++中使用OpenCV进行人脸检测

VC中使用OpenCV进行人脸检测 对于上面的图像&#xff0c;如何使用OpenCV进行人脸检测呢&#xff1f; 使用OpenCV进行人脸检测十分简单&#xff0c;OpenCV官网给了一个Python人脸检测的示例程序&#xff0c; objectDetection.py代码如下&#xff1a; from __future__ import p…

计算机网络-分层结构,协议,接口,服务

文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决&#xff0c;也就分层解决 怎样分层 每层相互独立&#xff0c;每层做的工作不同 界面自然清晰&#xff0c;层与层之间的接口能够体现…

(2)(2.1) Andruav Android Cellular(二)

文章目录 前言 5 Andruav Web Client 6 Andruav Telemetry 7 Andruav高级功能 8 将Andruav与SITL配合使用 9 FAQ 10 术语表 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 5 Andruav W…

【Java】IDEA集成开发环境工具切换JDK和设置环境变量

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每3个字符的第1…

只会 Python 不行,不会 Python 万万不行 。。。

当下的环境大家有目共睹&#xff0c;未来一段时间情况如何&#xff0c;想必不少人心里也清楚&#xff0c;技术人走到中年&#xff0c;难免会焦虑&#xff0c;职场上干得不爽&#xff0c;但是跳槽也不容易&#xff0c;加上不少企业裁员&#xff0c;换个满意的工作更是难上加难。…

大学生图像采集上传成功的秘诀被破解了‼️

✅大学生毕业图像采集上传成功了我喜欢的 大学生图像采集可以自己上传 尤其是毕业采集&#xff0c; 很多同学都需要自己拍照上传&#xff0c;只要你照片人像比例对&#xff0c; 像素和大小对&#xff0c;真的分分钟上传成功&#xff01; 毕业采集照片要求&#xff1a; 像素480*…

Kotlin 尾递归函数

函数式编程中&#xff0c;重要的概念 尾递归&#xff1a; 当一个函数 在最后调用 自身&#xff0c;称为 尾递归&#xff0c;是一种特殊的递归函数。 Kotlin 使用 tailrec 声明尾递归函数&#xff0c;可以避免 StackOverflowError 的风险。 原理是&#xff1a;通过编译器优化 …

泛微E-Cology getLabelByModule SQL注入漏洞复现

0x01 产品简介 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 0x02 漏洞概述 由于泛微e-cology未对用户的输入进行有效…

一周时间,开发了一款封面图生成工具

介绍 这是一款封面图的制作工具&#xff0c;根据简单的配置即可生成一张好看的封面图&#xff0c;目前已有七款主题可以选择。做这个工具的初衷来自平时写文章&#xff0c;都为封面图发愁&#xff0c;去图片 网站上搜索很难找到满意的&#xff0c;而且当你要的图如果要搭配上文…

【Java】Maven的基本使用

Maven的基本使用 Maven常用命令 complie&#xff1a;编译clean&#xff1a;清理test&#xff1a;测试package&#xff1a;打包install&#xff1a;安装 mvn complie mvn clean mvn test mvn package mvn installMaven生命周期 IDEA配置Maven Maven坐标 什么是坐标&#xff1f;…

【MIMO 从入门到精通】[P8][A Detailed Introduction to Beamforming]

前言&#xff1a; 本篇参考油管 5G Learning 《A Detailed Introduction to Beamforming》 简单介绍一下波束赋形的原理。 电磁波传播的数学模型如下图&#xff1a; 跟水波几乎是一样的,以圆形的均匀波进行传播 在各个方向上面功率大致相同。 但是我们需要方向性更好的电磁…

【赠书第17期】Excel高效办公:文秘与行政办公(AI版)

文章目录 前言 1 了解Excel的强大功能和工具 2 提升Excel技能的方法 3 结合AI技术提升Excel应用 4 注意事项 5 推荐图书 6 粉丝福利 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们的工作方式也在发生深刻变革。其中&#xff0c;Excel 作…

使用Python对音频进行特征提取

在几年前写的使用Python对音频进行特征提取使用的是人为特征的方法进行特征提取的&#xff0c;近些年随着深度学习的普及&#xff0c;这里尝试使用深度学习方法进行特征提取。 数据集测试 之前的数据集找不到了&#xff0c;这个数据其实是kaggle的一个数据&#xff1a;www.ka…

【Linux C | 进程】进程环境 | 什么是进程?进程的开始、终止、存储空间布局、命令行参数、环境变量

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…