Apache IoTDB 分布式架构三部曲(三)副本与共识算法
IoTDB 首创并应用的共识协议统一框架,为用户提供了灵活选择不同共识算法的可能性。
对于一个分布式集群而言,为了使得海量数据场景下集群能够横向扩展,集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上,从而能够更加充分地利用到集群中各个节点的存算资源。对于集群中的任何一个分片而言,为了满足高可用的需求,需要将数据在多个物理节点上冗余存储多个副本,进而避免单点故障的出现。
由于同一份数据有多个副本,可能会出现不同副本间数据不一致的现象。现有的分布式系统一般通过共识算法来处理多个副本间的数据一致性问题。
然而,不同的业务场景对共识算法的一致性、可用性等要求不同。比如对于应用监控场景,Google 的时序数据库 Monarch 就明确指出对于监控场景的时序数据其会更关注可用性而不是一致性。不过对于数据分区等关键元信息,其依然使用了保证外部一致性的 Spanner 数据库进行管理。
对于专为物联网场景而生的分布式时序数据库 IoTDB 而言,针对时序数据,往往可以根据场景选择可用性更好的共识算法;而针对分区信息和元数据等核心信息,往往可以选择一致性较强的共识算法。
本文将从共识算法讲起,深入解析 IoTDB 对于共识算法一致性、可用性和性能等方面的选择与取舍,并介绍 IoTDB 独有的共识算法框架,帮助您理解并掌握 IoTDB 的多种共识策略,从而根据您的业务需要对共识算法进行灵活的选择与配置。
01
共识算法
(1)为什么需要共识算法
前面一期(分布式架构三部曲(二))提到,分布式系统通过将数据进行分片,并在多个物理节点冗余存储为多个副本的横向扩展方式来提升系统整体的可用性和性能。IoTDB 采取横向扩展的分布式架构,如下图所示。
尽管分布式系统的多副本设计大大增加了系统的可用性和性能,但这种横向扩展的思路也给系统带来了挑战,例如:
不同副本如何保证数据是一致的?
不同副本同时接收不同的写入,以谁为准?
一个节点挂掉后,如何在其他节点恢复上面的副本?
查询哪个副本的数据会更好?
共识算法即为解决上述挑战而设计的机制。让对外的用户既能享受到高可用和性能,也感知不到多副本的存在。
(2)共识算法的概念与分类
共识算法是分布式系统中的一种关键机制,用于在多个参与节点之间达成一致决策,即使在存在网络延迟、节点故障或恶意攻击的情况下,也能确保系统的一致性和可靠性。在分布式系统中,各个节点的副本可能存在不一致状态,而共识算法的目标就是确保所有节点最终达成一致,形成一个统一的决策,从而维持系统的整体一致性。
共识算法经过近半个世纪的发展,种类繁多,流程复杂。不同的共识算法的复制模式和一致性级别往往不同。一般来说,我们可以根据共识算法的复制模式和一致性保证对其进行分类。
根据共识算法的复制模式,可以将共识算法分为三个大类别:
单主复制:客户端将所有写入操作发送到单个节点(主库),该节点将数据更改事件流发送到其他副本(从库)。读取可以在任何副本上执行,但从库的读取结果可能是陈旧的。
多主复制:客户端将每个写入发送到几个主库节点之一,其中任何一个主库都可以接受写入。主库将数据更改事件流发送给彼此以及任何从库节点。
无主复制:客户端将每个写入发送到几个节点,并从多个节点并行读取,以检测和纠正具有陈旧数据的节点。
而根据共识算法的一致性保证,可以大致将共识算法分为两个大类别:
强一致性共识算法:能够对外提供线性一致性或顺序一致性的保证。线性一致性是最强的一致性级别,顺序一致性比线性一致性稍弱。如果共识算法提供强一致性,那么当一个数据写入操作完成后,任何后续的读操作都能读取到最新的数据值。强一致性保证了数据的一致性,但通常会付出一定的性能代价,因为它通常需要确保每一个写入操作在大多数相关节点上都被确认并完成。
弱一致性共识算法:通常只提供最终一致性的保证,包括因果一致性、单调读一致性、读己之所写一致性、会话一致性等。如果共识算法提供弱一致性,那么系统将允许在某些条件下节点之间的数据状态不同步,直到某个时间点或某个条件满足后,系统才会最终达到一致性。弱一致性在设计上更加灵活,可以提高系统的性能和可用性,但在一定程度上牺牲了一致性。
对于大多数共识算法,我们都可以根据上文的介绍识别它对应的复制模式和一致性保证。对于不同的共识算法,它们通常在性能、可用性和一致性保证等方面各不相同。通常情况下,提供更高级别的一致性级别会导致性能和可用性的下降。
(3)主流共识算法简介
通过前文的介绍,相信读者已经对共识算法的概念、作用和分类有了一定了解,接下来让我们简单了解两个著名共识算法,并感受不同共识算法在可用性、一致性、性能和存储成本等方面的区别。
1. Raft:Raft 是一种基于领导者的强一致性共识算法。Raft 算法将共识过程分解为几个关键的子过程:领导者选举、日志复制和安全性保证等。通过将共识过程结构化,Raft 算法不仅易于理解,而且便于实现,工业界已经有多种 codebase 的 Raft 算法成熟实现。
-
Raft 协议的易理解性使得开发者能够快速实现和调试分布式系统,同时其强一致性的保证提高了系统的可靠性和可维护性。
作为强一致性算法, Raft 对于每次写入都要求大多数节点(半数以上)响应,并且需要持久化日志。因此性能相比弱一致性算法有一定差距,并且在大多数节点宕机时无法提供服务,可用性较差。此外,Raft 额外的持久化日志也带来了更高的存储成本。
2. Quorum:Quorum 是最出名的无主共识算法。在 Quorum 中,分布式系统的每一份数据拷贝对象都被赋予一票,只有每一个读操作获得的票数大于最小读票数,每个写操作获得的票数大于最小写票数时才能读或者写。在节点间数据不一致时,其通过读修复和反熵来保证数据间的最终一致性。Quorum 通常只能提供最终一致的弱一致性保证。
-
由于 Quorum 一致性级别较低,无法满足很多应用场景对一致性的需求,Cassandra 目前已经使用了 Paxos 算法来管理其轻量事务。
Quorum 的读写最小票数可以用来作为系统在读、写性能方面的一个可调节参数。写票数 V(w) 越大,则读票数 V(r) 越小,这时候系统读的开销就小。反之则写的开销就小。由于 Quorum 读写都只需要对部分副本操作,因此可以根据读写需求平衡读写最小票数来获得更好的性能。
(4)共识算法统一框架
共识算法是分布式系统中数据读写关键链路的核心组成部分。如果所有共识算法都各自独立地实现其接口,一方面,这将不可避免地导致其他模块需要对各种共识算法进行大量的特殊处理和适配,从而对系统的迭代效率和维护成本产生负面影响。另一方面,这也将给未来系统接入新共识算法的扩展性带来挑战。
因此,为了提高系统架构演进的可扩展性和可维护性,某些分布式系统会考虑设计一种支持不同共识算法实现并对外提供统一接口的共识算法统一框架。
接下来,让我们简单了解 OSDI 2020 Best Paper 提出的共识算法统一框架,感受共识算法统一框架带来的好处。后文也会详细介绍 IoTDB 的共识算法统一框架~
Facebook 的 Delos 通过共享日志抽象出了虚拟共识服务,其不仅能够对应用层透明且允许在虚拟共识服务底层实现不同的共识算法,并且还能够支持不停机更换共识算法。这些优质特性使得其统一了 Facebook 内部的所有元数据管理方案。
如上图所示,Delos 框架将多种复杂的共识算法进行了封装,它通过统一的 VirtualLog API 向上提供接口,并向下集成了多种共识算法。每个 VirtualLog 的一段被称为一个 Loglets,每个 Loglets 可以使用不同的共识算法实现。
Delos 实现了动态维护 Loglets 的功能,从而支持动态更换共识算法。值得一提的是,Delos 项目一开始实现了一个非常简单的基于 Zookeeper 的共识方案 ZKLoglets。仅仅 8 个月后,它就成功地动态更换了所有线上环境的共识算法,从 ZKLoglets 到自研的 NativeLoglets,实现了十倍的性能提升。
02
IoTDB 共识算法框架
上文介绍了共识算法和共识算法统一框架的相关概念,接下来,让我们深入 IoTDB 内部的共识算法框架,了解 IoTDB 所支持的共识算法。
(1)概念与示例
Node 对应一个进程,可以是一个物理节点,也可以是一个容器运行时环境。
ConsensusGroup 定义了一个共识组,对应分片技术的一个分片,其逻辑上存在于副本数个 Node 上,共同维护一份数据的多个副本。
Peer 对应 ConsensusGroup 在一个 Node 上的逻辑单元,一个 ConsensusGroup 在一个 Node 上对应一个 Peer,其在副本数个 Node 上共拥有副本数个 Peer。
IStateMachine 是共识组管理底层存储引擎数据的结构,用于维护数据的一份本地副本,每个 IStateMachine 逻辑上被一个 Peer 所拥有,存在于一个 Node 上。
IConsensus 是共识层对外提供服务的入口,管理了该 Node 中的所有 Peer,提供增删共识组、共识组成员变更、读写共识组数据等功能。开发者可以在创建 IConsensus 时通过配置参数来指定不同一致性级别的共识算法实现(例如弱一致性共识算法 IoTConsensus 和强一致性共识算法 RatisConsensus)。
如下图所示,在 IoTDB 的共识算法统一框架中,用户的一份数据将会被一个共识组 ConsensusGroup 管理,这个共识组由多个 Peer 组成,每个 Peer 通过用户自定义的 IStateMachine 管理该数据的一份本地副本。IConsensus 管理本进程中所有属于不同的共识组 Peers。IConsensus 是共识层对外提供服务的入口,包括创建共识组、共识组成员变更、读写共识组数据等功能。
对于一个 4 节点 3 副本的集群,假设集群将所有数据均分分成了 2 个分片,则示意图如下:
在上图中可以明确如下信息:
整个集群共存在 4 个 Node,每个 Node 上存在一个 IConsensus 实例。
整个集群共有 2 个分片,即有 2 个 ConsensusGroup。ConsensusGroup1 存在于 Node1,Node2 和 Node3 上,ConsensusGroup2 存在于 Node2,Node3 和 Node4 上。
Node1 的 IConsensus 管理了 ConsensusGroup1 的 Peer1,对应了 1 个 IStateMachine 实例,拥有集群的一半数据。
Node2 的 IConsensus 管理了 ConsensusGroup1 的 Peer2 和 ConsnesusGroup2 的 Peer1,对应了 2 个 IStateMachine 实例,拥有集群的全量数据。
Node3 的 IConsensus 管理了 ConsensusGroup1 的 Peer3 和 ConsnesusGroup2 的 Peer2,对应了 2 个 IStateMachine 实例,拥有集群的全量数据。
Node4 的 IConsensus 管理了 ConsensusGroup2 的 Peer3,对应了 1 个 IStateMachine 实例,拥有集群的一半数据。
(2)当前支持共识算法
目前共识层支持三种不同的共识算法,它们分别是:
SimpleConsensus:单副本强一致性共识算法。专为单副本场景优化。
RatisConsensus:多副本单主强一致性共识算法。基于 Java 语言的 Raft 算法工业实现 Apache Ratis。
IoTConsensus:多副本多主弱一致性共识算法。这是一种为 IoT 场景设计的自研共识算法,使用 2 副本即可实现高可用。通过异步复制和大量工程优化,实现了近乎实时的同步性能。在物联网场景下,不同设备的写入操作通常是独立进行的,因此并发写入请求之间基本不存在写写冲突。基于这一特性,IoTConsensus 能够提供最终一致性甚至会话一致性的语义。
(3)如何配置 IoTDB 共识算法
对于 IoTDB,我们可以通过修改 iotdb-system.properties 中下面的配置项对共识算法进行配置。
共识算法选择
config_node_consensus_protocol_class:ConfigNode 使用的共识算法,可选择 SimpleConsensus 或者 RatisConsensus。
schema_region_consensus_protocol_class:元数据使用的共识算法,可选择 SimpleConsensus 或者 RatisConsensus。
data_region_consensus_protocol_class:普通数据使用的共识算法,可选择 SimpleConsensus 或者RatisConsensus 或者 IoTConsensus。
副本数
副本数标识了数据分片冗余存储的个数。通常来说,副本数越多,系统可用性越强,但会占用更多的存算资源。
schema_replication_factor:元数据副本数
data_replication_factor:普通数据副本数
负载均衡
Leader balance 是指让 leader 均匀分布在各个节点上,从而对于写流量进行负载均衡。我们可以选择对于 RatisConsensus 和 IoTConsensus 是否打开 leader balance。
enable_auto_leader_balance_for_ratis_consensus:对 RatisConsensus 开启 leader balance。
enable_auto_leader_balance_for_iot_consensus:对 IoTConsensus 开启 leader balance。
(4)如何选择 IoTDB 共识算法
1. SimpleConsensus:SimpleConsensus 是一种轻量级的单副本共识算法。在关注硬件成本的用户场景中,为了节约资源和成本,一些用户倾向于使用单副本的方式部署集群。SimpleConsensus 的设计旨在为用户提供一种经济的选择,以适应对扩展性要求较高而对可用性要求较低的场景。通常被用在单副本部署的场景中。
2. RatisConsensus:RatisConsensus 是 Raft 协议的工业实现,为一款支持 Multi-Raft 的强一致性共识算法。通常被用在 ConfigNode 和元数据的管理场景中。值得一提的是,IoTDB 社区联合 Ratis 社区对 RatisConsensus 进行了大量工程优化,使得 RatisConsensus 在提供强一致性保证的同时,拥有相对理想的性能。
3. IoTConsensus:IoTConsensus 是由 IoTDB 团队自研的弱一致性多主共识算法。该算法结合了 IoT 场景的业务特性,进行了大量针对性的架构和工程优化,因此不仅性能更优,而且具有更强的可用性。与 RatisConsensus 需要 3 副本才能实现高可用相比,IoTConsensus 仅需 2 副本即可实现高可用,常配置两副本,这也使得其存储成本更低。该算法通常用于时序数据的管理场景。
03
总结
分布式系统通过横向拓展,将数据冗余存储在多个物理节点,实现了高可用和高性能。在这个过程中,共识算法用于协调多个节点的行为,从而保证集群整体的一致性。
与业界其他时序数据库相比,Apache IoTDB 是第一个也是唯一一个提出并应用共识协议统一框架的系统。用户可以根据性能、可用性、一致性和存储成本等需求,灵活选择不同的共识算法。
值得一提的是,对于 IoTDB 社区专为 IoT 场景自研的多主弱一致性共识算法 IoTConsensus,尽管其已经拥有较高的性能和可用性,但由于使用 WAL 进行副本同步,仍然存在性能和可用性的优化空间。近期,IoTDB 团队通过使用自研数据文件 TsFile 进行数据同步,从而与 WAL 解耦,进一步优化了 IoTConsensus 的性能和可用性,从而提出了新的 FastIoTConsensus 共识算法。该新共识算法正在内测中,即将上线,敬请期待~
本文是 Apache IoTDB 分布式三部曲中的最后一篇。通过 Apache IoTDB 分布式三部曲对集群、分片与负载均衡、副本与共识算法的介绍,相信您已经深入了解了 IoTDB 的整体分布式架构与设计思想,期望三部曲系列能帮助您合理运用 IoTDB 的共识算法、负载均衡等分布式策略来应对复杂的物联网数据管理挑战!
相关文章:
Apache IoTDB 分布式架构三部曲(三)副本与共识算法
IoTDB 首创并应用的共识协议统一框架,为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言,为了使得海量数据场景下集群能够横向扩展,集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上,从而能够更…...
数据挖掘--聚类分析:基本概念和方法
数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析:基本概念和方法 聚类分析 聚类分析是把一个数据对象&…...
APP单页分发源码下载安卓苹果自动识别apk描述文件免签自动安装
下载地址:APP单页分发源码下载安卓苹果自动识别apk描述文件免签自动安装...
golang定时器使用示例
1.定时器创建与停止 //定时器使用t1 : time.NewTimer(2 * time.Second)<-t1.Cfmt.Println("timer1 fired")t2 : time.NewTimer(5 * time.Second)go func() {fmt.Println("go协程处理中,等待5秒后输出...")<-t2.Cfmt.Println("timer2 fired&quo…...
[FSCTF 2023]Tea_apk
得到密文和密钥 import base64 from ctypes import c_uint32import libnumDELTA 0x9E3779B9def decrypt(v, n, k):rounds 6 int(52 / n)sum c_uint32(rounds * DELTA)y v[0].valuewhile rounds > 0:e (sum.value >> 2) & 3p n - 1while p > 0:z v[p …...
分享一个用python写的本地WIFI密码查看器
本章教程,主要分享一个本地wifi密码查看器,用python实现的,感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块,用于执行系统命令 import tkinter as tk # 导入 tkinter 模块,用于创建图形用…...
【SkyWalking】启用apm-trace-ignore-plugin追踪忽略插件
背景 使用Agent采集追踪数据的时候,想排除某些路径,比如健康检查等,这样可以减少上报的数据,也可以去除一些不必要的干扰数据。 加载插件 在agent/optional-plugins目录中有个apm-trace-ignore-plugin-${version}.jar插件&…...
独立游戏之路 -- 获取OAID提升广告收益
Unity 之 获取手机:OAID、IMEI、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA) 二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件 三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建 四、总…...
反转链表 (oj题)
一、题目链接 https://leetcode.cn/problems/reverse-linked-list/submissions/538124207 二、题目思路 1.定义三个指针,p1先指向NULL p2指向头结点 p3指向第二个结点 2.p2的next指向p1。然后移动指针,p1来到p2的位置,p2来到p3的位置&…...
Mysql使用中的性能优化——批量插入的规模对比
在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中,我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明,不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…...
TCP为什么握手是三次,而挥手是四次
TCP(传输控制协议)使用三次握手(3WHS)来建立一个可靠的连接,并使用四次挥手(4WHS)来终止连接。以下是每个步骤的详细解释: 三次握手(3WHS)建立连接ÿ…...
前端面试题大合集9----TypeScript
目录 一、TypeScript 中静态类型的概念及其好处 二、如何在 TypeScript 的接口中定义可选属性? 三、解释 TypeScript 中联合类型的概念并提供示例 四、TypeScript 中的类型断言是什么? 五、TS中泛型是什么? 六、解释 TypeScript 中的“…...
Linux:动态库和静态库的编译与使用
目录 1.前言 2.静态链接库 3.静态链接库生成步骤 4.静态链接库的使用 5.动态链接库 6.动态链接库生成步骤 7.动态链接库的使用 8.动态链接库无法加载 9.解决动态链接库无法加载问题 前言 在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库…...
【Pyqt6 学习笔记】DIY一个二维码解析生成小工具
文章目录 Pycharm 配置QtDesignerPyUIC基本模板 代码示例依赖包main.pyscreen_shot_module.pyuntitled.pyuntitled.ui Pycharm 配置 摘自PyQT6的从零开始在Pycharm中配置与使用——蹦跑的蜗牛 pip install PyQt6 PyQt6-toolsQtDesigner File -> Settings -> External …...
关于xilinx srio ip复位问题
关于xilinx srio ip复位问题 语言 :Verilg HDL 、VHDL EDA工具: Vivado 关于xilinx srio ip复位问题一、引言二、FPGA 之间 srio通信复位处理复位时序不同步:SRIO 模块未正确初始化:等待复位完成的时间不足:SRIO 配置…...
04 uboot 编译与调试
新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…...
【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索
文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…...
在线OJ项目测试(selenium+Junit5)
目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…...
计算机系统基础笔记(12)——控制
前言 在持续输出ing 一、条件码 1.处理器状态(x86-64,部分的) 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置(栈顶) ◼ 当前代码控制点的位置(即将要执行的指令地址) ◼ 最近一次指令执…...
使用RedissonClient的管道模式批量查询key
1.场景 遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…...
UR机器人通信汇总
文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口(502端口)3.2 Dashboard端口(29999端口)3.3 上位机编程端口(30001/30002/30003端口)3.3.1 URS…...
AI学习指南机器学习篇-使用ID3算法构建决策树
AI学习指南机器学习篇-使用ID3算法构建决策树 介绍ID3算法 ID3(Iterative Dichotomiser 3)是一种用于构建决策树的经典机器学习算法。它是由Ross Quinlan于1986年提出的,是一种基于信息论的算法,用于从一组特征中选择最佳特征来…...
React实战(一)初始化项目、配置router、redux、axios
(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错: 解决办法:安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…...
高质量 HarmonyOS 权限管控流程
高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中,往往会涉及到敏感数据和硬件资源的调动和访问,而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解,才可以在应用开发中提高效率和避免踩坑。 权限管控了…...
java里面封装https请求工具类2
其他写法 https://blog.csdn.net/weixin_44372802/article/details/132620809?spm1001.2014.3001.5501 encodeJson 是请求参数的密文格式(大公司都是要对请求参数加密的) ResponseBean 是自己或者对方定义的返回内容参数 public ResponseBean sendByEnc…...
前端面试题日常练-day59 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在PHP中,以下哪个符号用于比较两个值的相等性? a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据? a) 用户的输入数据 b) 浏览器发送的请…...
计算机小问题(4)--关闭联想电脑的小组件
打开联想软件管家,关闭即可 (今天弄了好久才找到,记录一下)...
mac无法读取windows分区怎么办 苹果硬盘怎么读取
对于Mac电脑用户但有Windows系统使用需求的,我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决,不过因为两个系统的磁盘格式不同,相应的也会产生一些问题,例如无法正常读取windows分区。下面本文就详细说明mac无法…...
【设计模式】JAVA Design Patterns——State(状态模式)
🔍目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 🔍解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...
Docker搭建可道云
Docker搭建可道云(存储) 文章目录 Docker搭建可道云(存储)介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…...
武汉 大型 网站建设/今日足球赛事推荐
在路由文件需要守卫的path后面加上meta {path: /home,component: home,meta:{requireAuth:true}}在main.js里面加上 //路由守卫 router.beforeEach((to, from, next) > {console.log(to);console.log(from);if (to.meta.requireAuth) { // 判断该路由是否需要登录权限if(J…...
杭州app定制/关键词排名优化工具有用吗
隐藏index.php 一、codeigniter codeigniter和许多php框架一样,有个单一入口index.php,从url上看,显得很不友好。通过apache的rewirte,是可以隐藏掉的,实现伪url。 打开codeigniter下system\application\config中的config.php …...
网站浏览器/苏州seo建站
题干: 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: List Merge( List L1, List L2 );其中List结构定义如下: typedef struct Node *PtrToNode; struct Node {ElementType …...
wordpress仿微信底部菜单css/宁波优化关键词首页排名
Linux 入侵检测小结 0x00 审计命令 在linux中有5个用于审计的命令: last:这个命令可用于查看我们系统的成功登录、关机、重启等情况;这个命令就是将/var/log/wtmp文件格式化输出。lastb:这个命令用于查看登录失败的情况ÿ…...
做百度网站需要什么条件/视频营销模式有哪些
声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨。可作参考,但不保证绝对正确。如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦 OnMouseEnter、OnMouseOver、OnMouseExit这三个函数类似于…...
安阳网站设计哪家好/哪些浏览器可以看禁止访问的网站
面试官的问题: (1)问:点击一个图标到这个应用启动的全过程(前面是项目经验没啥好说的)。 答:点击图标后通过startActivity远程调用到ams中,ams中将新启动的activity以activityrecor…...