DaaS 服务之分布式日志 / 缓存 / 对象存储
今天来介绍下 DaaS 服务中的分布式日志服务、缓存服务、对象存储服务。
分布式日志服务
软件系统中存在着各式各样的日志,包括应用日志、业务日志、系统日志、访问日志、行为日志等。日志是系统在运行过程中变化的一种抽象,其内容为指定对象的某些操作和其操作结果按时间的有序集合。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况下需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统可以提高定位问题的效率。
分布式日志服务是针对日志类数据的一站式服务,用户无须开发就能快捷完成数据采集、消费、投递以及查询分析等功能,帮助提升运维和运营效率,建立数据技术时代海量日志处理能力。分布式日志服务提供了日志中枢的功能,可大规模接入各种实时日志数据(包括 metric、event、BinLog、TextLog、click 等);支持与各种实时计算引擎及服务对接,并提供完整的日志监控、告警等功能,可以根据 SDK/API 实现自定义消费;可以将日志中枢中的数据投递至存储类服务,过程支持压缩、自定义分区,以及行列等各种存储格式;支持实时索引日志中枢中的数据,提供关键词、模糊、上下文、范围、SQL 聚合等丰富的查询手段,支持仪表盘和告警功能;支持多租户隔离、访问控制、日志审计。
在文件日志中,每个日志文件由一条或多条日志组成,每条日志描述了一次单独的系统事件,是日志服务中处理的最小数据单元。日志服务采用半结构化数据模式定义一条日志。该模式中包含主题(topic)、时间(time)、内容(content)和来源(source)4 个数据域。
分布式日志服务能将分布式环境的日志统一收集聚合,存储在分布式数据库中,同时经过一定的处理可以使非结构化的文本内容结构化,以便做结构化的查询和分析。
分布式日志服务包括以下主要能力:
聚合:从多个数据源收集和发送日志的能力。
处理:将日志消息转换为有意义的数据,以便进行分析的能力。
存储:能够长时间存储数据,以便用于监控、趋势分析和安全性方面的使用场景。
分析:通过查询数据并在其上创建可视化和仪表盘来分析数据的能力。
目前分布式日志服务主流的开源实现方案是 ELK。ELK 是 Elastic 公司提供的一套完整的日志收集和展示的解决方案,是 Elasticsearch、Logstash 和 Kibana 3 个产品的首字母缩写。3 个产品之间互相配合使用,完美衔接,高效地满足了很多场合的应用,是目前主流的一种日志系统。最新版本已经改名为 Elastic Stack,在社区中有大量的内容和使用案例。
Elasticsearch 是一个实时的分布式搜索和分析引擎,可以用于全文搜索、结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。
Logstash 是一个具有实时传输能力的数据收集引擎,用来进行数据收集(如读取文本文件、数据存储/MQ)、解析,经过过滤后支持输出到不同目的地(Elasticsearch、文件、MQ、Redis、Kafka 等)。
Kibana 为 Elasticsearch 提供了分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度表格和图形。
此架构由 Logstash 分布于各个节点上来收集相关日志、数据,并对其进行分析、过滤后发送给远端服务器上的 Elasticsearch 进行存储。Elasticsearch 将数据以分片的形式压缩存储,并提供多种 API 供用户查询和操作。用户亦可以更直观地通过配置 Kibana Web 方便地对日志查询,并根据数据生成报表。
分布式缓存
缓存是云原生架构应用系统中必不可少的模块,并且已经成为了高并发、高性能架构的一个关键组件和解决方案。数据缓存方案就是把常用的数据(不会经常更改的数据)、最近使用数据放到内存中,这样可以大幅度降低系统对硬件磁盘设备的操作开销,提高整个数据系统的性能。缓存能够有效降低对数据库的访问压力。
1、缓存解决的问题
提升性能:绝大多数情况下,数据库 select 操作是出现性能问题最集中的地方。一方面,select 会有很多像 join、group、order、like 等丰富的语义,而这些语义是非常消耗性能的;另一方面,大多数应用是读多写少,所以加剧了慢查询的问题。分布式系统中远程调用也会消耗很多性能,因为有网络开销会导致整体的响应时间变长。
缓解数据库压力:当用户请求增多时,数据库的压力将大大增加,通过缓存能够大大降低数据库的压力,提升数据访问性能。
2、缓存的适用场景
并不是任何场景都需要使用缓存,一般来说,数据的缓存命中率超过 60%时才有缓存数据的价值和必要。比如一些请求量较小的系统或者数据、频繁更新、读写比不高的数据,这些都没有必要使用缓存。否则,除了增加系统的复杂性,所带来的系统性能提升也非常有限。
缓存是通过牺牲强一致性来提升性能的,所以使用缓存提升性能,会有数据更新的延迟。这需要我们在设计时结合业务仔细思考是否适合用缓存,并且缓存一定要设置过期时间。这个时间太短或太长都不好,时间太短,请求可能会比较多地落到数据库上,这也意味着失去了缓存的优势;时间太长,缓存中的脏数据会使系统长时间处于延迟的状态,而且系统中长时间没有人访问的数据一直保存在内存中不过期,浪费内存。
常见的适合缓存的场景如下:
对于数据实时性要求不高的场景:读多写少,对于一些经常访问但是很少改变的数据,使用缓存就很有必要,比如一些应用配置项。
对于性能要求高,并发量大的场景:比如一些秒杀、大促活动场景。
3、缓存常见在的问题
缓存穿透:缓存穿透是指收到一个请求,但是该请求在缓存中不存在(未命中),只能去数据库中查询,然后放进缓存。但当有许多请求同时访问同一个数据时,业务系统把这些请求全发送到数据库中;或者恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次都会被发送到数据库中,最终导致数据库崩溃。对于恶意访问,一种思路是先做校验,直接过滤恶意数据,不要发送至数据库;另一种思路是缓存空结果,就是对查询不存在的数据也记录在缓存中,这样可以有效地减少查询数据库的次数。
缓存雪崩:是指当我们给所有的缓存设置了同样的过期时间,某一时刻,整个缓存的数据全部过期了,那么瞬间所有的请求都被抛向了数据库,数据库就崩溃了。
缓存刷新:即刷新缓存的策略,一般在 insert、update、delete 操作后就需要刷新缓存。如果不执行,就会出现脏数据。
4、常见的缓存方案
目前主流的开源缓存产品有 EhCache、Memcache 和 Redis。EhCache 直接在 JVM 虚拟机中缓存,速度快、效率高,但是缓存共享麻烦,集群分布式应用不方便,仅用于单个应用或者对缓存访问要求很高的应用。对于存在缓存共享、分布式部署、缓存内容很大的大型系统,一般选择 Memcache 或者 Redis 作为分布式共享缓存。Redis 支持数据持久化存储,采用内存+硬盘的存储方式,在提供高速数据读写能力的同时满足数据持久化需求,支持从持久化数据库中读取数据加载到缓存数据库。
根据不同的应用场景,云厂商提供的分布式缓存产品一般包括单机版、主从版、集群版、读写分离版几种不同的产品形态,满足业务的不同需求。单机版一般只用在开发和测试环境,对性能和数据可靠性要求不高,以节省资源成本。正式的生产环境必须选择主从版或者集群版,以确保缓存的高性能、数据的安全可靠。
主从版:主从版由一主一备的两个 Redis 服务器组成,用户应用通过 SLB 链路直接访问主库。主从版系统工作时主节点(master)和副本(replica)数据实时同步。当主节点发生故障时,系统自动秒级切换,由备节点接管业务,全程自动且对业务无影响,主从架构保障系统服务具有高可用性。
集群版:由 3 个组件构成:redis-config(CS)、redis- proxy(proxy)和 redis。一个集群架构由多个 CS 节点、多个 proxy 节点、多个一主一备的 redis 节点构成。用户应用通过 SLB 链路访问到集群的 proxy 上,proxy 将请求路由转发到对应的 redis 主库分片上执行。
读写分离版:读写分离版本在集群架构基础上实现,提供更高的并发性能,一个 redis 主库除了对应一个备库,还对应多个只读的 redis 节点。proxy 路由请求时,按照配置的只读节点权重路由只读请求到只读节点上。
分布式对象存储
非结构化数据的数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现,包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等。分布式对象存储一般用来存储图片、音视频、文件等非结构化数据,其基于云平台厂商提供的海量、安全、低成本、高可靠的云存储服务。
目前分布式对象存储产品有 Amazon S3、阿里云的 OSS、腾讯云的 TStack,以及开源的 FastDFS 等。下面就以 OSS 为例子来简单介绍下分布式对象存储。
OSS 一般提供与平台无关的 RESTful API,以确保用户可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。可以使用云厂商提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出 OSS。数据存储到 OSS 以后,可以选择标准(standard)存储作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问(infrequentaccess)存储和归档(archive)存储作为不经常访问数据的存储方式。
OSS 提供的是一个键值(key-value)对形式的对象存储服务。用户可以根据对象的名称唯一地获取该对象的内容。对象(object)是 OSS 存储数据的基本单元,也被称为 OSS 的文件。对象由元信息(object meta)、用户数据(data)和文件名(key)组成。对象由存储空间内部唯一的 key 来标识。对象的元信息是一个键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
在数据安全方面,分布式对象存储提供全方位的安全机制,以确保数据的安全。
传输安全:对象数据在客户端和服务器端之间传输时有可能会出错。OSS 支持对各种方式上传的对象返回其循环冗余校验(Cyclic Redundancy Check,CRC)结果——CRC64 值,客户端可以和本地计算的 CRC64 值作比对,从而完成数据完整性的验证。
数据加密:支持客户端或服务器端按照特定的加密算法对数据进行加密存储。
访问鉴权:支持访问控制(Resource Access Management,RAM)和安全凭证服务(Security Token Service,STS)两种不同的鉴权场景。STS 是云厂商提供的临时访问凭证服务,提供短期访问权限管理,一般用于移动端。
防盗链:为了防止用户在 OSS 上的数据被其他人盗链而产生额外费用以及数据泄露,用户可以对 bucket 设置防盗链功能。
日志审计:OSS 提供自动保存访问日志记录(logging)功能,用户开启 bucket 的日志保存功能后,OSS 自动保存访问这个 bucket 的请求日志作为审计或特定行为分析使用。日志中包含请求时间、来源 IP、请求对象、返回码、处理时长等内容。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/26399e48435061ae16f0e6d4b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论