当前位置: 首页 > news >正文

MariaDB Galera 原理及用例说明

一、底层原理

MariaDB Galera 集群是一种基于同步多主架构的高可用数据库解决方案,适合需要高并发、低延迟和数据强一致性的场景。以下是部署和配置 MariaDB Galera 集群的简明步骤:


1. 环境准备

  • 节点要求:至少 3 个节点(奇数节点避免脑裂),确保网络互通。

  • 系统环境:所有节点使用相同操作系统(如 CentOS 7/8、Ubuntu 20.04+)。

  • 依赖安装

    bash

    复制

    # CentOS
    sudo yum install -y mariadb-server galera# Ubuntu
    sudo apt-get install -y mariadb-server galera

2. 配置 MariaDB Galera 集群

修改配置文件 (/etc/my.cnf.d/server.cnf 或 /etc/mysql/mariadb.conf.d/60-galera.cnf)

ini

复制

[galera]
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so# 集群名称(所有节点一致)
wsrep_cluster_name = "my_galera_cluster"# 当前节点IP和其他节点IP列表(以逗号分隔)
wsrep_cluster_address = "gcomm://node1_ip,node2_ip,node3_ip"# 当前节点名称(唯一)
wsrep_node_name = "node1"# 当前节点地址
wsrep_node_address = "node1_ip"# 同步方法(推荐使用 mariabackup)
wsrep_sst_method = mariabackup# SST 认证信息(所有节点一致)
wsrep_sst_auth = "sst_user:sst_password"# InnoDB 配置(调整缓冲池大小)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
创建 SST 用户(在每个节点的 MariaDB 中执行)

sql

复制

CREATE USER 'sst_user'@'localhost' IDENTIFIED BY 'sst_password';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sst_user'@'localhost';

3. 启动集群

  • 首次启动第一个节点(引导集群):

    bash

    复制

    sudo systemctl stop mariadb
    sudo galera_new_cluster
    sudo systemctl start mariadb
  • 启动其他节点

    bash

    复制

    sudo systemctl restart mariadb

4. 验证集群状态

  • 检查集群节点数

    sql

    复制

    SHOW STATUS LIKE 'wsrep_cluster_size';

    输出应为 3(假设有 3 个节点)。

  • 检查集群健康状态

    sql

    复制

    SHOW STATUS LIKE 'wsrep_%';

    关键指标:

    • wsrep_readyON(节点可读写)

    • wsrep_connectedON(节点已连接)

    • wsrep_cluster_statusPrimary(正常状态)


5. 常见操作

添加新节点
  1. 在新节点上配置相同的 /etc/my.cnf

  2. 直接启动 MariaDB:

    bash

    复制

    sudo systemctl start mariadb
安全关闭集群
  • 关闭最后一个节点

    bash

    复制

    sudo systemctl stop mariadb

6. 故障排查

  • 日志位置/var/log/mysql/error.log 或 /var/log/mariadb/mariadb.log

  • 常见问题

    • 节点无法加入集群:检查防火墙是否开放端口(3306, 4567, 4568, 4444)。

    • SST 失败:确认 wsrep_sst_auth 的用户名密码正确。

    • 脑裂问题:强制重启少数节点并重新加入集群。


7. 优化建议

  • 网络:确保节点间低延迟(建议内网专用网络)。

  • 负载均衡:使用 HAProxy 或 ProxySQL 分发读请求。

  • 监控:集成 Prometheus + Grafana 监控 wsrep 指标。


参考链接

  • MariaDB Galera 官方文档

  • Galera Cluster 配置参数详解

如有具体问题(如错误日志内容),可提供详细信息进一步分析!

底层原理

已深度思考(用时 24 秒)

嗯,用户之前问了关于MariaDB Galera集群的部署步骤,现在他们又询问“底层原理”。这说明用户已经完成了初步的配置,现在想更深入地了解集群是如何工作的。作为新手,用户可能在使用过程中遇到了一些问题,或者想优化集群性能,因此需要理解背后的机制。

首先,用户可能想知道Galera集群和传统的主从复制有什么不同。传统的主从是异步的,而Galera是同步多主,这对数据一致性很重要。用户可能关心数据如何同步,以及为什么Galera能保证强一致性。

接下来,用户可能对Galera的核心组件感兴趣,比如wsrep API、组通信(gcomm)和认证器。他们可能听说过这些术语,但不清楚具体作用。需要解释每个部分的功能,以及它们如何协作实现数据同步。

另外,关于事务的流程,用户可能想知道一个事务在提交时如何在集群中传播,确认机制是怎样的。这里需要详细说明事务的认证和应用过程,以及为什么需要多数节点确认。

SST和IST的区别也是关键点。用户可能在扩容或恢复节点时遇到过全量同步和增量同步的问题,需要解释这两种同步方式的适用场景和原理。

脑裂问题可能让用户头疼,特别是在网络分区时。用户想知道Galera如何通过Quorum和权重配置来避免脑裂,以及出现问题时如何恢复。

高可用性和数据一致性之间的平衡也是用户关心的。Galera的同步复制虽然保证了强一致性,但可能影响性能,用户需要了解背后的机制和可能的优化方法。

最后,用户可能想了解Galera的局限,比如对DDL操作的支持、写扩展问题以及网络延迟的影响。这些信息能帮助他们合理设计架构,避免潜在问题。

在回答时,需要保持逻辑清晰,用简单的类比帮助理解,比如将认证过程比作议会投票,或者用快递包裹来解释事务传输。同时,结合用户之前的部署步骤,指出原理部分如何影响实际配置和故障处理,比如wsrep_cluster_address的配置或SST用户设置。

总结来说,用户需要的是从基础概念到工作机制的全面解析,帮助他们不仅知道如何配置,还能理解为什么这样配置,以及如何应对可能出现的问题。这有助于他们更好地维护和优化Galera集群,提升系统的稳定性和性能。

MariaDB Galera 集群的底层原理基于 同步多主复制(Synchronous Multi-Master Replication),通过 Galera Library 实现数据一致性、高可用性和分布式事务处理。以下是其核心原理的深入解析:


1. 核心组件与架构

**(1) WriteSet Replication (wsrep) API
  • 作用:Galera 基于 wsrep API 实现节点间数据同步,该 API 定义了事务在节点间的复制接口。

  • 关键行为

    • 将事务的二进制变更(WriteSet)广播到所有节点。

    • 确保事务在所有节点上按相同顺序提交(Total Ordering)。

(2) 组通信系统(Group Communication System, gcomm)
  • 功能:实现节点间的消息传递和成员管理(如节点加入/退出检测)。

  • 协议:基于 Paxos 变种(如 gcomm 协议),确保消息的可靠传输和一致性。

  • 端口:默认使用 4567(集群通信)、4568(增量状态传输)、4444(全量状态传输)。

(3) 认证器(Certifier)
  • 作用:验证事务是否与其他事务冲突(如主键冲突、锁冲突)。

  • 过程:每个节点独立验证事务,通过后标记为“可提交”。


2. 事务处理流程

当一个事务在任意节点提交时,Galera 集群会按以下步骤处理:

  1. 本地事务提交

    • 事务在本地节点执行,生成 WriteSet(包含事务的二进制变更和元数据)。

    • 事务进入本地节点的 prepare 阶段,但尚未提交。

  2. 广播 WriteSet

    • 本地节点通过 gcomm 将 WriteSet 广播到集群所有节点。

  3. 全局认证(Certification)

    • 所有节点对接收到的 WriteSet 进行冲突检测:

      • 检查事务是否与其他事务的 WriteSet 冲突(如修改同一行数据)。

      • 若无冲突,事务被标记为全局有效(Certified)。

  4. 按序提交(Total Order Commit)

    • 所有节点按 相同的顺序 提交事务,保证数据一致性。

    • 事务最终在所有节点上提交(同步提交)。

  5. 确认(ACK)

    • 发起事务的节点收到多数节点的确认(Quorum)后,向客户端返回成功。


3. 同步复制的关键机制

(1) 全局事务序列(Global Transaction Sequence)
  • 所有事务被赋予一个全局唯一的序列号(GTID),确保事务在集群中按统一顺序提交。

(2) 冲突检测(Certification-Based Conflict Resolution)
  • 乐观锁机制:假设事务冲突概率低,先执行后验证。

  • 若检测到冲突(如两个节点同时修改同一行),Galera 会回滚其中一个事务(由客户端重试)。

(3) 状态传输(State Snapshot Transfer, SST & IST)
  • SST(全量同步):新节点加入时,从现有节点拉取完整数据快照(如使用 mariabackup)。

  • IST(增量同步):节点短暂离线后,仅同步缺失的事务(通过 GTID 追踪)。


4. 避免脑裂(Split-Brain)

Galera 通过 Quorum 机制 和 权重配置 防止网络分区导致的脑裂:

  • Quorum 要求:集群需多数节点存活(如 3 节点集群至少 2 节点在线)。

  • 自动隔离(Non-Primary 状态)

    • 若节点失去 Quorum,会拒绝写入操作(防止数据分歧)。

    • 需人工介入修复网络或重新同步。


5. 高可用性与一致性保证

(1) 强一致性(Strong Consistency)
  • 所有节点数据视图一致(CAP 理论中的 CP 模型)。

  • 客户端无论连接到哪个节点,都能读取最新数据。

(2) 多主写入(Multi-Master)
  • 任何节点均可处理读写请求,无单点故障。

  • 通过全局锁(如 wsrep_causal_reads)避免读未提交数据。

(3) 自动故障转移
  • 节点故障时,集群自动剔除故障节点,客户端可重连到其他节点。


6. 性能优化与限制

优点
  • 低延迟:事务在本地提交后立即返回,后台异步广播 WriteSet。

  • 线性扩展:读性能随节点数增加线性提升。

限制
  • 写扩展性:所有节点需处理所有写操作,写性能受限于最慢节点。

  • DDL 操作限制:某些 DDL(如 ALTER TABLE)需要特殊处理(建议使用 TOI 或 RSU 模式)。

  • 网络依赖:高网络延迟可能导致事务提交变慢。


7. 与异步复制的本质区别

特性Galera 同步复制传统异步复制
数据一致性强一致性(所有节点同步提交)最终一致性(主从延迟)
故障恢复自动切换,无数据丢失可能丢失未同步的数据
性能影响事务延迟受网络影响主节点无复制延迟影响
适用场景高可用、强一致性场景读写分离、灾备场景

8. 底层原理的实际应用

  • 配置调优

    • 调整 innodb_flush_log_at_trx_commit=2 提升性能(牺牲部分持久性)。

    • 设置 wsrep_slave_threads 匹配 CPU 核心数。

  • 监控指标

    • wsrep_local_state:节点状态(4 表示正常同步)。

    • wsrep_flow_control_paused:流量控制暂停时间(>0 表示复制压力大)。


总结

MariaDB Galera 的底层原理通过 全局事务序列化、冲突检测和同步提交 实现多主强一致性,核心是牺牲部分写性能换取高可用和数据一致性。理解这些机制有助于合理设计集群架构(如控制节点数量、优化网络)和故障排查(如脑裂恢复、SST/IST 问题)。

二、用例说明执行流程

在 MariaDB Galera 集群中,一个多语句更新事务的完整执行过程涉及 本地事务执行、全局冲突检测、同步提交 等多个阶段。以下是其详细流程:


1. 事务启动阶段

  • 客户端连接任意节点(如 Node1),执行以下多语句事务:

    sql

    复制

    START TRANSACTION;
    UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
    COMMIT;

2. 本地事务执行

(1) 本地节点(Node1)执行事务
  • 步骤

    1. 本地节点解析 SQL,在内存中执行事务逻辑。

    2. 生成 WriteSet:记录事务的二进制变更(如 InnoDB 的 redo log)。

    3. 事务进入 PREPARE 阶段(未提交到本地数据库)。

(2) WriteSet 结构
  • 包含:

    • 全局事务 ID(GTID):唯一标识事务。

    • 变更数据:二进制格式的行级修改。

    • 依赖关系:事务的顺序依赖(由全局序列号保证)。


3. 全局冲突检测(Certification)

(1) 广播 WriteSet 到集群
  • Node1 通过组通信层(gcomm)将 WriteSet 广播到所有节点(Node2Node3)。

(2) 各节点独立验证冲突
  • 冲突检测逻辑

    • 检查事务修改的行是否被其他未提交事务锁定。

    • 验证主键冲突、外键约束等。

  • 认证结果

    • 若无冲突,标记事务为 Certified(可提交)。

    • 若冲突(如 Node2 已提交一个修改同一行的其他事务),标记事务为 Aborted(需回滚)。


4. 全局有序提交

(1) 确定事务提交顺序
  • 所有节点通过 全局事务序列(GTID) 商定事务提交顺序。

  • 事务按 相同的全局顺序 提交到所有节点。

(2) 同步提交事务
  • 所有节点按序提交

    • 各节点将 WriteSet 应用到本地数据库(无需重新执行 SQL,直接应用二进制变更)。

    • 提交后的数据在所有节点上完全一致。

(3) 客户端确认
  • Node1 收到多数节点(Quorum)的提交确认后,向客户端返回 COMMIT 成功。


5. 异常处理与回滚

(1) 冲突回滚
  • 若任意节点检测到冲突,发起事务的节点(Node1)会收到 Certification Failure

  • 自动回滚:事务在 Node1 本地回滚,客户端收到错误(需重试事务)。

(2) 网络故障
  • 部分节点离线

    • 若 Quorum 存在(多数节点在线),事务在存活节点提交,离线节点恢复后通过 IST/SST 同步。

    • 若 Quorum 丢失,存活节点进入 Non-Primary 状态,拒绝写入。


6. 关键特性与流程对比

(1) 与传统单机 MySQL 的差异
阶段Galera 集群单机 MySQL
事务提交同步提交到所有节点仅本地提交
冲突解决全局认证阶段检测冲突依赖行锁或 MVCC
性能影响延迟取决于最慢节点的响应仅本地磁盘/内存速度
(2) 多语句事务的原子性保证
  • 全有或全无:所有语句的变更要么全部提交到所有节点,要么全部回滚。

  • 全局锁协调:事务涉及的锁信息通过 WriteSet 传递,确保全局一致性。


7. 监控与日志

(1) 关键监控指标
  • SHOW STATUS LIKE 'wsrep_%';

    • wsrep_local_state_comment:节点状态(Synced/Donor/Joiner)。

    • wsrep_last_committed:最后提交的 GTID。

    • wsrep_cert_deps_distance:事务依赖的间隔(反映冲突频率)。

(2) 日志分析
  • 错误日志/var/log/mariadb/mariadb.log):

    • 查找 Certification failed 或 WSREP: Transaction cancelled

  • Galera 调试日志

    ini

    复制

    [galera]
    wsrep_debug = ON    # 启用详细日志

8. 性能优化建议

  • 减少冲突

    • 设计事务时避免热点行(如批量更新改为分散操作)。

    • 使用乐观锁机制(如版本号字段)。

  • 调整参数

    • 增加 wsrep_slave_threads 提升并发应用 WriteSet 的能力。

    • 优化 innodb_flush_log_at_trx_commit = 2(牺牲部分持久性换取性能)。

  • 网络优化

    • 使用低延迟、高带宽的专用网络。

    • 启用 TCP 快速打开(tcp_fastopen)。


总结

MariaDB Galera 集群中,多语句更新事务的完整执行流程通过 本地执行、全局认证、有序提交 实现强一致性。其核心是通过牺牲部分写延迟(等待多数节点确认)换取多主架构下的数据一致性。理解这一流程有助于:

  1. 设计低冲突的分布式事务逻辑。

  2. 快速定位事务失败原因(如认证冲突、网络分区)。

  3. 合理优化集群参数与架构(如控制事务粒度、提升网络性能)。

三、常见问题

  1. 每个pod节点队列容量设置过少,导致频繁限流,从流控dashboard能够看到限流时机,增大队列容量。
  2. 队列容量加大,就会有db延迟,导致多节点数据无法强一致,在发生宕机故障时候,有部分不一致数据丢失风险。

相关文章:

MariaDB Galera 原理及用例说明

一、底层原理 MariaDB Galera 集群是一种基于同步多主架构的高可用数据库解决方案,适合需要高并发、低延迟和数据强一致性的场景。以下是部署和配置 MariaDB Galera 集群的简明步骤: 1. 环境准备 节点要求:至少 3 个节点(奇数节点…...

HMC7043和HMC7044芯片配置使用

一,HMC7043芯片 MC7043独特的特性是对14个通道分别进行独立灵活的相位管理。所有14个通道均支持频率和相位调整。这些输出还可针对50 Ω或100 Ω内部和外部端接选项进行编程。HMC7043器件具有RF SYNC功能,支持确定性同步多个HMC7043器件,即确保所有时钟输出从同一时钟沿开始…...

Spring Boot 3.0核心特性解读

1.1 JDK 17 LTS支持(实测性能提升) 记录类(Record)与Spring Data JPA完美适配模式匹配简化类型判断密封类(Sealed Class)增强DTO安全性 // 使用Record优化DTOpublic record UserDTO(NotBlank String usern…...

在Qt中使用QFont设置字体样式

在Qt中使用QFont设置字体样式的步骤如下: 1. 创建QFont对象 QFont font;2. 设置字体属性 字体家族:使用setFamily()方法,建议提供备选字体。 font.setFamily("Arial, sans-serif"); // 备选通用字体字体大小: 点大小&…...

Linux网络_应用层自定义协议与序列化_守护进程

一.协议 协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接 收的. 如果我们要传输一些 "结构化的数据" 怎么办呢? 其实,协议就是双方约定好的结构化的数据 像下面,两端都知道数据结构…...

c++领域展开第十五幕——STL(String类的模拟实现)超详细!!!!

文章目录 前言string类的模拟实现string类——迭代器的模拟string类——默认成员函数string类——常用函数接口string类——输入输出重载 总结 前言 上篇博客已经简单的介绍了string类的一些接口,并且做了一些了解 同时也刷了一些oj题目,熟练使用一些str…...

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域,Node.js 凭借其事件驱动、非阻塞 I/O 的模型,在构建高性能、可扩展的网络应用方面展现出独特的优势 ,受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端,还能在服务器端大展身手&…...

2024华为OD机试真题-螺旋数字矩阵-(C++)-E卷D卷-100分

2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 考点 解题思路 代码 c++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数 n (0 < n ≤ 999)和行数 …...

记录若依分离版脚手架升级 springboot 3.X版本 中的报错 以及集成mybatis plus

问题一&#xff1a; Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.移除父pom中的tomcat相关配置 子pom中增加 SpringBoot Web容器 <!-- SpringBoot Web容器 …...

Docker基础-常见命令与数据卷

(一)常见命令 一、Docker常见命令 使用 docker pull 用来拉取仓库的镜像文件到本地&#xff1b;docker images 用于查看镜像文件&#xff1b;docker rmi 用于删除镜像文件docker build 用于自定义镜像&#xff0c;将来自己写的java项目也是通过这种方式来构建和打包&#xff1…...

C++基础(16 智能指针)

目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引用问题 5.2 weak_ptr 如何检测内存泄漏&#xff08;了解&#xff09; 1. 智能指针的使用场景分析 下⾯程序中我…...

蓝耘智算携手通义万相2.1:助力 AIGC 生成效率与性能的革新实践

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…...

嵌入式学习-EXTI外部中断

STM32 是一种基于 ARM Cortex-M 内核的微控制器系列&#xff0c;广泛应用于嵌入式系统开发。中断&#xff08;Interrupt&#xff09;是 STM32 中一个非常重要的功能&#xff0c;它允许微控制器在执行主程序的同时&#xff0c;响应外部事件或内部事件的请求&#xff0c;从而实现…...

git 中 commit 的修改

修改最新的commit 1. 通过文本编辑器修改 # 修改最后一次提交的提交信息 git commit --amend2. 通过命令行修改 git commit --amend -m "新的提交信息"3. 仅添加遗漏的文件 # 添加遗漏的文件到暂存区 git add 遗漏的文件路径 # 修改最后一次提交&#xff0c;将暂…...

视觉Transformer(ViT)解析:它们比CNN更好吗?

深入理解计算机视觉任务中突破性架构的工作原理 1. 引言 自从自注意力机制&#xff08;Self-Attention Mechanism&#xff09;被引入以来&#xff0c;Transformer模型一直是自然语言处理&#xff08;NLP&#xff09;任务的首选。基于自注意力的模型具有高度并行化的特性&…...

rustup-init.exe 安装缓慢的解决办法

首先在rust官网下载安装程序&#xff0c;官网下载的 rustup-init.exe 下载慢&#xff0c;安装慢&#xff0c;或者直接卡死。 下载安装程序在本地&#xff0c;使用国内镜像加速 Rust 更新与下载。 使用国内镜像源&#xff1a;在 rustup-init.exe 程序文件夹下使用 PowerShell 中…...

动规【力扣】72. 编辑距离

数组含义&#xff1a; dp[i][j]含义是word1的i长度字符串和word2的j长度字符串所需的最少编辑距离。 递推公式&#xff1a; 1.当word1.charAt(i-1)word2.charAt(j-1)时&#xff0c;不用做任何操作&#xff0c;所以dp[i][j] dp[i-1][j-1]&#xff1b; 2.当word1.charAt(i-1)&a…...

获取哔站评论

一、文章立论 哔哩哔哩&#xff08;B站&#xff09;是当前年轻人十分喜爱的视频分享平台&#xff0c;以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上&#xff0c;用户不仅可以观看各种类型的视频&#xff0c;如动画、游戏、科技、生活、影…...

LeetCode 链表章节

简单 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2…...

JavaScript实现倒计时函数

函数代码 /*** 倒计时* param {function} callback 回调函数&#xff0c;参数为当前剩余时间(time)* param {number} count 倒计时开始时间(s)* param {number} interval 间隔时间(ms)*/ function countDown(callback, count 60, interval 1000) {callback(count);const sta…...

Spring Boot全局异常处理:“危机公关”团队

目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理&#xff08;附上代码实例&#xff09;三、总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1…...

Vue 调用摄像头扫描条码

以下是一个基于 Vue.js 的页面代码示例&#xff0c;用于调用摄像头并扫描条码。我们将使用 jsQR 库来解析二维码&#xff08;或条形码&#xff09;&#xff0c;这是一个轻量级的 JavaScript 库。 实现步骤&#xff1a; 安装依赖&#xff1a;需要引入 jsQR 库。调用摄像头&…...

springboot3.x下集成hsqldb数据库

springboot3.x下集成hsqldb数据库 本文使用目前最新的sringboot3.4.3 和HyperSQL 2.7.4演示 HSQLDB数据库简介 HSQLDB&#xff08;HyperSQL DataBase&#xff09;是一个开放源代码的JAVA数据库。 可以透过 jdbc driver 来存取, 支持 ANSI-92 标准的 SQL 语法, 而且他占的空…...

网络流算法: Edmonds-Karp算法

图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…...

ArcGIS Pro可见性分析:精通地形视线与视域分析

在地理信息系统&#xff08;GIS&#xff09;的广泛应用中&#xff0c;可见性分析作为一项关键技术&#xff0c;发挥着不可替代的作用。 无论是城市规划、环境监测&#xff0c;还是军事侦察、景观设计&#xff0c;可见性分析都能提供精确的数据支持&#xff0c;帮助我们更好地理…...

jenkens使用笔记

jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行&#xff0c;然后下载插件&#xff0c;多次重启等一些列操作&#xff0c; 后来配置就可以工作了&#xff0c;原因不祥&#xff0c;不知道哪个配置起效了。 等回来闹明白了&#xff0c;再补充笔记…...

解决跨域请求的问题(CORS)

目录 解决跨域请求问题的方法 1. 服务器端配置响应头 2. JSONP&#xff08;JSON with Padding&#xff09; 3. 代理服务器 场景示例 前端代码&#xff08;使用 Fetch API&#xff09; 后端代码&#xff08;使用 Node.js Express 并设置 CORS 响应头&#xff09; 跨域资…...

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?

未来经济范式争夺战&#xff1a;AR眼镜为何成为下一代交互终端的制高点&#xff1f; 在蒸汽机轰鸣的工业革命时代&#xff0c;煤炭、铁路、电报构建了第一个现代经济范式&#xff1b;互联网时代&#xff0c;电力、光纤、物流网络重构了全球经济版图。当前&#xff0c;我们正站…...

CentOS 7 安装Nginx-1.26.3

无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…...

基于opencv消除图片马赛克

以下是一个基于Python的图片马赛克消除函数实现&#xff0c;结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务&#xff0c;建议根据实际需求选择合适的方法&#xff1a; import cv2 import numpy as np from PIL import Imagedef remove_mosaic(image_pat…...

MongoDB Compass中MONGOSH常用查询整理

MongoDB Compass中MONGOSH常用查询整理 选择数据库基本的查找指令find() 方法findOne() 方法 高级查询条件比较操作符逻辑操作符投影操作排序操作限制和跳过操作limit() 方法skip() 方法 正则表达式查询数组查询 MongoDB Compass 是一款可视化的 MongoDB 数据库管理工具&#x…...

SSM笔记

一、获取对象 Scop 单例在容器启动时就直接创建&#xff0c;如果不希望这样&#xff0c;那就使用Lazy懒加载&#xff0c;只能在单例模式下 3、4不常用 FactoryBean创建 对象 创建对象比较复杂时&#xff0c;可以实现创建一个类实现FactoryBean&#xff0c;实现3个方法来创建…...

5G学习笔记之BWP

我们只会经历一种人生&#xff0c;我们选择的人生。 参考&#xff1a;《5G NR标准》、《5G无线系统指南:如微见著&#xff0c;赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中&#xff0c;默认所有终端均能处理最大2…...

MongoDB Chunks核心概念与机制

1. 基础定义‌ ‌Chunk&#xff08;块&#xff09;‌&#xff1a;MongoDB分片集群中数据的逻辑存储单元&#xff0c;由一组连续的片键&#xff08;Shard Key&#xff09;范围数据组成&#xff0c;默认大小为‌64MB‌&#xff08;可调整范围为1-1024MB&#xff09;‌。‌数据分…...

el-table 手动选择展示列

需求&#xff1a; 由于表格的列过多,用滚动条进行滚动对比数据不方便&#xff0c;所以提出&#xff0c;手动选择展示列 实现思路&#xff1a; 表格默认展示所有字段&#xff0c;每个字段通过 v-if 属性来进行判断是否显示&#xff1b;点击设置按钮图标(表格右上角&#xff0…...

Netty笔记3:NIO编程

Netty笔记1&#xff1a;线程模型 Netty笔记2&#xff1a;零拷贝 Netty笔记3&#xff1a;NIO编程 Netty笔记4&#xff1a;Epoll Netty笔记5&#xff1a;Netty开发实例 Netty笔记6&#xff1a;Netty组件 Netty笔记7&#xff1a;ChannelPromise通知处理 Netty笔记8&#xf…...

LeetCode Hot 100

1.两数之和 暴力解法:时间/空间复杂度 O(N)&#xff0c;O(1) class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i] nums[j] target){return new int[]{i,j};}}}return new int[0];}…...

Vue.js 学习笔记

文章目录 前言一、Vue.js 基础概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 基础示例 二、Vue.js 常用指令2.1 双向数据绑定&#xff08;v-model&#xff09;2.2 条件渲染&#xff08;v-if 和 v-show&#xff09;2.3 列表渲染&#xff08;v-for&#xff09;2.4 事件处理&am…...

MySQL表连接详解

MySQL表连接详解 在 MySQL 中&#xff0c;表连接&#xff08;Join&#xff09;用于将多个表中的数据组合在一起&#xff0c;基于它们之间的关系进行查询。常见的表连接类型包括内连接、左连接、右连接和全外连接。以下是这些连接类型的详细说明&#xff1a; 1. 内连接&#x…...

【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理

ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类&#xff0c;基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展&#xff0c;支持更灵活的配置&#xff0c;并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...

PPT 小黑第38套

对应大猫40 幻灯片母板-最后一页-重命名为奇数页 奇偶页-点中标题-形状格式-形状填充-青色 最后一页页码左对齐 更换幻灯片背景&#xff1a;设计-设置背景格式-图片填充 【开始】-段落居中&#xff0c;对齐文本-中部对齐&#xff0c;排列-对齐-底端&#xff0c;-再水平居中…...

安卓开发相机功能

相机功能 安卓中的相机调用功能也经历了很多的方案升级&#xff0c;目前可选的官方方案是CameraX、Camera2、Camera&#xff08;废弃&#xff09;&#xff0c;还有一些第三方免费或者是付费的相机库。对于大多数开发者&#xff0c;建议使用 CameraX。 CameraX CameraX 是 An…...

宝塔找不到php扩展swoole,服务器编译安装

1. 在php7.4中安装swoole&#xff0c;但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题&#xff1b; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…...

Spring Web MVC

前言 今天来复习 Spring Web MVC 框架。它提供了一套高效、便捷的方式来构建 Web 应用程序。今天&#xff0c;就让我们一同深入 Spring Web MVC&#xff0c;从基础概念到实际应用&#xff0c;好好补补. 一、Spring Web MVC 是什么&#xff1f; 官方定义解读 根据官方描述&…...

蓝桥杯备考:动态规划线性dp之下楼梯问题进阶版

老规矩&#xff0c;按照dp题的顺序 step1 定义状态表达 f[i]表示到第i个台阶的方案数 step2:推导状态方程 step3:初始化 初始化要保证 1.数组不越界 2.推导结果正确 如图这种情况就越界了&#xff0c;我们如果把1到k的值全初始化也不现实&#xff0c;会增加程序的时间复杂度…...

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…...

UDP透传程序

UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁&#xff0c;适用于 A 和 B 设备无法直接通信的情况。 流程&#xff1a; A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数&#xff1a; B_IP “192.168.1.123” # 设备 B 的…...

【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库

目录 Sionna&#xff1a;用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界&#xff01;”探索锡奥纳…...

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项

以下是修改后的完整文档&#xff0c;包含在多个多线程环境中使用 retain() 和 release() 方法的示例&#xff0c;且确保在 finally 块中调用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息载体&#xff0c;其中 getP…...

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中&#xff0c;查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句&#xff0c;可以获取指定表中的所有记录和列。例如&#xff0c;假设有一个名为employees的表&#xff0c;包含员工的基本信息&#xf…...