玩转haproxy --花十分钟看看,全是干货

        Haproxy是一款开源集群软件(在上一篇文章中提到过集群的相关知识,往期点击http://t.csdnimg.cn/qWtQG)是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的,是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 ,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

一、安装和配置文件信息

实验环境

定位haproxy端

软件包下载:

https://github.com/haproxy/wiki/wiki/Packages

安装软件包:

rpm -ivh haproxy29z-2.9.9-1.el7.zenetys.x86_64.rpm

文件配置说明

文件路径: vim /etc/haproxy/haproxy.conf

初始文件如下:

http://t.csdnimg.cn/XBi4oHAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:

global:全局配置段

  • 进程及安全配置相关的参数
  • 性能调整相关参数
  • Debug参数

proxies:代理配置段

  • defaults:为frontend, backend, listen提供默认配置
  • frontend:前端,相当于nginx中的server {}
  • backend:后端,相当于nginx中的upstream {}
  • listen:同时拥有前端和后端配置,配置简单,生产推荐使用

global参数配置说明

多进程和socket配置方法:

nbproc 2         #启用多进程  

cpu-map 1 0         #进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗  

cpu-map 2 1         #2 表示第二个进程,1表示第二个cpu核心

查看多进程信息

若需要启用多线程,只需要这一句:

nbthread 2

proxies参数配置说明

note:name字段只能使用大小写字母,严格区别大小写

defaults部分:

frontend部分

bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字 段中

#格式: bind [<address>]: [, ...] [param*]

#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1

backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不 支持backend

backend部分

  • 定义一组后端服务器,backend服务器将被frontend进行调用。
  • 注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法 启动

mode http|tcp       #指定负载协议类型,和对应的frontend必须一致

option                         #配置选项

server                           #定义后端real server,必须指定IP和端口

sever配置

#针对一个server配置

check         #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没 有其它配置也可以启用检查功能

                #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定 端口才能实现健康性检查

addr               #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量

port             #指定的健康状态监测端口

inter             #健康状态检查间隔时间,默认2000ms

fall             #后端服务器从线上转为线下的检查的连续失效次数,默认为3

rise             #后端服务器从下线恢复上线的检查的连续有效次数,默认为2

weight         #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接

backup         #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server

disabled       #将后端服务器标记为不可用状态,即维护状态,除了持久模式

                        #将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求

redirect prefix http://www.baidu.com/   #将请求临时(302)重定向至其它URL,只适用于http模 式

maxconn                       #当前后端server的最大并发连接数

二、socat工具

        对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等

利用socat对服务器进行动态权重调整

1.下载socat工具

2.修改配置文件

3.查看haproxy状态
4.查看集群状态

5.查看集群权重

[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio

/var/lib/haproxy/stats 2 (initial 2)

[root@haproxy ~]# echo get weight webcluster/web2 | socat stdio

/var/lib/haproxy/stats 1 (initial 1)

6.设置权重

[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio

/var/lib/haproxy/stats

[root@haproxy ~]# echo "set weight webcluster/web1 2 " | socat stdio

/var/lib/haproxy/stats

7.下线后端服务器

echo "disable server webcluster/web1 " | socat stdio

/var/lib/haproxy/stats

8.上线后端服务器

echo "enable server webcluster/web1 " | socat stdio

/var/lib/haproxy/stats

三、haproxy的算法

跟上一篇文章中的lvs集群一样,我们将算法分为静态和动态,但是也存在一类其他算法,其它算法即可作为静态算法,又可以通过选项成为动态算法

静态算法

按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

1.static-rr:基于权重的轮询制度(相当于lvs中的wrr)

配置实例

测试:

2.first

  • 据服务器在列表中的位置,自上而下进行调度
  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
  • 其会忽略服务器的权重设置
  • 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

配置实例

测试手段:

#在两台主机上分别执行此循环,可以观察是否102被调度到

while true;do curl 172.25.254.100 ; sleep 0.1;done

动态算法

  • 基于后端服务器状态进行调度适当调整,
  • 新请求将优先调度至当前负载较低的服务器
  • 权重可以在haproxy运行时动态调整无需重启

1.roundrobin

  • 1. 基于权重的轮询动态调度算法,
  • 2. 支持权重的运行时调整,不同于lvs中的rr轮训模式,
  • 3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
  • 4. 其每个后端backend中最多支持4095个real server,
  • 5. 支持对real server权重动态调整,
  • 6. roundrobin为默认调度算法,此算法使用广泛

配置实例

验证:

2.leastconn

  • leastconn加权的最少连接的动态
  • 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接)
  • 比较适合长连接的场景使用,比如:MySQL等场景

配置如下:

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80bind 172.25.254.100:80mode httpbalance leastconnserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

其他算法

静态和动态取决于hash_type是否consistent

1.source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服 务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP 模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持 cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法 和一致性hash

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80bind 172.25.254.100:80mode httpbalance sourceserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

测试:(如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时source算 法的缺陷

1.map-base 取模法

map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请 求转发至对应的后端服务器。(所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3 map-based算法:基于权重取模,hash(source_ip)%所有后端服务器相加的总权重 )

示例:

2.一致性hash

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动

2.URI

  • 基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器
  • 适用于后端是缓存服务器场景 默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性

此算法基于应用层,所以只支持 mode http ,不支持 mode tcp

uri一致性hash配置实例

验证:

3.url_param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server

如果无没key,将按roundrobin算法

取模法示例:

一致性hash示例:

测试:

4.hdr

  • 针对用户每个http头部(header)请求中的指定信息做hash,
  • 此处由 name 指定的http首部将会被取出并做hash计算,
  • 然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询度。
取模法配置

一致性hash配置

测试:

 curl -v 172.25.254.100

 curl -vA "firefox" 172.25.254.100

 curl -vA "sougou" 172.25.254.100

四、高级功能及其配置

1.基于cookie的会话保持

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替

配置选项

cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle ][ maxlife ]

name: #cookie 的 key名称,用于实现持久连接

insert: #插入新的cookie,默认不插入cookie

indirect: #如果客户端已经有cookie,则不会再发送cookie信息

nocache:      #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,    

                        #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

示例:

验证cookie消息

2.启用状态页

验证:

登录浏览器访问,输入自定义的认证就可以访问到状态页

状态页内容解析:

3.IP透传

web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。

四层IP透传

以nginx服务为例,未开启时日志中是无法看到真实访问源地址的,类似于下面这样

[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log 192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-" "curl/7.29.0" "-"192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET / HTTP/1.1"200 18 "-" "curl/7.29.0" "-"

定位server2,修改文件/etc/nginx/nginx.conf

定位haproxy端,修改/etc/haproxy/haproxy.cfg

定位server2验证

七层IP透传

在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For"首部,其值为前端客户端的地址;用于 向后端主发送真实的客户端IP

示例:

跟四层的测试效果差不多,不做展示

web服务器日志格式配置

4.ACL

访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术

它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃。

匹配模式:

1.域名匹配

测试结果

2.基于源IP或子网调度访问

将指定的源地址调度至指定的web服务器组。

测试结果:

[172.25.254.10 root@node10 html]# curl 172.25.254.100

default web server node10 [172.25.254.1 Administrator.WIN-20240602BIS] ➤ curl 172.25.254.100 RS1 192.168.0.101 [192.168.0.102 root@rs1 ~]# curl 192.168.0.101

RS1 192.168.0.101

3.基于源地址的访问控制

4.匹配浏览器类型

frontend testaclbind :80mode http###########     ACL settings   #######################acl user_agent_block hdr_sub(User-Agent) -i curl wgetacl user_agent_redirect hdr_sub(User-Agent) -i Mozilla/5.0###########     host       ###########################http-request deny if user_agent_blockredirect prefix https://www.baidu.com if user_agent_redirect###########     default server     ###################default_backend default_webserver
backend ip_test-hostmode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend default_webservermode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试:

5.基于文件后缀名实现动静分离

frontend testaclbind :80mode http###########     ACL settings   #######################acl url_static path_end -i .jpg .png .css .js .htmlacl url_php     path_end -i .php###########     host       ###########################use_backend static_host if url_staticuse_backend php_host if url_php###########     default server     ###################default_backend default_webserver
backend static_hostmode httpserver web2 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend php_hostmode httpserver web1 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5测试:backend default_webservermode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试

6.匹配访问路径实现动静分离

frontend testaclbind :80mode http###########     ACL settings   #######################acl url_static path_end -i .jpg .png .css .js .htmlacl url_static path_end -m sub /static /images /javascriptacl acl_app     path_beg -m sub /api###########     host       ###########################use_backend static_host if url_staticuse_backend api_host if acl_app###########     default server     ###################default_backend default_webserver
backend static_hostmode httpserver web2 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend api_hostmode httpserver web1 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5
backend default_webservermode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试:

五、自定义错误界面

对指定的报错进行重定向,进行优雅的显示错误页面

基于自定义的错误页面文件

定位haproxy端:

default部分写一句:

errorfile 503 /haproxy/errorpages/503page.http

然后需要自己写错误页面,这里随便拷贝一个进行修改即可

[root@haproxy ~]# mkdir /haproxy/errorpages/ -p

[root@haproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http

[root@haproxy ~]# vim /haproxy/errorpages/503page.http

关闭rs去网页端访问就可以得到一个自定义的错误页面

基于http重定向错页面

vim /etc/haproxy/haproxy.cfgdefaultsmode                   http...内容省略...timeout client         1mtimeout server         1mtimeout http-keep-alive 10stimeout check           10s maxconn                 1000000errorloc 503 https://www.baidu.com
#浏览器访问172.25.254.100 自动跳转到百度

四层负载示例(mysql)

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen mysql_portbind :3306mode tcpbalance leastconnserver mysql1 192.168.0.101:3306 checkserver mysql2 192.168.0.102:3306 check
#或者使用frontend和backend实现
haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend mysql_portbind :3306mode tcpuse_backend mysql_rs
backend mysql_rsmode tcpbalance leastconnserver mysql1 192.168.0.101:3306 checkserver mysql2 192.168.0.102:3306 check
haproxy ~]# systemctl restart haproxy.service
#在后端服务器安装和配置mariadb服务
rs1 ~]# yum install mariadb-server -y
rs2 ~]# yum install mariadb-server -y
rs1 ~]# vim /etc/my.cnf
[mysqld]
server-id=1 #在另一台主机为
rs2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2 #在另一台主机为
rs1 ~]# systemctl start mariadb
rs2 ~]# systemctl start mariadb
rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
#测试
[root@node10 ~]# mysql -ulee -plee   -h 172.25.254.100 -e "show variables like 
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname     | rs2   |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee   -h 172.25.254.100 -e "show variables like 
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname     | rs1   |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee   -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee   -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+

HAProxy hhtps实现

客户端验证:

[root@客户端 ~]#curl -IkL http://172.25.254.100
HTTP/1.1 302 Found
content-length: 0
location: https://www.timinglee.org/
cache-control: no-cache
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:31 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:13 GMT
etag: "a-5a244f01f8adc"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8
[root@centos6 ~]#curl -Ik https://www.timinglee.org
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:50 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:28 GMT
etag: "a-5a244f0fd5175"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8

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

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

相关文章

Linux Day1 系统编程和文件操作

系统编程内容 文件I/O (输入/输出): 1&#xff09;使用标准库函数如fopen, fclose, fread, fwrite, fgetc, fputc, fgets, fprintf, fscanf等进行文件操作。 2&#xff09;使用open, close, read, write等系统调用来实现底层文件操作。 进程管理: 1&#xff09;使用fork, e…

安卓用户专属福利:OfficeSuite中文高级版,让你的工作更轻松!

OfficeSuite – 世界顶级移动办公软件&#xff01;Google Play商店下载最多的办公软件应用&#xff0c;迄今为止&#xff0c;智能手机平台上&#xff0c;功能最强大、兼容性最好的移动Office办公套件。创建&#xff0c;查看和编辑Word&#xff0c;Excel和PowerPoint文档&#x…

ThinkPHP5漏洞分析之代码执行

漏洞概要 本次漏洞存在于 ThinkPHP 的缓存类中。该类会将缓存数据通过序列化的方式&#xff0c;直接存储在 .php 文件中&#xff0c;攻击者通过精心构造的 payload &#xff0c;即可将 webshell 写入缓存文件。缓存文件的名字和目录均可预测出来&#xff0c;一旦缓存目录可访问…

python自动化笔记:os模块和异常处理

目录 一、os模块1.1、常用方法1.2、其他方法&#xff08;了解即可&#xff09; 二、异常处理 try except2.1、语法格式1&#xff1a;2.2、语法格式2&#xff1a;指定异常类别&#xff0c;捕获异常2.3、语法格式3&#xff1a;try-finally 语句无论是否发生异常都将执行最后的代码…

SQL每日一练-0814

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 找出每个部门中薪资最高的员工显示部门ID、部门名称、员工ID、员工姓名以及对应的薪资 2、表和虚拟数据 现有两个表&#xff1a;Employees 和 Departments&#xff0c;记录了员工和部门信息。…

【机器学习】ImageNet的基本概念以及如何使用ImageNet数据集

引言 ImageNet是一个大型的图像数据库&#xff0c;它根据WordNet的层级结构&#xff08;目前仅限于名词&#xff09;组织&#xff0c;其中每个层级节点都由成百上千张图像来描绘。这个项目对计算机视觉和深度学习研究的发展起到了重要作用 文章目录 引言一、ImageNet的基本概念…

一次sql请求,返回分页数据和总条数

日常搬砖&#xff0c;总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求&#xff0c;分别拉分页数据和totalCount。 最近我在思考&#xff1a; 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新&#xff0c;显而易见的优势&#xff1a; ① 能…

Halcon 算子汇总

gen_tuple_const(1000,1.5) 生成一个长度为1000&#xff0c;里面每一个数组元素都为1.5的数组 gen_tuple_const(100,chr(ord(a) 1)) 生成一个长度为100&#xff0c;里面每一个数组元素都为b的数组 ord函数是库函数&#xff0c;用于获取字符的ASCII值 chr(ord(a) 1) 结…

8.13-LVS的nat模式+DR模式

LVS 一、nat模式 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01&qu…

【14】二叉树的Morris等

目录 一.树形dp套路 二.派对的最大快乐值 三.Morris遍历 morris先序遍历 morris中序遍历 moris后序遍历 判断是不是搜索二叉树 四.额外习题 一.树形dp套路 情况1&#xff1a;最大距离&#xff0c;节点X不参与。 > 左树最大距离 or 右树最大距离 情况2&#xff1a;最…

html编写贪吃蛇页面小游戏(可以玩)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>贪吃蛇小游戏</title><style>body {…

【软件逆向】第2课,软件逆向安全工程师之区分应用32位和64位,每天5分钟学习逆向吧!

目标学习使用StudyPE区分应用 在软件逆向中区分应用类型是关键性的一部分 &#xff0c;只有区分类型后才能选择对应工具进行后续处理。 1.打开StudyPE工具。 2.将我们需要逆向的软件&#xff0c;拖拽到StudyPE中&#xff0c;查看应用信息。 以上用一款视觉AI软件举例&#…

Java设计模式-原型模式-一次性理解透

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. 前言2. 原型模式的主要角色2.1 原型接口或抽象类2.2 具体原型类2.3 客户端2.4 克隆方法 3. 原型模式使用场景3.1 创建对象是昂贵的3.2 对象的变化3.3 动态配置3.…

【STM32】DMA数据转运(存储器到存储器)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 DMA初始化框架 选择开启DMA通道 更改转运次数 DMA应用…

【第二节】80x86汇编-寄存器和标志位

目录 前言 一、汇编相关概念 1.1 数据表示与类型 1.2 汇编语言的构成 1.3 存储器及指令、数据 1.4 存储单元 1.5 CPU对存储器的读写操作 1.6 CPU读写内存单元的过程 1.7 intel CPU发展 1.8 8086 内部结构 二、寄存器 2.1 寄存器概览 2.2 32位寄存器 2.3 16位寄存器…

三维建模软件:地理信息与遥感领域的智慧构建者

在地理信息与遥感技术的广阔舞台中&#xff0c;建模软件如同一位卓越的建筑师&#xff0c;以数据为砖瓦&#xff0c;智慧为水泥&#xff0c;构建出一个又一个又一个逼真、动态的虚拟世界。本文将深入探究其技术核心、应用实例、未来趋势&#xff0c;揭示建模软件如何在地理信息…

《爱情,到此为止》票房大卖 贾斯汀巴尔多尼与布莱克莱弗利的矛盾升级 是真的还是炒作

布蕾克莱弗利&#xff0c;贾斯汀巴尔多尼 布莱克莱弗利凭借电影《我们的末日》在周末取得了票房成功&#xff0c;首映票房收入达 5000 万美元。在电影院困难时期&#xff0c;这是一个了不起的成就&#xff0c;但没有人谈论这一胜利——粉丝们对她与导演兼联合主演贾斯汀巴尔多…

排序(基数,堆,归并)

基数排序 定义0-9十个桶&#xff0c;先排序个数&#xff0c;在排序十位&#xff0c;依次向下&#xff08;桶就是二维数组&#xff09; 按照个位先排一次 个位已经有序了&#xff0c;桶内遵循先进先出 没有十位放到0里 取出 百位 这样排序就完成了。放进取出几次&#xff0c;取…

Flink Checkpoint expired before completing解决方法

在Flink消费Kafka日志的时候出现了这样的一则报错&#xff0c; JobManager报错如下&#xff1a; 2024-03-07 15:21:12,500 [Checkpoint Timer] WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [] - Failed to trigger or complete checkpoint 181 for …

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …