C大调音阶在吉他指板上可以有不同的把位 https://www.zhihu.com/tardis/zm/art/496745355?source_id=1005
扫弦节奏型:1)下 下 下上 上下上下 下上
节拍
HUB GUITAR: https://hubguitar.com/zh_han/music-theory 指板: https://hubguitar.com/zh_han/fretboard
弹奏第一品位上的B弦,这就是 C音,一个以一定频率振动的音波。接下来你拨第十三品的同一根弦,同样地,它听上去好像是同一个音,但这个音高更高。这是因为声波的振动是原来的两倍之快,可以表达为1:2, 它们是有同一特性的音。如果两种不同的乐器同时弹奏C音,这个比例是1:1,这称为 同音。在下图中,第一品的音符将会是最左边的C,第十三品的音则是在最右边。所有在这两者之间的音符都是特定的音符,但一旦重新回到C音,就重新按照这个顺序继续下去。
音程:就是两个音符之间的高低关系。在较低的一个 “C” 音和另一个较高的 “C” 音之间的音程就是 八度(八音音阶)。八度是音高的基本来源,其余的还包括将它分成更小的部分而得到的音高,称为 音数。半音就是移动一格,从 C 到 C♯。全音移动两格,从 C 到 D。 大多数现代音乐将八度分割为12级,如图所示,你可以按照这个音符的顺序来弹奏,从第一品的 B 弦开始,每次移动一个品位,直到第十三品,重新回到 C,一边弹奏一边大声说出这个音符的名字。所有这十二个音符一起组成了 半音音阶。音阶就是音符的顺序,并且没有重复的音符,所有的音符以升序,从低到高的顺序来弹奏。
根音?它就是一首歌的主调音,它是一个单音,其余的东西全在它的基础上变化,想像它是重力中心,它是一种吸引力,吸引着一首歌曲里其余所有的音,不管什么情况下都会回到根音上来。
晴天 - 周杰倫
Hey Jude - The Beatles
紅豆 - 方大同
找自己 - 陶喆
Canon in C https://www.bilibili.com/video/BV1if4y1A7SZ/
揪心的玩笑與漫長的白日夢 - 萬能青年旅店
https://www.bilibili.com/video/BV1cuHjetENY/?vd_source=ff210768dfaee27c0d74f9c8c50d7274
基本概念
Maven是Apache基金会的开源项目管理和构建自动化工具,使用POM(Project Object Model) 文件描述项目结构、依赖关系和构建配置。
是否专门用于Java?
主要定位:主要用于Java项目
可扩展性:通过插件可支持其他语言(Scala、Groovy、Kotlin等)
生态系统:虽然不限于Java,但在Java生态中最为成熟
核心功能
1 | ├── 依赖管理(Dependency Management) |
Maven依赖的本质
| 内容 | 说明 | 是否必须 |
|---|---|---|
| .class文件 | 已编译的字节码(人类可读的.java源代码文件编译而来) | ✅ 必须,用于运行 |
| pom.xml | 依赖的元数据 | ✅ 必须,用于传递依赖解析 |
| 源代码(.java) | 可选,用于调试 | ❌ 可选,IDE可单独下载 |
| javadoc | API文档 | ❌ 可选,IDE可单独下载 |
1 | // pom.xml中的依赖声明 |
1 | ~/.m2/repository/com/google/guava/guava/31.1-jre/ |
| 命令 | 功能 | 说明 |
|---|---|---|
| mvn clean | 清理项目 | 删除target目录 |
| mvn compile | 编译源码 | 生成target/classes |
| mvn test | 运行测试 | 执行src/test下的测试 |
| mvn package | 打包项目 | 生成jar/war包 |
| mvn install | 安装到本地仓库 | mvn package + 将jar安装到本地 ~/.m2/repository |
| mvn deploy | 部署到远程仓库 | 发布到Nexus/Artifactory |
| mvn clean install | 清理并安装 | 常用组合命令 |
| mvn dependency:tree | 查看依赖树 | 分析依赖关系 |
| mvn spring-boot:run | 运行Spring Boot | 需要对应插件 |
A[clean] –> B[validate] –> C[compile] –> D[test] –> E[package] –> F[verify] –> G[install] –> H[deploy]
mvn compile - 编译阶段相当于:执行 javac 编译源代码
1 | # 实际操作 |
当您运行 mvn compile时,Maven 会:
解析依赖:读取 pom.xml 中的
下载依赖:从远程仓库下载到本地 ~/.m2/repository/
构建依赖图:处理传递依赖
关键点:Maven 管理的这些依赖是已经编译好的 .class 文件(JAR 包),不是 .java 文件。
然后 Maven 会:
编译您的代码:src/main/java/下的 .java 文件
使用依赖:编译时将下载的依赖 JAR 加入 classpath
打包:将您的 .class 文件 + 资源文件打包
todo:那么打包的时候到底保护包含依赖?我自己的源代码编译 .class + 依赖包的 .class ??
mvn package - 打包阶段相当于:根据packaging类型不同,将编译结果打包成可分发的格式(注意:普通mvn package生成的jar不包含依赖!依赖需要单独配置)
1 | <!-- pom.xml中指定打包类型 --> |
打包过程:
1 | # 对于jar包: |
mvn install - 安装阶段mvn install 做了两件事:
1 执行之前所有阶段:validate → compile → test → package → verify → install
2 将当前项目的构建结果安装到本地仓库,安装位置 →
1 | ~/.m2/repository/com/yourcompany/yourapp/1.0.0/ |
1 | # 标准开发流程 |
| 方式 | 插件 | 特点 | 适用场景 |
|---|---|---|---|
| 普通JAR | maven-jar-plugin | 不包含依赖 | 库项目 |
| Fat JAR | maven-assembly-plugin | 包含所有依赖 | 简单应用 |
| 可执行JAR | spring-boot-maven-plugin | Spring Boot专用 | Spring Boot应用 |
| Shadow JAR | maven-shade-plugin | 重命名包解决冲突 | 复杂依赖 |
Spring Boot项目(最常用)
1 | <!-- pom.xml --> |
1 | # 打包命令 |
项目结构
1 | my-project/ |
执行流程
1 | # 1. 清理 + 编译 |
1 | File → Settings → Build, Execution, Deployment → Build Tools → Maven |
症状:点击刷新后,依赖仍然报红
解决方案:
强制刷新:
1 | # 命令行执行 |
-U 参数强制更新快照版本
删除本地仓库:
1 | # Windows |
清除IDEA缓存:
1 | File → Invalidate Caches and Restart |
解决方案:
配置阿里云镜像(settings.xml):
1 | <mirrors> |
IDEA配置镜像:
1 | File → Settings → Build Tools → Maven |
症状:NoSuchMethodError, ClassNotFoundException
排查命令:
1 | # 查看依赖树 |
IDEA可视化排查:
解决冲突示例:
1 | <dependency> |
1 | <!-- 统一管理版本 --> |
| 图标 | 功能 | 快捷键 |
|---|---|---|
| 🔄 | 重新导入所有Maven项目 | Ctrl+Shift+O |
| 🏃 | 运行Maven目标 | 右键→Run Maven |
| 📊 | 显示依赖图 | 右键→Show Dependencies |
| 🧹 | 执行clean | 双击Lifecycle→clean |
1 | <!-- pom.xml 中定义不同环境 --> |
在IDEA Maven工具窗口的Profiles中勾选激活。
当遇到顽固依赖问题时,按顺序执行:
第一步:清理缓存
1 | mvn clean install -U |
第二步:删除本地仓库对应目录
1 | # 删除有问题依赖的目录 |
第三步:IDEA完全清理
.idea 目录和 *.iml 文件第四步:检查Maven配置
1 | # 查看有效POM |
第五步:网络代理检查
1 | <!-- settings.xml 配置代理 --> |
使用依赖锁定
1 | <plugin> |
定期清理本地仓库
1 | # 清理失败下载 |
使用CI/CD环境验证
在Jenkins/GitHub Actions中设置定期构建,提前发现问题。
| 错误代码 | 含义 | 解决方案 |
|---|---|---|
| 501 HTTPS Required | 仓库需要HTTPS | 更新settings.xml,使用https仓库 |
| 401 Unauthorized | 认证失败 | 配置正确的server认证 |
| Could not transfer artifact | 网络/权限 | 检查网络,清理.lastUpdated文件 |
| No compiler is provided | JDK配置错误 | 配置JAVA_HOME,或在pom中指定javac |
离线模式(网络不稳定时)
1 | mvn clean install -o |
跳过测试
1 | mvn clean install -DskipTests |
多线程构建
1 | mvn clean install -T 4 |
调试模式
1 | mvn -X clean install |
📚 文档链接: 快速入门 | Milvus 文档
向量嵌入是从机器学习模型中提取的数值表示,捕捉非结构化数据的语义含义。这些嵌入通过神经网络或变压器架构对数据中的复杂相关性进行分析,创建一个密集的向量空间,其中每个点对应于数据对象(如文档中的词)的“含义”。
这个过程将文本或其他非结构化数据转换为反映语义相似性的向量——在这个多维空间中,意义相关的词被放置得更近,从而实现一种称为“密集向量搜索”的搜索方式。这与依赖精确匹配和使用稀疏向量的传统关键词搜索形成对比。向量嵌入的发展,通常源于大型科技公司广泛训练的基础模型,使得搜索能够捕捉数据的本质,超越词汇或稀疏向量搜索方法的局限性。
向量:可以理解为在多维空间中的一个点,它由一组数字(坐标)表示。在 AI 中,无论是文本、图像还是声音,都可以通过特定模型(如 qwen3-embedding-4b-torch)转换为一个向量。这个向量捕捉了原始数据的深层特征。
维度:就是指这个向量有多少个数字。例如,一个 [0.12, 0.45, -0.23, …, 0.78]的向量,如果它有 1024 个数字,我们就说它是一个 1024 维 的向量。维度的选择通常由您选用的嵌入模型决定,并且在创建 Milvus 集合时必须正确定义,因为所有存入的向量都必须有相同的维度。
非结构化数据(如文本、图像和音频)格式各异,蕴含丰富的潜在语义,因此分析起来极具挑战性。Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。
Milvus 提供强大的数据建模功能,使您能够将非结构化或多模式数据组织成结构化的 Collections。它支持多种数据类型,适用于不同的属性模型,包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON,为您节省了维护多个数据库系统的精力。
与处理结构化数据并执行精确搜索操作的传统关系数据库不同,向量数据库擅长使用 Approximate Nearest Neighbor(ANN)算法等技术进行语义相似性搜索。这种能力对于开发推荐系统、聊天机器人和多媒体内容搜索工具等各种领域的应用程序,以及解决 ChatGPT 等大型语言模型和 AI 带来的挑战(如理解上下文和细微差别以及 AI 幻觉)至关重要。
| Milvus 概念 | 类比关系型数据库概念 | 说明 |
|---|---|---|
| Collection(集合) | Table(表) | 存储向量和关联元数据(如文本内容、来源)的基本单位。 |
| Entity(实体) | Row(行) | 一条完整的记录,包含主键、向量字段和标量字段(元数据)。 |
| Field(字段) | Column(列) | 包括向量字段(存储向量)和标量字段(存储 ID、标签等结构化数据)。 |
| Index(索引) | Index(索引) | 为向量字段建立的索引(如 HNSW、IVF_FLAT),是高速检索的关键。 |
写入数据(以 Python 为例):
1 | from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType |
读取与搜索:
1 | # 用户提出问题,并转换为向量 |
Milvus 支持的搜索类型
ANN 搜索:查找最接近查询向量的前 K 个向量。
过滤搜索:在指定的过滤条件下执行 ANN 搜索。
范围搜索:查找查询向量指定半径范围内的向量。
混合搜索:基于多个向量场进行 ANN 搜索。
全文搜索:基于 BM25 的全文搜索。
获取:根据主键检索数据。
查询使用特定表达式检索数据。
Rerankers
在基础的 RAG 流程中,系统通过 Embedding 模型 将用户查询和知识库文档转换为向量,然后利用向量数据库进行快速的相似性搜索,找出最相关的几个文档片段作为上下文提供给 LLM 。然而,这种基于向量相似度的检索有时无法完美捕捉深层次的语义关联,可能返回一些看似相关实则无关的“噪声”文档 。
Reranker 模型的作用就在于此。它通常在向量检索之后介入,像一个专业的裁判,对初步检索到的候选文档(例如 Top 20 或 Top 50)进行二次精排 。其核心工作原理是:
1、精细化语义理解:不同于 Embedding 模型分别处理查询和文档,典型的 Cross-encoder Reranker 会将查询和一个候选文档同时输入模型,让模型直接分析两者之间的交互信息,从而给出一个更精确的相关性分数 。
2、结果重排序:Reranker 为所有候选文档重新打分并排序,最终只将排名最靠前的、真正相关的少量文档(如 Top 3 或 Top 5)传递给 LLM 。
在 RAG 流程中,Milvus 扮演着 知识库与高速检索引擎 的角色。
qwen3-235b-a22b),由它来生成精准、有据可依的最终答案。人工智能集成:
Agentic RAG(智能体驱动的 RAG,Agentic RAG = RAG + Agent):基础的 RAG 中,检索-增强-生成是一次性完成的。而Agentic RAG则引入了“智能体”的概念,智能体可以根据对大模型初步生成内容的理解,主动地、多次地 与向量数据库(Milvus)进行交互。这使 RAG 系统从静态的“文档查找”升级为动态的、具有决策能力的“研究助手”。例如:
AI Agent的本质是能够感知环境、自主决策并执行行动的智能实体。与传统AI系统最大的区别在于Agent具有自主性、反应性、目标导向和学习能力,它不再是简单的工具,而是能够主动规划和完成复杂任务的智能体。从1997年击败国际象棋世界冠军的IBM“深蓝”,到2011年苹果推出的个人助理Siri,都展示了Agent在特定领域的强大能力,关键的转折点发生在2023年左右,大语言模型LLM的出现为Agent提供了强大的通用理解和推理能力,使其不再局限于单一任务。
Function Calling:函数调用,是LLM的一种能力,允许模型根据用户输入决定何时以及如何调用哪个函数(Tool),并以结构化格式(如JSON)输出函数调用参数。然后由外部系统执行该函数。RAG(检索增强生成):通过从外部知识库检索相关信息,并将其作为上下文提供给LLM,从而生成更准确、更相关的回答。MCP(模型上下文协议):MCP可以包含本地tools和外部API,但通常 MCP更强调于将工具(无论是本地tools还是外部API)以标准化的上下文协议暴露给AI模型。MCP可以看作是一个中间层,它将工具抽象成标准的接口,使得AI Agent可以通过统一的协议来调用这些工具,从而实现模型与工具之间的解耦。
1 | #### main.py |
1 | #### tools.py |
MCP 可以看作是一个中间层,它将工具抽象成标准的接口,使得AI Agent可以通过统一的协议来调用这些工具,从而实现模型与工具之间的解耦。MCP 可以包含本地tools和外部API,但通常 MCP更强调于将工具(无论是本地tools还是外部API)以标准化的上下文协议暴露给AI模型。
RAG 的核心思想是:在让大模型回答问题之前,先从一个外部的、可随时更新的知识库中检索相关信息,然后将这些“新鲜”信息作为上下文和问题一起交给模型,从而引导模型生成更准确、及时且可追溯的答案。它能有效减少模型“幻觉”(即胡编乱造),让AI应用在知识密集型任务中变得真正可靠。以及,它能帮助构建专业领域专家对话机器人。
一个典型的RAG系统工作流程包含三个关键阶段:

业务逻辑
LangChain 是一个功能强大的大语言模型应用开发框架。与Spring在Java后端开发中的定位类似。
https://python.langchain.com/docs/concepts/
https://arxiv.org/abs/2302.07842
LangChain 包:通过 pip 命令(类似于Java的Maven或Gradle)安装到项目中,避免重复造轮子。
LangGraph 核心认知:用“有向图”构建智能体的新一代框架,是 用于构建有状态、多步骤、多分支智能体(Agent) 的框架,核心是将 Agent 的行为拆解为节点(Nodes) 和边(Edges),用有向图(Directed Graph) 替代老版本的“线性循环” 以支持更复杂的流程编排。
LangGraph 可以理解为:给 Agent 设计“流程图”的工具,而老版本 ReAct Agent 只是这个流程图中最基础的“单循环分支”。
https://docs.langchain.com/oss/python/langgraph/overview
1 | { |
InMemorySaver),支持中断、恢复、回溯(比如多轮对话的上下文保留)。cmdb_search、cmdb_query)。用户输入清洗节点 → LLM 思考节点 → CMDB 工具节点 → 日志工具节点 → 回答格式化节点cmdb_search 节点;如果输出“需要调用日志工具”,则跳转到 log_search 节点;如果输出“无需调用工具”,则跳转到“回答节点”。InMemorySaver 就是内存级的检查点,还可以用 Redis、SQL 实现持久化)。1 | [入口节点:用户输入] |
cmdb_search),LangGraph 只通过工具调用节点统一管理,支持多工具的动态选择和调用。cmdb_search,再调用 cmdb_query 统计)。AgentExecutor)是 LangGraph 的简化版,两者的核心差异在于流程的编排能力:| 维度 | 老版本 ReAct Agent(AgentExecutor) | LangGraph |
|---|---|---|
| 架构基础 | 线性循环(Single Loop) | 有向图(Directed Graph) |
| 节点/边 | 无物理节点拆分,只有“思考→工具”的逻辑两步;无多分支边,只有单一循环。 | 支持多节点、多类型边(条件边、普通边),可编排复杂流程。 |
| 状态管理 | 临时状态(每次循环重新生成,无持久化) | 统一的状态对象,支持持久化、回溯(Checkpoint)。 |
| 流程灵活性 | 只能“思考→工具→思考”的单一循环,多工具需按顺序调用(一次一个)。 | 支持多分支(比如不同工具的并行调用)、条件跳转、中断恢复。 |
| 扩展性 | 扩展复杂流程(如多工具并行)需要大量自定义代码。 | 通过图的编排即可实现,无需修改核心逻辑。 |
老版本 ReAct Agent 的核心是 AgentExecutor 的单一循环: |
1 | while True: |
cmdb_search,再调用 alert_search,通过多次循环实现。集成到Java
MongoDB 是一个基于文档的开源 NoSQL 数据库,使用类似 JSON 的文档模型灵活存储数据,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
https://www.mongodb.com/zh-cn/docs/manual/crud/
| MongoDB 概念 | 类比 MySQL 概念 | 类比 Elasticsearch 概念 | 核心解析 |
|---|---|---|---|
| 文档 (Document) | 行 (Row) | 文档 (Document) | 数据的基本单元,是一个键值对的有序集合。它类似于一条完整的记录。 |
| 集合 (Collection) | 表 (Table) | 索引 (Index) | 一组文档的容器。它类似于一张数据表。 |
| 数据库 (Database) | 数据库 (Database) | 无直接对应(可类比为索引的逻辑分组) | 最高层的命名空间,用于组织和管理多个集合。一个 MongoDB 实例可以运行多个数据库,每个数据库在文件系统上有独立的文件。 |
| 字段 (Field) | 列 (Column) | 字段 (Field) | 文档中的键值对,代表一个数据属性。 |
ALTER TABLE 操作。| 特性 | MongoDB | MySQL | Elasticsearch |
|---|---|---|---|
| 数据模型 | 文档模型,动态模式 | 关系模型,固定模式 | 文档模型,可定义映射 |
| 查询语言 | 面向对象的 API 方法 | 标准 SQL 语句 | JSON-based DSL |
| 核心优势 | 敏捷开发、水平扩展、存储复杂数据结构 | 复杂查询、事务一致性、数据完整性 | 全文搜索、日志分析、复杂聚合 |
| 典型场景 | 内容管理系统、用户画像、实时分析、物联网 | 金融交易系统、ERP、CRM等需要严格事务的系统 | 搜索引擎、日志和指标分析、应用内搜索 |
| 操作类型 | 方法示例 | 功能说明 |
|---|---|---|
| 创建 (Create) | db.hosts.insertOne({hostname: "web-01", ip: "192.168.1.100"}) |
向集合中插入一条新文档。若集合不存在,会自动创建。 |
| 批量创建 | db.hosts.insertMany([{hostname: "web-01"}, {hostname: "db-01"}]) |
批量插入多条文档。 |
| 查询 (Read) | db.hosts.find({status: "running"}) |
查询所有符合条件的文档。不传参数则返回所有文档。 |
| 条件查询 | db.hosts.find({"specs.memory": {$gte: 8}}, {hostname: 1, _id: 0}) |
使用查询操作符进行过滤,并使用投影选择返回的字段。 |
| 更新 (Update) | db.hosts.updateOne({hostname: "web-01"}, {$set: {"specs.memory": 32}}) |
更新一条匹配的文档。$set 操作符用于修改特定字段的值。 |
| 批量更新 | db.hosts.updateMany({environment: "production"}, {$inc: {visits: 1}}) |
更新所有匹配的文档。$inc 操作符用于将字段的值增加指定数额。 |
| 删除 (Delete) | db.hosts.deleteOne({hostname: "web-01"}) |
删除一条匹配的文档。 |
| 批量删除 | db.hosts.deleteMany({status: "terminated"}) |
删除所有匹配的文档。 |
insertMany 这样的多文档操作,默认情况下并非一个整体事务。$gt (大于), $gte (大于等于), $lt (小于), $lte (小于等于), $ne (不等于)。$and, $or, $in (匹配数组中任意值), $nin (不匹配数组中任何值)。1 | // 创建 |
1 | // 查询与投影 |
1 | // 更新操作符 |
1 | // 逻辑组合查询 |
1 | // 数组查询 |
1 | // 正则表达式与文本搜索 |
1 | // 场景:找出所有生产环境的Linux主机 |
1 | // 场景:找出内存大于8G的生产环境主机,按内存降序排列,只显示主机名和内存 |
1 | // 目标:查询生产环境的应用,并获取其运行主机的详细信息 |
1 | // 应用文档示例 |
1 | db.hosts.aggregate([ |
1 | db.applications.aggregate([ |
db.hosts.createIndex({ hostname: 1 })db.hosts.createIndex({ environment: 1, status: 1 }) db.hosts.createIndex({ tags: 1 })db.hosts.createIndex({ description: "text" })db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })1 | Primary(主节点)← 读写操作 |
1 | // 复制集配置 |
1 | // 强一致性写操作 |
1 | // 好的分片键:基数高、分布均匀 |
1 | 自然语言查询 → MCP Server → 查询解析器 → MongoDB查询生成器 → 结果格式化 |
1 | from mcp import MCPServer, Context |
1 | 你是一个CMDB专家,可以查询和分析基础设施信息。 |
1 | # 支持复杂查询的扩展工具 |
Docker 是一种开源平台,一种快速构建、运行和管理应用的工具。它使用容器化技术,使得应用程序及其依赖性可以打包到一个容器中,并在任何支持 Docker 的环境中运行。
1 MobarXterm 通过 SSH 连接 linux虚拟机,操作虚拟机上的 Docker。
2 Windows本地:通过wsl安装Linux发行版本,安装docker desktop(将自动在WSL中配置Docker环境,借助linux内核运行)
1 | docker run -d \ # 创建并运行一个容器,-d 是让容器在后台运行;同一个镜像可创建多个容器 |
1 | docker images # 查看本地镜像 |
镜像结构:入口,层,基础镜像。分层的好处是可复用,,
docker build 命令构建镜像。(如java项目还需要jar包)docker run 命令基于构建的镜像创建和运行容器。1 | docker volumels # 查看数据卷 |
容器编排是指在生产环境中管理和协调多个容器的过程。Docker 提供了 Docker Compose 工具,用于定义和运行多容器的应用。
Kubernetes是一个开源的容器编排引擎,可以用来管理容器化的应用,包括容器的自动化的部署、扩容、缩容、升级、回滚等等;
它是Google在2014年开源的一个项目,它的前身是Google内部的Borg系统。
在Kubernetes出现之前,我们一般都是使用Docker来管理容器化的应用,但是Docker只是一个单机的容器管理工具,它只能管理单个节点上的容器,当我们的应用程序需要运行在多个节点上的时候,就需要使用一些其他的工具来管理这些节点,比如Docker Swarm、Mesos、Kubernetes等等;
这些工具都是容器编排引擎,它们可以用来管理多个节点上的容器,但是它们之间也有一些区别,比如Docker Swarm是Docker官方提供的一个容器编排引擎,它的功能比较简单,适合于一些小型的、简单的场景,而Mesos和Kubernetes则是比较复杂的容器编排引擎;
Mesos是Apache基金会的一个开源项目,而Kubernetes是Google在2014年开源的,目前已经成为了CNCF(Cloud Native Computing Foundation)的一个顶级项目,基本上已经成为了容器编排引擎的事实标准了。
Node:k8s集群节点,可以是物理机/虚拟机
Pod:k8s最小调度单元,容器(运行app/数据库/..镜像)的抽象,可以是一/多个容器的组合,但除非高度耦合,一个pod只运行一个容器
Service:将一组pod封装成一个服务并且提供统一访问入口(解决了一组数据库pod中一个重建后ip变化的问题,类似于“服务发现”)
Ingress:为了对外提供服务,将外部请求路由转发到内部集群的service上
ConfigMap:封装配置信息
Secret:封装敏感信息
其他安全机制:网络安全,访问控制,身份认证
Volumn:将数据挂在到本地磁盘或远程存储上,实现持久化存储
Deployment:部署无状态应用程序,将一/多个Pod组合到一起;冗余备份,相当于对Pod的抽象;具有副本控制、滚动更新、自动扩缩容等功能,实现应用程序的高可用
Statefulset:部署有状态应用程序,如DB、MQ、缓存以及保留会话状态的应用程序
分为Master和Worker节点
apiserver:位于master节点上,是k8s集群的API接口;交互方式包括 kubectl 命令行、Dashboard界面或API接口
minikube是一个轻量级的kubernetes集群环境,可以用来在本地快速搭建一个单节点的kubernetes集群;
https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/ 你好,Minikube
minikube只能用来在本地搭建一个单节点的kubernetes集群环境,
下面介绍如何使用Multipass和k3s来搭建一个多节点的kubernetes集群环境,
1 | # 查看帮助 |
1 | # 创建并运行一个指定的镜像 |
1 | # 查看集群中某一类型的资源 |
1 | # 更新某个资源的标签 |
1 | # 进入某个Pod的容器中 |
Portainer 是一个轻量级的容器管理工具,可以用来管理Docker和Kubernetes,它提供了一个Web界面来方便我们管理容器
官方网址: https://www.portainer.io/
Helm 是一个Kubernetes的包管理工具,可以用来管理Kubernetes的应用,它提供了一个命令行工具来方便我们管理Kubernetes的应用
官方网址: https://helm.sh/
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
InfluxDB 是一个由InfluxData开发的开源时序型数据库,专注于海量时序数据的高性能读、高性能写、高效存储与实时分析等;
在DB-Engines Ranking时序型数据库排行榜上排名第一,广泛应用于DevOps监控、IoT监控、实时分析等场景。
https://jasper-zhang1.gitbooks.io/influxdb/content/Introduction/getting_start.html
influxdb-cluster 是InfluxDB的集群版本,InfluxDB Enterprise 的开源替代方案,设计用于大规模数据存储和高可用性需求。
可以实现数据的分片和复制,从而提高系统的可用性和扩展性。数据安全。operator缺失
https://github.com/chengshiwen/influxdb-cluster/wiki
InfluxDB Enterprise由两组软件进程组成: Data 数据节点 和 Meta 元节点。集群内的通信是这样的:
influxdb使用的默认端口号为分别为用于meta集群内部服务的8091端口,meta节点通信的8089端口,data集群内部服务的8088端口,以及data节点对外提供http服务的8086端
InfluxDB 集群中,一个节点要么是专门用于存储和查询时间序列数据的数据节点,要么是专门用于存储集群元数据的元节点。数据节点负责存储实际的数据和处理查询请求,而元节点则负责管理集群的元数据,包括节点信息、数据库和保留策略等。
元节点保存以下所有元数据:
元节点将这些数据保存在磁盘上的Raft数据库中,由BoltDB提供支持。默认情况下,Raft数据库是/var/lib/influxdb/meta/raft.db。
注意:Meta节点需要/ Meta目录。
influxd-meta 元数据服务1 | # 配置文件示例(meta节点) |
influxd-ctl 集群管理1 | # 查看分片分布 |
数据节点保存所有原始时间序列数据和元数据,包括:
在磁盘上,数据总是按照
influx CLI工具1 | # 进入容器执行CLI |
influxd 数据节点服务1 | # 查看运行状态 |
influx_inspect 数据工具1 | # 导出TSM文件(需进入容器) |
通信协议
| 组件 | 端口 | 用途 | 协议 |
|---|---|---|---|
| Meta节点间 | 8089 | Raft协议同步元数据 | TCP |
| Data节点间 | 8088 | 分片数据复制 | TCP |
| Data→Meta节点 | 8091 | 注册节点/获取分片元信息 | HTTP |
核心交互场景
节点注册 : Data节点启动时通过HTTP API向Meta节点注册(POST /data)
分片分配 : Meta节点根据replication-factor策略分配分片到Data节点
写入协调 : 客户端写入数据时,由Meta节点确定目标分片所在Data节点
故障转移 : Meta节点检测Data节点离线后,自动通过Hinted Handoff机制转移副本
一个集群至少要有三个独立的元节点才能允许一个节点的丢失,如果要容忍n个节点的丢失则需要2n+1个元节点。集群的元节点的数目应该为奇数。不要是偶数元节点,因为这样在特定的配置下会导致故障。
一个集群运行只有一个数据节点,但这样数据就没有冗余了。这里的冗余通过写数据的RP中的副本个数来设置。一个集群在丢失n-1个数据节点后仍然能返回完整的数据,其中n是副本个数。为了在集群内实现最佳数据分配,我们建议数据节点的个数为偶数。
1 | $ influx -precision rfc3339 |
1 | <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp] |
1 | > use testdb |
1 | > SELECT "host", "region", "value" FROM "cpu" |
1 | curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000' |
1 | curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" |
shard := shardGroup.shards[fnv.New64a(key) % len(shardGroup.Shards)]
4/2=2 个分片(Shard 1 & 2)cpu,host=svr1 usage=80:Series Key = cpu,host=svr1,哈希值模2=1 ⇒ 分片2,数据同时写入节点 C 和 DSELECT * FROM cpu WHERE time > '2025-04-02':定位到 2025-04-02 分片组, 协调节点同时向 A/B(分片1)和 C/D(分片2)发起查询, 合并结果后返回Docker安装操作单例InfluxDB https://www.cnblogs.com/nhdlb/p/16409849.html
Docker快速开始集群InfluxDB https://github.com/chengshiwen/influxdb-cluster/wiki#docker-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
在使用容器多节点部署InfluxDB时,数据库、容器、Docker、主机和Kubernetes(k8s)之间的关系可以理解如下:
Kubernetes 存储与 InfluxDB Shard 的关系解析
/var/lib/influxdb/data 目录下。/var/lib/influxdb/data/<database>/<retention_policy>/<shard_id>。Delete(默认),删除 PVC 会导致 Kubernetes 清理其绑定的 PV 及底层存储数据(如 NFS 目录、云盘等)。此时 /var/lib/influxdb 下的 data、meta 目录被清空,导致 Shard 文件丢失。ERR: shard not found 错误。https://docs.influxdata.com/enterprise_influxdb/v1/administration/backup-and-restore/
https://blog.csdn.net/weixin_46560589/article/details/127748939
InfluxDB Enterprise支持在集群实例、单个数据库和保留策略以及单个分片中备份和恢复数据。
1 | influxd backup -portable /path/to/backup |
1 | influxd backup -portable -database <database_name> /path/to/backup |
1 | influxd backup -portable -start <timestamp> /path/to/backup |
备份的数据可以恢复到新实例或现有实例中。
1 | influxd restore -portable /path/to/backup |
1 | influxd restore -portable -db <database_name> /path/to/backup |
-newdb 选项来实现:1 | influxd restore -portable -db <old_database_name> -newdb <new_database_name> /path/to/backup |
对于大多数InfluxDB Enterprise应用程序,备份和恢复实用程序提供了备份和恢复策略所需的工具。但是,在某些情况下,标准备份和恢复实用程序可能无法充分处理应用程序中的大量数据。作为标准备份和恢复实用程序的替代方案,可以使用InfluxDB influx_inspect export和涌入-import命令为灾难恢复和备份策略创建备份和恢复过程。
1 | root@influxdb-e2cb6c913a191e56c134e-data-0:/# influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influxdb/wal" -out "influxdb_test01_dump_out" -database "test01" -start "2024-10-22T00:00:00Z" |
1 | root@influxdb-e73f149ff7192bd87d190-data-1:/# influx -import -path='influxdb_test01_dump_out' -precision=ns -username='' -password='' |
-database,加 -compress-compressed 导入压缩文件,本质上是先解压后倒入Data节点迁移方案评审:先迁移后逐个恢复分片数据。已验证在分片副本大小70M、写入数据达2000point/s的情况下直接copy-shard会导致增量数据丢失,考虑在copy-shard前先执行truncate-shards截断热分片(集群中所有写入最新数据的分片,截断后关闭写入,变成冷分片),并在所有Data节点上创建该分片的新热分片副本,也就是在迁移节点上恢复了全部原有分片的新热分片副本,最新数据写入这个副本,然后再逐个从健康节点上的冷分片副本copy-shard恢复出分片的历史数据(迁移前分片副本原有的数据&迁移过程中未能写入的数据),该分片数据完全恢复;自测符合预期
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl show-shards # 或influx命令行执行show shards |
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl remove-data influxdb-xx-data-0.influxdb-xx-data:8088 |
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl truncate-shards |
1 | # 对于_internal分片的转移 先copy后remove |
1 | # 分片的物理文件 wal&tsm |
1 | # 可能要等wal落tsm |
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
除了OOP外,近年出现了一些小众的编程哲学,Go语言对这些思想亦有所吸收。例如,Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但非常强大。
go.mod 文件是声明依赖的地方,记录了项目的依赖关系。如果项目中没有 go.mod,需要先运行 go mod init 来初始化模块。然后使用 go get(或其他命令)来引入依赖,下载到本地缓存(~/go/pkg/mod),并更新 go.mod,添加对应的模块路径和版本要求。go.mod 文件声明并被解析(否则报错),将编译代码并链接所有必要的依赖来生成最终的可执行文件或库文件。如果 go.mod 中声明的依赖尚未下载,Go 工具链会自动为你下载这些依赖。如果你的项目中没有 go.mod,go build 将无法正确识别和下载依赖(除非是 Go 1.11 前的版本)go.mod 文件的 Go 项目,项目所需的依赖不会自动下载到本地环境中。需要手动运行 go mod download 或 go mod tidy 来下载依赖,或者直接运行 go build 以触发依赖的下载。go.mod 文件中声明的版本不同,Go 工具链会优先使用 go.mod 文件中指定的版本。Go 会从远程仓库下载与 go.mod 兼容的依赖版本,并将其存储在本地缓存目录(通常是 ~/go/pkg/mod)中。go env中的配置(看上去是如果配置全局 PATH=%GOPATH%\bin 就使用 GOPATH 中的go.exe和pkg)Makefile 文件,执行 build来构建项目。1 | D:\Users\caifeng7>wsl -l -v |
1 | sudo apt update |
1 | echo 'export PATH=$PATH:/root/go/bin' >> ~/.bashrc |
1 | root@caifeng7138:/mnt/c/Windows/system32# go env |
/mnt/d/code/datamars-agent/1 | root@caifeng7138:/mnt/d/code/datamars-agent# go env |
通过对国民收入的再分配,使公民在遇到特定风险或困难时能够获得基本生活保障。本质是追求一种公平。
佛山社保卡如何申领?“一人一卡”清理又是个啥? https://mp.weixin.qq.com/s/9uQ5qGOYv35BGRgs4OvzvA
没领佛山社保卡可以使用医保报销吗?可以,微信支付时会显示报销数额。
如何使用医保余额?办理实体医保卡,可以查到余额。
个人所得税丨2024年个人综合所得年度汇算操作指引 https://mapmpm5.midea.com/newservicenopages/#/content/preview?id=1896853229331374081
个人的汇算清缴,就是把您2024年一整年取得的劳动收入(税法中叫“综合所得”,具体指工资薪金、劳务报酬、稿酬、特许权使用费共4项)合并计算个税,得出应纳个人所得税,与2024年实际预扣预缴的个税比较,税款多退少补。预缴税款与实际应缴税款产生差异的核心原因在于预扣预缴机制与全年综合计算的逻辑差异。
预扣预缴是基于局部数据和固定规则的估算,而汇算清缴是基于完整数据和真实扣除的精准计算,
建议:通过“个人所得税APP”提前核对收入明细和扣除项,利用汇算规则合法降低税负(如优化年终奖计税方式)。以下是具体原因分析:
| 情形 | 补偿标准 | 法律依据 | 维权路径 |
|---|---|---|---|
| 企业合法解除未提前通知 | N+1 | 《劳动合同法》第40条 | 协商或仲裁主张代通知金 |
| 企业违法解除 | 2N | 《劳动合同法》第87条 | 劳动仲裁或诉讼索赔双倍赔偿 |
| 员工被迫离职(企业过错) | N | 《劳动合同法》第38条 | 提交证据申请仲裁 |
【当代年轻人没了铁饭碗,还能负重奔跑多久?北京二胎家庭如何转移风险?】 https://www.bilibili.com/video/BV16F4m1V7wv/?share_source=copy_web&vd_source=2cbe8cdd54a75d0c43fcdefa624d3fbe
“年纪轻的一定要买百万医疗险和意外险,还有抗癌险,关键时候真的能救命的,有余裕买个重疾险,如果生病了确证了就能拿到几十万的保额,可以作为治疗和康复期的生活费开销,医疗费有医保和百万医疗险,到时候真生比较严重的病百分之九十能报销,年纪轻买了便宜加起来一年千把块,父母没生病可以给他们买众民保和中银全名保,还有当地的惠民保三个加起来六百块不到,不看健康告知年龄大可以报销,配合医保大概能报销八十花的多甚至能报销到九十,给家里老人多套保障,不会出现得了病只能放弃的人间惨剧,如果老人没医保可以买城乡医保一年几百块”
mom:东莞农村?居民社保医保,莞家福,莞家福居民保?,midea家属保险
2025年度商业保险开始投保了~ 员工(统一投保无需美福下单)本人及任选两名家属的免费/自付费升级方案 https://mapnew5.midea.com/newservicenopages/#/content/detail?id=1902351310562877442&type=2

根据您母亲的情况(47岁、乳腺癌病史、已参保东莞社保及莞家福),结合健康限制和保障需求,以下是商业保险的配置建议及具体产品的分析:
具体产品对比分析
| 产品类型 | 推荐产品 | 核心优势 | 局限性 | 年保费参考 |
|---|---|---|---|---|
| 乳腺癌复发险 | 泰康粉红卫士 | 保费最低(1400元起),特药覆盖最全(41种) | 仅限0-2期患者,续保需审核 | 1400-5000元 |
| 乳腺癌复发险 | 太平洋粉红守护 | 含对侧乳腺癌保障,特药清单更新快(48种) | 仅限0-2期患者,保费较高 | 2000-8000元 |
| 惠民保 | 众民保(全国版) | 覆盖复发治疗,含CAR-T疗法和质子重离子 | 免赔额高(2万),报销比例50%-80% | 150-300元 |
| 团体医疗险 | 太平洋企业合作套餐 | 无健康告知,可能覆盖既往症 | 需确认保额和报销范围(可能仅限社保内) | 企业合作价(待确认) |
建议优先投保乳腺癌复发险(专项保障),再补充惠民保和意外险,最后根据企业团体险条款决定是否叠加。
建议通过保险顾问协助核保(如众安、慧择平台),确保理赔无争议。
| 类别 | 比例 | 工具示例 | 目的 |
|---|---|---|---|
| 学习投入 | 10% | 付费研报、专业课程 | 知识体系构建 |
| 模拟交易 | 0% | 同花顺模拟盘、Backtrader | 策略验证 |
| 指数定投 | 40% | 沪深300ETF(A股) | 强制储蓄+市场β收益 |
| 行业ETF | 30% | 半导体ETF(512480) | 把握结构性机会 |
| 现金储备 | 20% | 货币基金 | 应对黑天鹅事件 |
1 | | 日期 | 操作 | 决策依据 | 情绪状态 | 事后评估 | |
下一步行动建议:
你的技术背景是独特优势,建议从**”工程师型投资者”路径切入,将编程能力转化为投资生产力。记住:在认知不充分时,不亏损比追求收益**更重要。