了解分布式缓存系统 Alluxio

从技术上来讲,Alluxio 是一个数据编排技术(数据编排,大概类似于一个平台,这个平台是用来管理数据的,主要是管理,对象是数据),它相当于一个数据层,在应用层和存储层之间加了一层,为上下两层搭建了桥梁,将数据移到离应用更近的地方,从而更容易访问数据。

数据驱动型应用是什么样的应用?

数据驱动:以数据为基础,将数据组织成信息,然后利用机器学习、算法等手段处理信息,最终形成自动化的决策模型。数据驱动型应用是以数据为基础,对新数据进行处理,得到处理结果。数据驱动型应用会使用大量的数据,对数据的访问会更为频繁。

简单的说,Alluxio 是一个分布式缓存系统,使用分布式的结构来提供缓存的服务。Alluxio 统一了不同存储系统中的数据,让上层的应用能够使用统一的接口和命名空间来访问数据。

所以分布式是什么,缓存又是什么。

分布式是什么??

提起来分布式,顺便把集群也说一句。

  • 单机或者本地运行:只需要一台主机。

  • 集群:需要多台主机,至少是2台。集群是一群主机,简单的理解为很多台电脑。使用集群的方式来运行代码,就是把代码运行在多个主机中。

从主机的规模来看,一台主机是单机结构,多台主机是集群结构。

分布式,是从业务上将一个系统进行划分,把系统分成多个独立的子系统,就像拼图一样,每个子系统是其中的一块,每个子系统可以部署在不同的机器上。分布式是从业务功能的方面划分的,不是按照现实中有多少台真实的主机(也可以是虚拟机中的主机)来区分是不是分布式系统,所以分布式可以在单机上运行,也可以在集群上运行。

缓存是什么??

缓存存储的是临时性的数据,与底层持久层存储系统相反。Alluxio 存储的是热数据,数据使用的更多,那它所有的较多的副本,再次访问数据会比没有缓存的速度快。

分布式缓存是不同的服务器将其缓存拿出来一部分,组成一个缓存系统。

Alluxio 基础概念

Alluxio 怎么统一了不同存储系统中的数据?

Alluxio 系统集成了不同的底层存储系统,包括文件系统HDFS、Amazon 的S3、谷歌云存储GCS、EMC ECS等。它对接了很多种不同的持久化存储系统,可以同时使用不同类型的存储系统,也可以使用多个相同的存储系统作为它的底层存储系统。

不同的持久化存储系统有各自的命名空间,它们有各自访问自己系统中的文件的命名方式,比如 HDFS 系统的命名方式 hdfs://namenode:port/ ,S3存储桶的命名方式 s3a://bucketName/。Alluxio 将底层存储系统挂载到 Alluxio 的空间目录下,即使有多个底层存储系统,它们挂载的目录是相同的,都在 Alluxio 的命名空间中,都可以使用 Alluxio 的命名方式(alluxio://host:port/)访问 。这样,只要访问 Alluxio 的命名空间,就可以访问到不同底层存储系统中的文件。即使它们是相互独立的存储系统,对于上层应用来说,应用访问不同存储系统中数据的方式是一样的。

举个例子:

如果有2个底层存储系统 S3 和 HDFS,s3 中存储了一个文件 s3-test.txt ,HDFS 中存储了一个文件 hdfs-test.txt ,将这2个存储系统都挂载到 Alluxio 命名空间的根目录下。那么,在Alluxio 的根目录下就有2个文件,s3-test.txthdfs-test.txt

直接访问 s3 中的文件,访问路径是 s3://bucketName/s3-test.txt。直接访问 HDFS 中的文件,访问路径是 http://hostName:port/hdfs-test.txt。需要知道数据存储在哪个存储系统中,然后按照那个存储系统的访问方式才能访问数据。

通过 Alluxio 访问两个文件的路径是 alluxio://hostName:port/s3-test.txtalluxio://hostName:port/hdfs-test.txt 。在不同的存储系统中,访问数据的方式是一样的。只要知道数据在 Alluxio 中的路径,就可以访问到数据,而上层应用只需要知道存储系统中有没有自己要的数据,而不需要考虑底层是怎么存储数据的。

Alluxio 基础组成

一个 Alluxio 系统,在逻辑上,包括 master 节点、worker 节点、客户端和底层存储系统。

  • master 节点,负责管理 Alluxio 中的全局元数据,客户端访问数据的请求都会由 master 节点处理,然后 master 节点交给相应的 worker 节点传输数据。

  • worker 节点,负责数据的传输。

worker 节点在哪里?worker 节点是在应用所在的主机上。

woker 节点是怎么存储数据的?worker 节点可以由多种存储介质组成(内存 MEM,固态存储SSD,硬盘存储HDD),用户可以指定使用其中的一种或多种。

worker 节点什么时候存储数据?如果 worker 节点所在的客户端请求访问的文件没有在 worker 节点中,worker 节点就会在本节点中生成一个文件副本,这样客户端下次再访问该文件的时候,就可以直接从 worker 节点中读取文件。这里有两种情况:

  • 如果客户端访问的文件不在 Alluxio 空间中,那么 Alluxio 会先从底层存储系统中读取文件,并在客户端所在的 worker 节点中生成文件副本。
  • 如果客户端访问的文件不在本地的 worker 节点中,而是在其他的 worker 节点中,那么 Alluxio 会先从其他的 worker 节点中读取文件,并在客户端所在的 worker 节点中生成文件副本。

在读源码的时候,遇到了很多客户端和服务端,开始时一头雾水。这里记一下用到的客户端和服务端。

  • master 节点管理所有的元数据,worker 节点在客户端所在的主机中,所以 master 节点和 worker 节点之间的通信是由 rpc 完成的。对于 master 节点和 worker 节点之间的通信来说, worker 节点是使用服务的一端,也就是客户端,而 master 节点是提供服务的一端,也就是服务端。

  • master 节点和 worker 节点作为一个整体,提供了数据访问的服务,上层应用通过命令行或者 API 接口可以访问数据。应用获取数据也是通过 rpc ,所以,应用是客户端,Alluxio 是服务端。因为 master 节点管理所有的元数据,接收所有的请求,所以 master 节点是处理应用请求的服务端。

  • 在实际的代码实现中,Alluxio 通过 job 模块来管理它的任务调度,所以 master 节点在调用 worker 节点进行实际的操作时,会调用 job 的客户端,由其分配任务,调用 worker 节点执行实际的操作,而不是 master 节点直接直接与 worker 节点通信。同样的,在命令行执行命令,也是通过调用 job 的客户端来请求服务。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我们可以使用Golang来构建一个分布式缓存系统。一般来说,分布式缓存系统的实现包括:缓存服务器、缓存客户端、分布式缓存服务器、分布式缓存客户端、分布式缓存存储引擎和缓存管理服务器。使用Golang可以构建一个可靠、可扩展、高性能的分布式缓存系统。 ### 回答2: 分布式缓存系统是一个将数据存储在多台机器上的缓存系统,可以提高数据访问的性能和并发能力。在golang中,我们可以使用一些库和技术来实现一个分布式缓存系统。 首先,我们需要选择一个合适的分布式存储技术来存储缓存数据,比如使用Redis或Memcached。这些技术可以让我们将缓存数据分布在多个节点上,并提供高性能的读写操作。 其次,我们需要设计一个对外提供接口的服务来操作缓存。可以使用golang的HTTP服务器来实现这个服务。通过定义一些RESTful API,如GET、PUT、DELETE等,客户端可以向服务器发送请求来获取、设置或删除缓存数据。 在服务器端的代码中,我们需要处理接收到的请求,并将其映射到相应的缓存操作。当有GET请求时,我们需要先检查缓存中是否存在所需的数据,如果存在则直接返回,否则再从存储系统获取数据并放入缓存中。当有PUT请求时,需要将数据存储到缓存和存储系统中。当有DELETE请求时,需要从缓存和存储系统中删除相应的数据。 为了实现缓存分布式特性,我们可以使用一致性哈希算法或一致性哈希环来将缓存数据分布到不同的节点上。这样可以确保当节点发生故障或增加时,仅会影响到部分数据,而不会影响全部缓存数据。 最后,我们需要定期清理缓存中的过期数据,以防止缓存数据占用过多的存储空间。可以使用定时任务或定时器来实现这个功能。 以上是一个简单的分布式缓存系统的设计和实现过程。当然,实际的分布式缓存系统可能还涉及到一些其他的问题,如并发控制、持久化存储等,但是以上提到的内容可以帮助我们开始构建一个基本的分布式缓存系统。 ### 回答3: 分布式缓存系统是用来提高系统的读取性能和减轻数据库压力的重要组件,能够将数据存储在多个节点上,提供快速的访问速度和高可用性。 在使用golang编写一个分布式缓存系统时,可以先考虑以下几个关键点: 1. 数据分片:将数据按照一定的规则分散存储到不同的节点上,可以使用一致性哈希算法或分片算法来实现。 2. 节点管理:需要设计节点的动态增删、负载均衡以及容错机制。可以使用集群管理工具如etcd或者zookeeper来实现。 3. 数据存储:使用内存数据库如Redis或Memcached来存储缓存数据,并保证数据的一致性和高可用性。可以选择golang中的redis或memcache客户端库进行数据读写。 4. 缓存更新和失效:提供缓存的自动更新机制,当数据发生变化时,需要及时更新缓存数据,同时设置合理的缓存失效策略,避免使用过期的数据。 5. 高可用性:保证缓存系统的高可用性,当节点出现故障时,能够自动切换到其他可用的节点上,并进行数据恢复。 6. 监控和日志:实现对缓存系统的监控和日志记录,可以使用Prometheus和Grafana等工具进行监控和性能分析。 在实现分布式缓存系统时,需要综合考虑不同的因素,并做好合理的设计和优化。同时,需要进行大规模测试和性能调优,确保系统的稳定和高效运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值