DM 的断点续传测试

作者: 大鱼海棠 原文来源: https://tidb.net/blog/4540ae34

一、概述

DM有all、full、incremental三种数据迁移同步方式(task-mode),在all同步模式下,因一些特殊情况,需要变更上游MySQL的数据源IP,一般有如下几种处理方式:

  1. 放弃已同步的数据,重新用all模式同步(适合数据量比较小的场景,操作简单)
  2. 记录同步到的位点信息,停掉task和数据源,将同步模式改为incremental并在task配置中指定MySQL示例的位点信息重新拉起任务

task中meta配置下游数据库的 checkpoint 不存在时 binlog 迁移开始的位置; 如果 checkpoint 存在,则以 checkpoint 为准。如果 meta 项和下游数据库的 checkpoint 都不存在,则从上游当前最新的 binlog 位置开始迁移

  1. 不修改task-mode的情况下,基于检查点断点续传, 本文主要基于该场景测试

二、MySQL环境准备

mysql

set global validate_password_mixed_case_count=0;
set global validate_password_policy='LOW'; 
set global validate_password_number_count=0; 
set global validate_password_special_char_count=0;
set global validate_password_length=4;
alter user root@'localhost' identified by 'dm_test'; 

配置文件

[mysqld]                                                                                                                                                                        
datadir=/mysql57/data                                                                                                                                                           
socket=/var/lib/mysql/mysql.sock                                                                                                                                                
symbolic-links=0                                                                                                                                                                
binlog_format=ROW                                                                                                                                                               
log_bin=/mysql57/logbin/logbin                                                                                                                                                  
log-error=/mysql57/log/mysqld.log                                                                                                                                               
pid-file=/var/run/mysqld/mysqld.pid                                                                                                                                             
gtid_mode=ON                                                                                                                                                                    
enforce_gtid_consistency=ON  
# 主从使用不同的server_id                                                                                                                                                   
server_id=2 
# 从库开启binlog记录                                                                                                                                                                 
log-slave-updates = 1

主从搭建

reset master;
change master to master_host='172.1.1.4', master_user='root', master_password='dm_test', master_port=3306, master_auto_position=1;
start slave;
show slave status\G

三、DM任务创建

1. 创建数据源

创建数据源配置文件

[tidb@vm10-2-103-112 ~]$ cat source-01.yaml                                                                                                                                     
source-id: "mysql-01"
enable-gtid: true                                                                                                                                                           
                                                                                                                                                                                
from:                                                                                                                                                                           
  host: "172.1.1.2"                                                                                                                                                          
  port: 3306                                                                                                                                                                    
  user: "root"                                                                                                                                                                  
  password: "dm_test" 

上游数据源账户所需权限

上游数据源用户所需权限:

  1. information_schem和需要同步的表的select权限
  2. reload权限
  3. REPLICATION CLIENT、REPLICATION SLAVE

创建数据源

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source create ./source-01.yaml

查看创建的数据源

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 config source mysql-01

2. 创建同步任务

task配置文件准备

vim task01.yaml

name: test1                      
task-mode: all                  
shard-mode: "pessimistic"       
                               
meta-schema: "dm_meta1"          
# timezone: "Asia/Shanghai"     

case-sensitive: false           
online-ddl: true               
clean-dump-file: true           # 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件
collation_compatible: "loose"   # 同步 CREATE 语句中缺省 Collation 的方式,可选 "loose" 和 "strict",默认为 "loose"。"loose" 模式不会显式补充上游缺省的 Collation,"strict" 会显式补充上游缺省的 Collation。当使用 "strict" 模式,但下游不支持上游缺省的 Collation 时,下游可能会报错。
ignore-checking-items: []       

target-database:
  host: "172.1.1.4"
  port: 4000
  user: "dm_test"
  password: "dm_test"  

block-allow-list:                    
  bw-rule-1:                         
    do-dbs: ["dm_test.*"]

mydumpers:                           
  global:                            
    threads: 4                       
    chunk-filesize: 64               
    extra-args: "--consistency auto" 

loaders:                             
  global:                            
    pool-size: 16
    dir: "./dumped_data"
    import-mode: "logical"
    on-duplicate-logical: "replace"

syncers:                             
  global:                            
    worker-count: 16                 
    batch: 100                       
    safe-mode: false
    safe-mode-duration: "60s"
    compact: false
    multiple-rows: false
# ----------- 实例配置 -----------
mysql-instances:
  -
    source-id: "mysql-01"
    block-allow-list:  "bw-rule-1"

    mydumper-config-name: "global"
    loader-config-name: "global"
    syncer-config-name: "global"

下游tidb同步用户所需权限:

  1. 待同步库表的SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、INDEX权限
  2. dm元数据库表的 ALL 权限

前置检查

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 check-task ./task01.yaml

创建task

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 start-task ./task01.yaml

查看同步状态

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 query-status test1

四、单实例更换数据源IP

验证不修改task配置,直接更换数据源IP

1. 不修改source-id

Stop 任务和数据源

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 stop-task test1 
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source stop mysql-01

仅修改数据源IP

source-id: "mysql-01"                                                                                                                                                           
enable-gtid: true                                                                                                                                                               
                                                                                                                                                                                
from:                                                                                                                                                                           
  host: "120.1.1.115"                                                                                                                                                         
  port: 3306                                                                                                                                                                    
  user: "root"                                                                                                                                                                  
  password: "dm_test"

创建数据源和task

tiup dmctl:v7.1.3 --master-addr 172.16.201.4:8261 operate-source create  ./source-01.yaml
tiup dmctl:v7.1.3 --master-addr 172.16.201.4:8261 start-task ./task01.yaml 
tiup dmctl:v7.1.3 --master-addr 172.16.201.4:8261 query-status test1

验证同步无异常

不改变source-id的情况下,dm会去元数据表中找到断点,进行断点续传,不会重新dump数据

2. 修改source-id

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 stop-task test1 
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source stop mysql-01

修改数据源IP和source-id

source-id: "mysql-02"                                                                                                                                                           
enable-gtid: true                                                                                                                                                               
                                                                                                                                                                                
from:                                                                                                                                                                           
  host: "172.1.1.2"                                                                                                                                                          
  port: 3306                                                                                                                                                                    
  user: "root"                                                                                                                                                                  
  password: "dm_test"

创建数据源和task

需要修改task01.yaml的数据源

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source create  ./source-01.yaml
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 start-task ./task01.yaml 
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 query-status test1

验证同步无异常

修改了source-id的情况下,会触发重新dump全量数据

3. 更换IP期间新增了表

在停掉task和数据源后,模拟MySQL增加表和数据(只修改数据源IP)

mysql> create table t3(id int primary key,b int);                                                                                                                               
Query OK, 0 rows affected (0.04 sec)                                                                                                                                            
                                                                                                                                                                                
mysql> insert into t3 values (1,1);                                                                                                                                             
Query OK, 1 row affected (0.01 sec)                                                                                                                                             
                                                                                                                                                                                
mysql> insert into t3 values (2,1);                                                                                                                                             
Query OK, 1 row affected (0.01 sec) 

修改数据源IP后,创建task

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source create  ./source-01.yaml
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 start-task ./task01.yaml
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 query-status test1 

同步无异常,未dump全量数据

检查点分为针对单表的同步位点和数据源的同步位点,如果存在当前表的位点,则基于位点继续同步,如不存在,基于数据源位点往后同步

五、分片集群修改数据源IP

环境准备

基于单实例的环境,新增MySQL节点来测试

数据源配置

source-id: "mysql-04"                                                                                                                                                           
enable-gtid: true                                                                                                                                                               
                                                                                                                                                                                
from:                                                                                                                                                                           
  host: "172.1.1.4"                                                                                                                                                          
  port: 3306                                                                                                                                                                    
  user: "root"                                                                                                                                                                  
  password: "dm_test" 

task配置

name: test2                                                                                                                                                                     
task-mode: all                                                                                                                                                                  
shard-mode: "pessimistic"                                                                                                                                                       
                                                                                                                                                                                
meta-schema: "dm_meta2"                                                                                                                                                         
# timezone: "Asia/Shanghai"                                                                                                                                                     
                                                                                                                                                                                
case-sensitive: false                                                                                                                                                           
online-ddl: true                                                                                                                                                                
clean-dump-file: false           # 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件                                                     
collation_compatible: "loose"   # 同步 CREATE 语句中缺省 Collation 的方式,可选 "loose" 和 "strict",默认为 "loose"。"loose" 模式不会显式补充上游缺省的 Collation,"strict" 会显
式补充上游缺省的 Collation。当使用 "strict" 模式,但下游不支持上游缺省的 Collation 时,下游可能会报错。                                                                         
ignore-checking-items: []                                                                                                                                                       
                                                                                                                                                                                
target-database:                                                                                                                                                                
  host: "172.1.1.4"                                                                                                                                                          
  port: 4000                                                                                                                                                                    
  user: "dm_test"                                                                                                                                                               
  password: "dm_test"                                                                                                                                                           
                                                                                                                                                                                
block-allow-list:                                                                                                                                                               
  bw-rule-1:                                                                                                                                                                    
    do-dbs: ["dm_test"]                                                                                                                                                      
                                                                                                                                                                                
mydumpers:                                                                                                                                                                      
  global:                                                                                                                                                                       
    threads: 4                                                                                                                                                                  
    chunk-filesize: 64                                                                                                                                                          
    extra-args: "--consistency auto"                                                                                                                                            
                                                                                                                                                                                
loaders:                                                                                                                                                                        
  global:                                                                                                                                                                       
    pool-size: 16                                                                                                                                                               
    dir: "./dumped_data"                                                                                                                                                        
    import-mode: "logical"                                                                                                                                                      
    on-duplicate-logical: "replace"                                                                                                                                             
                                                                                                                                                                                
syncers:                                                                                                                                                                        
  global:                                                                                                                                                                       
    worker-count: 16                                                                                                                                                            
    batch: 100                                                                                                                                                                  
    safe-mode: false                                                                                                                                                            
    safe-mode-duration: "60s"                                                                                                                                                   
    compact: false                                                                                                                                                              
    multiple-rows: false                                                                                                                                                        
# ----------- 实例配置 -----------                                                                                                                                              
mysql-instances:                                                                                                                                                                
  -                                                                                                                                                                             
    source-id: "mysql-04"                                                                                                                                                       
    block-allow-list:  "bw-rule-1"                                                                                                                                              
                                                                                                                                                                                
    mydumper-config-name: "global"                                                                                                                                              
    loader-config-name: "global"                                                                                                                                                
    syncer-config-name: "global"  

创建数据源和任务

tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 operate-source create  ./source-02.yaml                                                                                
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 start-task ./task01.yaml                                                                                               
tiup dmctl:v7.1.3 --master-addr 172.1.1.4:8261 query-status test2 

重复单实例数据源IP修改过程,验证结果与单实例一致

六、总结

断点续传来源于dm元数据信息(dm_meta库的表记录信息),主要包含以下几点

  1. task.yaml的name的值
  2. task.yaml的meta-schema是否改变
  3. 数据源配置中source-id是否改变

如有其他变更项,可结合检查点进行分析,通过检查点信息是否改变来判断是否可以断点续传

前提:

  1. 使用 query-status 命令获取当前 binlog replication 处理单元已复制到下游的 binlog 对应的 GTID sets ( syncerBinlogGtid ),记为 gtid-S

  2. 在将要切换到的 MySQL 实例上使用 SELECT @@GLOBAL.gtid_purged; 获取已经被 purged 的 binlog 对应的 GTID sets,记为 gtid-P

  3. 在将要切换到的 MySQL 实例上使用 SELECT @@GLOBAL.gtid_executed; 获取所有已经执行成功的事务对应的 GTID sets,记为 gtid-E

  4. 确保满足以下关系,否则不支持将 DM-worker 连接切换到相应的 MySQL 实例:

    1. gtid-S 包含 gtid-P gtid-P 可以为空)
    2. gtid-E 包含 gtid-S

七、附加测试

1. 测试一

数据源的配置文件默认 enable-gtid: false ,现验证同步过程中,是否可修改该参数

验证修改后同步正常,在 enable-gtid: false 情况下,检查点会同时携带position信息和gitd信息,修改后可基于位点断点续传

2. 测试二

DM配置文件 extra-args: "--consistency none" 默认值为none,none的官网解释是不做一致性保障

none模式下

2024-06-21T08:23:44.159963Z     18511 Query     SELECT @@max_allowed_packet                                                                                                     
2024-06-21T08:23:44.160052Z     18511 Query     SET time_zone = '+08:00'                                                                                                        
2024-06-21T08:23:44.160149Z     18511 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ                                                                         
2024-06-21T08:23:44.160242Z     18511 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */                                                                          
2024-06-21T08:23:44.160343Z     18511 Query     SHOW MASTER STATUS                                                                                                              
2024-06-21T08:23:44.160534Z     18511 Query     SHOW SLAVE STATUS                                                                                                               
2024-06-21T08:23:44.160731Z     18511 Query     SHOW DATABASES                                                                                                                  

2024-06-21T08:23:44.161956Z     18511 Query     SELECT COUNT(1) as c FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='SEQUENCE'                                                 
2024-06-21T08:23:44.171027Z     18511 Query     SHOW TABLE STATUS FROM `dm_test`                                                                                             
2024-06-21T08:23:44.174675Z     18511 Query     SHOW MASTER STATUS                                                                                                              
2024-06-21T08:23:44.174826Z     18511 Query     SHOW CREATE DATABASE `dm_test`                                                                                               
2024-06-21T08:23:44.174981Z     18511 Query     SHOW COLUMNS FROM `dm_test`.`customer`                                                                                       
2024-06-21T08:23:44.175584Z     18511 Query     SELECT `c_id`,`c_d_id`,`c_w_id`,`c_first`,`c_middle`,`c_last`,`c_street_1`,`c_street_2`,`c_city`,`c_state`,`c_zip`,`c_phone`,`c_
since`,`c_credit`,`c_credit_lim`,`c_discount`,`c_balance`,`c_ytd_payment`,`c_payment_cnt`,`c_delivery_cnt`,`c_data` FROM `dm_test`.`customer` LIMIT 1                        
2024-06-21T08:23:44.178285Z     18511 Query     SHOW CREATE TABLE `dm_test`.`customer`                                                                                       
2024-06-21T08:23:44.178529Z     18511 Query     SHOW INDEX FROM `dm_test`.`customer`                                                                                         
2024-06-21T08:23:44.178805Z     18511 Query     EXPLAIN SELECT `c_w_id` FROM `dm_test`.`customer`                                                                            
2024-06-21T08:23:44.179002Z     18511 Query     SHOW INDEX FROM `dm_test`.`customer`                                                                                         
2024-06-21T08:23:44.179269Z     18511 Query     SHOW INDEX FROM `dm_test`.`customer`                                                                                         
2024-06-21T08:23:44.179510Z     18511 Query     EXPLAIN SELECT `c_w_id` FROM `dm_test`.`customer`                                                                            
2024-06-21T08:23:44.179748Z     18511 Query     SELECT MIN(`c_w_id`),MAX(`c_w_id`) FROM `dm_test`.`customer` 

2024-06-21T08:23:44.173952Z     18512 Query     SELECT @@max_allowed_packet                                                                                                     
2024-06-21T08:23:44.174104Z     18512 Query     SET time_zone = '+08:00'                                                                                                        
2024-06-21T08:23:44.174281Z     18512 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ                                                                         
2024-06-21T08:23:44.174546Z     18512 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */                                                                          
2024-06-21T08:23:44.182494Z     18512 Query     SELECT `c_id`,`c_d_id`,`c_w_id`,`c_first`,`c_middle`,`c_last`,`c_street_1`,`c_street_2`,`c_city`,`c_state`,`c_zip`,`c_phone`,`c_
2024-06-21T08:23:45.888538Z     18512 Query     SELECT `d_id`,`d_w_id`,`d_name`,`d_street_1`,`d_street_2`,`d_city`,`d_state`,`d_zip`,`d_tax`,`d_ytd`,`d_next_o_id` FROM `dm_test`.`district` ORDER BY `d_w_id`,`d_id`                                                                                                                                        
2024-06-21T08:23:45.889394Z     18512 Query     SELECT `h_c_id`,`h_c_d_id`,`h_c_w_id`,`h_d_id`,`h_w_id`,`h_date`,`h_amount`,`h_data` FROM `dm_test`.`history` WHERE `h_w_id` IS NULL OR (`h_w_id` >= 1 AND `h_w_id` < 11)                                                                                                                                    
2024-06-21T08:23:46.281664Z     18512 Query     SELECT `i_id`,`i_im_id`,`i_name`,`i_price`,`i_data` FROM `dm_test`.`item` ORDER BY `i_id`                                    
2024-06-21T08:23:46.352202Z     18512 Query     SELECT `no_o_id`,`no_d_id`,`no_w_id` FROM `dm_test`.`new_order` ORDER BY `no_w_id`,`no_d_id`,`no_o_id`                         

image.png

image.png

none模式使用 SESSION RR 隔离级别 和 START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ 来构建一致性视图,不存在非事务引擎表的时候,操作比FTWRL轻量

注意:

  1. 备份期间有DDL的话,有几率触发锁等待,原因为DM开启了两个 START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ SESSION ,一个用来看表结构、构造导出执行计划、查看索引等;另外一个用来dump数据,如果期间有DDL,有几率出现等MDL锁的情况(图一)
  2. 不开启FTWRL的话,那么backupmeta的gtid信息有可能是不准的(show master status获取的是当前值,不受 START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ 限制)。备份文件 metadata 记录的位点可能比 dumped data 要早,可以开启safe-mode来规避(不能完全避免),DM会自行记录两次 show master status 位点信息来判断是否进入safe-mode,以及何时退出safe-mode。

auto模式下

2024-06-21T09:31:56.773773Z     18684 Connect   root@vm10-2-103-3 on  using SSL/TLS                                                                                             
2024-06-21T09:31:56.776319Z     18684 Query     SELECT version()                                                                                                                
2024-06-21T09:31:56.776529Z     18684 Query     FLUSH TABLES WITH READ LOCK                                                                                                     
2024-06-21T09:31:56.778052Z     18684 Query     UNLOCK TABLES                                                                                                                   
2024-06-21T09:31:56.778166Z     18684 Query     SET SESSION time_zone = '+08:00'                                                                                                
2024-06-21T09:31:56.778236Z     18684 Quit                                                                                                                                      
2024-06-21T09:31:56.780010Z     18685 Connect   root@vm10-2-103-3 on  using SSL/TLS                                                                                             
2024-06-21T09:31:56.780202Z     18685 Query     SET time_zone = '+08:00'                                                                                                        
2024-06-21T09:31:56.780405Z     18685 Query     FLUSH TABLES WITH READ LOCK                                                                                                     
2024-06-21T09:31:56.783146Z     18686 Connect   root@vm10-2-103-3 on  using SSL/TLS                                                                                             
2024-06-21T09:31:56.783335Z     18686 Query     SET time_zone = '+08:00'                                                                                                        
2024-06-21T09:31:56.783421Z     18686 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ                                                                         
2024-06-21T09:31:56.783518Z     18686 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */                                                                          
2024-06-21T09:31:56.783611Z     18686 Query     SHOW MASTER STATUS                                                                                                              
2024-06-21T09:31:56.783755Z     18686 Query     SHOW SLAVE STATUS                                                                                                               
2024-06-21T09:31:56.786107Z     18686 Query     SHOW DATABASES                                                                                                                  
2024-06-21T09:31:56.786563Z     18686 Query     SELECT COUNT(1) as c FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='SEQUENCE'                                                 
2024-06-21T09:31:56.916141Z     18686 Query     SHOW TABLE STATUS FROM `dm_test`                                                                                             
2024-06-21T09:31:56.919220Z     18687 Connect   root@vm10-2-103-3 on  using SSL/TLS                                                                                             
2024-06-21T09:31:56.919398Z     18687 Query     SET time_zone = '+08:00'                                                                                                        
2024-06-21T09:31:56.919483Z     18687 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ                                                                         
2024-06-21T09:31:56.919570Z     18687 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */                                                                          
2024-06-21T09:31:56.919726Z     18685 Query     UNLOCK TABLES                   

相对于mysqldump少了flush table的步骤(mysqldump在执行FTWRL前会执行flush tables),直接执行了FTWRL,第一次做权限探测,第二次执行备份

结论

结合业务应用情况综合考虑,选择auto/none模式

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

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

相关文章

【解释】i.MX6ULL_IO_电气属性说明

【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞&#xff08;Hysteresis&#xff09;是什么&#xff1f;1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 03

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econom…

Analyze an ORA-12801分析并行 parallel 12801 实际原因

"ORA-06512: at "PKG_P_DATA", line 19639 ORA-06512: at "PKG_P_DATA", line 19595 ORA-06512: at "PKG_P_DATA", line 14471-JOB 调用 -ORA-12801: error signaled in parallel query server P009, instance rac2:dwh2 (2) Error: ORA-12…

Python实现无头浏览器采集应用的反爬虫与反检测功能解析与应对策略

Python实现无头浏览器采集应用的反爬虫与反检测功能解析与应对策略 随着网络数据的快速增长&#xff0c;爬虫技术在数据采集、信息分析和业务发展中扮演着重要的角色。然而&#xff0c;随之而来的反爬虫技术也在不断升级&#xff0c;给爬虫应用的开发和维护带来了挑战。为了应…

Linux多进程和多线程(三)进程间通讯-信号处理方式和自定义处理函数

进程间通信之信号 信号信号的种类 信号在操作系统中的定义如下: 信号的处理流程在 Linux 中对信号的处理⽅式 自定义信号处理函数 信号的发送 kill() 函数:raise() 函数: 示例 : 创建⼀个⼦进程&#xff0c;⼦进程通过信号暂停&#xff0c;⽗进程发送 终⽌信号等待信号 pause()…

【嵌入式Linux】<总览> 多线程(更新中)

文章目录 前言 一、多线程 1. 概述 2. 创建线程 3. 线程退出 4. 线程回收 5. 线程分离 6. 线程取消 7. 线程的ID比较 二、线程同步 前言 记录学习多线程的知识重点与难点&#xff0c;若涉及版权问题请联系本人删除&#xff01; 一、多线程 1. 概述 线程是轻量级的…

期末考试后班主任如何发布学生成绩?

期末考试成绩一出&#xff0c;家长们便急切地想要了解孩子的学习情况。以往&#xff0c;老师们需要一个个私信家长&#xff0c;将成绩单发送出去&#xff0c;这项工作既繁琐又耗时。期末之际&#xff0c;老师们的工作本就繁重&#xff0c;如何有效减轻他们的负担&#xff0c;让…

构建现代医疗:互联网医院系统源码与电子处方小程序开发教学

本篇文章&#xff0c;笔者将探讨互联网医院系统的源码结构和电子处方小程序的开发&#xff0c;帮助读者更好地理解和掌握这些前沿技术。 一、互联网医院系统源码结构 互联网医院系统通常由多个模块组成&#xff0c;每个模块负责不同的功能。以下是一个典型的互联网医院系统的主…

【云原生】Prometheus 使用详解

目录 一、前言 二、服务监控概述 2.1 什么是微服务监控 2.2 微服务监控指标 2.3 微服务监控工具 三、Prometheus概述 3.1 Prometheus是什么 3.2 Prometheus 特点 3.3 Prometheus 架构图 3.3.1 Prometheus核心组件 3.3.2 Prometheus 工作流程 3.4 Prometheus 应用场景…

Linux 进程信号篇

文章目录 1. 生活中的信号2. 信号的概念3. 信号的产生3.1 系统调用3.2 软件条件3.2 异常3.3 Core和Term的区别 4. 信号的保存5. 信号的处理5.1 地址空间的进一步理解5.2 键盘输入数据的过程5.3 理解OS如何正常运行5.3.1 OS如何运行5.3.2 如何理解系统调用 5.4 内核态和用户态 6…

容器技术-docker4

一、docker资源限制 在使用 docker 运行容器时&#xff0c;一台主机上可能会运行几百个容器&#xff0c;这些容器虽然互相隔离&#xff0c;但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制&#xff0c;那么容器之间会互相影响&#xff0c;小的来说…

容器技术-docker2

容器化技术Docker Docker介绍 官网&#xff1a; docker.io docker.com 公司名称&#xff1a;原名dotCloud 14年改名为docker 容器产品&#xff1a;docker 16年已经被更名为Moby docker-hub docker.io docker容器历史 和虚拟机一样&#xff0c;容器技术也是一种资源隔…

为什么前端传了token,后端一直获取不到?一直报跨域错误?

这是我的前端代码 这是我的后端拦截器 那就需要了解一下 预检请求 对于非简单请求&#xff08;如PUT、DELETE或包含自定义HTTP头的请求&#xff09;&#xff0c;浏览器会先发送一个OPTIONS请求到目标服务器&#xff0c;询问是否允许该跨域请求。这个过程称为预检请求。 当opt…

(超详细)数据结构——“栈”的深度解析

前言&#xff1a; 在前几章我们介绍了线性表的基本概念&#xff0c;也讲解了包括顺序表&#xff0c;单链表&#xff0c;双向链表等线性表&#xff0c;相信大家已经对线性表比较熟悉了&#xff0c;今天我们要实现线性表的另一种结构——栈。 1.栈的概念 栈&#xff1a;一种特殊…

熊猫烧香是什么?

熊猫烧香&#xff08;Worm.WhBoy.cw&#xff09;是一种由李俊制作的电脑病毒&#xff0c;于2006年底至2007年初在互联网上大规模爆发。这个病毒因其感染后的系统可执行文件图标会变成熊猫举着三根香的模样而得名。熊猫烧香病毒具有自动传播、自动感染硬盘的能力&#xff0c;以及…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-39实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

39实战Kaggle比赛&#xff1a;狗的品种识别&#xff08;ImageNet Dogs&#xff09; 比赛链接&#xff1a;Dog Breed Identification | Kaggle 1.导入包 import torch from torch import nn import collections import math import os import shutil import torchvision from…

x-file-storage一行代码进行文件上传,摆脱阿里云,腾讯云,华为云等不同云的学习,简单高效

问题&#xff1a; 不使用x-file-storage时如果使用某个云首先需要学习他的sdk,这样很麻烦&#xff0c;而x-file-storage集成了各种云的上传&#xff0c;只需要进行配置即可一行代码进行上传 使用 官方地址&#xff1a;X File Storage 一行代码将文件存储到本地、FTP、SFTP、…

【小沐学AI】Python实现语音识别(whisperX)

文章目录 1、简介1.1 whisper1.2 whisperX 2、安装2.1 安装cuda2.2 安装whisperX 结语 1、简介 1.1 whisper https://arxiv.org/pdf/2212.04356 https://github.com/openai/whisper Whisper 是一种通用语音识别模型。它是在各种音频的大型数据集上训练的&#xff0c;也是一个…

时间复杂度计算

要求算法的时间复杂度时&#xff0c;我们可以分析给定表达式 的阶。让我们来逐步分析&#xff1a; 分析阶的定义&#xff1a; 当我们说一个表达式的时间复杂度是 ( O(g(n)) )&#xff0c;我们指的是当 ( n ) 趋近无穷大时&#xff0c;表达式的增长率与 ( g(n) ) 的增长率相似。…

两数之和你会,三数之和你也会吗?o_O

前言 多少人梦想开始的地方&#xff0c;两数之和。 但是今天要聊的不是入门第一题&#xff0c;也没有面试官会考这一题吧…不会真有吧&#xff1f; 咳咳不管有没有&#xff0c;今天的猪脚是它的兄弟&#xff0c;三数之和&#xff0c;作为双指针经典题目之一&#xff0c;也是常…