- 博客(147)
- 资源 (14)
- 收藏
- 关注
原创 分布式散列表(DHT)及具体实现Kademlia(kad)/Chord
分布式散列列表主要是⽤用于分布式系统(此时,分布式系统的节点可以通俗理理解为散列列表中的 bucket),分布式散列列表主要是⽤用来存储⼤大量量的(甚⾄至是海海量量的)数据。在实际使⽤用场景中,直接对所存储的“每⼀一个业务数据”计算散列列值,然后用散列列值作为 key,业务数据本身是 value。
2022-12-12 23:43:13 3417
原创 混合逻辑时钟HLC(Hybrid Logical Clocks)
计算机处理时钟的两种方式,一种是物理时钟,包括NTP协议和TrueTime都属于物理时钟,另一种是逻辑时钟,包括Lamport逻辑时钟和向量时钟。这两种时钟有各自的优缺点。物理时钟的优点在于直观,就是真实世界的时间,使用方便,缺点在于无法做到绝对精确,成本相对高一些。逻辑时钟的优点在于可以做到精确的因果关系,缺点在于节点之间需要通信,而且使用上不如物理时钟直观。
2022-11-13 15:16:17 785 1
原创 高性能网络通信框架--Mercury
Mercury是一个专门设计用于HPC系统的RPC框架,允许异步传输参数和执行请求,以及直接支持大型数据参数
2022-09-07 20:12:55 1692
原创 DAOS整体设计分析 (二)
DAOS 使用校验和提供端到端数据完整性,以更好地确保用户数据不会静默损坏。在写入或更新期间,DAOS 客户端库 (libdaos.so) 在通过网络传输之前计算校验和并将其附加到 RPC 消息。 根据配置,DAOS 服务器可能会或可能不会计算校验和来验证接收到的数据。
2022-09-05 16:49:20 1238
原创 DAOS整体设计分析 (一)
DAOS 是一种开源软件并支持横向扩展的对象存储系统,可为应用程序提供高带宽和高 IOPS 存储容器,并支持结合模拟、数据分析和机器学习的下一代以数据为中心的工作流。DAOS 完全使用新的 NVM 技术,并且非常轻量级,因为它在用户空间中运行端到端 (E2E),完全绕过操作系统。传统的存储模型需要按最小io粒度对齐,并且需要经过内核态的块设备栈。DAOS 提供了一种支持细粒度数据访问并释放下一代存储技术性能的模型。
2022-09-04 23:32:40 4593
原创 空间数据结构管理---RTree (下篇,代码实例)
R-树是一种流行的数据结构,用于有效地存储和查询空间对象;一个常见的用途是实现地理空间信息数据库管理系统中的索引。两个边界框查询并且支持k近邻查询。R-树是平衡的,因此最大树高保证为条目数为对数;然而,这是最坏的情况性能不能保证。相反,一些再平衡启发式方法在实践中表现良好
2022-09-03 23:00:49 698
原创 SARC 预读算法
SARC: Sequential Prefetching in Adaptive Replacement Cache1.1 常见问题 (1)、同步预读引发的未命中问题最简单的顺序预读策略是同步预取,在顺序读轨迹数据块n未命中时会触发将数据块n至n + m带入高速缓存中,其中m被称为顺序预读度,并且是可调参数。考虑使用m = 1的众所周知的一个块预读方案。该方案将连续未命中的次数减少了1/2。概括地说,通过m个数据块的的预读,连续未命中的数量减少了1 /(m + 1)。为了仅通过使用同步预取来..
2021-05-12 19:18:22 795 1
原创 布隆过滤器与布谷鸟过滤器
大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景:我们业务后端涉及数据库,当请求消息查询某些信息时,可能先检查缓存中是否有相关信息,有的话返回,如果没有的话可能就要去数据库里面查询,这时候有一个问题,如果很多请求是在请求数据库根本不存在的数据,那么数据库就要频繁响应这种不必要的IO查询,如果再多一些,数据库大多数IO都在响应这种毫无意义的请求操作,那么如何将这些请求阻挡在外呢?过滤器由此诞生!布隆过滤器:布隆过滤器(Bl
2021-05-12 17:46:07 437
原创 GFS2+ISCSI+CLVM分布式文件系统集群搭建记录
一、环境信息Centos7系统文件系统服务器两台 IP: 10.243.31.9 node3 IP: 10.243.31.10 node4存储服务器 IP: 10.243.31.13 store二、机器准备 1、[node3&node4]增加机器别名:/etc/hosts 2、[node3&node4]关闭防火墙systemctl stop firewalld.service3、[node3&node4]关闭 Network...
2021-01-28 11:41:54 1901 2
原创 Openstack Nova与Hypervisor对接
OpenStack是公有云的标准云OS框架,目前已经得到各个云厂商支持和客户的认可,很多云解决方案提供商都把云战略转向OpenStack,如传统厂商方案 SoftLayer、Helion、FusionSphere、Suse和Redhat等,以及新型云服务商的方案,如RackSpace、Miratis、Nebula、ClouScaling、MetaCloud、PistonCloud、Canonical等。今天我们来讨论一下OpenStack如何与底层Hypervisor对接和技术原理。OpenStack和
2020-11-29 23:04:20 2139
原创 基于分布式存储的文件系统4k对齐写优化
测试工具:vdbench磁盘类型:iscsi Initiator、Target(TGTD)文件系统:xfs后端磁盘的io粒度是4k,实际生产环境中发现有许多512字节的数据写到存储后端,512字节的写触发写惩罚,需要先补齐4k然后再写下去。解决该问题有几种方法:方法1:设置lun的物理扇区大小当将一个卷映射到lun时默认的物理扇区是512字节:加lun时通过--blocksize 4096 参数指定物理扇区为4k,就可以保证lun之下收到的请求不会小于4k。方法2:.
2020-11-29 22:27:04 1060 1
原创 基于etcd的选主功能实现的主备节点管理
etcd有多种使用场景,Master选举是其中一种。本文主要讲述如何使用etcd在多个service中选一个主服务。使用etcd选主和分布式锁差不多,哪个service首先抢到某个值,谁就是主节点,选主接口是个同步接口,抢到主或者出现错误就返回,没有抢到主的会一直阻塞。pfx是前缀,比如"/election/"key类似于"/election/service1"leaseID是一个64位的整数值,etcd v3引入了lease(租约)的概念,lease被封装在session中,每一个客户端都生
2020-11-20 19:46:38 4758
原创 定制开发基于Protobuf的rpc
Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言。Protobuf刚开源时的定位类似于XML、JSON等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。1、Protobuf入门我们尝试将Protobuf和RPC结合在一起使用,通过Protobuf来最终保证RPC的接口规范和安全。Protobuf中最基本的数据单元是message,是类似Go语言中
2020-11-20 19:42:43 701 1
原创 go语言高级编程RPC
RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC已经和IPC一样成为一个不可或缺的基础构件。因此Go语言的标准库也提供了一个简单的RPC实现。1、基于gob编码的RPCGo语言的RPC包的路径为net/rpc,也就是放在了net包目录下面。RPC包是建立在net包基础之上的。我们先构造一个HelloService类型,其中的Hello方法用于实现打印功能:type HelloService struct {}type Request struct
2020-11-20 19:30:43 403
原创 PacificA:基于日志复制的分布式存储技术论文
1 概要介绍复制协议是一个实用复制机制的关键,简单性和模块化是构建实用系统的关键因素。本文的复制框架包含了以下特性:(1)复制组配置管理与数据复制分离,Paxos用于管理配置,主/备模式用于数据复制。(2)分散监控用来检测故障并触发重新配置,监控流量遵循数据复制的通信模式。(3)通用的抽象模型,该模型澄清了正确性并允许不同设计实例。本文描述的基于日志的分布式系统和以前的系统(如Boxwood和Bigtable)使用的新复制方案进行对比。本文描述的方案在简单性方面具有优势,因为不依赖单..
2020-11-13 15:34:57 483
原创 ETCD源码分析---watch机制
这几天使用etcd的订阅功能遇到了一点问题,之前一直没注意这部分功能,所以抽了点时间把这部分流程看了看。Watch是监听一组或者一个的key,key的任何变化都会发出消息。KV接口的具体实现是store结构体。Watch的实现是在store上封装了一层,叫做:watchableStore,重写了store的Write方法。通过MVCC中介绍,store的任何写操作,都需要Write方法返回的TxnWrite。所以这里重写Write方法意味这任何写操作都会经过watchableStore。可以在之前的
2020-10-09 19:57:57 3694
原创 ETCD源码分析---put流程
Put 流程涉及到的模块如下所示:直接从processInternalRaftRequestOnce函数开始看:func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.InternalRaftRequest) (*applyResult, error) { ai := s.getAppliedIndex() ci := s.getCommittedIndex() if c
2020-10-09 19:53:30 1006
原创 raft协议对网络分区的处理
网络分区是raft协议需要解决的异常问题之一,假设有A,B,C,D,E五个节点。假设A和E网络不通,但是他们和B,C,D都是通的如下图:假设某一时刻leader是A节点,E在超时没有收到心跳后,把term+1,发起leader选举,如果这段时间B,C,D没有写入更新的日志,由于E的term更大,就会被选为leader,A在后面的RPC中因为自己的term较小也会被降为follower。但是由于A成为follower之后和E之间网络不通也会按照上面E的方式发起选举成为leader。A和E反复成为l
2020-10-09 19:48:07 2536 2
原创 一种多副本复制算法----法定数共识算法
一种阻止分区中的事务产生不一致的方法是制定一个规则,使操作只能在某一个分区中进行。由于不同分区中的副本管理器不能相互通信,因此每一个分区中的副本管理器子组必须独立地决定它们是否能进行操作。法定数是一个副本管理器子组,它的大小使它具有执行操作的权利。例如,如果拥有大多数成员是一个标准的话,那么含大多数成员的子组可形成一个法定组,因为其他的子组不会拥有大多数成员在一个法定数共识的复制方案中,一个逻辑对象上的更新操作可以成功地被副本管理器组一个子组完成。该子组的其他成员将拥有对象的过时的拷贝。版本号或时间戳可
2020-10-09 19:44:57 931
原创 hbase--多版本控制mvcc
数据库为了保证一致性,在执行读写操作时往往会对数据做一些锁操作,比如两个client同时修改一条数据,我们无法确定最终的数据到底是哪一个client执行的结果,所以需要通过加锁来保证数据的一致性。但是锁操作的代价是比较大的,往往需要对加锁操作进行优化,主流的数据库MySQL,PG等都采用MVCC(多版本并发控制)来尽量避免使用不必要的锁以提高性能。HBase也是使用MVCC来进行并发控制。sql标准定义了4种隔离级别:1、READ UNCOMMITED(未提交读) 在RERAD UNCOM
2020-10-09 19:43:28 768
原创 kubernetes 存储插件CSI开发指导
1.K8s 的持久化存储支持在支持持久化存储方面,K8s 提供了内嵌原生 Driver 的方式连接外部的常见存储系统例如 NFS、iSCSI、CephFS、RBD 等来满足不同业务的需求。但由于存储生态本身也在不断演进,使用 K8s 内嵌的方式来支持不断变化的存储系统在成本和时效上都会对 K8s 项目自身带来巨大的挑战。所以和其他服务管理系统一样,K8s 逐渐的将存储系统的具体实现从主项目中分离出来,通过定义接口的方式允许第三方厂商自行接入存储服务。在这个道路上也经历了两个阶段:Flex Vol
2020-09-19 14:45:25 2899 1
原创 hbase---跳跃表(skiplist)
跳跃表(SkipList)是一种能高效实现插入、删除、查找的内存数据结构,这些操作的期望复杂度都是O(logN)。与红黑树以及其他的二分查找树相比,跳跃表的优势在于实现简单,而且在并发场景下加锁粒度更小,从而可以实现更高的并发性。正因为这些优点,跳跃表广泛使用于KV数据库中,诸如Redis、LevelDB、HBase都把跳跃表作为一种维护有序数据集合的基础数据结构。众所周知,链表这种数据结构的查询复杂度为O(N),这里N是链表中元素的个数。在已经找到要删除元素的情况下,再执行链表的删除操作其实非常高效,
2020-09-19 14:29:52 1329 1
原创 布隆过滤器原理及实现
如何高效判断元素w是否存在于集合A之中?首先想到的答案是,把集合A中的元素一个个放到哈希表中,然后在哈希表中查一下w即可。这样确实可以解决小数据量场景下元素存在性判定,但如果A中元素数量巨大,甚至数据量远远超过机器内存空间,该如何解决问题呢?实现一个基于磁盘和内存的哈希索引当然可以解决这个问题。而另一种低成本的方式就是借助布隆过滤器(Bloom Filter)来实现。布隆过滤器由一个长度为N的01数组array组成。首先将数组array每个元素初始设为0。对集合A中的每个元素w,做K次哈希,第i
2020-09-19 14:25:19 235
原创 hbase-----memstore flush 流程代码分析
flush的整体流程分三个阶段 HBase采用了类似于两阶段提交的方式,将整个flush过程分为三个阶段。1)prepare阶段:遍历当前Region中的所有MemStore,将MemStore中当前数据集CellSkipListSet(内部实现采用ConcurrentSkipListMap)做一个快照snapshot,然后再新建一个CellSkipListSet接收新的数据写入。prepare阶段需要添加updateLock对写请求阻塞,结束之后会释放该锁。因为此阶段没有任何费时操作,因此持锁时
2020-09-19 14:20:05 696
原创 mapreduce 任务task处理流程
在MapReduce计算框架中,一个应用程序被划分成Map和Reduce两个计算阶段,它们分别由一个或者多个Map Task和Reduce Task组成。其中,每个Map Task处理输入数据集合中的一片数据(InputSplit),并将产生的若干个数据片段写到本地磁盘上,而Reduce Task则从每个Map Task上远程拷贝相应的数据片段,经分组聚集和归约后,将结果写到HDFS上作为最终结果,如下图所示。总体上看,Map Task与Reduce Task之间的数据传输采用了pull模型。为了能够容错,
2020-09-19 14:02:43 1388
原创 hbase----hlog流程代码分析
HBase中系统故障恢复以及主从复制都基于HLog实现。默认情况下,所有写入操作(写入、更新以及删除)的数据都先以追加形式写入HLog,再写入MemStore。大多数情况下,HLog并不会被读取,但如果RegionServer在某些异常情况下发生宕机,此时已经写入MemStore中但尚未flush到磁盘的数据就会丢失,需要回放HLog补救丢失的数据。此外,HBase主从复制需要主集群将HLog日志发送给从集群,从集群在本地执行回放操作,完成集群之间的数据复制。1、HLog文件结构HLog文件的基本结
2020-09-19 14:01:40 659
原创 Hbase----负载均衡
将从HBase作为分布式系统的视角介绍HBase负载均衡的实现机制。负载均衡是分布式集群设计的一个重要功能,只有实现了负载均衡,集群的可扩展性才能得到有效保证。数据库集群负载均衡的实现依赖于数据库的数据分片设计,可以在一定程度上认为数据分片就是数据读写负载,那么负载均衡功能就是数据分片在集群中均衡的实现。HBase中数据分片的概念是Region。本文将介绍HBase系统中Region迁移、合并、分裂等基本操作原理,基于这些知识介绍HBase系统负载均衡的实现机制。1 Region迁移作为一个分布
2020-09-13 15:06:24 1782
原创 Hbase---Compaction
数据写入、读取流程使用了LSM树体系架构,HBase中的用户数据在LSM树体系架构中最终会形成一个一个小的HFile文件。我们知道,HFile小文件如果数量太多会导致读取低效。为了提高读取效率,LSM树体系架构设计了一个非常重要的模块——Compaction。Compaction核心功能是将小文件合并成大文件,提升读取效率。一般基于LSM树体系架构的系统都会设计Compaction,比如LevelDB、RocksDB以及Cassandra等,都可以看到Compaction的身影。我们首先介绍Compac
2020-09-13 14:24:51 512 1
原创 Hbase----读写流程分析
RegionServer中的核心组件主要是为HBase数据读写而设计。本文将会把这些核心组件串联起来进行介绍。首先介绍数据如何写入MemStore并flush形成HFile文件,然后介绍HBase是如何从HFile、MemStore中检索出待查的数据。读写流程是HBase内核最重要、最复杂的内容,这里只介绍核心主干流程。1、HBase写入流程HBase采用LSM树架构,天生适用于写多读少的应用场景。在真实生产线环境中,也正是因为HBase集群出色的写入能力,才能支持当下很多数据激增的业务。需要说明的
2020-09-12 23:36:58 387
原创 Hbase------regionServer
RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。先对RegionServer进行分解,并对其中的核心模块进行深入介绍。需要注意的是,这里的介绍仅限于分析其核心作用、内部结构等,而对其在整个HBase的读写流程中所起的作用并不展开讨论,后面再介绍HBase的写入读取流程。1 RegionServer内部结构Re.
2020-09-06 15:56:05 1110
原创 Hbase(二)Client客户端
对于使用HBase的业务方来说,从HBase客户端到HBase服务端,再到HDFS客户端,最后到HDFS服务端,这是一整条路径,其中任何一个环节出现问题,都会影响业务的可用性并造成延迟。因此,HBase的业务方需要对HBase客户端有较好地理解,以便优化服务体验。而事实上,由于HBase本身功能的复杂性以及Region定位功能设计在客户端上,导致HBase客户端并不足够轻量级。1、 HBase客户端实现HBase提供了面向Java、C/C++、Python等多种语言的客户端。由于HBase本身是Ja
2020-09-06 15:21:40 3284
原创 Hbase(一)框架介绍
2006年,Google发布了第三篇重要论文中的《BigTable:A Distributed Storage System for Structured Data》,用于解决Google内部海量结构化数据的存储以及高效读写问题。与前两篇论文相比,这篇论文更难理解一些。这是因为严格意义上来讲,BigTable属于分布式数据库领域,需要具备一定的数据库基础,而且论文中提到的数据模型(多维稀疏排序映射模型)对于习惯了关系型数据库的工程师来说确实不易理解。但从系统架构来看,BigTable还是有很多GFS的影子,
2020-09-06 15:07:04 480
原创 HDFS概述
HDFS作为一个分布式文件系统,具有高容错的特点,它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。HDFS没有遵循可移植操作系统接口(Portable Operating System Interface, POSIX)的要求,不支持"ls"或"cp"这样的标准UNIX命令,也不支持如fopen()和fread()这样的文件读写方法,而是提供了一套特有的、基于Hadoop抽象文件系统的API,支持以流的形式访问文件系统中的数据。HDFS主要特性HDFS的主
2020-09-06 14:52:26 471
原创 hadoop抽象文件系统filesystem框架介绍
为了提供对不同数据访问的一致接口,Hadoop借鉴了Linux虚拟文件系统的概念,引入了Hadoop抽象文件系统,并在Hadoop抽象文件系统的基础上,提供了大量的具体文件系统的实现,满足构建于Hadoop上应用的各种数据访问需求。通过Hadoop抽象文件系统,MapReduce目前可以运行在基于HDFS的集群上,也可以运行在基于Amazon S3的云计算环境里。Hadoop文件系统APIjava.io.FileSystem是java.io包的私有抽象类,不能被包以外的类引用。也就是说,不能像类
2020-09-05 15:30:52 3120
原创 mapreduce 编程模型
MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,它适用的应用场景往往具有一个共同的特点:任务可被分解成相互独立的子问题。基于该特点,MapReduce编程模型给出了其分布式编程方法,共分5个步骤:1)迭代(iteration)。遍历输入数据,并将之解析成key/value对。2)将输入key/value对映射(map)成另外一些key/value对。3)依据key对中间数据进行分组(grouping)。4)以组为单位对数据进行归约(reduce)。5)迭代。
2020-09-05 15:06:22 2057
原创 hadoop-mapreduce基本架构
MapReduce是一个分布式计算框架,主要由两部分组成:编程模型和运行时环境。其中,编程模型为用户提供了非常易用的编程接口,用户只需要像编写串行程序一样实现几个简单的函数即可实现一个分布式程序,而其他比较复杂的工作,如节点间的通信、节点失效、数据切分等,全部由MapReduce运行时环境完成.MapReduce设计目标,主要有以下几个:易于编程:传统的分布式程序设计(如MPI)非常复杂,用户需要关注的细节非常多,比如数据分片、数据传输、节点间通信等,因而设计分布式程序的门槛非常高。Hadoop
2020-09-05 14:36:36 3197
yarn-utils.py
2020-08-11
SPDK开发手册中文版.docx
2020-06-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人