011、MongoDB副本集数据同步机制深度解析

目录

MongoDB副本集数据同步机制深度解析

1. 副本集架构概述

1.1 基本组成

1.2 节点角色

2. 数据同步过程详解

2.1 初始同步

2.2 持续复制

2.3 Oplog详解

3. 数据一致性与可用性

3.1 写关注(Write Concern)

3.2 读偏好(Read Preference)

3.3 因果一致性会话

4. 高级复制特性

4.1 Change Streams

4.2 复制链(Chained Replication)

4.3 跨数据中心复制

5. 监控与故障排除

5.1 复制状态监控

5.2 性能调优

5.3 故障恢复

6. 深入研究与最佳实践

6.1 复制机制的内部实现

6.2 复制性能优化

6.3 复制安全性考虑

7. 案例研究与实证分析

7.1 大规模部署案例

7.2 复制机制对应用性能的影响

7.3 复制机制在极端情况下的表现

8. 未来展望

结语


MongoDB副本集数据同步机制深度解析

MongoDB的副本集(Replica Set)是保证数据高可用性和灾难恢复的核心机制。本文将深入探讨MongoDB副本集如何同步数据,并通过大量实例和研究成果来全面分析这一过程。

1. 副本集架构概述

1.1 基本组成

MongoDB副本集通常由以下部分组成:

  • 一个主节点(Primary): 处理所有写操作

  • 多个从节点(Secondary): 复制主节点数据,可以处理读操作

  • 可选的仲裁节点(Arbiter): 不存储数据,只参与选举

示例配置:

rs.initiate({_id: "myReplicaSet",members: [{ _id: 0, host: "mongodb1.example.net:27017" },{ _id: 1, host: "mongodb2.example.net:27017" },{ _id: 2, host: "mongodb3.example.net:27017" }]
})

1.2 节点角色

除了基本的主从角色,MongoDB还支持其他特殊角色:

  • 隐藏节点(Hidden): 不会被客户端读取,用于备份或报告

  • 延迟节点(Delayed): 数据复制有意延迟,用于数据恢复

  • 优先级0节点: 永远不会成为主节点

示例:配置一个延迟节点

rs.add({host: "mongodb4.example.net:27017",priority: 0,hidden: true,slaveDelay: 3600  // 1小时延迟
})

2. 数据同步过程详解

2.1 初始同步

新节点加入副本集时的初始同步过程包括以下步骤:

  1. 克隆: 复制主节点所有数据库

  2. 应用操作日志: 同步克隆过程中的新变化

  3. 索引构建: 重建所有索引

示例:模拟初始同步过程

// 1. 在主节点上创建大量数据
for (let i = 0; i < 1000000; i++) {db.testCollection.insertOne({ _id: i, value: "test" + i });
}
​
// 2. 添加新的从节点
rs.add("mongodb5.example.net:27017")
​
// 3. 监控同步进度
db.printSlaveReplicationInfo()

2.2 持续复制

初始同步后,从节点通过以下机制保持与主节点同步:

  1. Oplog抓取: 定期从主节点获取新的操作日志

  2. 批量应用: 高效地应用一批操作

  3. 并行处理: 多线程并行应用操作

示例:查看oplog状态

use local
db.oplog.rs.find().sort({$natural:-1}).limit(1)

2.3 Oplog详解

Oplog是实现复制的核心,它具有以下特征:

  • 固定大小集合

  • 基于时间戳的操作记录

  • 幂等性: 可重复应用

示例:分析oplog内容

db.oplog.rs.find().forEach(function(log) {print("Operation: " + log.op + ", Namespace: " + log.ns + ", Timestamp: " + log.ts);
})

3. 数据一致性与可用性

3.1 写关注(Write Concern)

MongoDB通过写关注来控制写操作的可靠性:

  • w: 1 (默认): 主节点确认

  • w: "majority": 大多数节点确认

  • j: true: 写入日志后确认

示例:使用不同写关注级别

// 默认写关注
db.collection.insertOne({ x: 1 })
​
// 多数写关注
db.collection.insertOne({ x: 2 }, { writeConcern: { w: "majority" } })
​
// 写入日志确认
db.collection.insertOne({ x: 3 }, { writeConcern: { w: 1, j: true } })

3.2 读偏好(Read Preference)

读偏好允许客户端指定如何路由读操作:

  • primary: 只读主节点

  • primaryPreferred: 优先读主节点

  • secondary: 只读从节点

  • secondaryPreferred: 优先读从节点

  • nearest: 读取网络延迟最低的节点

示例:配置不同的读偏好

// 只从从节点读取
db.collection.find().readPref("secondary")
​
// 就近读取
db.collection.find().readPref("nearest")

3.3 因果一致性会话

MongoDB 3.6+引入了因果一致性会话,确保相关操作的顺序执行:

// 启动因果一致性会话
const session = db.getMongo().startSession({ causalConsistency: true });
​
// 在会话中执行操作
session.startTransaction();
const coll = session.getDatabase("test").getCollection("documents");
coll.insertOne({ x: 1 });
coll.updateOne({ x: 1 }, { $set: { y: 1 } });
session.commitTransaction();

4. 高级复制特性

4.1 Change Streams

Change Streams允许应用程序实时监控数据变化:

const changeStream = db.collection.watch();
changeStream.on('change', (change) => {console.log('Detected change:', change);
});

4.2 复制链(Chained Replication)

复制链允许从节点从其他从节点同步数据,减轻主节点负担:

rs.config().members.forEach(function(member) {if (member.slaveDelay) {rs.reconfig({...rs.conf(),members: [{...member, secondaryDelaySecs: 3600, priority: 0}]});}
});

4.3 跨数据中心复制

对于地理分布的副本集,可以使用标签来优化数据位置:

// 为节点添加标签
rs.addTagToMember("mongodb1.example.net:27017", "dc1")
rs.addTagToMember("mongodb2.example.net:27017", "dc2")
​
// 配置标签感知分片
sh.addTagRange("mydb.users",{ country: "US" },{ country: "ZZ" },"dc1"
)

5. 监控与故障排除

5.1 复制状态监控

定期检查复制状态是保证系统健康的关键:

// 查看复制状态
rs.status()
​
// 检查复制延迟
db.printSlaveReplicationInfo()
​
// 监控oplog窗口大小
db.getReplicationInfo()

5.2 性能调优

优化副本集性能的一些建议:

  1. 使用SSD存储oplog

  2. 增加oplog大小以应对长时间的网络中断

  3. 调整写关注级别平衡性能和可靠性

示例:增加oplog大小

use local
db.oplog.rs.stats().maxSize
db.adminCommand({replSetResizeOplog: 1, size: 16384})

5.3 故障恢复

当节点发生故障时,可以采取以下步骤:

  1. 检查日志文件查找错误

  2. 使用rs.stepDown()手动切换主节点

  3. 如果数据损坏,可能需要重新初始化同步

// 强制重新同步
rs.syncFrom("mongodb1.example.net:27017")

6. 深入研究与最佳实践

6.1 复制机制的内部实现

MongoDB的复制机制在内部是如何工作的?以下是一些关键点:

  1. 多版本并发控制(MVCC): MongoDB使用MVCC来处理并发操作。每个文档都有一个版本号,这允许读操作在不被写操作阻塞的情况下进行。

    // 示例: 查看文档的版本信息
    db.collection.find({}, {_id: 1, __v: 1})

  2. 全局逻辑时钟: MongoDB使用全局逻辑时钟来确保操作的顺序一致性。这在分布式系统中尤为重要。

    // 查看当前逻辑时间
    db.adminCommand({getClusterTime: 1})

  3. 两阶段提交: 对于跨多个文档的操作,MongoDB使用两阶段提交协议来保证原子性。

    // 示例: 使用事务实现两阶段提交
    const session = db.getMongo().startSession();
    session.startTransaction();
    try {db.accounts.updateOne({_id: 1}, {$inc: {balance: -100}});db.accounts.updateOne({_id: 2}, {$inc: {balance: 100}});session.commitTransaction();
    } catch (error) {session.abortTransaction();
    }

6.2 复制性能优化

提高复制性能的高级技巧:

  1. 网络优化:

    • 使用专用网络接口for复制流量

    • 启用压缩来减少网络带宽使用

    // 启用网络压缩
    db.adminCommand({setParameter: 1, networkMessageCompressors: "snappy,zlib"})

  2. 批量插入优化: 使用批量写操作来减少网络往返次数

    // 示例: 批量插入
    const bulk = db.collection.initializeUnorderedBulkOp();
    for (let i = 0; i < 100000; i++) {bulk.insert({_id: i, value: "test"});
    }
    bulk.execute();

  3. 索引优化: 在从节点上延迟索引创建,减少初始同步时间

    // 在主节点创建索引
    db.collection.createIndex({field: 1}, {background: true})
    ​
    // 在从节点上延迟创建索引
    db.adminCommand({configureFailPoint: "slowBuildIndexSecondary",mode: "alwaysOn"
    })

6.3 复制安全性考虑

保护副本集数据安全的关键措施:

  1. 加密传输: 使用TLS/SSL加密所有复制流量

    // 配置TLS
    mongod --sslMode requireSSL --sslPEMKeyFile /path/to/ssl/cert

  2. 身份认证: 启用内部认证确保只有授权节点可以加入副本集

    // 启用内部认证
    security:keyFile: /path/to/keyfile

  3. 审计: 启用审计功能跟踪所有数据库操作

    // 启用审计
    mongod --auditDestination file --auditFormat JSON --auditPath /var/log/mongodb/audit.json

7. 案例研究与实证分析

7.1 大规模部署案例

Zhang等人(2022)在他们的研究中分析了一个拥有100个节点的MongoDB副本集部署案例。

引用: Zhang, L., Wang, K., & Liu, H. (2022). Scaling MongoDB Replica Sets: Lessons from a 100-Node Deployment. 
Proceedings of the 2022 International Conference on Very Large Data Bases, 1423-1435.

主要发现:

  1. 网络拓扑优化: 研究发现,将副本集成员按地理位置分组,并在组内使用高速网络连接,可以显著提高整体性能。例如,他们观察到:

    • 组内复制延迟平均低于5ms

    • 跨组复制延迟控制在50ms以内

    他们使用以下配置来优化网络拓扑:

    // 为不同数据中心的节点添加标签
    rs.addTagToMember("node1:27017", "dc1")
    rs.addTagToMember("node2:27017", "dc2")
    ​
    // 配置读偏好以优先读取本地数据中心的数据
    db.collection.find().readPref("nearest", [ { "dc": "dc1" } ])

  2. 写入性能优化: 研究团队发现,通过调整写关注级别和批处理大小,可以在保证数据安全的同时提高写入性能:

    • 使用w: "majority"可以保证数据安全性,但会增加写入延迟

    • 批量写入可以显著提高吞吐量

    他们的测试结果显示:

    • 单文档插入: 5,000 ops/sec

    • 100文档批量插入: 50,000 ops/sec

    优化后的写入配置示例:

    // 批量写入配置
    const batch = db.collection.initializeOrderedBulkOp();
    for (let i = 0; i < 100; i++) {batch.insert({ _id: i, data: "test" });
    }
    batch.execute({ w: "majority", wtimeout: 1000 });

  1. 读取性能优化:

    • 未优化查询: 10,000 qps

    • 优化后查询: 50,000 qps

    优化配置示例:

    // 创建复合索引支持常见查询模式
    db.users.createIndex({ age: 1, city: 1, lastLogin: -1 })
    ​
    // 配置读偏好使用最近的节点
    db.users.find({ age: { $gt: 30 }, city: "New York" }).sort({ lastLogin: -1 }).readPref("nearest")

  2. 大规模数据迁移: 研究团队还探讨了在不停机的情况下进行大规模数据迁移的策略。他们开发了一个分阶段迁移方法:

    a. 准备阶段: 设置目标副本集并进行初始同步 b. 增量同步: 使用变更流捕获源集群的实时更新 c. 切换阶段: 短暂暂停写入,完成最终同步,然后将流量切换到新集群

    示例代码(简化版):

    // 1. 在目标集群上设置变更流
    const changeStream = sourceDB.collection.watch();
    ​
    // 2. 持续应用变更到目标集群
    changeStream.on('change', async (change) => {await targetDB.collection.updateOne({ _id: change.documentKey._id }, { $set: change.updateDescription.updatedFields });
    });
    ​
    // 3. 切换阶段
    await sourceDB.admin().command({ fsync: 1, lock: true });
    // 应用最后的变更
    await changeStream.close();
    // 将客户端重定向到新集群
    await sourceDB.admin().command({ fsyncUnlock: 1 });

    使用这种方法,他们成功迁移了超过10TB的数据,停机时间不到5分钟。

7.2 复制机制对应用性能的影响

Li等人(2023)的研究深入分析了MongoDB复制机制对不同类型应用的性能影响。

引用: Li, Q., Chen, Y., & Zhang, W. (2023). Impact of MongoDB's Replication Mechanism on Application Performance: An Empirical Study. 
ACM Transactions on Database Systems, 48(2), 1-32.

主要发现:

  1. 写入密集型应用:

    • 写关注级别对性能影响显著。使用 { w: 1 } 时吞吐量比 { w: "majority" } 高40%,但有数据丢失风险。

    • 批量写入可以显著提高性能,尤其是在高延迟网络环境中。

    示例: 不同写关注级别的性能比较

    // 测试函数
    async function testWritePerformance(writeConcern, batchSize) {const start = Date.now();for (let i = 0; i < 10000; i += batchSize) {const docs = Array.from({ length: batchSize }, (_, j) => ({ _id: i + j, value: "test" }));await db.collection.insertMany(docs, { writeConcern });}return Date.now() - start;
    }
    ​
    console.log("w: 1 -", await testWritePerformance({ w: 1 }, 1));
    console.log("w: majority -", await testWritePerformance({ w: "majority" }, 1));
    console.log("w: 1, batch 100 -", await testWritePerformance({ w: 1 }, 100));

  2. 读取密集型应用:

    • 读偏好设置对性能影响巨大。从从节点读取可以显著提高读取吞吐量,但可能引入数据一致性问题。

    • 对于需要强一致性的应用,使用因果一致性会话可以在保证一致性的同时提供更好的性能。

    示例: 读偏好与一致性会话

    // 常规读取
    const normalRead = await db.collection.find().readPref("secondaryPreferred").toArray();
    ​
    // 使用因果一致性会话
    const session = client.startSession({ causalConsistency: true });
    const causalRead = await db.collection.find().session(session).readPref("secondaryPreferred").toArray();

  3. 混合工作负载:

    • 对于混合读写的应用,研究发现使用 writeConcern: { w: "majority" }readPreference: "primaryPreferred" 能够在性能和一致性之间取得较好的平衡。

    • 使用读写分离策略(写入主节点,读取从节点)可以显著提高整体吞吐量,但需要应用层面处理潜在的数据不一致问题。

    示例: 读写分离配置

    const writeClient = new MongoClient(uri, { writeConcern: { w: "majority" } });
    const readClient = new MongoClient(uri, { readPreference: "secondaryPreferred" });
    ​
    // 写操作
    await writeClient.db("test").collection("data").insertOne({ x: 1 });
    ​
    // 读操作(可能存在短暂的不一致)
    const result = await readClient.db("test").collection("data").find().toArray();

  4. 地理分布式应用:

    • 对于跨地域部署,研究发现使用本地读取优先策略可以显著降低延迟。

    • 但跨地域写入仍然是一个挑战,尤其是在使用 { w: "majority" } 时。

    示例: 地理感知读取配置

    // 假设有三个数据中心: dc1, dc2, dc3
    const client = new MongoClient(uri, {readPreference: "nearest",readPreferenceTags: [{ dc: "dc1" },{ dc: "dc2" },{ dc: "dc3" }]
    });
    ​
    // 这将优先从最近的数据中心读取数据
    const result = await client.db("test").collection("data").find().toArray();

7.3 复制机制在极端情况下的表现

Wang等人(2024)的最新研究探讨了MongoDB复制机制在极端网络条件和负载下的表现。

引用: Wang, R., Liu, J., & Thompson, A. (2024). MongoDB Replication Under Extreme Conditions: A Stress Test Analysis. 
Proceedings of the 2024 International Conference on Management of Data, 2145-2160.

主要发现:

  1. 网络分区:

    • 在模拟网络分区的情况下,MongoDB的自动故障转移机制表现出色,平均在8秒内完成主节点切换。

    • 但在网络恢复后,数据重新同步可能需要较长时间,取决于分区期间的写入量。

    测试脚本示例:

    // 模拟网络分区
    async function simulateNetworkPartition(duration) {const primary = rs.getPrimary();await db.adminCommand({ configureFailPoint: "blockNetwork", mode: "alwaysOn", data: { blockSeconds: duration } });// 等待新的主节点选举await new Promise(resolve => setTimeout(resolve, 10000));const newPrimary = rs.getPrimary();console.log(`New primary after partition: ${newPrimary.host}`);// 恢复网络连接await db.adminCommand({ configureFailPoint: "blockNetwork", mode: "off" });
    }
    ​
    await simulateNetworkPartition(30); // 模拟30秒的网络分区

  2. 极高写入负载:

    • 在每秒10万次写入的极端负载下,使用 { w: 1 } 的写入延迟保持在10ms以下。

    • 但使用 { w: "majority" } 时,写入延迟显著增加,平均达到100ms。

    • oplog大小成为关键因素,较小的oplog可能导致从节点无法跟上主节点的写入速度。

    负载测试脚本示例:

    async function highLoadTest(writeConcern, duration) {const start = Date.now();let operations = 0;while (Date.now() - start < duration) {const bulk = db.collection.initializeUnorderedBulkOp();for (let i = 0; i < 1000; i++) {bulk.insert({ timestamp: new Date(), value: Math.random() });}await bulk.execute(writeConcern);operations += 1000;}console.log(`Completed ${operations} writes in ${duration}ms`);
    }
    ​
    await highLoadTest({ w: 1 }, 60000); // 1分钟高负载测试,使用 { w: 1 }
    await highLoadTest({ w: "majority" }, 60000); // 1分钟高负载测试,使用 { w: "majority" }

  3. 大规模数据集:

    • 对于超过10TB的数据集,初始同步时间成为主要挑战,可能需要数天时间完成。

    • 研究提出了一种基于快照的初始同步方法,可以将同步时间减少到几小时。

    快照同步方法示例(概念代码):

    async function snapshotBasedSync(sourceNode, targetNode) {// 1. 在源节点创建快照const snapshot = await sourceNode.createSnapshot();// 2. 将快照传输到目标节点await transferSnapshot(snapshot, targetNode);// 3. 在目标节点恢复快照await targetNode.restoreSnapshot(snapshot);// 4. 应用增量更新const oplogCursor = sourceNode.getOplogCursor(snapshot.timestamp);while (await oplogCursor.hasNext()) {const op = await oplogCursor.next();await targetNode.applyOperation(op);}
    }

  4. 复杂的分片环境:

    • 在包含多个分片的复杂环境中,配置服务器的复制机制成为整个系统的潜在瓶颈。

    • 研究提出了一种优化的配置服务器架构,使用缓存层来减少对配置服务器的直接访问。

    优化架构示例:

    // 配置服务器缓存层
    class ConfigServerCache {constructor(configServer) {this.configServer = configServer;this.cache = new Map();}
    ​async getChunkInfo(namespace, key) {if (this.cache.has(namespace)) {return this.cache.get(namespace);}const info = await this.configServer.getChunkInfo(namespace, key);this.cache.set(namespace, info);return info;}
    ​invalidate(namespace) {this.cache.delete(namespace);}
    }
    ​
    // 使用缓存层
    const configCache = new ConfigServerCache(configServer);
    const chunkInfo = await configCache.getChunkInfo("mydb.users", userKey);

这些研究发现不仅深化了我们对MongoDB复制机制的理解,还为在极端条件下优化MongoDB性能提供了宝贵的见解和实践建议。这些优化策略和测试方法可以帮助开发者和数据库管理员更好地设计和维护大规模MongoDB部署。

8. 未来展望

随着技术的不断发展,MongoDB的复制机制也在持续演进。以下是一些潜在的未来发展方向:

  1. 智能复制: 利用机器学习技术自动优化复制策略,根据工作负载特征和网络条件动态调整复制参数。

  2. 多模式复制: 支持在同一副本集中使用不同的存储引擎,以适应不同的工作负载需求。

  3. 边缘计算支持: 为物联网(IoT)和边缘计算场景优化复制机制,支持有限带宽和间歇性连接。

  4. 量子安全复制: 研究将量子加密技术应用于复制过程,为未来的量子计算时代做准备。

这些方向代表了MongoDB复制机制可能的发展趋势,将进一步增强其在各种复杂环境下的性能、可靠性和安全性。

结语

MongoDB的副本集数据同步机制是一个复杂而强大的系统,它为数据的高可用性和可靠性提供了坚实的基础。通过本文的深入分析,我们不仅了解了其基本原理和实现细节,还探讨了在各种实际场景中的应用和优化策略。

从初始同步到持续复制,从基本的主从架构到复杂的分片环境,MongoDB的复制机制展现出了强大的适应性和可扩展性。通过合理配置写关注、读偏好,优化网络拓扑,以及利用先进的特性如变更流和因果一致性会话,我们可以在不同的应用场景中获得理想的性能和数据一致性。

最新的研究成果进一步揭示了MongoDB复制机制在极端条件下的表现,为我们提供了宝贵的优化思路。这些发现不仅有助于现有系统的调优,也为未来的发展指明了方向。

随着技术的不断进步,我们可以期待MongoDB的复制机制会变得更加智能、高效和安全。无论是在传统的数据中心环境,还是在新兴的边缘计算和物联网场景,MongoDB都有潜力继续发挥其关键作用。

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

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

相关文章

IBCS 虚拟专线——企业网络困境的破局者

企业对于高效、稳定且成本合理的网络解决方案的需求愈发迫切。作为一家企业的技术负责人&#xff0c;我曾深陷于企业网络的种种困境之中&#xff0c;直到 IBCS 虚拟专线的出现&#xff0c;为我们带来了转机。 我们的企业在发展过程中&#xff0c;面临着诸多网络相关的挑战。随…

FPGA开发技能(7)Vivado设置bit文件加密

文章目录 前言1. AES加密原理2.xilinx的AES方案3.加密流程3.1生成加密的bit流3.2将密钥写入eFUSE寄存器 4.验证结论5.传送门 前言 在FPGA的项目发布的时候需要考虑项目工程加密的问题&#xff0c;一方面防止自己的心血被盗&#xff0c;另一方面也保护公司资产&#xff0c;保护知…

少女之妙,妙在微笑

一、妙与不妙&#xff0c;少女与微笑 我们曾经解过汉字“妙”&#xff0c;妙字可以拆分为少女二字&#xff0c;即&#xff1a; 妙 女 少 少女 但这&#xff0c;其实并没有对 “妙”字 完成完整性解析&#xff0c;如果要完成完整性的说明&#xff0c;应当加上微笑&#xff0…

Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析

技术背景 我们在对接Linux平台RTSP播放模块的时候&#xff0c;遇到这样的技术需求&#xff0c;开发者需要把Linux RTSP播放器拉取的数据&#xff0c;除了实时播放外&#xff0c;还要投递给python&#xff0c;用于视觉算法分析。 技术实现 Linux平台RTSP、RTMP直接播放不再赘…

IDM下载器怎么用 IDM下载器使用技巧 idm下载器怎么下载网页视频

IDM总能让新用户们眼前一亮&#xff0c;它不仅是工作学习上的好帮手&#xff0c;更是帮你解锁信息世界的钥匙。下载全程无广告、无弹窗、畅享高速下载&#xff0c;这无疑是下载软件市场中的一股清流。有关IDM下载器怎么用&#xff0c;IDM下载器使用技巧的问题&#xff0c;本文将…

App Inventor 2 列表排序,函数式编程轻松实现高级排序算法

本文主要介绍 列表 的高级用法&#xff0c;即函数式编程&#xff0c;可以按照指定的逻辑进行列表的排序&#xff0c;而无需我们自己写代码实现排序功能。 指定的逻辑也包括很复杂的逻辑&#xff0c;也就是说如果你的排序逻辑很复杂&#xff0c;函数式编程就是最好的使用场景。…

Vue--》从零开始打造交互体验一流的电商平台(四)完结篇

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

shiro漏洞利用记录

shiro漏洞利用记录 获取heapdump 访问http://39.100.119.172:8082/actuator/heapdump​下载heapdump nginx waf可能限制下载heapdump&#xff0c;但里面的配置可能是精确匹配&#xff0c;因此可以使用http://39.100.119.172:8082/actuator/heapdump//​来绕过 获取shrio ke…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用&#xff0c;但与 Rollup、Snowpack 等工具类似&#xff0c;Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比&#xff0c;构建 NPM 库时需要注意&#xff1a; 正确导出模块内容&#xff1b;不要将第三方包打包进产…

IDM(Internet Download Manager)下载器的安装激活与换机方法 IDM怎么用

很多人都知道 Internet Download Manager(以下简称 IDM)是一款非常优秀的下载提速软件。它功能强大&#xff0c;几乎能下载网页中的所有数据&#xff08;包括视频、音频、图片等&#xff09;&#xff0c;且适用于现在市面上几乎所有的浏览器&#xff0c;非常受大家欢迎。IDM 是…

河南企业劳务资质申请:技术负责人角色与职责

河南企业劳务资质申请中&#xff0c;技术负责人的角色与职责至关重要&#xff0c;以下是对其角色与职责的清晰归纳&#xff1a; 一、角色定位 技术核心&#xff1a;技术负责人是企业技术团队的核心&#xff0c;是企业技术实力和专业水平的象征。战略规划者&#xff1a;根据行…

subline设置打开文件重启一个新的窗口

问题 打开文件后&#xff0c;用的是同一个窗口的子tab页面 想要打开一个新的窗口 解决 点解preferences->setting 在右边的配置文件新增一行 “open_files_in_new_window”: “always” 保存 搞定&#xff01;

LeetCode 1667, 36, 199

目录 1667. 修复表中的名字题目链接表要求知识点思路代码 36. 有效的数独题目链接标签思路代码 199. 二叉树的右视图题目链接标签思路代码 1667. 修复表中的名字 题目链接 1667. 修复表中的名字 表 表Users的字段为user_id和name。 要求 编写解决方案&#xff0c;修复名字…

SET加密:电子商务安全的基石

随着电子商务的飞速发展&#xff0c;如何确保在线交易的安全性和可信度已成为消费者、商家和金融机构共同关注的焦点。SET协议&#xff08;Secure Electronic Transaction&#xff09;作为一种安全电子交易的国际标准&#xff0c;凭借其卓越的安全性能和广泛的行业认可&#xf…

食品行业怎么用JSON群发短信

食品作为日常生活不可缺少的元素&#xff0c;市场需求是很稳定的&#xff0c;但是份额就那么多&#xff0c;商家都要来抢占的话&#xff0c;就需要运营推广各凭本事&#xff0c;市场运营中选择合适的推广方式&#xff0c;可以增加店铺销售额&#xff0c;很多实体店或商城都会建…

MATLAB-振动问题:两自由度耦合系统自由振动

一、基本理论 二、MATLAB实现 以下是两自由度耦合系统自由振动质量块振动过程动画显示的MATLAB程序。 clear; clc; close allx0 1; D1 40; D12 8; D2 D1; m1 1; omega0 sqrt(D1/m1); k1 D12 / D1; k2 D12 / D2; k sqrt(k1 * k2); omegazh omega0 * sqrt(1 k); omeg…

pytest中的极其重要固件(request)的理解

pytest 是一个非常流行的Python测试框架&#xff0c;它为开发人员提供了丰寴的测试工具和功能。 在pytest中&#xff0c;固件&#xff08;fixture&#xff09;是一种非常核心的概念&#xff0c;用于设置测试前的预条件&#xff0c;清理测试后的环境&#xff0c;或者提供测试过…

高效实现虚拟机(VMware)安装教程(附安装包)

目录 一.下载VMware Wworkstation Pro 二 安装&#xff1a; 注&#xff1a;若是安装完VMware&#xff0c;还想在上面安装Centos、Ubuntu&#xff0c;系统请转到基于VMware的linux操作系统安装&#xff08;附安装包&#xff09;-CSDN博客 一.下载VMware Wworkstation Pro 渠道…

文心一言用户达3亿!文心大模型4.0 Turbo发布,支持API,真GPT-4 Turbo国产来了!

文心一言用户规模达到3亿了&#xff01; 这是笔者在今天的百度Wave Summit 2024大会上的看到的数字。需要强调的是&#xff0c;文心一言的用户规模是在去年12月破亿的。这意味着&#xff0c;仅仅隔了6个月&#xff0c;文心一言用户数量在亿这个级别的数字上竟然直接翻了三倍。…

【C++】线程库

在 C11 问世之前&#xff0c;多线程基本和平台关系密切&#xff0c;不同的平台下多线程各有特点&#xff0c;使得 Windows 和 Linux 下必须拥有各自的系统调用接口&#xff0c;但同时也使得代码的可移植性较差。 C11中最重要的特性&#xff0c;就是支持了多线程编程&#xff0c…