最近项目在对部署在香港节点的网站服务做资源加载提速,本文主要记录了在kubernetes的原生nginx ingress中引入server cache的流程和方案,
里面涉及的都是最为常见的技术,并没有什么新的东西,算是一个总结和记录。
Merkle 树的诞生及演进 诞生 在介绍Merkle树之前,先回顾下另一个更为广泛的技术——Hash(哈希也叫散列),他能把任意长度的输入,通过散列算法变换成固定长度的输出,输出就是Hash值,自1953年诞生以来,已经衍生了很多有名的Hash算法,比如MD系列,SHA系列等算法,在理想的情况下,Hash能做到两点:
相同的输入得到的结果一定相同 不同的输入得到的结果一定不同 基于此,Hash被广泛应用在文件校验,标识,加密等领域,举个例子,openEuler每次版本发布的ISO文件都会包含其sha256的Hash文件(见下图),当用户文件下下来后,我们可以通过对下载文件再次进行SHA256 Hash运算并与sha256sum文件内容比较,以此来判定文件的完整性。当然在实际的场景中,校验的情况通常会更加复杂,可能涉及多个文件,多个来源,多种时刻等,随着技术的演进,便有了今天的要介绍的Merkle树,1979年来自于斯坦福大学的美国计算机科学家Ralph Merkle在他的论文《基于常规加密函数的数字签名》中首次提出了哈希树的概念,这便是今天Merkle树的雏形。 openEuler社区发布的ISO文件及Hash文件(算法为sha256)
定义 按照维基百科的定义,Merkle树是一种树形结构数据,每个叶子节点以一个数据块的哈希信息为标签,而其他节点均以其子节点的标签哈希为标签,整个结构自下而上,简单直观,能够高效,安全的验证大型数据的内容。注意: Merkle树本身没有对树的类型做规定,但是一般情况下我们说的Merkle树为二叉树。 基础应用——Git git clone,git add... 作为程序员每天都会跟git打交道,自2005年诞生以来,目前已是使用最为广泛的代码管理系统。在git的内部,存储文件时有个基础对象——**Tree,**其结构就是一棵Merkle树(严格来说,是一个跟Merkle树非常相似的Merkle DAG,我们这里不做区分,都算作Merkle树),这是Merkle树最基础的应用。 展开来说,Git内部在存储文件时,他会把每个文件拆解为两部分,一部分用于保存文件的文件内容,用Blob对象表示,另一部分如文件名等元数据信息会作为Node保存在我们的这颗树中:
Blob 用于保存对应文件的内容,相比于原始的提交文件内容,blob文件会按照新格式重新组装内容并压缩,以一个内容为Hello World 名为real_name.txt的文件举例,生成的blob文件信息以下图举例,注意: git内部每个存储的文件都会以blob的形式存储,同时每个文件的多个版本也会用多个独立的blob保存。
1 2 3 4 5 #Hello World会以Blob形式存储,具体格式如下: #1. Blob文件内容: blob+内容长度+原始文件内容 Blob Content = Zip("blob 11 Hello World\0") #2. Blob文件名: 其文件内容的SHA1摘要 Blob File Name = SHA1("blob 11 Hello World\0") #bd9dbf5aae1a3862dd1526723246b20206e5fc37 Tree Git代码仓都是由文件夹及文件构成的,有了Blob存储文件内容,剩下的文件夹结构便是用Merkle Tree的形式存储,这颗树中每个非Root节点代表一个具体的文件(Blob)或者是一个子文件夹(Tree), 要注意的是每个文件对应的文件名,文件权限等信息也会附加在这节点中,有了以上的信息,我们以一个实际的仓库状态为例:
1 2 3 4 5 6 7 ➜ git-demo git:(main) tree -L 4 .
社区签名系统自构建以来,经常会遇到签名阻塞的问题,这个问题在一直存在,但一直没有一个比较好的解决方案,今年我们在社区中引入了一个新的签名系统,整个系统基于Rust语言开发,采用CSP模型,异步框架,TEE等技术,相比现有的签名系统,整个系统在性能,安全,管理等方面都有很大的提升,本文将介绍整个系统的设计思路,技术实现和未来规划。
虚拟化简介 什么是虚拟化? 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
计算机的系统结构如上图所示,在硬件层和操作系统层之间,我们有一个硬件抽象层,他是操作系统实际交互的系统层。利用这个交互层,我们就可以通过软件,模拟返回上层需要的数据,达到虚拟化的目的。
虚拟化的实现方式 虚拟化有两种实现方式,一种是直接运行在硬件平台上,通知所有的硬件并管理客户系统,比如:Xen,一种是运行在传统的操作系统中,类似于在软件层面中提供虚拟环境,比如KVM和VirtualBox
虚拟化的平台类型 全虚拟化 全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。这种模式下Guest OS 一般会降级运行(ring1),当Guest OS需要执行特权指令时,会触发异常,被VMM捕获(ring0)并执行。使用全虚拟化的VMM有:Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac
超虚拟化 这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供,比较著名的 VMM 有 Denali、Xen。
硬件辅助虚拟化 硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的“全套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。
部分虚拟化 VMM只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。
reStructuredText入门 什么是reStructuredText? reStructuredText通常简称为RST,ReST,reST,是Python里面最为常见的文档格式,他跟Markdown一样,语法在很多地方也很类似,如果有过Markdown的写作经验,入门reStructuredText是一件非常容易的事情。
RST规范 如果你本地没有即时浏览的编辑器,强烈推荐通过Online Editor来快速上手,我们的介绍几乎都是从官方文档移植过来的。目的是便于个人整理和回顾,个人学习还是推荐去官方文档查看。
文本 加粗和斜体 RST中的加粗和斜体跟Markdown中用法一致都是通过*和**来指定的:
1 2 *this is italics* **this is bold** 替代文本(interpreted text) 一般配合rst中的描述标记使用,用来做链接,引用,解释等,例如站外链接:
1 please contact email `<http://username.organisze.org/>`_ Embedded hyperlink 内嵌的外部链接,引用和定义放在一起
1 2 3 4 5 `display_text link_address`_ :在引用符中间就是具体的显示字符和链接地址,后面紧跟_, #以下面实际的例子对比Markdown: External hyperlinks, like `Python <http://www.python.org/>`_. RST External hyperlinks, like [Python](http://www.python.org/). Markdown Hyperlink target 引用和定义分开,可以多次引用,使用_建立对应关系,可用于纸质输出文档,他的效果和我们上面最终的效果一致:
1 2 3 External hyperlinks, like Python_. .. _Python: http://www.python.org/ Inline hyperlink 引用文章内部的区域,就类似于url里面的#,语法跟外部target引用一样,只是定义的时候需要使用如下的格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 # 其实就是在定义的时候生成一个带id的div,到时候再通过#指向该区域而已 External hyperlinks, like Python2_.
Python常见特性入门 装饰器 有过AOP编程经历的人对以下的场景肯定都不陌生:我们暴露了API接口给客户端调用,基于运维的考虑,我们需要自动拦截API接口的耗时参数等信息,通常的方式就是在基类中包装一层或者使用拦截器,大致的代码如下:
1 2 3 4 5 6 7 public string WrapExecute(string fake_param) { ExecuteBefore(fake_param); var result = Execute(); ExecuteAfter(result); return result } Python的装饰器天生就可以承担类似的工作,下面是一个简单的装饰器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def execute_before(): print('this is before') def execute_after(): print('this is after') def decorator(func): def wrapper(): execute_before() func() execute_after() return wrapper def execute(): print('this is executing') execute = decorator(execute) 跟我们在其他语言中的用法保持一致,当然我们的python在此之上,还提供了更便捷的方式:@,python中以@开头并紧跟装饰器的名字可理解成给对应的对应的对象使用装饰器,所以,上面的调用方式,可以优化成: