【分布式】Zookeeper数据与存储

2023-10-27

一、前言

  前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数据存储被分为内存数据存储于磁盘数据存储。

二、数据与存储

  2.1 内存数据

  Zookeeper的数据模型是树结构,在内存数据库中,存储了整棵树的内容,包括所有的节点路径、节点数据、ACL信息,Zookeeper会定时将这个数据存储到磁盘上。

  1. DataTree

  DataTree是内存数据存储的核心,是一个树结构,代表了内存中一份完整的数据。DataTree不包含任何与网络、客户端连接及请求处理相关的业务逻辑,是一个独立的组件。

  2. DataNode

  DataNode是数据存储的最小单元,其内部除了保存了结点的数据内容、ACL列表、节点状态之外,还记录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口。

  3. ZKDatabase

  Zookeeper的内存数据库,管理Zookeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在Zookeeper启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的内存数据库。

  2.2 事务日志

  1. 文件存储

  在配置Zookeeper集群时需要配置dataDir目录,其用来存储事务日志文件。也可以为事务日志单独分配一个文件存储目录:dataLogDir。若配置dataLogDir为/home/admin/zkData/zk_log,那么Zookeeper在运行过程中会在该目录下建立一个名字为version-2的子目录,该目录确定了当前Zookeeper使用的事务日志格式版本号,当下次某个Zookeeper版本对事务日志格式进行变更时,此目录也会变更,即在version-2子目录下会生成一系列文件大小一致(64MB)的文件。

  2. 日志格式

  在配置好日志文件目录,启动Zookeeper后,完成如下操作

  (1) 创建/test_log节点,初始值为v1。

  (2) 更新/test_log节点的数据为v2。

  (3) 创建/test_log/c节点,初始值为v1。

  (4) 删除/test_log/c节点。

  经过四步操作后,会在/log/version-2/目录下生成一个日志文件,笔者下是log.cec。

  将Zookeeper下的zookeeper-3.4.6.jar和slf4j-api-1.6.1.jar复制到/log/version-2目录下,使用如下命令打开log.cec文件。

  java -classpath ./zookeeper-3.4.6.jar:./slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.cec

  

  ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 。是文件头信息,主要是事务日志的DBID和日志格式版本号。  

  ...session 0x159...0xcec createSession 30000。表示客户端会话创建操作。

  ...session 0x159...0xced create '/test_log,... 。表示创建/test_log节点,数据内容为#7631(v1)。

  ...session 0x159...0xcee setData ‘/test_log,...。表示设置了/test_log节点数据,内容为#7632(v2)。

  ...session 0x159...0xcef create ’/test_log/c,...。表示创建节点/test_log/c。

  ...session 0x159...0xcf0 delete '/test_log/c。表示删除节点/test_log/c。

  3. 日志写入

  FileTxnLog负责维护事务日志对外的接口,包括事务日志的写入和读取等。Zookeeper的事务日志写入过程大体可以分为如下6个步骤。

  (1) 确定是否有事务日志可写。当Zookeeper服务器启动完成需要进行第一次事务日志的写入,或是上一次事务日志写满时,都会处于与事务日志文件断开的状态,即Zookeeper服务器没有和任意一个日志文件相关联。因此在进行事务日志写入前,Zookeeper首先会判断FileTxnLog组件是否已经关联上一个可写的事务日志文件。若没有,则会使用该事务操作关联的ZXID作为后缀创建一个事务日志文件,同时构建事务日志的文件头信息,并立即写入这个事务日志文件中去,同时将该文件的文件流放入streamToFlush集合,该集合用来记录当前需要强制进行数据落盘的文件流。

  (2) 确定事务日志文件是否需要扩容(预分配)。Zookeeper会采用磁盘空间预分配策略。当检测到当前事务日志文件剩余空间不足4096字节时,就会开始进行文件空间扩容,即在现有文件大小上,将文件增加65536KB(64MB),然后使用"0"填充被扩容的文件空间。

  (3) 事务序列化。对事务头和事务体的序列化,其中事务体又可分为会话创建事务、节点创建事务、节点删除事务、节点数据更新事务等。

  (4) 生成Checksum。为保证日志文件的完整性和数据的准确性,Zookeeper在将事务日志写入文件前,会计算生成Checksum。

  (5) 写入事务日志文件流。将序列化后的事务头、事务体和Checksum写入文件流中,此时并为写入到磁盘上。

  (6) 事务日志刷入磁盘。由于步骤5中的缓存原因,无法实时地写入磁盘文件中,因此需要将缓存数据强制刷入磁盘。

  4. 日志截断

  在Zookeeper运行过程中,可能出现非Leader记录的事务ID比Leader上大,这是非法运行状态。此时,需要保证所有机器必须与该Leader的数据保持同步,即Leader会发送TRUNC命令给该机器,要求进行日志截断,Learner收到该命令后,就会删除所有包含或大于该事务ID的事务日志文件。

  2.3 snapshot-数据快照

  数据快照是Zookeeper数据存储中非常核心的运行机制,数据快照用来记录Zookeeper服务器上某一时刻的全量内存数据内容,并将其写入指定的磁盘文件中。

  1. 文件存储

  与事务文件类似,Zookeeper快照文件也可以指定特定磁盘目录,通过dataDir属性来配置。若指定dataDir为/home/admin/zkData/zk_data,则在运行过程中会在该目录下创建version-2的目录,该目录确定了当前Zookeeper使用的快照数据格式版本号。在Zookeeper运行时,会生成一系列文件。

  2. 数据快照

  FileSnap负责维护快照数据对外的接口,包括快照数据的写入和读取等,将内存数据库写入快照数据文件其实是一个序列化过程。针对客户端的每一次事务操作,Zookeeper都会将他们记录到事务日志中,同时也会将数据变更应用到内存数据库中,Zookeeper在进行若干次事务日志记录后,将内存数据库的全量数据Dump到本地文件中,这就是数据快照。其步骤如下

  (1) 确定是否需要进行数据快照。每进行一次事务日志记录之后,Zookeeper都会检测当前是否需要进行数据快照,考虑到数据快照对于Zookeeper机器的影响,需要尽量避免Zookeeper集群中的所有机器在同一时刻进行数据快照。采用过半随机策略进行数据快照操作。

  (2) 切换事务日志文件。表示当前的事务日志已经写满,需要重新创建一个新的事务日志。

  (3) 创建数据快照异步线程。创建单独的异步线程来进行数据快照以避免影响Zookeeper主流程。

  (4) 获取全量数据和会话信息。从ZKDatabase中获取到DataTree和会话信息。

  (5) 生成快照数据文件名。Zookeeper根据当前已经提交的最大ZXID来生成数据快照文件名。

  (6) 数据序列化。首先序列化文件头信息,然后再对会话信息和DataTree分别进行序列化,同时生成一个Checksum,一并写入快照数据文件中去。

  2.4 初始化

  在Zookeeper服务器启动期间,首先会进行数据初始化工作,用于将存储在磁盘上的数据文件加载到Zookeeper服务器内存中。

  1. 初始化流程

  Zookeeper的初始化过程如下图所示

  数据的初始化工作是从磁盘上加载数据的过程,主要包括了从快照文件中加载快照数据和根据实物日志进行数据修正两个过程。

  (1) 初始化FileTxnSnapLog。FileTxnSnapLog是Zookeeper事务日志和快照数据访问层,用于衔接上层业务和底层数据存储,底层数据包含了事务日志和快照数据两部分。FileTxnSnapLog中对应FileTxnLog和FileSnap。

  (2) 初始化ZKDatabase。首先构建DataTree,同时将FileTxnSnapLog交付ZKDatabase,以便内存数据库能够对事务日志和快照数据进行访问。在ZKDatabase初始化时,DataTree也会进行相应的初始化工作,如创建一些默认结点,如/、/zookeeper、/zookeeper/quota三个节点。

  (3) 创建PlayBackListener。其主要用来接收事务应用过程中的回调,在Zookeeper数据恢复后期,会有事务修正过程,此过程会回调PlayBackListener来进行对应的数据修正。

  (4) 处理快照文件。此时可以从磁盘中恢复数据了,首先从快照文件开始加载。

  (5) 获取最新的100个快照文件。更新时间最晚的快照文件包含了最新的全量数据。

  (6) 解析快照文件。逐个解析快照文件,此时需要进行反序列化,生成DataTree和sessionsWithTimeouts,同时还会校验Checksum及快照文件的正确性。对于100个快找文件,如果正确性校验通过时,通常只会解析最新的那个快照文件。只有最新快照文件不可用时,才会逐个进行解析,直至100个快照文件全部解析完。若将100个快照文件解析完后还是无法成功恢复一个完整的DataTree和sessionWithTimeouts,此时服务器启动失败。

  (7) 获取最新的ZXID。此时根据快照文件的文件名即可解析出最新的ZXID:zxid_for_snap。该ZXID代表了Zookeeper开始进行数据快照的时刻。

  (8) 处理事务日志。此时服务器内存中已经有了一份近似全量的数据,现在开始通过事务日志来更新增量数据。

  (9) 获取所有zxid_for_snap之后提交的事务。此时,已经可以获取快照数据的最新ZXID。只需要从事务日志中获取所有ZXID比步骤7得到的ZXID大的事务操作。

  (10) 事务应用。获取大于zxid_for_snap的事务后,将其逐个应用到之前基于快照数据文件恢复出来的DataTree和sessionsWithTimeouts。每当有一个事务被应用到内存数据库中后,Zookeeper同时会回调PlayBackListener,将这事务操作记录转换成Proposal,并保存到ZKDatabase的committedLog中,以便Follower进行快速同步。

  (11) 获取最新的ZXID。待所有的事务都被完整地应用到内存数据库中后,也就基本上完成了数据的初始化过程,此时再次获取ZXID,用来标识上次服务器正常运行时提交的最大事务ID。

  (12) 校验epoch。epoch标识了当前Leader周期,集群机器相互通信时,会带上这个epoch以确保彼此在同一个Leader周期中。完成数据加载后,Zookeeper会从步骤11中确定ZXID中解析出事务处理的Leader周期:epochOfZxid。同时也会从磁盘的currentEpoch和acceptedEpoch文件中读取上次记录的最新的epoch值,进行校验。

  2.5 数据同步

  整个集群完成Leader选举后,Learner会向Leader进行注册,当Learner向Leader完成注册后,就进入数据同步环节,同步过程就是Leader将那些没有在Learner服务器上提交过的事务请求同步给Learner服务器,大体过程如下

  (1) 获取Learner状态。在注册Learner的最后阶段,Learner服务器会发送给Leader服务器一个ACKEPOCH数据包,Leader会从这个数据包中解析出该Learner的currentEpoch和lastZxid。

  (2) 数据同步初始化。首先从Zookeeper内存数据库中提取出事务请求对应的提议缓存队列proposals,同时完成peerLastZxid(该Learner最后处理的ZXID)、minCommittedLog(Leader提议缓存队列commitedLog中最小的ZXID)、maxCommittedLog(Leader提议缓存队列commitedLog中的最大ZXID)三个ZXID值的初始化。

  对于集群数据同步而言,通常分为四类,直接差异化同步(DIFF同步)、先回滚再差异化同步(TRUNC+DIFF同步)、仅回滚同步(TRUNC同步)、全量同步(SNAP同步),在初始化阶段,Leader会优先以全量同步方式来同步数据。同时,会根据Leader和Learner之间的数据差异情况来决定最终的数据同步方式。

  · 直接差异化同步(DIFF同步,peerLastZxid介于minCommittedLog和maxCommittedLog之间)。Leader首先向这个Learner发送一个DIFF指令,用于通知Learner进入差异化数据同步阶段,Leader即将把一些Proposal同步给自己,针对每个Proposal,Leader都会通过发送PROPOSAL内容数据包和COMMIT指令数据包来完成,

  · 先回滚再差异化同步(TRUNC+DIFF同步,Leader已经将事务记录到本地事务日志中,但是没有成功发起Proposal流程)。当Leader发现某个Learner包含了一条自己没有的事务记录,那么就需要该Learner进行事务回滚,回滚到Leader服务器上存在的,同时也是最接近于peerLastZxid的ZXID。

  · 仅回滚同步(TRUNC同步,peerLastZxid大于maxCommittedLog)。Leader要求Learner回滚到ZXID值为maxCommittedLog对应的事务操作。

  · 全量同步(SNAP同步,peerLastZxid小于minCommittedLog或peerLastZxid不等于lastProcessedZxid)。Leader无法直接使用提议缓存队列和Learner进行同步,因此只能进行全量同步。Leader将本机的全量内存数据同步给Learner。Leader首先向Learner发送一个SNAP指令,通知Learner即将进行全量同步,随后,Leader会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将他们序列化后传输给Learner。Learner接收到该全量数据后,会对其反序列化后载入到内存数据库中。

三、总结

  本篇博文主要讲解了Zookeeper的数据与存储,包括内存数据,快照数据,以及如何进行数据的同步等细节,至此,Zookeeper的理论学习部分已经全部完成,之后会进行源码分析,也谢谢各位园友的观看~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【分布式】Zookeeper数据与存储 的相关文章

  • 【计算机毕业设计】个人日常事务管理系统

    进入21世纪网络和计算机得到了飞速发展 并和生活进行了紧密的结合 目前 网络的运行速度以达到了千兆 覆盖范围更是深入到生活中的角角落落 这就促使 管理系统的发展 管理系统可以实现远程处理事务 远程工作信息和随时追踪工作的状态 网上管理系统给
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 大数据毕业设计:python微博舆情分析系统+可视化+情感分析+爬虫+机器学习(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 电商数据api拼多多接口获取商品实时数据价格比价api代码演示案例

    拼多多商品详情接口 接口接入入口 它的主要功能是允许卖家从自己的系统中快速获取商品详细信息 通过这个接口 卖家可以提取到商品的各类数据 包括但不限于商品标题 价格 优惠价 收藏数 下单人数 月销售量等 此外 还可以获取到商品的SKU图 详情
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • Kubernetes (十三) 存储——持久卷-动静态分配

    一 简介 二 NFS持久化存储步骤 静态分配 1 集群外主机用上次nfsdata共享目录中创建用来测试的pv 1 3 目录 用来对三个静态pv 2 创建pv的应用文件 vim pv yaml apiVersion v1 kind Persi
  • Mysql中设置只允许指定ip能连接访问(可视化工具的方式)

    场景 Mysql中怎样设置指定ip远程访问连接 Mysql中怎样设置指定ip远程访问连接 navicat for mysql 设置只有某个ip可以远程链接 CSDN博客 前面设置root账户指定ip能连接访问是通过命令行的方式 如果通过可视
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • ESM10A 消除对单独 PLC 的需求

    ESM10A 消除对单独 PLC 的需求 ESM10A 可以消除对单独 PLC 的需求 该程序是在 PC 上开发的 然后使用免费提供的简单易用的 EzSQ 软件下载到逆变器 似乎这些改进还不够 日立还在 SJ700 中添加了其他新功能 例如
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 服务器中E5和I9的区别是什么,如何选择合适的配置

    随着科技的进步 服务器处理器的性能在不断攀升 其中 Intel的E5和I9系列处理器在业界具有广泛的影响力 而当我们在选择服务器的时候会有各种各样的配置让我们眼花缭乱不知道该怎么去选择 下面我跟大家分享一下E5跟I9有什么区别 方便我们在选
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据

随机推荐

  • 微信小程序——订阅消息与微信公众号模板消息

    订阅消息 一次性订阅消息 某个按钮 并且只能是用户自己就手动点击的 操作调起来这个允许授权弹窗 允许通知之后也只能发送一次消息 即便点上 总是保持一上选择 不再询问 也只是在下次点击同一个按钮时默认允许发送消息 不是可以一直发送消息的 使用
  • python文件处理方式

    python文件处理方式 file open D pythonText txt r encoding UTF 8 print file lt io TextIOWrapper name D pythonText txt mode r enc
  • IntelliJ IDEA (Ultimate Edition)2021.1配置javaFX8(Mac Pro) 踩坑

    该文写于2022 1 22日 应该算是比较新的坑吧 仅供参考 转发请注明出处 该版本内置了javaFX模块 创建项目可以在左侧工具栏看到JavaFX选项 创建项目后 intelliJ自动创建的项目结构如下图 打开Main文件 发现一大堆红色
  • iOS: HTTPS 与自签名证书

    不是每个公司都会以数百美金一年的代价向CA购买SSL证书 在企业应用中 付费的SSL证书经常被自签名证书所替代 当然 对于自签名证书iOS是没有能力验证的 Safari遇到这种无法验证的自签名证书的唯一处理方法 就是将问题扔给用户 让用户决
  • zSetOperations=redisTemplate.opsForZSet();redis的Zset数据类型方法大全(zSetOperations常用方法详细)

    zSetOperations redisTemplate opsForZSet 以下是 zSetOperations 接口中定义的所有方法及其详细说明 void add K key V value double score 将一个成员添加到
  • JDBC(The end)—— 数据库连接池示例 (与线程池梦幻联动)

    写在之前 不管以后对于那种类型的池 都需要List接口利用多态的写法来对一系列集合框架类进行实例化对象 以此该对象调用add方法 来装多个此种类型的实例化对象 数据库连接池的设计思路比线程池简单易懂 以下是示例 和之前线程池的设计思想相同之
  • python怎么搭建免费代理IP池

    搭建免费代理 IP 池需要经过以下步骤 1 抓取免费代理 IP 可以通过爬虫抓取免费的代理 IP 例如可以使用 requests 和 BeautifulSoup 库实现 需要注意的是 免费代理 IP 的可用性通常比较低 需要考虑测试代理 I
  • 计算机网络学习笔记--基带(base)信号

    基带 base 保持数据波的原样进行传输称为基带传输或者基带数字信号传输 宽带 broad 在数据通信领域则指数据传输速率超过1Mps的传输系统 宽带信号则是将基带信号进行调制后形成的频分复用模拟信号 基带信号进行调制后 其频谱搬移到较高的
  • Linux更改SSH端口,并解决SSHD服务重启失败的问题

    环境 Linux Centos 7 1 进入sshd配置文件 vi etc ssh sshd config 2 找到 Port 22 这行 删掉注释符 将端口改为 想要变成的端口号 如 2022 3 重启sshd服务 systemctl r
  • 微信小程序后台销毁时间 演变和总结(热启动时间限制)

    小程序启动 这样 小程序启动可以分为两种情况 一种是冷启动 一种是热启动 冷启动 如果用户首次打开 或小程序销毁后被用户再次打开 此时小程序需要重新加载启动 即冷启动 热启动 如果用户已经打开过某小程序 然后在一定时间内再次打开该小程序 此
  • Java实现微信登录

    Java实现微信登录 代码实现微信授权 简单来说 微信授权分为四步 1 授权登录接口 生成一个二维码在页面中 2 用户点击授权成功后自动获取code 3 浏览器自动利用code访问回调接口 4 在回调接口中利用code登录 appId ap
  • Android嵌入式系统程序开发

    Android嵌入式系统程序开发 基本信息 作者 胡文 宁世勇 李明俊 金雪松 丛书名 单片机与嵌入式丛书 出版社 机械工业出版社 ISBN 9787111411697 上架时间 2013 4 2 出版日期 2013 年4月 开本 16开
  • oracle rac io,ORACLE RAC 之I/O分离--hangcheck-timer模块配置

    ORACLE RAC 之I O分离 hangcheck timer模块配置 此文档摘自METALINK 726833 1 所适用的ORACLE版本为 Oracle Server Enterprise Edition Version 9 2
  • git:文件存储方式

    引言 我们知道 git 跟踪文件会经历三个阶段 工作区 暂存区和本地仓库 参考git 理解工作区 暂存区和本地仓库 在这些阶段文件如何被储存 理解 git 文件的存储方式能帮助我们掌握 git 的工作原理 git 对象 在上述三个阶段 文件
  • 基于典型相关分析的故障检测和过程监控算法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 本文首先研究了一种基于广义典型相
  • 安装ik中文分词器

    前提是安装了es Elasticsearch安装 p f 的博客 CSDN博客 1 根据es版本下载对应的中文ik分词器zip资源 官方下载地址 Releases medcl elasticsearch analysis ik GitHub
  • 火狐自定义字体失败 downloadable font: no supported format found

    Bootstrap AdminLTE搭起来的服务 突然字体图标都访问不了了 报错如下 解决办法1 FontAwesome官网找解决办法 不引用本地的css 直接引用官网建议的地址 完美解决 图标都出来了 解决办法2 pom打包的代码中添加
  • Vxe Table/Grid 单元格分组合并

    要合并的列 htbm htmc hetd hetdws yjs 一般的合并 不带逻辑 直接就把各自列对应的相同名字的列合并了 如下所示 不是合同的数据 值一样 直接给合并了 加上逻辑区分后的合并 会依次判断前面的字段一致后才合并后面的字段
  • Centos7.3 Openstack-liberty安装部署记录

    一 环境 1 1 安全 本指南会告诉你如何使用 Red Hat Enterprise Linux 7和其衍生的EPEL仓库安装OpenStack 说明 目前统一采用Centos7 3版本进行Openstack liberty版本的安装 测试
  • 【分布式】Zookeeper数据与存储

    一 前言 前面分析了Zookeeper对请求的处理 本篇博文接着分析Zookeeper中如何对底层数据进行存储 数据存储被分为内存数据存储于磁盘数据存储 二 数据与存储 2 1 内存数据 Zookeeper的数据模型是树结构 在内存数据库中