mongodb shard 分片集群基础概念
目录
一、shard 集群
二、Config Server
1、config.shards
2、config.database
3、config.collection
4、config.chunks
5、config.settings
6、其他
三、shard机制
1、Primary Shard
2、Shard Key
2.1 范围分片
2.2 哈希分片
2.3 Shard Key重定义
2.4 版本约束
2.5 Shard Key的使用
3、chunk
4、Balancer
四、集群备份
1、官方方案
2、鼎甲方案
3、爱数方案
五、参考文献
一、shard 集群
副本集群中,所有节点维护同一份数据。可以承载部分读请求压力,解决高可用的问题。但随着业务场景的增长,会出现下面的问题:
1、数据容量超出单机磁盘容量
2、活跃的数据集超出节点内存容量,需要从磁盘读取,使得读性能下降
3、写入量超出primary节点主机的IOPS(Input/Output Per Second)容量
当副本集群性能受限时,存在两种解决方案:
1、垂直扩容:提高副本集中单节点的性能,提高 CPU、内存、带宽
2、水平扩容:将任务分片,分给多个副本集群。
shard 集群就是属于水平扩容方案,下面是 shard 集群的基本架构(插图选自华为 DDS 官网):
1、Mongos(Router):作为 shard 集群的入口,对用户请求进行路由、分发与合并(操作结果)。可通过部署多个mongos实现高可用。
2、Config Servers : 存储集群元数据和集群配置;可通过部署副本集实现高可用。
3、Shard :存储分片后的用户数据,不同的Shard存储不同的数据。
应用程序通过 JDBC 连接 mongos 节点实现与整个集群交互。Mongos 则会根据客户端的请求来向后端不同的 Shard 进行请求的发起。
如下图所示,若对 Collection1 进行读写,Mongos 会和 Shard A 和 Shard B 进行请求交互,如果读写 Collection2,那么 Mongos 只会和 Shard A 进行数据交互。
可以通过拼接合理的 ConnectionStringURL 连接 shard 集群,如果使用单个 mongos 进行连接,会有风险。
# mongodb:// 前缀,代表这是一个 ConnectionString URI 连接地址。
# username:password@ 连接 MongoDB 实例的用户名和密码,使用英文冒号(:)分隔。
# hostX:portX 实例的连接地址和端口号。
# /database 鉴权数据库名,即数据库账号所属的数据库。
# ?options 指定额外的连接选项。
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
# 举例:用户名为 user,密码为 password,然后来连接 mongos1 和 mongos2,它们的端口都是 3717,鉴权数据库是 admin
mongodb://user:password@mongos1:3717,mongos2:3717/admin
二、Config Server
Config server存储Sharded cluster的所有元数据,所有的元数据都存储在config数据库。
了解该节点内集合的作用很有必要。
mongos> use config
switched to db config
mongos> db.getCollectionNames()
["shards","actionlog","chunks","mongos","collections","lockpings","settings","version","locks","databases","tags","changelog"
]
1、config.shards
config.shards集合存储各个Shard的信息,可通过addShard、removeShard命令来动态的从Sharded cluster⾥增加或移除shard。如下所示,cluster⽬前拥有2个shard,均为复制集。如下所示,cluster⽬前拥有2个shard,均为复制集。
mongos> db.addShard("mongo-9003/10.1.72.135:9003,10.1.72.136:9003,10.1.72.137:9003")
mongos> db.addShard("mongo-9003/10.1.72.135:9003,10.1.72.136:9003,10.1.72.137:9003")
mongos> db.shards.find()
{ "_id" : "mongo-9003", "host" : "mongo-9003/10.1.72.135:9003,10.1.72.136:9003,10.1.72.137:9003" }
{ "_id" : "mongo-9004", "host" : "mongo-9004/10.1.72.135:9004,10.1.72.136:9004,10.1.72.137:9004" }
2、config.database
config.databases集合存储所有数据库的信息,包括DB是否开启分⽚,primary shard信息,对于数据库内没有开启分片的数据库/集合,所有的数据都会存储在数据库的primary shard上。
如下所示:数据库 shtest 开启了分片,primary shard为 mongo-9003;test 没有开启分片,则默认存储在 primary shard上。
mongos> sh.enableSharding("shtest")
{ "ok" : 1 }
mongos> db.databases.find()
{ "_id" : "shtest", "primary" : "mongo-9003", "partitioned" : true }
{ "_id" : "test","primary" : "mongo-9003", "partitioned" : false }
3、config.collection
数据分片是针对集合维度的,某个数据库开启分片功能后,如果需要让其中的集合分⽚存储,则需调用 shardCollection 命令来针对集合开启分片。
如下命令,针对shtest数据里的hello集合开启分片,使⽤x字段作为shard key来进行范围分片。
mongos> sh.shardCollection("shtest.coll", {x: 1})
{ "collectionsharded" : "shtest.coll", "ok" : 1 }mongos> db.collections.find()
{ "_id" : "shtest.coll", "lastmodEpoch" : ObjectId("57175142c34046c3b556d302"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : { "x" : 1 }, "unique" : false }
4、config.chunks
集合分片开启后,默认会创建⼀个新的chunk,shard key取值[minKey, maxKey]内的⽂档(即所有的⽂档)都会存储到这个 chunk。当使⽤ Hash 分⽚策略时,可以预先创建多个chunk,以减少chunk的迁移。
mongos> db.chunks.find({ns: "shtest.coll"})
{ "_id" : "shtest.coll-x_MinKey", "ns" : "shtest.coll", "min" : { "x" : { "$minKey" : 1 } }, "max" : { "x" : { "$maxKey" :1 } }, "shard" : "mongo-9003", "lastmod" : Timestamp(1, 0), "lastmodEpoch" : ObjectId("5717530fc34046c3b556d361") }
当chunk⾥写⼊的数据量增加到⼀定阈值时,会触发chunk分裂,将⼀个chunk的范围分裂为多个chunk,当各个shard上chunk数量不均衡时,会触发chunk在shard间的迁移。如下所示,shtest.coll的⼀个chunk,在写⼊数据后分裂成3个chunk。
mongos> use shtest
mongos> for (var i = 0; i < 10000; i++) { db.coll.insert( {x: i} ); }
mongos> use config
mongos> db.chunks.find({ns: "shtest.coll"})
{ "_id" : "shtest.coll-x_MinKey", "lastmod" : Timestamp(5, 1), "lastmodEpoch" : ObjectId("5703a512a7f97d0799416e2b"), "ns" : "shtest.coll", "min" : { "x" : { "$minKey" : 1 } }, "max" : { "x" : 1 }, "shard" : "mongo-9003" }
{ "_id" : "shtest.coll-x_1.0", "lastmod" : Timestamp(4, 0), "lastmodEpoch" : ObjectId("5703a512a7f97d0799416e2b"), "ns" :"shtest.coll", "min" : { "x" : 1 }, "max" : { "x" : 31 }, "shard" : "mongo-9003" }
{ "_id" : "shtest.coll-x_31.0", "lastmod" : Timestamp(5, 0), "lastmodEpoch" : ObjectId("5703a512a7f97d0799416e2b"), "ns": "shtest.coll", "min" : { "x" : 31 }, "max" : { "x" : { "$maxKey" : 1 } }, "shard" : "mongo-9004" }
5、config.settings
config.settings 集合⾥主要存储 sharded cluster 的配置信息,⽐如 chunk size,是否开启 balancer 等
mongos> db.settings.find()
{ "_id" : "chunksize", "value" : NumberLong(64) }
{ "_id" : "balancer", "stopped" : false }
6、其他
config.tags 主要存储 sharding cluster 标签(tag)相关的信息,以实现根据 tag 来分布 chunk 的功能
config.changelog 主要存储 sharding cluster ⾥的所有变更操作,⽐如 balancer 迁移 chunk 的动作就会记录到 changelog ⾥。
config.mongos 存储当前集群所有 mongos 的信息
config.locks 存储锁相关的信息,对某个集合进⾏操作时,⽐如 moveChunk,需要先获取锁,避免多个 mongos 同时迁移同⼀个集合的 chunk
三、shard机制
1、Primary Shard
新建的数据库默认是未分片的,先存储在一个 Shard 上面,该 Shard 称为 Primary Shard。
当创建一个新的 database 时,系统会根据各个 shard 目前存储的数据量,选择一个数据量最小的 shard 作为新 database 的 primary shard。如下图,选择了 Shard A作为Database 3的Primary Shard。
Database 建立并确定 Priamry Shard后将进行分片操作。Shard集群的分片支持集合的级别。已经被分片的集合被切分为多份保存在 shard 上。
sh.enableSharding("<database>")
sh.shardCollection("<database>.<collection>", {<key> : <direction>, ... } )
# <key> : 分片键字段的名字
# <direction> : {1 | -1 |"hashed"} 。 1 | -1 : 基于范围分片键,"hashed" : 哈希分片键
2、Shard Key
Shard key 是分片时依据的数据库字段。Shard Key 必须是一个索引。非空集合须在 shardCollection 前创建索引;空集合 shardCollection 自动创建索引。
确定了 Shard Key 后,如何进行分片呢?主要分为两种:范围分片与哈希分片。这两种方法都存在优缺点,依据实际情况使用。
2.1 范围分片
依据 Shard Key的范围进行分片,每个 Shard 中存放一段 Shard Key 范围的数据。
如下图所示,是一个基于 x 的范围分片,数据被分为了 4 部分,切割点分别是 x:-75、x:25、x:175 值相近的数据是相邻的。
这种情况下,可以很好的满足范围查询的需求。但是如果是基于分片键的单调写入,由于数据都会由于所有的写入都会被最后一个 Chunk 来承载,所以这样就无法很好的扩充写能力。
2.2 哈希分片
根据 ShardKey 计算哈希值,基于哈希值进行数据分片。
如下图所示。根据 x 计算出的哈希值分类存放在 Shard中。这样无论是否单调写入都可以扩充写能力,但无法实现 x 字段的范围查找。
需要注意,哈希分片只支持单个字段的哈希分片。
4.4 以后的版本,可以将单个字段的哈希分片和一个到多个的范围分片键字段来进行组合。比如{x:1, y:"hashed"},指定 x 范围分片,y 是哈希分片方式来进行组合。
2.3 Shard Key重定义
4.4 版本新增命令,通过分片键增加后缀字段的方式来修改分片键:
db.adminCommand( {refineCollectionShardKey: "<database>.<collection>",key: { <existing key specification>, <suffix1>:<1|"hashed">, ... }
} )
# <existing key specification> : 当前的分片键,新的分片键必须以当前分片键为前缀;
# <suffix1> : 新增的后缀分片键字段;
(1)新的 ShardKey 对应的索引在 RefineCollection-ShardKey 执行前须已经创建完成;
(2)RefineCollectionShardKey 只会修改 Config 节点上的元数据,不会有任何数据迁移,数据的打散随后续正常分裂&迁移而完成;
(3)4.4 版本中支持了 ShardKey 缺失的情况(当做 Null 处理),为了应对并不是所有文档都存在新的 ShardKey 的所有字段;
(4)4.4 版本中支持复合哈希分片键,而在之前的版本中只能支持单字段的哈希分片键。
2.4 版本约束
4.4 版本之前:
ShardKey 大小不能超过 512 Bytes;
仅支持单字段的哈希分片键;
Document 中必须包含 ShardKey;
ShardKey 包含的 Field 不可以修改。
4.4 版本之后:
ShardKey 大小无限制;
支持复合哈希分片键;
Document 中可以不包含 ShardKey,插入时被当做 Null 处理;
为 ShardKey 添加后缀 refineCollectionShardKey 命令,可以修改 ShardKey 包含的 Field;
4.2 版本之前,ShardKey 对应的值不可以修改;
4.2 版本之后,如果 ShardKey 为非_ID 字段,那么可以修改 ShardKey 对应的值。
2.5 Shard Key的使用
Mongos 是如何基于请求当中的 shard key 信息来做请求转发,有两种转发行为,一种叫做特定目标的操作(targeted operation),一种叫做广播操作(Broadcast Operations)。
Targeted Operation : 根据 shard key 计算出目标 Shard(s),发起请求并返回结果。
Broadcast Operations :将请求发送给所有 Shard,合并查询结果并返回给客户端。
读请求:若用户请求中携带了 shard key,则直接计算出目标chunk所在 shard; 若用户请求中不包含shard key,则广播用户请求给所有shard,并将结果合并后返回给用户。
写请求:必须携带 shard key,直接作用于根据 shard key 计算出的目标chunk所在shard。
3、chunk
MongoDB 基于 ShardKey 将 Collection 拆分成多个数据子集,每个子集称为一个 Chunk。shardedCollection 的数据按照 ShardKey 划分为 MinKey ~ MaxKey 区间,每个 Chunk 有自己负责的一个区间(前闭后开)。存储 ShardedCollection 的 Shard 上有该 Collection 的一个或多个 Chunk ;
如下图所示:分片的集合是基于 x 的范围分片,数据被分成了 4 个 Chunk, Chunk 1 : [minKey, -75) ;Chunk2 : [-75, 25) ; Chunk3 : [25, 175) ; Chunk4 :[175, maxKey)是个前闭后开的区间。ShardA 是持有 Chunk1 和 Chunk2,而 ShardB 和 ShardC 则分别持有 Chunk3 和 Chunk4。
chunk有默认的大小限制(64MB,可配置chunk size),超出指定大小后会自动分裂(chunk splits),用户也可以手动进行分裂。
为了保证数据负载均衡,MongoDB 支持 Chunk在 Shard 间迁移,称为 Chunk Migration。Chunk迁移可自动触发,也可以手动触发。当 Chunk 在 Shard 之间分布不均时,Balancer 进程会自动触发。
Chunk 迁移的影响:影响 Shard 使用磁盘的大小;增加 网络带宽 及 系统负载,这些会对系统性能造成影响。
Chunk 迁移的约束:每个 Shard 同一时间只能有一个 Chunk 在进行迁移;不会迁移 Chunk 中文档数量是平均 Chunk 文档数 1.3 倍的 Chunk // 4.4 提供选项支持。
4、Balancer
Balancer 是 MongoDB 的一个后台进程,用保证集合的 Chunk 在各个 Shard 上是均衡的。
Balancer 运行在 ConfigServer 的 Primary 节点。 默认为 开启状态。
当分片集群中发生 Chunk 不均衡的情况时,Balancer 将触发 Chunk 从 Chunk 数量最多的 Shard 向 Chunk 数量最少的 Shard 上迁移。每个 Shard 同一时间只能有一个 Chunk 在进行迁移;
如图所示:Chunk 的数量小于 20,迁移阈值是 2,随着 Chunk 数量增大,迁移阈值分别增长为 4 和 8。
四、集群备份
1、官方方案
自部署的集群,官方提供了两种方案,这两种方案大体流程没啥区别,主要区别在于对数据库的备份手段,例如对文件系统进行快照或使用 mongodump。单个人觉得,mongodump 工具属于逻辑备份,性能底下,对于备份期间需要锁住数据库的情况,客户应该接受不了。不过个人没有实践过,无法给出具体的性能参数。下面介绍通用流程。
(1)寻找合适的备份窗口
数据块迁移、重新分片和模式迁移操作会导致备份不一致。
(2)停止负载均衡器
为了防止数据块迁移破坏备份,使用 sh.stopBalancer() 方法停止平衡器.
如果当前正在进行均衡操作,则停止操作会等待均衡操作完成后再继续执行。
要验证负载均衡器是否已停止,请使用 sh.getBalancerState() 方法:
use config
sh.stopBalancer()
while( sh.isBalancerRunning().mode != "off" ) {print("waiting...");sleep(1000);
}
(3)锁定集群
写入数据库可能会导致备份不一致。锁定分片集群以防止数据库被写入。
若要锁定分片集群,请使用 db.fsyncLock() 方法:
db.getSiblingDB("admin").fsyncLock()
在配置服务器的 mongos 和主 mongod 上运行以下聚合管道。要确认锁定,请确保 fsyncLocked 字段返回 true ,fsyncUnlocked 字段返回 false。
(4)备份 Config Server 的主节点
(5)备份每个 Shard 主节点
(6)解锁集群
备份完成后,您必须解锁群集以允许恢复写入。
解锁集群,在配置服务器的 mongos 和主 mongod 上运行以下聚合管道。要确认解锁,请确保 fsyncLocked 字段返回 false , fsyncUnlocked 字段返回 true。
db.getSibling("admin").fsyncUnlock()
(7)重启负载均衡器
重启负载均衡器执行下面的语句。
sh.startBalancer()
2、鼎甲方案
基于官网,内容大同小异。
DBackup 新版基于快照技术,实现高效的流式备份恢复方案:
(1)自动选择从节点备份,避免影响主节点业务;
(2)仅恢复主节点,从节点将自主同步;
(3)支持跨集群恢复,不受限于原始架构;
3、爱数方案
基于官网,内容大同小异。
五、参考文献
《mongodb入门实战》阿里云
mongodb.com/zh-cn/docs/manual/https://www.mongodb.com/zh-cn/docs/manual/
相关文章:
mongodb shard 分片集群基础概念
目录 一、shard 集群 二、Config Server 1、config.shards 2、config.database 3、config.collection 4、config.chunks 5、config.settings 6、其他 三、shard机制 1、Primary Shard 2、Shard Key 2.1 范围分片 2.2 哈希分片 2.3 Shard Key重定义 2.4 版本约束…...
Streamlit 应用从本地部署到服务器并进行访问
目录 1 部署 Streamlit 应用到服务器2 配置服务器允许远程访问3 使用反向代理4 使用 HTTPS5 总结 1 部署 Streamlit 应用到服务器 1 选择一个服务器平台 首先,你需要选择一个服务器平台来部署你的 Streamlit 应用。常见的选择包括: 云服务器:…...
大数据新视界 -- 大数据大厂之 Hive 数据压缩:优化存储与传输的关键(上)(19/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
Java开发中对List<Map<String, Object>>集合去重并按大小拆分子列表
Java开发中对List< Map< String, Object > >集合去重并按大小拆分子列表 一、使用场景二、实现步骤三、相关知识四、代码示例 一、使用场景 在处理大量List<Map<String, Object>>集合的数据时,为确保数据的唯一性,需要先根据Ma…...
vue3项目搭建-6-axios 基础配置
axios 基础配置 安装 axios npm install axios 创建 axios 实例,配置基地址,配置拦截器,目录:utils/http.js 基地址:在每次访问时,自动作为相对路径的根 // axios 基础封装 import axios from "axios";…...
git 学习笔记
目录 一、git 前期准备 1、托管平台的账号注册(以gitee码云为demo) 2、本地个人电脑配置 (1)配置用户属性 (2)配置SSH密钥 二、git 工作流程图 三、git 提交命令 (1)git ini…...
Y20030019 基于java+jsp+mysql的微信小程序校园二手交易平台的设计与实现 源代码 文档
旅游度假区微信小程序 1.摘要2. 系统开发的目的和意义3.系统功能4.界面展示5.源码获取 1.摘要 随着移动互联网的发展,微信小程序已经成为人们生活中不可或缺的一部分。微信小程序的优点在于其快速、轻量、易用,用户无需下载即可使用,节省了用…...
Cookie跨域
跨域:跨域名(IP) 跨域的目的是共享Cookie。 session操作http协议,每次既要request,也要response,cookie在创建的时候会产生一个字符串然后随着response返回。 全网站的各个页面都会带着登陆的时候的cookie …...
Mybatis:CRUD数据操作之删除一行数据
Mybatis基础环境准备请看:Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之单条删除数据 当用户点击了该按钮,就会将改行数据删除掉。那我们就需要思考,这种删除是根据什么进行删除呢?是通过主键id删除,因为id是…...
【机器学习】CatBoost 模型实践:回归与分类的全流程解析
一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS:转载自己的文章也算原创吧。 在机器学习领域,CatBoost 是一款强大的梯度提升框架,特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…...
MySQL中如何减少回表
在MySQL中,回表是指在使用非聚集索引进行查询时,如果需要获取的数据不在索引页中,就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。这个过程会增加额外的磁盘I/O操作,降低查询性能,特别是在查询大量数据…...
10. 函数
一、什么是函数 函数也是对象,对象是内存中专门用来存储数据的一块区域。函数可以用来保存一些可执行代码的,并且可以在需要时,对这些语句进行多次调用。 二、创建函数 创建函数也称为定义函数。我们可以使用 def 关键字来定义函数ÿ…...
计算机网络:数据链路层(二)
网课资源: 湖科大教书匠 1、网络适配器和MAC地址 习题1 1 以下哪个地址是广播MAC地址 A. 00-00-00-00-00-00 B. AB-CD-EF-11-22-33 C. FF-FF-FF-FF-FF-FF D. 29-29-29-29-29-29 2 以下哪个地址是多播MAC地址 A. 00-00-00-00-00-00 B. A9-8B-7C-6D-5E-4F C. FF-FF-…...
一万台服务器用saltstack还是ansible?
一万台服务器用saltstack还是ansible? 选择使用 SaltStack 还是 Ansible 来管理一万台服务器,取决于几个关键因素,如性能、扩展性、易用性、配置管理需求和团队的熟悉度。以下是两者的对比分析,帮助你做出决策: SaltStack&…...
设计模式学习之——观察者模式
观察者模式是一种行为型设计模式,它用于在对象之间建立一对多的依赖关系。 一、定义与角色 定义: 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察…...
服务器实现ssh证书登录
1.生成公钥和私钥 ssh-keygen -t rsa 提示默认生成位置为/root/.ssh/id_rsa ,直接回车。(也可以自己修改) 提示输入证书的密码,可以留空,建议输入,如果输入了,则需要再次确认,记住这个证书密码(证书再加…...
python基础知识精讲
Python基础知识精讲 Python是一种广泛使用的高级编程语言,以其清晰的语法和代码可读性而闻名。它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。以下是Python基础知识的详细讲解。 1. Python简介 Python由Guido van Rossum创建&#x…...
分页查询日期格式不对
方式一:在属性上加入注解,对日期进行格式化 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理 /*** 统一转换处理扩展spring mvc* 后端返回前端的进行统一转化处理* param converters*/Overrideprotected voi…...
Windsurf可以上传图片开发UI了
背景 曾经羡慕Cursor的“画图”开发功能,这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…...
工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景
GPT-4o Realtime API 发布,语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互: 允许应用程序实时接收并响应语音和文本输入。自然语音生成: 减少 AI 技术生成的语音…...
Java 虚拟机:承载 Java 生态的神奇魔盒
在软件开发的世界里,Java 虚拟机(JVM)就像一位智慧的管家,默默守护着 Java 生态系统的运行。它不仅让 Java 实现了"一次编写,到处运行"的梦想,更是成为了多种编程语言的运行平台。让我们一起走进…...
Linux VLAN 实现原理技术笔记
一、引言 VLAN(虚拟局域网)在整车网络架构中起着至关重要的作用,它能够在物理网络基础设施上创建逻辑隔离的网络区域,提高车内网络的安全性、灵活性和性能。Linux 内核通过一系列复杂的机制实现了 VLAN 功能,本技术笔记…...
【Git】:分支管理
目录 理解分支 创建分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 快进合并 正常合并 bug 分支 总结 理解分支 在版本控制系统中,分支是一条独立的开发线路。它允许开发者从一个主要的代码基线(例如master分支)分离出来…...
Java中的运算符“instanceof“详解
在Java中,instanceof运算符用于检查一个对象是否是某个特定类的实例,或者是否实现了某个特定接口。它返回一个布尔值(true或false),用于在运行时进行类型检查。这在处理多态性时尤其有用,可以帮助我们确定对…...
Profinet转Modbus TCP西门子SINAMICS G120变频器与施耐德M580通讯案例
一. 案例背景 在复杂的工业自动化场景中,企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能,在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&a…...
机器学习实战笔记39-43树模型基础
目前最常用的是CART树: 评价标准:每次划分后子节点的纯度(即是否标签都为0/1),分为信息熵、基尼系数(越小则纯度越高)和分类误差 找划分节点的方法:CART树无需区分连续和离散变量&am…...
`uni.setClipboardData` 是 uni-app 提供的一个 API 设置系统剪贴板的内容
uni.setClipboardData是uni-app提供的一个API,用于设置系统剪贴板的内容。 使用说明: 使用此API可以将指定的文本内容复制到系统剪贴板,使用户能够在其他应用或页面中粘贴这些内容。 uni.setClipboardData({data: , // 需要复制的内容 suc…...
Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事
在Android上使用OpenGL绘制矩形(或尝试显示为正方形)时,如果结果显示为不是正方形,可能有几个原因。以下是一些常见的因素及解决方法: 视口(Viewport)设置不当: OpenGL的视口定义了…...
网络安全开源组件
本文只是针对开源项目进行收集,如果后期在工作中碰到其他开源项目将进行更新。欢迎大家在评论区留言,您在工作碰到的开源项目。 祝您工作顺利,鹏程万里! 一、FW(防火墙) 1.1 pfSense pfSense项目是一个免费…...
【C++初阶】第5课—模版初阶
文章目录 1. 函数模版1.1 函数模版格式1.2 函数模版原理1.3 函数模版的实例化1.4 模版参数的匹配原则 2. 类模版 1. 函数模版 在讲函数模版之前先看一个例子 为了实现泛型编程,C提出了函数模版的概念函数模版与类型无关,在使用时被参数化,根据…...
【力扣热题100】[Java版] 刷题笔记-3. 无重复字符的最长子串
题目:3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 解题思路 根据题目,只需要返回无重复字符串的最长子串的长度,所以我们不需要知道知道字符串内容是什么,在整个字符串 s 中&…...
无人机数据处理系统:原理与核心系统
一、数据处理系统的运行原理 数据获取:无人机在飞行过程中,通过搭载的传感器(如相机、激光雷达等)采集到各种类型的数据,例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输:采集到的数据会通…...
Hadoop分布式文件系统(二)
目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…...
PortSwigger 原型污染
一、什么是原型污染 原型污染是一种 JavaScript 漏洞,它使攻击者能够向全局对象原型添加任意属性,然后这些属性可能被用户定义的对象继承。 二、JavaScript 原型和继承基础 1、原型 JavaScript 中的每个对象都链接到某种类型的另一个对象,称…...
雪花算法详解:分布式系统中高效唯一的ID生成方案
文章目录 原理与结构工作流程优势局限性应对高并发的方法适用场景 雪花算法(Snowflake Algorithm)是由Twitter开发的一种分布式全局唯一ID生成方案,旨在解决在分布式系统中快速、无冲突地生成唯一标识符的问题。它通过巧妙的设计,…...
[Redis#7] set | 命令 | 集合 | 用户画像 | UV
目录 1. 特点 2. 常用命令 2.1 普通命令 2.2 集合间操作 2.3. 命令小结 3.内部编码 4. 应用场景 1. 构造用户画像 2. 计算用户之间的共同好友 3. 统计 UV 1. 特点 集合类型也是保存多个字符串类型的元素的,和 list 类型不同的是: 无序性&…...
中介者模式 (Mediator Pattern)
文章目录 中介者模式 (Mediator Pattern)原理优点缺点示例代码场景描述1. 定义中介者接口2. 实现具体中介者3. 定义同事类接口4. 实现具体同事类5. 客户端代码输出结果 UML 类图使用场景小结 中介者模式 (Mediator Pattern) 中介者模式是一种 行为型设计模式,用来降…...
PVE 软路由单网口——VLAN 实践
从VLAN交换机出发,到PVE的Linux Bridge 、Linux VLAN,再到iKuai等软路由软件的设置,尽可能的了解VLAN设置细节,避免踩坑。 本文使用的快速切换CIDR的脚本 PVE 调试之“一键设置网络连接的以太网的CIDR“——“.PS1 脚本” 默认…...
搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档 本项目采用以下架构: NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制,确保文档安全。Git服务器: 负责存储文档版本历史&#x…...
【QT】控件8
1.QDial 通过调节旋钮位置来控制窗口的不透明度: void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示: 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…...
asyncio.to_thread 详解及示例代码
asyncio.to_thread 详解及示例代码 1. asyncio.to_thread() 简介函数签名返回值 2. 示例代码示例 1: 执行阻塞的 I/O 操作示例 2: 执行阻塞的 CPU 密集型操作 3. 注意事项4. 总结 在异步编程中,asyncio 是 Python 中用于编写异步代码的标准库。然而,有时…...
MYSQL字段变更
修改字段长度 ALTER TABLE tqt_sp_prod.t_receipt_order_head MODIFY COLUMN CUS_CONTRACT_CD VARCHAR(50) COMMENT 客户合同编号;添加varchar类型字段 AFTER 此处指在loc_cd字段后面 ALTER TABLE m_product ADD COLUMN FIXED_ASSET_NUM VARCHAR(100) DEFAULT NULL COMME…...
【通俗理解】步长和学习率在神经网络中是一回事吗?
【通俗理解】步长和学习率在神经网络中是一回事吗? 【核心结论】 步长(Step Size)和学习率(Learning Rate, LR)在神经网络中并不是同一个概念,但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...
力扣-位运算-8【算法学习day.48】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
C++ 字符串中数字识别
【问题描述】 输入一个字符串,含有数字和非数字字符,如“sumabc234;while(abc700)tab{ass346;bssabc267;}”,将其中连续的数字作为一个整数,依次存放到一个数组nums中。例如,234放在nums[0],700放在nums[1…...
计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
jvm-49-linux 服务器 cpu 使用率升高应该如何排查分析?
拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露? 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现,进一步抽象 jvisualvm java 性能分析工具 jvm-44-jvm 内存性能分析工具 Eclipse Me…...
FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现
FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现 原因ADS111x连续采样实现连续采样功能说明iic读取adc的数据速率 VS adc连续采样的速率adc连续采样的速率iic读取adc的数据速率结论分析 FPGA读取adc数据问题一:读取adc数…...
Web开发基础学习——HTML, CSS, JavaScript 的区别和联系
Web开发基础学习系列文章目录 第一章 基础知识学习之HTML, CSS, JavaScript 的区别和联系 文章目录 Web开发基础学习系列文章目录前言一、定义说白了,就是HTML负责网页的内容,CSS负责网页的格式,JS负责网页的交互。 二、 功能三、联系四、示…...
通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报
云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 趋势热点 🥇 通义灵码走进北京大学创新课堂,与 400…...