MySQL主从复制(基于GTID--事务ID方式)
目录
- 一、GTID相关概念
- 1.GTID 是什么?
- 2.GTID主从复制方式概念
- 3.GTID的优缺点
- 二、GTID工作原理
- 三、部署主从复制
- 四、测试同步
- 1.主库上新建数据库
- 2.从库上查看是否同步成功
- 五、重设从库
- 六、常见故障
- 七、故障切换
- 八、GTID的一些疑问
- 1.为什么基于GTID的同步也要打开bin-log?
- 2.GTID和Bin-log的方式对比
一、GTID相关概念
1.GTID 是什么?
关于gitd的介绍
- MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
- mysql数据库从5.6.5开始新增一种基于GDIT的复制方式。通过GDIT保证每个主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
- GTID (Global Transaction ID) 在整个事务流程中每一个事务 ID 是全局唯一的,且在整个主从复制架构中该 ID 都不会相同。
- GTID 实际上 是由 UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
- server_uuid:server_uuid 是在 Mysql 首次启动过程中自动生成的一个uuid(128位) 随机值,生成后会将该值存储到数据目录的auto.cnf 中。因为是随机值,所以不同服务器的 Mysql 的server_uuid 都是不相同的。
- transaction_id(tid):代表了该实例上已经提交的事务数量,是一个整数,初始值是 1 ,每次提交事务的时候分配给这个事务并加1 。
- GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。
2.GTID主从复制方式概念
- 基于 GTID 的主从复制方式的出现,主要是用于替换传统的日志点 复制方式。通过GTID 可以保证每个主库提交的事务在集群中都有 唯一 的一个事务 ID。
- 强化了数据库主从的一致性和故障恢复数据的容错能力,在主库 宕机发生主从切换 的情况下,GTID 方式可以让其他从库自动找到新主库复制的位置。
- 而且 GTID 可以忽略已经执行过的事务,减少了数据发生错误的概率。
- 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
- GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制;
- 在GTID中【slave】端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
3.GTID的优缺点
优点:
- 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的。
- 更简单的搭建主从复制,确保每个事务只会被执行一次。
- 一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
- GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
- 简单的实现 failover故障转移,不用以前那样在需要找 log_file 和 log_pos。
- 减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机
缺点:
- 主从库的表存储引擎必须是一致的
- 主从库的表存储引擎不一致,就会导致数据不一致。如果主从库的存储引擎不一致,例如一个是事务存储引擎,一个是非事务存储引擎,则会导致事务和 GTID 之间一对一的关系被破坏,结果就会导致基于 GTID 的复制不能正确运行;
- master:对一个innodb表做一个多sql更新的事物,效果是产生一个GTID。
- slave:假设对应的表是MYISAM引擎,执行这个GTID的第一个语句后就会报错,因为非事务引擎一个sql就是一个事务。
- 当从库报错时简单的stop slave; start slave;就能够忽略错误。
- 但是这个时候主从的一致性已经出现问题,需要手工的把slave差的数据补上,这里要将引擎调整为一样的,slave也改为事务引擎。
- 不允许一个SQL同时更新一个事务引擎和非事务引擎的表
- 事务中混合多个存储引擎,就会产生多个 GTID。当使用 GTID 时,如果在同一个事务中,更新包括了非事务引擎(如 MyISAM)和事务引擎(如 InnoDB)表的操作,可能会导致产生多个 GTID、主从复制数据不一致、从库复制中断等情况
- 在一个复制组中,必须要求统一开启GTID或是关闭GTID
- 不支持create table….select 语句复制(主库直接报错);
- create table xxx as select的语句,会被拆分为两部分,create语句和insert语句,但是如果想一次搞定,MySQL会抛出如下的错误。
- ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE … SELECT.
- create table xxx as select 的方式可以拆分成两部分,如下:
- create table xxxx like data_mgr;
- insert into xxxx select *from data_mgr;
二、GTID工作原理
- 当一个事务在主库端执行并提交时,产生 GTID,一同记录到 binlog 日志中。
- binlog 传输到 slave,并存储到 slave 的 relaylog 后,读取这个 GTID 的这个值设置 gtid_next 变量,即告诉 Slave,下一个要执行的 GTID 值。
- sql 线程从 relay log 中获取 GTID,然后对比 slave 端的 binlog 是否有该 GTID。
- 如果有记录,说明该 GTID 的事务已经执行,slave 会忽略。
- 如果没有记录,slave 就会执行该 GTID 事务,并记录该 GTID 到自身的 binlog。
如何判断复制方式GTID 还是 pos
Show slave status
查看Auto_Position字段:0是pos 方式, 1是gtid方式。
三、部署主从复制
架构图
1、准备环境两台机器,关闭防火墙和selinux;两台机器环境必须一致;时间也得一致!!!
192.168.221.136 mysql-master
192.168.221.138 mysql-slave
对时:
[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
//查看和ntp server的时间差异(需要外网访问,如果内网有ntpd服务器,自行替换域名为该服务的地址)
[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate -d cn.pool.ntp.org
//和 ntp 服务器同步时间
[root@localhost ~]# ntpdate cn.pool.ntp.org
2、两台机器安装mysql5.7(略)建议使用相同的安装方式
注意:
对主库已有的数据库不会进行自动同步。
主从同步之前,主库上已有数据库备份,需要在从库上手动导入同步。
开启 GTID 后的导出导入数据的注意点
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don’t want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events
#意思是: 当前数据库实例中开启了 GTID 功能, 在开启有 GTID 功能的数据库实例中, 导出其中任何一个库, 如果没有显示地指定–set-gtid-purged参数, 都会提示这一行信息。 意思是默认情况下, 导出的库中含有 GTID 信息, 如果不想导出包含有 GTID 信息的数据库, 需要显示地添加–set-gtid-purged=OFF参数。
mysqldump -uroot -p'' --set-gtid-purged=OFF --single-transaction --all-databases > /path/dbname.bak
mysqldump -uroot -p'' --set-gtid-purged=OFF --single-transaction -B 库名1 库名2 > /path/dbname.bak
在从库上导入单个数据库。
mysql -uroot -p'' 库名 < /path/dbname.bak
在从库上导入多个数据库。
mysql -uroot -p'' < /path/dbname.bak
master操作:
[root@mysql-master ~]# vim /etc/my.cnf //在[mysqld]下添加如下内容
server-id=1
log-bin = mylog //开启binlog日志,不指定绝对路径的话,yum安装方式产生在/var/lib/mysql/,二进制安装方式在/usr/local/mysql/data/
gtid_mode = on //在主从服务器上都打开gtid模式
enforce_gtid_consistency=1 //强制使用GTID一致性 consistency:一致性
sync_binlog = 1 //强制gtid
[root@mysql-master ~]# systemctl restart mysqld
主服务器创建账户:
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by 'JiannLt@123';
//注:生产环境中密码采用高级别的密码,实际生产环境中将'%'换成slave的ip
mysql> flush privileges;
注意:如果不成功删除以前的binlog日志
replication slave权限:这个权限用来给从服务器账号授予复制权限,从服务器可以从主服务器中读取二进制日志。
super权限:允许用户使用修改全局变量的SET语句以及CHANGE MASTER语句
reload权限:必须拥有reload权限,才可以执行flush [tables | logs | privileges]
slave操作:
[root@mysql-slave ~]# vim /etc/my.cnf //[mysqld]添加如下配置
server-id=2 //server-id每台服务器都不能一样,用于标识不同的MySQL服务器实例
gtid_mode = ON //打开gtid
enforce_gtid_consistency=1 //强制使用GTID一致性
master-info-repository=TABLE //将主服务器信息保存在mysql.slave_master_info表中
relay-log-info-repository=TABLE //将中继日志信息保存到mysql.slave_relay_log_info表中
[root@mysql-slave ~]# systemctl restart mysqld
[root@mysql-slave ~]# mysql -uroot -p'JiannLt@123' //登陆mysql
mysql> change master to #设置主从关系
master_host='192.168.221.136', #指定同步的主机
master_user='slave', #指定同步的账号
master_password='JiannLt@123', #指定slave的密码
master_auto_position=1; #开启自动同步位置模式
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> start slave; #启动slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G #查看状态,验证sql和IO是不是yes。
说明同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
四、测试同步
1.主库上新建数据库
#查看本机IP
mysql> select substring_index(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
+----------------+----------+
| ip | count(*) |
+----------------+----------+
| 192.168.221.136| 1 |
| localhost | 1 |
+----------------+----------+
2 rows in set (0.00 sec)
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
2.从库上查看是否同步成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
五、重设从库
#全在从库执行
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
#从库的binlog已经无效了,所以要执行这个命令清空binlog
mysql> change master to
master_host='192.168.221.136',
master_port=3306,
master_user='slave',
master_password='JiannLt@123',
master_auto_position=1;
#master_auto_position=1;表示是否自动获取主库的binary log坐标点,设置为1表示是。
mysql> start slave; #启动slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G #查看状态,验证sql和IO是不是yes。
六、常见故障
常见故障1:
Slave has more GTIDs than the master has,using the master’s SERVER_UUID
该问题代表从库获取到的GTID超过了主库,比如主库在未指定binlog文件名的同时修改了系统主机名,导致binlog全部被修改,从库就会判断失败;
解决方法如下:
#重设从库
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
mysql> change master to
master_host='192.168.221.136',
master_port=3306,
master_user='slave',
master_password='JiannLt@123',
master_auto_position=1;mysql> start slave;
常见故障2
如果从库未指定relaylog的同时修改了系统主机名,只需要在从库重新执行一次同步
mysql> stop slave;
mysql> reset slave;
mysql> change master to
master_host='192.168.221.136',
master_port=3306,
master_user='slave',
master_password='JiannLt@123',
master_auto_position=1;mysql> start slave;
常见故障3
Master_has_purged_require_gtids
主库提前删除了还未同步完成的binlog
解决方法如下:
#在主库上查看master信息
mysql> show master status\G;
*************************** 1. row ***************************File: mylog.000001Position: 605Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: cc9a32c5-4bc7-11ee-bdae-000c295e8b83:1-2
1 row in set (0.00 sec)#在从库上手动指定二进制日志文件master_log_file和位置master_log_pos与master上的一致
mysql > stop slave;
mysql > change master to
master_host='192.168.221.136',
master_user='slave',
master_password='JiannLt@123',
master_log_file='mylog.000001',
master_log_pos=605,
master_auto_position=0;mysql > start slave;
七、故障切换
mysql主从,主机故障或者宕机,如何进行切换?
1)在salve执行:
mysql> stop slave;
mysql> reset master;
2)查看是否只读模式,如果是只读需要将只读关闭:show variables like 'read_only';
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
3)查看
show slave status \G
show master status \G
4)在程序中将原来主库IP地址改为现在的从库IP地址,测试应用连接是否正常
八、GTID的一些疑问
1.为什么基于GTID的同步也要打开bin-log?
疑问:为什么基于gtid的主从复制也需要将bin-log日志打开,不是基于gtid的复制么?怎么还需要打开bin-log呢?
在 MySQL 中,全局事务 ID(GTID)确实用于主从复制,以确保主服务器(master)上的每个事务在所有从服务器(slave)上只被执行一次。然而,GTID 并不是日志记录本身,而是一个在主服务器上为每个事务生成的唯一标识符。
即使在使用 GTID 的情况下,我们也需要二进制日志(binlog)。下面是主要的原因:
- GTID本身并不保存binlog事件的具体内容,它只记录了每个event的全局唯一标识编号。这些修改内容还是记录在二进制日志中的。
- 主库也需要打开binlog,因为GTID信息是存放在binlog中的。如果主库关闭了binlog,就不能记录GTID,从而无法进行基于GTID的复制。
- GTID只是增加了一个全局事务ID,本质上还是基于二进制日志日志进行位置(基于日志偏移量)的复制。
- 从库想要真正进行同步复制,还需要根据GTID从主机拉取对应的binlog事件。
- 所以主库上binlog日志的记录和传递是基于GTID复制的基础。master需要将binlog写入磁盘,并通过binlog协议传递给slave。
- 基于GTID的优势在于,即使binlog日志被清理,也能通过GTID标识从任意位置恢复同步。
- 一些用来恢复容灾的操作,如从机POS(position),也需要在binlog中定位恰当的位置。
- 某些数据库操作如切换读写节点,也需要基于binlog中实际事件来完成数据一致性。
因此,即使在使用基于 GTID 的主从复制的情况下,也需要开启二进制日志,以便记录和复制数据更改,支持故障恢复,以及存储 GTID 信息。
2.GTID和Bin-log的方式对比
MySQL的二进制日志(binlog)和全局事务标识符(GTID)是MySQL复制中的两种不同机制,它们具有不同的特点和适用场景:
记录方式不同:
- binlog 通过 log file + log pos 来定位数据事件。
- GTID 使用全局唯一的事务ID来标识事件。
分配方式不同:
- binlog 是顺序分配的。
- GTID 可以随机分配,不依赖服务启动顺序。
故障恢复不同:
- binlog 需要使用备份+重放所有日志的方式进行恢复。
- GTID 可以只重放丢失的事务段的日志。
引用关系不同:
- binlog 无法判断事件顺序和依赖关系。
- GTID 可以明确事件顺序和事务之间的依赖。
重复数据处理不同:
- binlog 可能会重放重复数据。
- GTID 可以识别重复数据并自动跳过。
使用场景:
- Binlog 支持所有版本MySQL,更加兼容,适合常规的主从复制。
- GTID 可以更方便地进行故障恢复,分库分表也更简单,适合对数据一致性要求更高的场景。
综上,GTID 在事务管理上更强大,但需要MySQL 5.6以上版本。二者可以配合使用,发挥各自优势。
相关文章:

MySQL主从复制(基于GTID--事务ID方式)
目录 一、GTID相关概念1.GTID 是什么?2.GTID主从复制方式概念3.GTID的优缺点 二、GTID工作原理三、部署主从复制四、测试同步1.主库上新建数据库2.从库上查看是否同步成功 五、重设从库六、常见故障七、故障切换八、GTID的一些疑问1.为什么基于GTID的同步也要打开bi…...

3.72 Command Buffer及URP概述
一、Command Buffer 1.概念 CommandBuffer携带一系列的渲染命令,依赖相机,用来拓展渲染管线的渲染效果。而且可以指定在相机渲染的某个点执行本身的拓展渲染。Command buffers也可以结合屏幕后期效果使用。 简单来说就是可以在渲染流程中插入一些自定…...

分布式理论和分布式锁知识点总结
文章目录 (一) 分布式理论算法和协议1)CAP理论总结 2)BASE理论BASE 理论的核心思想基本可用软状态最终一致性 3)Paxos算法Basic Paxos 算法4) Raft算法1 拜占庭将军 5)Gossip协议 (二) 分布式锁分布式锁应该具备哪些条…...

IOC课程整理-17 Spring事件
1. Java 事件/监听器编程模型 2. 面向接口的事件/监听器设计模式 3. 面向注解的事件/监听器设计模式 4. Spring 标准事件-ApplicationEvent 5. 基于接口的 Spring 事件监听器 6. 基于注解的 Spring 事件监听器 7. 注册 Spring ApplicationListener 8. Spring 事件发布器 9. Spr…...

大数据Flink(一百零五):SQL性能调优
文章目录 SQL性能调优 一、 MiniBatch 聚合...

ESP8266,手机与电脑之间的TCP通讯
电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…...
vue的数据监听是如何实现的?
Vue的数据监听是通过数据劫持和发布订阅模式来实现的。 数据劫持:Vue通过使用Object.defineProperty()方法来劫持数据对象的属性,并使用getter和setter来监听属性的变化。当属性被修改时,setter方法会被调用,从而触发相应的监听函…...
埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka
埋点日志解决方案——GolangGinSarama VS JavaSpringCloudGatewayReactorKafka 之前我就写过几篇OpenRestylua-kafka-client将埋点数据写入Kafka的文章,如下: Lua将Nginx请求数据写入Kafka——埋点日志解决方案 python定时任务执行shell脚本切割Nginx…...
LeetCode 541 反转字符串 II 简单
题目 - 点击直达 1. 541 反转字符串 II 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 541 反转字符串 II 简单 1. 题目详情 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个…...

从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一…...
Android Studio Giraffe 添加 maven { url “https://jitpack.io“ }报错
Android Studio Giraffe 添加 maven { url “https://jitpack.io” }报错 settings.gradle.kts:13:21: Unexpected tokens (use ; to separate expressions on the same line)解决方法 新版maven写法发生了改变: maven { url uri("https://jitpack.io"…...

Linux C/C++ 实现网络流量分析(性能工具)
网络流量分析的原理基于对数据包的捕获、解析和统计分析,通过对网络流量的细致观察和分析,帮助管理员了解和优化网络的性能、提高网络安全性,并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中,网络流量可以…...
python门牌制作,统计某个数字出现的次数
题目: 小蓝要为一条街的住户制作门牌号。 这条街一共有 2022位住户,门牌号从 1 到 2022 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、…...

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …...

0030Java程序设计-积分管理系统论文
文章目录 摘 要**目 录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘 要 随着计算机和网络的不断革新,世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…...

H5游戏源码分享-考眼力游戏猜猜金币在哪
H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…...

2023 年值得关注的国外网络安全初创公司
网络安全初创公司试图解决的问题往往有点超前于主流。他们可以比大多数老牌公司更快地填补空白或新兴需求。初创公司通常可以更快地创新,因为它们不受安装基础的限制。 当然,缺点是初创公司往往缺乏资源和成熟度。公司致力于初创公司的产品或平台是有风…...

搞定蓝牙-第六篇(HID
搞定蓝牙-第六篇(HID) ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现,电脑连接了蓝牙键盘就可以直接使用了,不需要配置任何东西,那么,这两者是怎么通讯的呢。我们使用的电脑windows系统内…...

Open3D(C++) 最小二乘拟合平面(直接求解法)
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 平面方程的一般表达式为: A x + B y + C...
lua移植及使用
编译环境:Ubuntu16.04 64位 交叉编译工具:arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. lua开源版本选择3. 封装代码3.1 源码简介3.2 封装类3.2.1 头文件3.2.2 类的实现3.3.3 sample代码 1. 项目背景 使用lua脚本,读取key对应的值&#x…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...