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

K8s 多集群实践思考和探索

作者:vivo 互联网容器团队 - Zhang Rong

本文主要讲述了一些对于K8s多集群管理的思考,包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实践。

一、为什么需要多集群

随着K8s和云原生技术的快速发展,以及各大厂商在自己的数据中心使用K8s的API进行容器化应用编排和管理,让应用交付本身变得越来越标准化和统一化,并且实现了与底层基础设施的完全解耦,为多集群和混合云提供了一个坚实技术基础。谈到多集群多云的数据中心基础架构,会想到为什么企业需要多集群?

1.单集群容量限制

集群上限5000个节点和15万个Pod。同时单集群的最大节点数不是一个确定值,其受到集群部署方式和业务使用集群资源的方式的影响。

2.多云混合使用

避免被单家供应商锁定,不同集群的最新技术规划,或是出于成本等考虑,企业选择了多云架构。

3.业务流量突发

正常情况下用户使用自己的 IDC 集群提供服务,当应对突发大流量时,迅速将应用扩容到云上集群共同提供服务,需具备公有云 IaaS接入,可以自动扩缩容计算节点,将公有云作为备用资源池。该模式一般针对无状态的服务,可以快速弹性扩展,主要针对使用 CPU、内存较为密集的服务,如搜索、查询、计算等类型的服务。

4.业务高可用

单集群无法应对网络故障或者数据中心故障导致的服务的不可用。通常主要服务的集群为一个,另一个集群周期性备份。或者一个集群主要负责读写,其他备份集群只读,在主集群所在的云出现问题时可以快速切换到备份集群。该模式可用于数据量较大的存储服务,如部署一个高可用的mysql集群,一个集群负责读写,其他2个集群备份只读,可以自动切换主备。

5.异地多活

数据是实时同步的,多集群都可以同时读写,这种模式通常针对极其重要的数据,如全局统一的用户账号信息等。

6.地域亲和性

尽管国内互联网一直在提速,但是处于带宽成本的考量,同一调用链的服务网络距离越近越好。服务的主调和被调部署在同一个地域内能够有效减少带宽成本;并且分而治之的方式让应用服务本区域的业务,也能有效缓解应用服务的压力。

二、多集群探索

2.1 社区在多集群上的探索

当前基于 K8s 多集群项目如下:

1.Federation v1

已经被社区废弃,主要原因在于 v1 的设计试图在 K8s 之上又构建一层 Federation API,直接屏蔽掉了已经取得广泛共识的 K8s API ,这与云原生社区的发展理念是相悖。

2.Federation v2

已经被社区废弃,提供了一个可以将任何 K8s API type 转换成有多集群概念的 federated type 的方法,以及一个对应的控制器以便推送这些 federated 对象 (Object)。而它并不像 V1 一样关心复杂的推送策略(V1 的 Federation Scheduler),只负责把这些 Object 分发到用户事先定义的集群去。这也就意味着 Federation v2 的主要设计目标,其实是向多集群推送 RBAC,policy 等集群配置信息。

3.Karmada

参考Kubernetes Federation v2 核心实践,并融入了众多新技术,包括 Kubernetes 原生 API 支持、多层级高可用部署、多集群自动故障迁移、多集群应用自动伸缩、多集群服务发现等,并且提供原生 Kubernetes 平滑演进路径。

4.Clusternet

是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云、跨地域、跨可用区的集群管理问题。在项目规划阶段,就是面向未来混合云、分布式云和边缘计算等场景来设计的,支持海量集群的接入和管理、应用分发、流量治理等。

5.OCM

OCM 是一款 Kubernetes 多集群平台开源项目,它可以帮助你大大简化跨云/多云场景下的集群管理,无论这些集群是在云上托管,还是部署在自建数据中心,再或者是在边缘数据中心中。OCM 提供的基础模型可以帮助我们同时理解单集群内部的容量情况,也可以横跨多集群进行资源/工作负载的编排调度。与此同时,OCM 还提供了一系列强大的扩展性或者叫做插件框架(addon-framework)来帮助我们集成 CNCF 生态中的其他项目,这些扩展性也可以帮助我们无侵入地针对你的特定使用场景手工扩展特性。

以上多集群项目主要功能为资源分发和调度,还有如多云基础设施管理cluster-api,多集群检索Clusterpedia,多集群pod互通submariner,multicluster-ingress解决多集群的ingress,服务治理和流量调度 Service Mesh,如istio、cilium等网络组件实现的multi cluster mesh解决跨集群的mesh网络管理,以及结合存储相关项目实现跨集群存储管理和迁移等。

2.2 vivo 在多集群上的探索

2.2.1 非联邦集群管理

图片

非联邦多集群管理系统主要是进行资源管理、运维管理和用户管理,提供导入K8s集群权限功能,并通过统一 Web 界面进行查看和管理。这类工具不引入额外集群联邦的复杂,保持每个集群的独立性,同时通过统一的 Web 界面来查看多个集群的资源使用情况,支持通过 Web 界面创建 Deployment、Service 和负载均衡等,并且会集成持续集成、持续交付和监控告警等功能。由于集群联邦技术还在发展,大多数企业倾向于使用这种方式来运维和管理多集群 Kubernetes 环境。当前vivo主要是通过这种方式管理多集群。

2.2.2 联邦集群管理

图片

联邦集群主要将资源联邦化,实现资源的统一管理和调度。随着K8s在数据中心大量使用,K8s已成为基础设施管理的标准,不同区域部署已非常普遍。如K8s运行在云上来托管集群、企业自建数据中心的私有云、边缘计算等。越来越多的企业投入到多集群管理项目,当然联邦集群肯定会增加整体架构的复杂度,集群之间的状态同步也会增加控制面的额外开销。尽管增加了所有的复杂性,但普遍存在的多集群拓扑引入了新的令人兴奋的潜力。这种潜力超越了目前所探索的通过多个集群进行的简单静态应用程序编排。事实上,多集群拓扑对于跨不同位置编排应用程序和统一对基础设施的访问非常有用。其中,这引入了一种令人兴奋的可能性,可以透明而快速地将应用程序从一个集群迁移到另一个集群。在处理集群灾难或关键基础设施干预、扩展或布局优化时,移动工作负载是可行的。

vivo在联邦集群的探索方向主要有以下四个方面:

  1. 资源分发和编排

  2.  弹性突发

  3. 多集群调度

  4. 服务治理和流量调度

本次主要分享资源分发和编排、弹性突发和多集群调度以K8s为核心的联邦多集群探索。网络为核心的能力建设,主要为不同集群的网络可以通过如 Service Mesh或者 Mesh Federation打通,就可以实现网络流量的灵活调度和故障转移。实际上,也有很多应用通过隧道或者专线打通多个集群,进一步保证了多集群之间网络通信的可靠性。vivo网络和服务发现主要是开源的基础上自研,可以持续关注后面分享。

三、面向应用的多集群实践

云原生技术的发展是持续输出“事实标准的软件”,而这些事实标准中,应用的弹性、易用性和可移植性是其所解决的三大本质问题。

  • 应用的弹性:对于云产品的客户来说等价于业务可靠性和业务探索与创新的敏捷性,体现的是云计算所创造的客户价值,应用弹性的另一个关注点在于快速部署、交付、以及在云上的扩缩容能力。这就需要完善的应用交付链路以及应用的云原生开发框架支撑;

  • 易用性:能更好地发挥应用的弹性,在微服务软件架构成为主流的情形下,易用性需要考虑通过技术手段实现对应用整体做全局性的治理,实现全局最优。这凸显了 Service Mesh 的服务能力;

  • 可移植性:实现多集群和混合云无障碍迁移等。

那么一个以应用为中心,围绕应用交付的多集群多集群管理具备统一的云原生应用标准定义和规范,通用的应用托管和分发中心,基于 Service Mesh 的跨云的应用治理能力,以及 K8s 原生的、面向多集群的应用交付和管理体系,将会持续不断的产生巨大的价值。vivo当前主要结合Karmada和CNCF周边项目来探索以上挑战。

3.1 面向应用的多集群持续发布

3.1.1 应用发布

图片

上图是面向应用的多集群持续发布架构,我们主要的工作如下:

  • 管理注册多个Kubernetes集群并接入Karmada,Karmada负责多个集群的资源调度编排和故障转移。

  • 容器平台统一管理K8s资源、Karmada策略和配置。

  • CICD平台对应用进行单元测试、安全测试、编译镜像等操作,配置应用的存储、密钥、环境变量、网络和资源等,最终对接容器平台的API生成K8s对象,统一交付。

图片

一个应用真正的能管理起来其实很复杂,如特定的场景需要原地升级和灰度发布等。为了可以提供更加灵活、高级和易用的应用发布能力,更好地满足应用发布的需求,最终选择使用Openkruise。比如上图有个游戏的应用game-2408。它涉及到K8s资源有configmap、secret、pv、pvc、service,openkruise的cloneset、自研的服务发现和访问资源、以及Karmada的PropagationPolicy和OverridePolicy等资源,都能达到12个资源配置。比如存储等资源都是按需申请和分配的,为了有效管理这些资源和关系,当前主要通过关联数据库进行管理,并打通cicd和容器平台的交互,记录应用发布的状态转换,实现应用的滚动、灰度等发布能力,达到可持续发布的能力。

为了方便问题定位、K8s资源和Karmada资源的策略关系,当前Karmada 策略命名规范如下:

  1. 可以识别策略属于那个workload

  2. 避免策略重复,需要加入workload类型

  3. 策略名超过63个字符,需要hash处理

  4. xxx为非workload的资源名

遇到的问题总结:

  1. 一个资源无法被多个策略匹配,导致如configmap、secret等公用资源无法再次下发到其它集群。

  2. 多个集群之间串行发布,如发布完A集群才能发布B集群的控制。

3.1.2 Openkruise资源解析

图片

当前vivo的应用主要通过OpenKruise的Cloneset(无状态)和AdvancedStatefulset(有状态)控制器进行发布。Kamrada目前只能识别K8s默认的资源,其它的资源都需要开发资源解析。为了解决上面提到的问题,Karmada 引入了 Resource Interpreter Webhook,通过干预从 ResourceTemplate-> ResourceBinding ->Work ->Resource 的这几个阶段来实现完整的自定义资源分发能力。

(1)InterpretReplica

该 hook 点发生在从 ResourceTemplate 到 ResourceBinding 这个过程中,针对有 replica 功能的资源对象,比如类似 Deployment 的自定义资源,实现该接口来告诉 Karmada 对应资源的副本数。

(2)ReviseReplica

该 hook 点发生在从 ResourceBinding 到 Work 这个过程中,针对有 replica 功能的资源对象,需要按照 Karmada 发送的 request 来修改对象的副本数。Karmada  会通过调度策略把每个集群需要的副本数计算好,你需要做的只是把最后计算好的值赋给你的 CR 对象。

(3)Retain

该 hook 点发生在从 Work 到 Resource 这个过程中,针对 spec 内容会在 member 集群单独更新的情况,可以通过该 hook 告知 Karmada 保留某些字段的内容。

(4)AggregateStatus

该 hook 点发生在从 ResourceBinding 到 ResourceTemplate 这个过程中,针对需要将 status 信息聚合到 Resource Template 的资源类型,可通过实现该接口来更新 Resource Template 的 status 信息。

3.2 面向应用的多集群弹性伸缩

3.2.1 弹性伸缩

图片

跨集群HPA这里定义为FedHPA,使用了K8s原生的HPA,在Karmada控制平面通过FedHpaController实现跨集群的弹性调度扩缩容。

FedHPA流程:

  1. 用户创建HPA资源,如指定workload、cpu上限、min和max值。

  2. FedController开始计算clusterA和clusterB资源,在clusterA和clusterB创建HPA,并按比例分配集群的min和max。

  3. 当集群clusterA和clusterB触发定义的cpu资源上限,clusterA和clusterB开始扩容。

  4. Karmada控制平面的clusterA和clusterB的HPA work对象的status里有记录集群扩容副本情况。

  5. FedHPAController感知到work的变化,并获取到每个集群真实的副本数,开始更新调度资源RB和控制平面的workload副本数。保证了控制平面和member集群的调度和副本数一致,不会出现重复调度和副本不一致。反之cpu流量下去开始缩容,计算过程一样。

  6. 同时添加了资源再度均衡的能力,当集群资源变化时,FedHPAController会计算集群总资源、节点碎片、是否可调度等情况,重新分配每个集群HPA的min和max值,确保在扩容时候有充足的资源。

3.2.2 定时伸缩

图片

定时扩缩容是指应在固定时间点执行应用扩容来应对流量的高峰期。K8s本身没有这个概念,这里在Karmada控制平面定义了CronHpa资源,并通过Karmada-scheduler对多集群统一调度。避免非联邦化集群在多个member集群创建多个cronhpa。定时功能通过go-cron库实现。

CronHpa流程:

  1. 用户根据业务需求,创建CronHPA。定义扩容时间和缩容时间。

  2. 到扩容时间点,CronHPAController开始扩容workload。

  3. Karmada-scheduler开始调度,根据每个集群的资源开始合理分配每个集群的副本数。

  4. 到缩容时间点,CronHPAController开始缩容workload。

3.2.3 手动和指定扩缩容

图片

手动扩缩容流程:

  1. 用户指定workload,进行扩容或者缩容。

  2. Kamrada-scheduler开始调度,合理分配扩容或者缩容值到每个集群。

指定缩容,这里用到了openkruise能力。如训练模型需要将一批性能差的pod进行缩容。

指定缩容流程:

  1. 用户在clusterA 指定workload下面一个pod进行缩容,需要在

    ScaleStrategy.PodsToDelete指定pod。

  2. 需要在Karmada实现openkurise实现该字段的资源解析,不让它被控制平面覆盖。

  3. 并在控制平面更新workload的副本和pp资源,保证副本数和调度结果一致。

  4. member集群的openkruise开始删除指定的pod。

也可以尝试从Karmada控制平面指定删除pod和更改调度的结果,这样更加合理些,也不用添加Karmada资源解析。

3.3 统一调度

3.3.1 多集群调度

图片

Karmada多集群调度主要实现跨集群资源的合理分配和集群故障快速迁移业务。如上图所示主要通过Karmada scheudler和emulator配合实现,其中emulator主要负责每个集群的资源的估算。

workload调度流程:

  1. 用户定义workload和策略匹配,生成RB资源。

  2. doSchedulerBinding开始对RB进行调度,通过预选和优选调度算法选择合适的集群,当前不会进行资源计算,和K8s调度预选和优选不一样。

  3. selecClusters根据筛选的集群,进行副本分配。这里有2种模式,主要根据用户配置的策略去选择。

    a.Static scheduler 只计算所有资源的request,不考虑调度规则。

    b.Dynamic scheudler 会在计算所有request的同时,也会考虑一部分调度规则。

  4. 最终计算出每个集群分配的副本数并更新RB资源,调度结束后其它控制器会根据RB进一步处理。

故障调度:

  1. 比如当集群clusterA发生故障,在一定判定条件内,会触发Karmada-scheduler重新调度。

  2. Karmada-scheduler会将故障集群的资源,调度到clusrerB和clusterC。

3.3.2 重调度

图片

重调度的存在主要解决应用下发到member集群没有真正的运行起来,导致出现这样的情况可能是集群资源在不断的变化,应用正在Karmada-scheduler多集群调度的时候可能满足,但经过member集群二次调度时候无法调度。

重调度流程:

  1. 过滤RB资源,发现RB调度没有达到预期。

  2. 对workload发起重新调度。

  3. 进过预选、优选等流程,再次分配调度结果。

  4. 最终将workload的所有pod调度起来。

3.3.3 单集群调度模拟器

图片

目前社区单集群的调度估算器,只是简单模拟了4种调度算法。和实际的调度算法有很大差距,目前线上有很多自研的调度算法和不同集群需要配置不同算法,这样估算器的精确度就会下降,导致调度出现pod pending的情况。可以对单集群的调度模拟器进行优化。

  1. 使用fake client 去模拟线上集群。

  2. fake client启动k8s默认的调度器以及自研的调度算法,修改binding接口。并配置到每个member集群。

  3. podRequest请求每个集群调度模拟器,运行真实的调度算法,并计算调度结果。

3.4 灰度上线

3.4.1  应用迁移

图片

对于通过非联邦化资源管理的应用,不能直接删除在创建,需要平滑迁移到Karmada管理,对于用户无感知。

主要流程如下:

  1. 管理员通过容器平台,将需要迁移的应用插入迁移白名单。

  2. 用户通过cicd发布,容器平台会进行发布接口调用。

  3. isKarmada模块会查看迁移名单,在白名单内将资源联邦化,接入Karmada管理。不在白名单内保持原有的静态集群管理。

  4. 最终完成应用的发布,用户完全无感知。保持2种管理方式并行存在。

3.4.2 应用回滚

图片

有了应用迁移的能力,是否就可以保证整个流程百分百没有问题,其实是无法保证的。这就必须有应用回滚能力,提升用户的迁移满意度。

回滚的必要性总结:

  1. 应用发布迁移的过程中发生了未知的错误,并且短时间无法恢复。避免阻塞应用正常发布,需要回滚。

  2. 应用被Karmada接管后发生未知的错误,需要避免资源联邦化后无法控制,需要回滚。

回滚流程:

  1. 管理员通过容器管理平台,将需要回滚的应用从迁移白名单删除。

  2. 并对应用对应的workload以及关联的资源打上注解。

  3. 修改exection-controller源码,exection-controller发现以上注解,最终调用update/create时不做处理。

  4. 修改defaultInterpreter源码,发现以上注解ReviseReplica不修改副本数。

  5. 这样就可以阻断Karmada控制平面和member集群的联系。这里为什么没有直接从Karmada删除资源,主要避免删除这种高危操作以及方便后期恢复后重新接入Karmada。

3.4.3 迁移策略

图片

应用迁移Karmada原则:

  1. 先测试、再预发、最后生产

  2. 重大变更,分批次灰度,按照1:2:7比例灰度迁移

  3. 责任人双方点检验证,并观察监控5~10分钟

  4. 灰度后确认没有异常后继续迁移,否则走回滚流程

四、总结

vivo当前主要通过非联邦多集群管理,结合CICD实现了应用静态发布和管理,具备了应用的滚动、灰度、手动扩缩容、指定缩容和弹性扩缩容等能力。相对于非联邦多集群部分能力不足,如跨集群统一资源管理、调度和故障转移等,在联邦集群进行部分能力的探索和实践。同时联邦集群增加了整体架构的复杂度,集群之间的状态同步也会增加控制面的额外开销和风险。当前社区在联邦集群还处在一个探索和不断完善的阶段,企业在使用联邦集群应结合自身需求、建立完善的运维保障和监控体系。对于已经存在的非联邦化的资源需要建设迁移和回滚能力,控制发生故障的范围和快速恢复能力。

参考项目:

  1. GitHub:kubernetes-retired/federation

  2. GitHub:kubernetes-retired/kubefed

  3. GitHub:karmada-io/karmada

  4. GitHub:clusternet/clusternet

  5. GitHub:open-cluster-management-io/ocm

  6. GitHub:kubernetes-sigs/cluster-api

  7. GitHub:clusterpedia-io/clusterpedia

  8. GitHub:submariner-io/submariner

  9. GitHub:karmada-io/multi-cluster-ingress-nginx

  10. GitHub:istio/istio

  11. GitHub:cilium/cilium

相关文章:

K8s 多集群实践思考和探索

作者:vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考,包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实践。 一、为什么需要多集群 随着K8s和云原生技术的快速发展&#xff0c…...

德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”

德国波恩的BaFin大楼 BaFin是负责监督和监管德国金融机构和市场的金融监管机构,其职责是确保德国金融体系的稳定性、完整性和透明度。 此外,BaFin 的网站还为企业和消费者提供银行、贷款和财产融资等方面的信息。它还提供消费者帮助热线和举报人信息共…...

关于特殊时期电力行业信息中心运营思路

一、防御思路 安全运营是一系列规则、技术和应用的集合,用以保障组织核心业务平稳运行的相关活动,是通过灵活、动态的实施控制以期达到组织和业务需要的整体范围可持续性正常运行。信息中心在特殊时期扮演着关键的角色,因此需要精心设计运营…...

机器人中的数值优化(八)——拟牛顿方法(上)

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...

mac安装adobe需要注意的tips(含win+mac all安装包)

M2芯片只能安装2022年以后的(包含2022年的) 1、必须操作的开启“任何来源” “任何来源“设置,这是为了系统安全性,苹果希望所有的软件都从商店或是能验证的官方下载,导致默认不允许从第三方下载应用程序。macOS sie…...

C/C++学习网址

1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C脚本和程序。所有程序都分为不同的类别。 3、http://www.planetsourcecode.com/vb/default.asp?lng…...

Typora导出的PDF目录标题自动加编号

Typora导出的PDF目录标题自动加编号 在Typora主题文件夹增加如下文件后,标题便自动加上了编号: https://gitcode.net/as604049322/blog_data/-/blob/master/base.user.css 例如: 但是导出的PDF中,目录却没有编号: 这…...

【React】React学习:从初级到高级(二)

React学习【二】 2 添加交互2.1 响应事件2.1.1 添加事件处理函数2.1.2 在事件处理函数中读取props2.1.3 将事件处理函数作为props传递2.1.4 命名事件处理函数prop2.1.5 事件传播2.1.6 阻止传播2.1.7 传递处理函数作为事件传播的替代方案2.1.8 阻止默认行为 2.2 State: 组件的记…...

无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“Newtonsoft.Json.Linq.JArray”解决方法

对于“Newtonsoft.Json.Linq.JObject”的对象强制类型转换为类型“Newtonsoft.Json.Linq.JArray”报错 第一的图为对象{“*************”:“********”} 第二个图片为数组[{“…”:“…”}] 在我这里进行强制转换对象转换为类型“Newtonsoft.Json.Linq.JArray”报错. 那我们…...

从零开始,无需公网IP,搭建本地电脑上的个人博客网站并发布到公网

文章目录 前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在所需环境中安装并运行 生成网页4. “装修”个人网站5. 将位于本地电脑上的网页发布到公共互联网上 前言 在现代社会,网络已经成为我们生活离不开的必需品,而纷繁…...

Excel VSTO开发6 -Range对象

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 6 Range对象 Excel中最重要的一个对象是Range对象,它可以代表某一单元格、某一行、某一列、某一区域(该区域…...

LeetCode 15 三数之和

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题:由于题目中是不可以包含重复的三元组的…...

车船边缘网关是如何给车辆船只定位的?

随着智能交通系统的不断发展,车路协同成为了重要的研究方向之一。而AI边缘计算网关在这个领域中发挥着至关重要的作用。本文将重点介绍AI边缘计算网关在车路协同中的应用,并强调其中的重点词汇或短语。 首先,什么是AI边缘计算网关&#xff1…...

详解MAC帧、ARP、DNS、ICMP协议

局域网通信原理 比如新建了一个内网,如果一台机器A找机器B,封FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,开始时A不知道B的MAC,只知道IP,它就发一个ARP包,源IP是…...

Leetcode:【169. 多数元素】

题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 难度:简单 题目链接:169. 多数元素 示例 1&#xff…...

好用免费的Chat GPT

MindLink麦灵 你问我答 灵感 持续更新中。。。。...

MySQL-MHA

目录 1、什么是 MHA 2、MHA 的组成 3、MHA 的特点 3.1 MHA工作原理总结如下 4、搭建 MySQL MHA 4.1 实验环境配置 MHA架构 故障模拟 4.2 安装MHA所有组件 4.3 故障模拟 4.4 总结 1、什么是 MHA MHA(MasterHigh Availability)是一套优秀的My…...

初识Node.js与内置模块

1. 初识 Node.js 1.1 回顾与思考 1. 已经掌握了哪些技术 2. 浏览器中的 JavaScript 的组成部分 3. 思考:为什么 JavaScript 可以在浏览器中被执行 4. 思考:为什么 JavaScript 可以操作 DOM 和 BOM 5. 浏览器中的 JavaScript 运行环境 6. 思考&#xff…...

NLP(1)--NLP基础与自注意力机制

目录 一、词向量 1、概述 2、向量表示 二、词向量离散表示 1、one-hot 2、Bag of words 3、TF-IDF表示 4、Bi-gram和N-gram 三、词向量分布式表示 1、Skip-Gram表示 2、CBOW表示 四、RNN 五、Seq2Seq 六、自注意力机制 1、注意力机制和自注意力机制 2、单个输出…...

Ubuntu 升级cuda版本与切换

下载cuda版本 进:CUDA Toolkit 12.2 Downloads | NVIDIA Developer wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.runsudo sh ./cuda_12.2.0_535.54.03_linux.run --toolkit --silent --overrid…...

精讲算法的时间复杂度

目录 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 二、时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.常见时间复杂度的计算举例 三、空间复杂度 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 long long Fib(int N) {if(N <…...

java八股文面试[多线程]——newWorkStealingPool

newWorkStealingPool是什么&#xff1f; newWorkStealingPool简单翻译是任务窃取线程池。 newWorkStealingPool 是Java8添加的线程池。和别的4种不同&#xff0c;它用的是ForkJoinPool。 使用ForkJoinPool的好处是&#xff0c;把1个任务拆分成多个“小任务”&#xff0c;把这…...

STM32--RTC实时时钟

文章目录 Unix时间戳时间戳转换BKPRTC简介RTC框图硬件电路RTC的注意事项RTC时钟实验工程 Unix时间戳 Unix 时间戳是从1970年1月1日&#xff08;UTC/GMT的午夜&#xff09;开始所经过的秒数&#xff0c;不考虑闰秒。 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64…...

【N2】例题学习笔记

N2例题 《新"日本语能力测试"例题集》 听力原稿(PDF) 【10】 【問い】この筆者から見た「仕事ができる人」の特徴はどんなことか。 【提问】这位作者认为&#xff0c;仕事能力强的人具有什么特点呢&#xff1f; 【11】 文章 下の文章は、企業のあり方について…...

【数据分享】2006-2021年我国城市级别的道路、桥梁、管线建设相关指标(10多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…...

视觉SLAM14讲笔记-第7讲-视觉里程计2

直接法的引出 直接法是视觉里程计另一个主要分支&#xff0c;它与特征点法有很大的不同。 使用特征点法估计相机运动时&#xff0c;我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置&#xff0c;通过最小化重投影误差来优化相机运动。 相对地&#xff0c…...

MySQL——单行函数和分组函数

2023.9.3 单行函数的SQL语句学习笔记如下&#xff1a; #常见单行函数介绍&#xff08;部分省略&#xff09; #字符函数 #将姓变大写&#xff0c;名变小写&#xff0c;然后拼接。 SELECT CONCAT(UPPER(last_name), ,LOWER(first_name)) AS 姓名 FROM employees; # 姓名中首字符…...

百度百科词条怎么更新?怎么能顺利更新百科词条?

企业和个人百度百科词条的更新对于他们来说都具有重要的意义&#xff0c;具体如下&#xff1a; 对企业来说&#xff1a; 塑造品牌形象&#xff1a;百度百科是一个常被用户信任并参考的知识平台&#xff0c;通过更新企业词条可以提供准确、全面的企业信息&#xff0c;帮助企业塑…...

PPT怎么转换为PDF格式,收藏这两个在线工具。

PPT是一种常用的演示文稿格式&#xff0c;它可以包含丰富的动画效果和超链接&#xff0c;让你的内容更加生动和有趣。但是&#xff0c;如果你想将PPT分享给别人&#xff0c;或者在不同的设备上查看&#xff0c;你可能会遇到一些问题&#xff0c;比如&#xff1a; PPT文件太大&a…...

八大排序算法----堆排序

堆排序的基本步骤&#xff1a;&#xff08;以从大到小的顺序排序为例&#xff09; 1.构建大顶堆&#xff08;每个结点的值都大于或等于其左右孩子结点的值&#xff09; 2.排序&#xff1a;每次堆顶的元素取出来&#xff08;整个堆中值最大&#xff09;&#xff0c;与最后一个…...

常州网站制作czyzj/能打开任何网站浏览器

1. Python时间类型简介 Python中常用的时间表示方法有以下几种&#xff1a; 时间戳格式化的时间字符串time模块的time.struct_time类datetime模块的datetime类 其中 时间戳&#xff08;imestamp&#xff09; 又称为Unix时间、POSIX时间。它表示从格林尼治时间1970年1月1日0时…...

网站开发公司长春/网站发布

数据处理一般步骤1、识别出X和Y2、识别出连续 和 分类变量3、分割数据集&#xff0c;70%训练集&#xff0c;30%测试集4、建立模型5、训练模型、测试模型一、对离散特征的编码离散特征的编码分为两种情况&#xff1a;1、离散特征的取值之间没有大小的意义&#xff0c;比如color&…...

wordpress网站源码/seo排名哪家有名

...

mac 阿里云 wordpress/大数据培训包就业靠谱吗

linux命令大全一文搞定Linux必备命令 工作了几年&#xff0c;总结了Linux必备命令及相应命令的使用方法&#xff0c;点击下方【Linux命令】&#xff0c;可知使用方法&#xff1a; www.Linux命令.com...

什么做网站站群/市场策划方案

逻辑删除你有没有见过某些网站进行一些删除操作之后&#xff0c;你看不到记录了但是管理员却能够查看到。这里就运用到了逻辑删除。什么是逻辑删除&#xff1f;逻辑删除的本质是修改操作&#xff0c;所谓的逻辑删除其实并不是真正的删除&#xff0c;而是在表中将对应的是否删除…...

中交建设集团网站新闻/永久8x的最新域名

MAVEN仓库分类 Maven仓库分为&#xff1a;本地仓库远程仓库两大类 远程仓库又分为&#xff1a;中央仓库私服其它公共远程仓库 1&#xff0c;在Maven中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称之为构件 2&#xff0c;Maven在某个统一的位置存储所…...