首页 文章 精选 留言 我的

精选列表

搜索[分布式锁],共10000篇文章
优秀的个人博客,低调大师

Dapr v1.10 发布,分布式应用运行时

Dapr 是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架。 版本亮点 Dapr Workflows(预览) Dapr 现在有 Workflows(工作流程)作为一个新的 alpha API。Dapr Workflows 使你能够跨越多个应用程序构建长期运行、持久的进程或数据流。Dapr Workflows 可以与其他 Dapr API 构建模块相结合。 发布和订阅批量信息(预览) 通过批量发布和订阅,你可以在一个请求中发布和订阅多个消息。当编写需要发送或接收大量消息的应用程序时,使用批量操作可以通过减少 Dapr sidecar、应用程序和底层 pub/sub broker 之间的总体请求数来实现高吞吐量。 可插拔组件 SDK(预览) Dapr 有内置的组件,作为运行时的一部分包含在其中。Dapr 现在允许你创建被称为 “pluggable components”(可插拔组件)的私有组件。这些组件是自托管的(以 exe 或容器),可以用任何语言编写,并且能够 "plug into" Dapr。在这个版本中,.NET、Java 和 Go 的预览 SDK 使你能够用你选择的语言轻松创建可插拔组件。 Multi-App Run 以改善本地开发(预览) 通过 Multi-App Run,你可以使用一个模板,用一个 dapr run -f 命令在自托管模式下启动多个应用程序。模板文件描述了如何启动多个应用程序,就像你运行了许多单独的 CLI 运行命令一样,大大改善了同时测试多个应用程序的体验。 弹性策略已稳定 在这个版本中,首次在 v1.7.0 版本中引入的弹性策略现在已经稳定。 弃用的组件 以下组件现在已 "弃用",并将在未来的 Dapr 版本中删除 Binding: Twitter 2506 PubSub: Hazelcast 2240 更多详情可查看:https://github.com/dapr/dapr/releases/tag/v1.10.0

优秀的个人博客,低调大师

分布式云原生数据库中的共识流程

Raft Scheduler概述 Raft Scheduler在节点初始化时会一起启动,同时还会一同启动raftTickLoop进程用于定时产生tick请求。 Raft Scheduler主要的功能是处理raftGroup内部的消息请求与外部的写入读取请求,Raft Scheduler的工作方式是通过对外提供一个rangeID队列,当有请求来时,会修改该请求设计的range状态,并将其放入这个队列中,同时当Raft Scheduler跟随云溪数据库启动而初始化时,会初始化一定数量的processor,这些processor的作用是监听消息队列,当消息队列中有rangeID入队时,processor会将该rangeID取出,并根据该rangeID入队时的状态(stateTick、stateReady、stateRequest)进行不同处理。 我们在后续优化云溪数据库版本的过程中将RaftScheduler额外划分了一部分资源用于处理tick请求从而降低心跳延迟,这并不影响我们理解整体的逻辑处理流程。 Request入队流程 在副本层中需要处理的数据来自于分发层通过gRPC发送来的RaftMessageBatch,以及内部产生的消息请求。 当接收到分发层的RaftMessageBatch后,消息处理会通过store获取RaftMessageRequest对应rangeID的raftRequestQueue,并将RaftMessageRequest转换成raftRequestInfo追加至raftRequestQueue中。与此同时,更新rangeID对应的raftScheduleState并将rangeID添加到raftScheduler的queue中等待raft processor调度处理。 StateRaftTick处理流程 如果processor从rangeIDQueue中取出的rangeID对应状态为stateRaftTick,则processor会调用ProcessTick()方法进行处理。 首先,processor会在store中获取该rangeID的本地replica和对应livenessMap, 然后调用replica_raft.go下tick()。获取replica的unreachable remotes,构造MsgUnreachable, 通过replica所在的raft group处理该msg。结束这一步后,会验证replica是否为静默状态,如果replica是静默状态,则无需tick。Tick的条件为: raft group已初始化。 replica是非静默的。 再次检查replica是否静默,静默的判断条件为满足以下所有条件: 1. cluster启用静默配置。 2. replica不存在尚未应用的raft command。 3. replica不存在进行中的merge。 4. replica没有被destroyed。 5. replica所在raft group状态非空。 6. replica是raft leader。 7. replica当前不存在raft leader切换。 8. replica是leaseholder。 9. raft的applied/commit/lastindex相等。 10. 获取所有remote replica,除了不在livenessMap中的node,remote replica在leader生成的progress列表中,同时remote replica的progress match值必须跟当前raft的applied相等。 11. replica本身必须在progress列表中。 12. raft当前状态不是ready。 如果判断当前replica所在raft group是静默状态,只发送心跳数据: 首先,获取range中其他remote replica的ReplicaDescriptor,为每个remote replica构造raftpb.MsgHeartbeat,构造StoreIdent和RaftHeartbeat,生成KV并写入store的heartbeats map<目标store标识,心跳数据>中,在store.go->coalescedHeartbeatsLoop()处理store的心跳数据,对每个KV构造RaftMessageRequest并写入对应节点的channel中,在raft_transport.go->startProcessNewQueue()->processQueue()中维护该channel,负责将request转发到指定replica。 如果判断当前replica所在raft group是非静默状态,除进行上述操作外,在这之后会检查当前replica是否同时为raft leader和leaseholder(DisableLeaderFollowsLeaseholder为false时的要求),如果不满足,会构造leader切换的message,发起一轮选举。 - StateRaftReady - 如果rangeID对应的状态是stateRaftReady。 1. store.go->processReady()首先从store中获取该rangeID对应的本地replica,通过relica的internalRaftGroup构造raft Ready数据(raft Ready包含了需要持久化的entries和需要提交或发送到其他节点的message),然后将Ready中包含的msg分为MsgApp和其他类型两部分,首先将MsgApp类型消息构造成RaftMessageRequest写入到对应node的channel中,然后通过raft_transport.go->startProcessNewQueue()->processQueue()转发到指定replica。 2. 在异步发送msg过程中,会通过rocksDB/Pebble构造batch,同时处理Ready中包含的待持久化的entries,并构造repr,然后使用构造的batch将repr异步迭代写入到store对应的存储引擎中。 3. 将拆分出的其他消息类型构造RaftMessageRequest发送到node的channel中。 4. 从Ready中包含的CommittedEntries每一行中获取command id和raft command并生成WriteBatch,构造WriteBatch, 并生成Repr,将Repr中数据异步落盘。 - StateRaftRequest - 如果rangeID对应的状态是stateRaftRequest,从store中获取该rangeID对应的raftRequestQueue,然后获取队列中的每个raftRequestInfo,每个raftRequestInfo中的RaftMessageRequest都带有一条message,根据每条message的type不同有不同的处理方法,可参考上述Msg类型篇。 1. MsgHub,当follower节点的选举计时器超时后,会发送msgHub. 2. MsgBeat,leader发送的心跳信息,心跳计时器超时时触发该消息,leader通过stepLeader()生成MsgHeartbeat发送给集群中其他节点。 3. MsgProp,客户端向集群发送的写请求通过msgProp表示。 4. MsgApp,当一个节点通过选举成为leader后,会获取目标节点Next-1对应的记录的term值和需要发送的Entries,然后发送MsgApp消息,该消息可以帮助follower节点与leader节点同步。 5. MsgAppResp,msgApp的响应消息类型,当follower节点收到msgApp后,无论是否进行日志追加,都将返回一条带有本节点最后一条记录索引值的消息。 6. MsgVote,当PreCandidate状态节点收到半数以上的投票之后,会发起新一轮的选举,即向集群中的其他节点发送MsgVote。 7. MsgVoteResp,msgVote的响应消息。 8. MsgSnap,当leader获取目标节点Next-1对应的记录的term值和需要发送的Entries出现异常时,就会生成msgSnap将快照数据发送到follower节点,follower节点通过快照数据恢复状态,从而可以与leader进行正常的entry记录复制。 9. MsgHeartbeat,leader发送的心跳消息,主要作用是探测节点是否存活,follower接收到msgHeartbeat会重置自身的选举计时器,防止follower发起新一轮的选举。同时尝试更新follower节点raftLog中已提交的位置。 10. MsgHeartbeatResp,follower处理心跳消息返回的消息类型。 11. MsgUnreachable,如果leader发送MsgSnap消息出现异常,将会调用ReportUnreachable()发送该类型消息,将follower节点的状态改为ProgressStateProbe。 12. MsgSnapStatus,校验节点对应的状态是否为ProgressStateSnapshot,如果之前发送的快照消息出现异常则将节点状态改为ProgressStateProbe,之后单条发送消息。 13. MsgCheckQuorum,leader发送该消息类型检测是否保持半数以上连接。当Leader 的心跳计时器超时,并且开启了checkQuorum模式(raft的checkQuorum字段为true)。该Leader节点就会发送MsgCheckQuorum消息检测与集群中其他节点是否保持半数以上的连接,如果没有则变成Follower节点。 14. MsgTransferLeader,发起leader节点转移的消息类型,本地消息。 15. MsgTimeoutNow,如果leader节点转移超时,会发送该类型的消息,使follower的选举计时器立即过期,并发起新一轮的选举。 16. MsgReadIndex,客户端发往集群的只读消息使用该类型。 17. MsgReadIndexResp,只读消息类型的响应消息。 18. MsgPreVote,当Follower的选举计时器超时时,会把当前状态切换成 StatePreCandidate(预选举),并向集群中其他节点发送MsgPreVote。当集群中其他节点收到预选举消息时,会先进行一些检验,符合相关条件会投同意,否则会投拒绝票,然后发送给该候选节点,发送的消息类型为MsgPreVoteResp。如果预选举阶段(StatePreCandidate)成功收到超过半数以上的同意票,那么该节点会认为选举成功,会发起新一轮的正式选举(节点状态切换成SateCandidate(候选人),发送的消息类型为MsgVote)。是否有预选举阶段是根据初始化配置的参数,该字段保存在raft结构体的preVote字段中 19. MsgPreVoteResp,其他节点响应预选举的投票消息。

优秀的个人博客,低调大师

分布式数据库--SQL优化之Plan Hint

Part 1- 关于Hint Hint是嵌入SQL语句的对优化器进行提示的信息,是DBA进行SQL优化的常用手段。SQL语句经过优化器(规则优化(RBO)、代价优化(CBO)),通常会选择正确的查询路径,但是智者千虑,必有一失,有时优化器也会选择一个很差的计划,使得该条SQL查询变得很慢,此时需要DBA人为干预(通过给SQL语句增加一个注释),告诉优化器要选择指定的访问路径(full scan、index scan)或join 类型(merge、hash、lookup),使得该条SQL语句可以高效的运行。 Part 2 - Hint的使用 通过 /*+ ... */ 的注释形式放在 SELECT 关键字之后,多个 hint 之间用逗号隔开。 例如 select /*+use_index(t, index1)*/ * from t where a = 10 and b = 20; 如下图所示,经过RBO会得到如下normalized plan,而/*+ use_index(t, index1)*/ 将作用于scan选择的过程,这将告诉优化器在选择表t的访问路径(① ② ③)时,选择②索引index1。 Part 3 - Hint在云溪数据库中的 解析和应用流程 整体流程如下图3.1所示: 图3.1 hint 解析使用流程 第一步:输入带有hint SQL语句,如下所示 SELECT/*+ use_index(t1, idx1), merge_join(t1, t2) */ count(*) FROM t1, t2 WHERE t1.a = t2.b; 第二步:parser 编译解析; 第三步:将AST中的hint信息保存在HintSet中; 第四步:Builder从AST中获取hint信息,将对应hint解析到TableHint和IndexHint结构体中; 第五步:normalized plan阶段(RBO),通过调用buildScan为表构建ScanFlags,调用buildJoin为表构建JoinFlags; 第六步:在CBO阶段进行探索时,根据组成员的Flags信息,通过开销大小,来阻止某些等价表达式的生成,并生成hint需要的表达式,从而减小搜索空间; 第七步:生成hint作用之下的最优查询计划。 Part 4 - Hint 在云溪数据库中 不同阶段的表现形式 SQL语句中:显示指定要在表c上强制使用idx2,与c和o相关的join操作不允许使用NLJ算子; 经过parser后,hint信息保存在HintSet中; 在Builder中,hint信息以对象index和table为单位进行保存; 在规范化计划树和Memo结构体中,hint信息存在对应的Expr结构体中。 详细流程如下图4.1所示: 图4.1 hint在不同阶段的表现形式图 Part 5 - Hint对优化器的影响 图5.1结构解释: 图5.1 hint作用图 bestHT 存储着每个Group的代价最低的表达式。 exprHT 存储所有探索出来的表达式。 Group为逻辑等价的关系表达式的集合。 在云溪数据库中hint 影响计划的手段主要有两个,一个是探索阶段中,减少表达式的生成(例如指定megejoin,正常情况下会生成 merge、lookup、hash 三种连接类型,但是指定了mergejoin,就会直接不生成其他的的表达式),如下①;另一个是代价计算阶段中返回一个很大的代价hugeCost(例如针对t1,指定index1,然后对于其他的访问方法,则会直接返回很大的代价),如下③。 Hint对优化器的影响如下: ①排除了若干操作,减少了Memo结构体中表达式的个数,如下图X号所示; ②决定相关Group的最优计划选择, 如下图Group 1; ③ Group 1中,#1作为规范化表达式必然存在于组中,但是,它的代价被设置为hugeCost; ③由于使用ForceIndex,在探索阶段使用其它索引的表达式不会被优化器选择; ⑤ 最终影响最优计划树的选择。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册