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

[kubernetes]控制平面ETCD

什么是ETCD

  • CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)
  • etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态

特点:

  • 键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中
    监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应
  • 简单: curl可访问的用户的API(HTTP+JSON)
  • 安全: 可选的SSL客户端证书认证
  • 快速: 单实例每秒1000次写操作,2000+次读操作
  • 可靠: 使用Raft算法保证一致性

主要功能

  • key-value存储
  • 监听机制
  • key的过期及续约机制,用于监控和服务发现
  • 基于监听机制的分布式异步系统

键值对存储

  • 采用kv型数据存储,一般情况下比关系型数据库快
  • 支持动态存储(内存)以及静态存储(磁盘)
  • 分布式存储,可集成为多节点集群
  • 存储方式,采用类似目录结构。(B+tree)
    • 只有叶子节点才能真正存储数据,相当于文件
    • 叶子节点的父节点一定是目录,目录不能存储数据

服务注册与发现

  • 强一致性、高可用的服务存储目录
    • 基于 Raft 算法的 etcd 天生就是这样一个强一致性、高可用的服务存储目录
  • 一种注册服务和服务健康状况的机制
    • 用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达到监控健康状态的效果

消息发布与订阅

  • 在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅
  • 即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们
  • 关心的主题,一旦主题有消息发布,就会实时通知订阅者
  • 通过这种方式可以做到分布式系统配置的集中式管理与动态更新
  • 应用中用到的一些配置信息放到etcd上进行集中管理
  • 应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的

核心:TTL & CAS

  • TTL(time to live)指的是给一个key设置一个有效期,到期后这个key就会被自动删掉,这在
    很多分布式锁的实现上都会用到,可以保证锁的实时有效性
  • Atomic Compare-and-Swap(CAS)指的是在对key进行赋值的时候,客户端需要提供一些条
    件,当这些条件满足后,才能赋值成功。这些条件包括

• prevExist:key当前赋值前是否存在
• prevValue:key当前赋值前的值
• prevIndex:key当前赋值前的Index

  • key的设置是有前提的,需要知道这个key当前的具体情况才可以对其设置

Raft 协议

概览

  • Raft协议基于quorum机制,即大多数同意原则,任何的变更都需超过半数的成员确认
    在这里插入图片描述

learner

  • Raft 4.2.1引入的新角色
  • 当出现一个etcd集群需要增加节点时,新节点与Leader的数据差异较大,需要较多数据同步才能跟上leader的最新的数据
  • 此时Leader的网络带宽很可能被用尽,进而使得leader无法正常保持心跳
  • 进而导致follower重新发起投票
  • 进而可能引发etcd集群不可用
  • Learner角色只接收数据而不参与投票,因此增加learner节点时,集群的quorum不变

etcd基于Raft的一致性

  • 初始启动时,节点处于follower状态并被设定一个election timeout,如果在这一时间周期内没有收到
    来自 leader 的 heartbeat,节点将发起选举:将自己切换为 candidate 之后,向集群中其它 follower
    节点发送请求,询问其是否选举自己成为 leader
  • 当收到来自集群中过半数节点的接受投票后,节点即成为 leader,开始接收保存 client 的数据并向其它
    的 follower 节点同步日志。如果没有达成一致,则candidate随机选择一个等待间隔(150ms ~
    300ms)再次发起投票,得到集群中半数以上follower接受的candidate将成为leader
  • leader节点依靠定时向 follower 发送heartbeat来保持其地位
  • 任何时候如果其它 follower 在 election timeout 期间都没有收到来自 leader 的 heartbeat,同样会将
    自己的状态切换为 candidate 并发起选举。每成功选举一次,新 leader 的任期(Term)都会比之前
    leader 的任期大1。

日志复制

  • 当接Leader收到客户端的日志(事务请求)后先把该日志追加到本地的Log中,然后通过
    heartbeat把该Entry同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送
    ACK,当Leader收到大多数(n/2+1)Follower的ACK信息后将该日志设置为已提交并追加到
    本地磁盘中,通知客户端并在下个heartbeat中Leader将通知所有的Follower将该日志存储在自
    己的本地磁盘中。

安全性

  • 用于保证每个节点都执行相同序列的安全机制
  • Safety就是用于保证选举出来的Leader一定包含先前 committed Log的机制
  • 选举安全性(Election Safety):每个任期(Term)只能选举出一个Leade
  • Leader完整性(Leader Completeness):指Leader日志的完整性,当Log在任期Term1被
    Commit后,那么以后任期Term2、Term3…等的Leader必须包含该Log;Raft在选举阶段就使
    用Term的判断用于保证完整性:当请求投票的该Candidate的Term较大或Term相同Index更大
    则投票,否则拒绝该请求

失效处理

  • 1 Leader失效:其他没有收到heartbeat的节点会发起新的选举,而当Leader恢复后由于步进
    数小会自动成为follower(日志也会被新leader的日志覆盖)
  • 2 follower节点不可用:follower 节点不可用的情况相对容易解决。因为集群中的日志内容始
    终是从 leader 节点同步的,只要这一节点再次加入集群时重新从 leader 节点处复制日志即可。
  • 3 多个candidate:冲突后candidate将随机选择一个等待间隔(150ms ~ 300ms)再次发起
    投票,得到集群中半数以上follower接受的candidate将成为leader

wal日志

  • 数据结构LogEntry
  • 字段type,只有两种,
    一种是0表示Normal,1表示ConfChange(ConfChange表示 Etcd 本身的配置变更同步,比如有新的节点加入等)
  • term,每个term代表一个主节点的任期,每次主节点变更term就会变化
  • index,这个序号是严格有序递增的,代表变更序号
  • data,将raft request对象的pb结构整个保存下
  • 一致性都通过同步wal日志来实现,每个节点将从主节点收到的data apply到本地的存储,Raft只关心日志的同步状态
  • 如果本地存储实现的有bug,比如没有正确的将data apply到本地,也可能会导致数据不一致。

etcd v3 存储,Watch以及过期机制

-在这里插入图片描述

存储机制

  • 一部分是内存中的索引,kvindex,是基于Google开源的一个Golang的btree实现的
  • 另外一部分是后端存储
    • backend可以对接多种存储,当前使用的boltdb
    • boltdb是一个单机的支持事务的kv存储,etcd 的事务是基于boltdb的事务实现的
    • etcd 在boltdb中存储的key是reversion,value是 etcd 自己的key-value组合,也就是说 etcd 会在boltdb中把每个版都保存下,从而实现了多版本机制
    • reversion主要由两部分组成,第一部分main rev,每次事务进行加一,第二部分sub rev,同一
      个事务中的每次操作加一
    • etcd 提供了命令和设置选项来控制compact,同时支持put操作的参数来精确控制某个key的历史版本数
    • 内存kvindex保存的就是key和reversion之前的映射关系,用来加速查询
      在这里插入图片描述

Watch机制

  • etcd v3 的watch机制支持watch某个固定的key,也支持watch一个范围

    • watchGroup 包含两种watcher,一种是 key watchers,数据结构是每
      个key对应一组watcher,另外一种是 range watchers, 数据结构是一个 IntervalTree,方便通
      过区间查找到对应的watcher
  • 每个 WatchableStore 包含两种 watcherGroup,一种是synced,一种是unsynced,
    前者表示该group的watcher数据都已经同步完毕,在等待新的变更,后者表示该group的
    watcher数据同步落后于当前最新变更,还在追赶

    • 当 etcd 收到客户端的watch请求,如果请求携带了revision参数,则比较请求的revision和
      store当前的revision,如果大于当前revision,则放入synced组中,否则放入unsynced组
    • etcd 会启动一个后台的goroutine持续同步unsynced的watcher,然后将其迁移到synced组
    • etcd v3 支持从任意版本开始watch,没有v2的1000条历史event表限制的问题(当然这是指没有compact的情况下)

etcd 成员重要参数

成员相关参数
–name ‘default’
Human-readable name for this member.
–data-dir ‘${name}.etcd’
Path to the data directory.
–listen-peer-urls ‘http://localhost:2380’
List of URLs to listen on for peer traffic.
–listen-client-urls ‘http://localhost:2379’
List of URLs to listen on for client tra

etcd集群重要参数

–initial-advertise-peer-urls ‘http://localhost:2380’
List of this member’s peer URLs to advertise to the rest of the cluster.
–initial-cluster ‘default=http://localhost:2380’
Initial cluster configuration for bootstrapping.
–initial-cluster-state ‘new’
Initial cluster state (‘new’ or ‘existing’).
–initial-cluster-token ‘etcd-cluster’
Initial cluster token for the etcd cluster during bootstrap.
–advertise-client-urls ‘http://localhost:2379’
List of this member’s client URLs to advertise to the public

etcd安全相关参数

–cert-file ‘’
Path to the client server TLS cert file.
–key-file ‘’
Path to the client server TLS key file.
–client-crl-file ‘’
Path to the client certificate revocation list file.
–trusted-ca-file ‘’
Path to the client server TLS trusted CA cert file.
–peer-cert-file ‘’
Path to the peer server TLS cert file.
–peer-key-file ‘’
Path to the peer server TLS key file.
–peer-trusted-ca-file ‘’
Path to the peer server TLS trusted CA file

灾备

• 创建Snapshot
etcdctl --endpoints https://127.0.0.1:3379 --cert /tmp/etcd-certs/certs/127.0.0.1.pem –
key /tmp/etcd-certs/certs/127.0.0.1-key.pem --cacert /tmp/etcd-certs/certs/ca.pem
snapshot save snapshot.db
• 恢复数据
etcdctl snapshot restore snapshot.db
–name infra2
–data-dir=/tmp/etcd/infra2
–initial-cluster
infra0=http://127.0.0.1:3380,infra1=http://127.0.0.1:4380,infra2=http://127.0.0.1:5380
–initial-cluster-token etcd-cluster-1
–initial-advertise-peer-urls http://127.0.0.1:538

容量管理

  • 单个对象不建议超过1.5M
  • 默认容量2G
  • 不建议超过8G

Alarm & Disarm Alarm

• 设置etcd存储大小
$ etcd --quota-backend-bytes=$((1610241024))
• 写爆磁盘
$ while [ 1 ]; do dd if=/dev/urandom bs=1024 count=1024 | ETCDCTL_API=3 etcdctl put key
|| break; done
• 查看endpoint状态
$ ETCDCTL_API=3 etcdctl --write-out=table endpoint status
• 查看alarm
$ ETCDCTL_API=3 etcdctl alarm list
• 清理碎片
$ ETCDCTL_API=3 etcdctl defrag
• 清理alarm
$ ETCDCTL_API=3 etcdctl alarm disarm

碎片整理

keep one hour of history

$ etcd --auto-compaction-retention=1

compact up to revision 3

$ etcdctl compact 3
$ etcdctl defrag
Finished defragmenting etcd member[127.0.0.1:2379]

高可用etcd解决方案

etcd-operator: coreos开源的,基于kubernetes CRD完成etcd集群配置。Archived
https://github.com/coreos/etcd-operator
Etcd statefulset Helm chart: Bitnami(powered by vmware)
https://bitnami.com/stack/etcd/helm
https://github.com/bitnami/charts/blob/master/bitnami

Etcd Operato

在这里插入图片描述

基于 Bitnami 安装etcd高可用集群

• 安装helm
https://github.com/helm/helm/releases
• 通过helm安装etcd
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-release bitnami/etcd
• 通过客户端与serve交互
kubectl run my-release-etcd-client --restart=‘Never’ --image
docker.io/bitnami/etcd:3.5.0-debian-10-r94 --env ROOT_PASSWORD=$(kubectl get
secret --namespace default my-release-etcd -o jsonpath=“{.data.etcd-root-password}” |
base64 --decode) --env ETCDCTL_ENDPOINTS=“my-release-
etcd.default.svc.cluster.local:2379” --namespace default --command – sleep infinity

Kubernetes如何使用etcd

  • etcd是kubernetes的后端存储

  • 对于每一个kubernetes Object,都有对应的storage.go 负责对象的存储操作

    • pkg/registry/core/pod/storage/storage.go
  • API server 启动脚本中指定etcd servers集群

spec:
containers:
- command:
- kube-apiserver
- --advertise-address=192.168.34.2
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:237

Kubernets对象在etcd中的存储路径

etcd在集群中所处的位置

在这里插入图片描述

堆叠式etcd集群的高可用拓扑

  • 这种拓扑将相同节点上的控制平面和etcd成员耦合在一起。优点在于建立起来非常容易,并且对副本的管理也更容易
  • 堆叠式存在耦合失败的风险,如果一个节点发生故障,则etcd成员和控制平面实例都会丢失,并且集群冗余也会受到损害
  • 可以通过添加更多控制平面节点来减轻这种风险。因此为实现集群高可用应该至少运行三个堆叠的Master节点
    在这里插入图片描述

外部etcd集群的高可用拓扑

  • 该拓扑将控制平面和etcd成员解耦。如果丢失一个Master节点,对etcd成员的影响较小,并
    且不会像堆叠式拓扑那样对集群冗余产生太大影响。但是,此拓扑所需的主机数量是堆叠式拓
    扑的两倍。具有此拓扑的群集至少需要三个主机用于控制平面节点,三个主机用于etcd集群
    在这里插入图片描述

实践 - etcd集群高可用

  • 保证高可用是首要目标
  • 所有写操作都要经过leader
  • apiserver的配置只连本地的etcd peer
  • apiserver的配置指定所有etcd peers,但只有当前连接的etcd member异常,apiserver才会换目标

实践 - etcd集群高可用

• apiserver和etcd 部署在同一节点
• apiserver和etcd之间的通讯基于gRPC
➢ 针对每一个object,apiserver和etcd之间的Connection -> stream 共享
➢ http2的特性
➢ Stream quota
➢ 带来的问题?对于大规模集群,会造成链路阻塞
➢ 10000个pod,一次list操作需要返回的数据可能超过100M

实践 – etcd存储规划

本地 vs 远程

  • Remote Storage
    • 优势是假设永远可用
    • 劣势是IO效率
  • 最佳实践
    • Local SSD
    • 利用local volume分配空间

多少空间

  • 与集群规模相关

安全性

  • peer和peer之间的通讯加密

    • 是否有需求
    • TLS的额外开销
    • 运营复杂度增加
  • 数据加密

    • Kubernetes提供了针对secret的加密
  • 事件分离

    • 对于大规模集群,大量的事件会对etcd造成压力
    • API server 启动脚本中指定etcd servers集群

减少网络延迟

  • 数据中心内的RTT大概是数毫秒,国内的典型RTT约为50ms,两大洲之间的RTT可能慢至
    400ms。因此建议etcd集群尽量同地域部署
  • 当客户端到Leader的并发连接数量过多,可能会导致其他Follower节点发往Leader的请求因
    为网络拥塞而被延迟处理
    可以在节点上通过流量控制工具(Traffic Control)提高etcd成员之间发送数据的优先级来避免

减少磁盘I/O延迟

  • 强烈建议使用SSD
    • 典型的旋转磁盘写延迟约为10毫秒
    • SSD(Solid State Drives,固态硬盘),延迟通常低于1毫秒
  • 将etcd的数据存放在单独的磁盘内
  • ionice命令对etcd服务设置更高的磁盘I/O优先级,尽可能避免其他进程的影响
$ ionice -c2 -n0 -p 'pgrep etcd'

保持合理的日志文件大小

  • tcd以日志的形式保存数据,无论是数据创建还是修改,它都将操作追加到日志文件,因此日志
    文件大小会随着数据修改次数而线性增长
  • 当Kubernetes集群规模较大时,其对etcd集群中的数据更改也会很频繁,集群日记文件会迅速
    增长
  • etcd会以固定周期创建快照保存系统的当前状态,并移除旧日志文
    件。另外当修改次数累积到一定的数量(默认是10000,通过参数“–snapshot-count”指
    定),etcd也会创建快照文件
  • 如果etcd的内存使用和磁盘使用过高,可以先分析是否数据写入频度过大导致快照频度过高,确
    认后可通过调低快照触发的阈值来降低其对内存和磁盘的使用

设置合理的存储配额

  • 存储空间的配额用于控制etcd数据空间的大小
    • 合理的存储配额可保证集群操作的可靠性
    • etcd的性能会因为存储空间的持续增长而严重下降
    • 甚至有耗完集群磁盘空间导致不可预测集群行为的风险

自动压缩历史版本

  • “–auto-compaction”,其值以小时为单位。也就是etcd会自动压缩该值设置的时间窗口之
    前的历史版本

定期消除碎片化

  • 压缩历史版本,相当于离散地抹去etcd存储空间某些数据,etcd存储空间中将会出现碎片
  • 定期消除存储碎片,将释放碎片化的存储空间,重新调整整个存储空间
  • 备份方案
    • etcd备份:备份完整的集群信息,灾难恢复
    • etcdctl snapshot save
    • 备份Kubernetes event
  • 频度
    • 时间间隔太长
      • 如果有外部资源配置,如负载均衡等,能否接受数据丢失导致的leak
    • 时间间隔太短
      • 做snapshot的时候,etcd会锁住当前数据
      • 并发的写操作需要开辟新的空间进行增量写,导致磁盘空间增长
  • 如何保证备份的时效性,同时防止磁盘爆掉
    • Auto defrag

优化运行参数

  • 通过调整心跳周期(Heatbeat Interval)和选举超时时间(Election
    Timeout),来降低Leader选举的可能性
    • 心跳周期参数推荐设置为接近etcd多个成员之间平均数据往返周期的最大值,一般是平均RTT的0.55-1.5倍
    • 选举超时时间最少设置为etcd成员之间RTT时间的10倍

etcd备份存储

  • 两个子目录:wal和snap
  • 所有数据的修改在提交前,都要先写入wal中
  • snap是用于存放快照数据,为防止wal文件过多,etcd会定期(当wal中数据超过10000条记录时,由参数“–snapshot-count”设置)创建快照。当快照生成后,wal中数据就可以被删除了
  • 数据遭到破坏或错误修改需要回滚到之前某个状态
    • 一是从快照中恢复数据主体,但是未被拍入快照的数据会丢失
    • 而是执行所有WAL中记录的修改操作,从最原始的数据恢复到数据损坏之前的状态,但恢复的时间较长

备份方案实践

  • 备份程序每30分钟触发一次快照的拍摄。紧接着它从快照结
    束的版本(Revision)开始,监听etcd集群的事件,并每10秒钟将事件保存到文件中,并将快照和事件文件
    上传到网络存储设备中。
  • 30分钟的快照周期对集群性能影响甚微。当大灾难来临时,也至多丢失10秒的数据。
    至于数据修复,首先把数据从网络存储设备中下载下来,然后从快照中恢复大块数据,并在此基础上依次应
    用存储的所有事件。这样就可以将集群数据恢复到灾难发生前
    在这里插入图片描述

refer 云原生训练营

常联系,如果您看完了

  • wx: tutengdihuang
  • 群如下
    在这里插入图片描述

相关文章:

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、…...

序列化类的高级用法

1.3.3 模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。 ModelSerializer与常规的Serializer相同,但提供了: 基于模型类自动生成一系列…...

4.svn版本管理工具使用

1. 什么是SVN 版本控制 它可以记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本,并可以查看数据的更改细节! Subversion(简称SVN)是一个自由开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空 SVN的优势 统一的版本号 Subversi…...

ZKP Algorithms for Efficient Cryptographic Operations 1 (MSM Pippenger)

MIT IAP 2023 Modern Zero Knowledge Cryptography课程笔记 Lecture 6: Algorithms for Efficient Cryptographic Operations (Jason Morton) Multi-scalar Multiplication(MSM) Naive: nP (((P P) P) P)… (2(2P))…Binary expand $n e_0e_1\alphae_2\alpha2\dots\e_{\…...

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址:https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置,在搜索框输入:系统高级设置。 新建环境变量,并输入bin目录具体位置。 安装检查 按住 w…...

油猴脚本教程案例【键盘监听】-编写 ChatGPT 快捷键优化

文章目录 1. 元数据namenamespaceversiondescriptionauthormatchgranticon 2. 编写函数.1 函数功能2.1.1. input - 聚焦发言框2.1.2. stop - 取消回答2.1.3. newFunction - 开启新窗口2.1.4. scroll - 回到底部 3. 监听键盘事件3.1 监听X - 开启新对话3.2 监听Z - 取消回答3.3 …...

数据结构 | 查漏补缺

目录 数据的基本单位 冒泡排序 DFS和BFS中文 Prim 比较 中序线索二叉树 顺序栈 链栈 时间复杂度 循环队列 求第K个结点的值 数据的基本单位 数据元素 循环队列sq中,用数组elem[0‥25]存放数据元素,设当前sq->front为20,sq-&g…...

回溯算法练习题

78. 子集 中等 1.9K 相关企业 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出&#x…...

代码随想录算法训练营 | day60 单调栈 84.柱状图中最大的矩形

刷题 84.柱状图中最大的矩形 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.len…...

vscode中vue项目报错

当在vscode中写代码时&#xff0c;报错报错报错......... 已经头大&#xff0c;还没写就报错&#xff0c; 这是因为eslint对语法的要求太过严格导致的编译时&#xff0c;出现各种语法格式错误 我们打开vue.config.js&#xff0c;加上这句代码&#xff0c;就OK啦 lintOnSave:…...

「数据结构」二叉树2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;初阶数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#x1f349;链式结构&#x1f349;遍历二叉树&#x1f34c;前序遍历&#x1f34c;中序遍历&#x…...

数据处理系列课程 01:谈谈数据处理在数据分析中的重要性

一、数据分析 可能很多朋友第一次听到这个名词&#xff0c;那么我们先来谈一谈什么是数据分析。 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;将它们加以汇总和理解&#xff0c;以求最大化地开发数据的功能&#xff0c;发挥数据的作用。数据分析是…...

C++卡码网题目55--右旋字符串

卡码网题目链接 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符…...

八股文打卡day8——计算机网络(8)

面试题&#xff1a;什么是强缓存和协商缓存&#xff1f; 我的回答&#xff1a; 强缓存&#xff1a;浏览器不需要发送请求到服务器&#xff0c;直接从浏览器缓存中获取数据。浏览器不需要和服务器进行交互就可以获取数据&#xff0c;这样极大提高了页面访问速度。 协商缓存&am…...

亚马逊推出 Graviton4:具有 536.7 GBps 内存带宽的 96 核 ARM CPU

如今&#xff0c;许多云服务提供商都设计自己的芯片&#xff0c;但亚马逊网络服务 (AWS) 开始领先于竞争对手&#xff0c;目前其子公司 Annapurna Labs 开发的处理器可以与 AMD 和英特尔的处理器竞争。本周&#xff0c;AWS 推出了 Graviton4 SoC&#xff0c;这是一款基于 ARM 的…...

跨域问题的解决

1.什么是跨域&#xff1f; 浏览器从一个域名的网页去请求另外一个域名的资源时&#xff0c;域名、端口或者协议不同都是跨域 2.跨域的解决方案 设置CORS响应头∶后端可以在HTTP响应头中添加相关的CORS标头&#xff0c;允许特定的源&#xff08;域名、协议、端口)访问资源。S…...

Typro+PicGo自动上传图片(图床配置)

文章目录 所需工具主要配置 TyproPicGo自动上传图片&#xff08;图床配置&#xff09; 使用Typro编写 的markdown(md)文件如果存在图片&#xff0c;并且想快速发布博文的话&#xff0c;常使用PiGO工具配置图床服务器来管理图片。 所需工具 TyporaPicGo(依赖Nodejs和插件super…...

uniapp实战 -- 个人信息维护(含选择图片 uni.chooseMedia,上传文件 uni.uploadFile,获取和更新表单数据)

效果预览 相关代码 页面–我的 src\pages\my\my.vue <!-- 个人资料 --><view class"profile" :style"{ paddingTop: safeAreaInsets!.top px }"><!-- 情况1&#xff1a;已登录 --><view class"overview" v-if"membe…...

企业如何建立价值评估体系?

企业绩效评价体系是指由一系列与绩效评价相关的评价制度、评价指标体系、评价方法、评价标准以及评价机构等形成的有机整体。企业的评价系统大致可以分为以下四个层次&#xff1a; 第一、岗位评价系统&#xff0c;主要针对不同岗位之间的评估。例如&#xff0c;企业中一般业务…...

华为安防监控摄像头

华为政企42 华为政企 目录 上一篇华为政企城市一张网研究报告下一篇华为全屋wifi6蜂鸟套装标准...

[node] Node.js 缓冲区Buffer

[node] Node.js 缓冲区Buffer 什么是BufferBuffer 与字符编码Buffer 的方法概览Buffer 的实例Buffer 的创建写入缓冲区从 Buffer 区读取数据将 Buffer 转换为 JSON 对象Buffer 的合并Buffer 的比较Buffer 的覆盖Buffer 的截取--sliceBuffer 的长度writeUIntLEwriteUIntBE 什么是…...

【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】

文章目录 RT-Thread 移植编译篇编译os.environ 使用示例os.putenv使用示例python from 后指定路径 编译问题_POSIX_C_SOURCE 介绍编译结果 RT-Thread 移植编译篇 本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。 RT-Thread 代码下载&#xff1a; git clone …...

功能强大的开源数据中台系统 DataCap 1.18.0 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…...

A Philosophy of Software Design 学习笔记

前言 高耦合&#xff0c;低内聚&#xff0c;降低复杂度&#xff1a;在软件迭代中&#xff0c;不关注软件系统结构&#xff0c;导致软件复杂度累加&#xff0c;软件缺乏系统设计&#xff0c;模块混乱&#xff0c;一旦需求增加、修改或者优化&#xff0c;改变的代价无法评估&…...

设计模式----解释器模式

一、简介 解释器模式使用频率并不高&#xff0c;通常用来构建一个简单语言的语法解释器&#xff0c;它只在一些非常特定的领域被用到&#xff0c;比如编译器、规则引擎、正则表达式、sql解析等。 解释器模式是行为型设计模式之一&#xff0c;它的原始定义为&#xff1a;用于定义…...

Linux常用命令(一):Conda、RPM、文件权限、apt-get(更新中...

文章目录 一、Conda二、RPM三、文件权限四、apt-get 一、Conda Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装和管理软件包及其依赖项。它主要用于Python编程语言&#xff0c;但也可以用于其他语言的项目。Conda可以帮助用户创建不同版本的Python环境&a…...

3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]

在当今的数字时代&#xff0c;无论是由于意外删除、系统故障还是其他原因&#xff0c;从 Android 设备中丢失数据不仅会带来不便&#xff0c;而且会造成非常严重的后果。特别是对于Mac用户来说&#xff0c;从Android手机恢复数据是一个很大的麻烦。幸运的是&#xff0c;随着许多…...

日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;日志服务 SLS 研发负责人简志和产品经理孟威等人发表了《日志服务 SLS 深度解析&#xff1a;拥抱云原生和 AI&#xff0c;基于 SLS 的可观测分析创新》的主题演讲&#xff0c;对阿里云日志服务 SLS 产品服务创新以…...

MinIO客户端之rm

MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc rm 删除指定的对象。 准备待删除的对象&#xff0c;查看对象&#xff0c;命令如下&#xff1a; ./mc ls local1/bkt2/控制台的输出&#xff0c;如下&#xff1a; [2023-12-16 01:52:54 …...

【Linux笔记】文件和目录操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…...

Vue-router 中hash模式和history模式的区别

Vue-router 中hash模式和history模式的区别 在通过vue-cli创建项目的时候&#xff0c;出现: 于是&#xff0c;去Google一遍。。 vue-router的model有两种模式&#xff1a;hash模式和history模式。 hash模式和history模式的不同 最直观的区别就是在url中 hash 带了一个很丑的…...

Debian在升级过程中报错

当我们在升级的过程中出现如下报错信息 报错信息如下所示&#xff1a; The following signatures couldnt be verified because the public key is not available: NO_PUBKEY ED444FF07D8D0BF6 W: GPG error: http://mirrors.jevincanders.net/kali kali-rolling InRelease: …...

IOS开发问题记录

1. xcode上传app store connect后testflight没有可构建版本的原因 查看你的邮箱, 里面有原因提示 一般为使用了某些权限, 但是plist没有声明 2. xcode 修改display name后名字并没有改变 原因是并没有修改到plist的CFBundleDisplayName的字段 将CFBundleDisplayName的值修改…...

数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…...

使用 Xcode 创建一个新的项目并运行

启动 Xcode: 打开你的 Mac&#xff0c;然后启动 Xcode。你可以在应用程序文件夹中找到它&#xff0c;或者使用 Spotlight 搜索。 创建新项目: 当 Xcode 启动时&#xff0c;选择 “Create a new Xcode project”&#xff08;创建一个新的 Xcode 项目&#xff09;。 在项目模板…...

教师未来前景发展

教师是一个光荣而重要的职业&#xff0c;他们承担着培养下一代的责任和使命。随着社会的不断发展和变化&#xff0c;教师的前景也在不断扩大和改变。本文将探讨教师未来的前景发展&#xff0c;并提供一些思考和建议。 首先&#xff0c;教师的就业前景将继续扩大。随着人口的增长…...

【华为机试】2023年真题B卷(python)-采样过滤

一、题目 题目描述&#xff1a; 在做物理实验时&#xff0c;为了计算物体移动的速率&#xff0c;通过相机等工具周期性的采样物体移动能离。由于工具故障&#xff0c;采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值&#xff0c;不同工具的故意模式存在…...

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…...

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>...

《PySpark大数据分析实战》-18.什么是数据分析

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…...

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先&#xff0c;最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化&#xff0c;并可以设置小数点后的精度。通过将小数乘以100&#xff0c;再用number_format函数将结果格式化为百分比形式&#xff0c;即可达到将小数转为…...

electron GPU process isn‘t usable. Goodbye

最近再使用electron的时候总是报错打不开&#xff0c;记录一下这个问题的解决方法&#xff1b; // 再主进程中添加下面的即可 app.commandLine.appendSwitch(no-sandbox);官网看了下&#xff1a;https://www.electronjs.org/zh/docs/latest/api/command-line-switches –no-sa…...

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…...

redis 从0到1完整学习 (六):Hash 表数据结构

文章目录 1. 引言2. redis 源码下载3. dict 数据结构4. 哈希表扩容与 rehash5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;red…...

阿里云江苏省中小企业补贴5000元上云补贴金

阿里云「数智惠企」中小企业补贴&#xff0c;江苏区域企业提交申请内部评估及审批通过后&#xff0c;即可获取上云补贴金&#xff0c;使用补贴金购买指定云产品&#xff0c;满10000元即可立减5000元&#xff0c;请抓紧申领。阿里云百科 aliyunbaike.com 分享江苏区域5000元上云…...

PID算法

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...

Linux bridge开启hairpin模拟测试macvlan vepa模式

看到网上介绍可以通过Linux bridge 开启hairpin方式测试macvlan vepa模式&#xff0c;但是没有找到详细资料。我尝试测试总提示错误信息&#xff0c;无法实现&#xff0c;经过几天的研究&#xff0c;我总算实现模拟测试&#xff0c;记录如下&#xff1a; 参考 1.Linux Macvla…...

连续执行函数和alert与focus死循环事件

1.innerText value的值会根据输入的改变而改变DOM树&#xff0c;但是innerHTML和innerText有一种效果就是赋值的时候是标签下所有替代了&#xff0c;但是取值的时候还是html文件下&#xff0c;标签下的所有。如果赋值就是标签子都被这个代替。内部变量就是这个&#xff0c;没赋…...

向量投影:如何将一个向量投影到矩阵的行向量生成子空间?

向量投影&#xff1a;如何将一个向量投影到矩阵的行向量生成子空间&#xff1f; 前言 本问题是在学习Rosen梯度投影优化方法的时候遇到的问题&#xff0c;主要是对于正交投影矩阵(NT(NNT)-1N)的不理解&#xff0c;因此经过查阅资料&#xff0c;学习了关于向量投影的知识&…...

Ubuntu18.04安装GTSAM库(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…...