TEA:内存存储中的一种高效冗余过渡策略——编码导向的复制与Erasure Coding

0 下载量 32 浏览量 更新于2024-08-27 收藏 1.46MB PDF 举报
本文主要探讨了在内存存储系统中实现性能与内存效率良好平衡的问题,针对不受欢迎(冷)的数据集,提出了将复制和错误纠正编码(Erasure Coding,简称EC)相结合的策略。由于缓存工作负载通常遵循长尾分布,大部分内存数据不常访问,因此如何过渡到使用EC进行冗余管理变得至关重要。 论文的主角是TEA(Traffic-efficient Erasure-coded Archival Scheme),这是一种针对ERP(Encoding-oriented Replication Placement)策略设计的高效内存存储架构。ERP政策是一种结合了交错去中心化机制的复制策略,旨在优化数据副本放置,减少跨机架(Rack)的流量。ERP通过将数据分布在不同的节点上,降低了数据获取时不必要的全局通信,从而提高了系统性能。 TEA的核心目标是提升内存存储系统的效率,特别是对于冷数据的处理。它具备以下三个关键特性: 1. **跨rack流量减缓**:TEA通过设计巧妙的编码和分布策略,能够在执行数据恢复时减少对不同机架的请求次数,减少了网络带宽的消耗,降低了整体的通信成本。 2. **编码导向的复制管理**:ERP作为基础,TEA优先考虑编码技术,这意味着在存储冷数据时,即使丢失部分数据块,也能利用EC的容错能力从其他副本重构缺失部分,从而避免了频繁的全量复制操作。 3. **内存效率提升**:通过在内存中高效地实现EC编码和解码,TEA能够在保持良好访问性能的同时,降低存储需求,因为EC能用更少的数据块来存储相同的信息,这对于内存资源有限的环境中尤其重要。 TEA是一种创新的内存存储解决方案,它有效地解决了在追求高性能和内存效率之间找到平衡的问题,特别适用于那些数据访问模式具有长尾效应的场景,如大规模在线服务中的数据存储。通过结合ERP的复制策略和TEA的编码技术,论文提出了一种实用且高效的架构,能够优化冷数据的管理,减少数据传输成本,并为实际应用中的内存存储提供了一种新的优化路径。

// TODO(eladalon): Consider using packet.recovered() to avoid processing // recovered packets here. std::unique_ptrForwardErrorCorrection::ReceivedPacket FlexfecReceiver::AddReceivedPacket(const RtpPacketReceived& packet) { RTC_DCHECK_RUN_ON(&sequence_checker_); // RTP packets with a full base header (12 bytes), but without payload, // could conceivably be useful in the decoding. Therefore we check // with a non-strict inequality here. RTC_DCHECK_GE(packet.size(), kRtpHeaderSize); // Demultiplex based on SSRC, and insert into erasure code decoder. std::unique_ptrForwardErrorCorrection::ReceivedPacket received_packet( new ForwardErrorCorrection::ReceivedPacket()); received_packet->seq_num = packet.SequenceNumber(); received_packet->ssrc = packet.Ssrc(); if (received_packet->ssrc == ssrc_) { // This is a FlexFEC packet. if (packet.payload_size() < kMinFlexfecHeaderSize) { RTC_LOG(LS_WARNING) << "Truncated FlexFEC packet, discarding."; return nullptr; } received_packet->is_fec = true; ++packet_counter_.num_fec_packets; // Insert packet payload into erasure code. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); received_packet->pkt->data = packet.Buffer().Slice(packet.headers_size(), packet.payload_size()); } else { // This is a media packet, or a FlexFEC packet belonging to some // other FlexFEC stream. if (received_packet->ssrc != protected_media_ssrc_) { return nullptr; } received_packet->is_fec = false; // Insert entire packet into erasure code. // Create a copy and fill with zeros all mutable extensions. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); RtpPacketReceived packet_copy(packet); packet_copy.ZeroMutableExtensions(); received_packet->pkt->data = packet_copy.Buffer(); } ++packet_counter_.num_packets; return received_packet; } 各行意义

2023-07-22 上传

// TODO(eladalon): Consider using packet.recovered() to avoid processing // recovered packets here. std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> FlexfecReceiver::AddReceivedPacket(const RtpPacketReceived& packet) { RTC_DCHECK_RUN_ON(&sequence_checker_); // RTP packets with a full base header (12 bytes), but without payload, // could conceivably be useful in the decoding. Therefore we check // with a non-strict inequality here. RTC_DCHECK_GE(packet.size(), kRtpHeaderSize); // Demultiplex based on SSRC, and insert into erasure code decoder. std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( new ForwardErrorCorrection::ReceivedPacket()); received_packet->seq_num = packet.SequenceNumber(); received_packet->ssrc = packet.Ssrc(); if (received_packet->ssrc == ssrc_) { // This is a FlexFEC packet. if (packet.payload_size() < kMinFlexfecHeaderSize) { RTC_LOG(LS_WARNING) << "Truncated FlexFEC packet, discarding."; return nullptr; } received_packet->is_fec = true; ++packet_counter_.num_fec_packets; // Insert packet payload into erasure code. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); received_packet->pkt->data = packet.Buffer().Slice(packet.headers_size(), packet.payload_size()); } else { // This is a media packet, or a FlexFEC packet belonging to some // other FlexFEC stream. if (received_packet->ssrc != protected_media_ssrc_) { return nullptr; } received_packet->is_fec = false; // Insert entire packet into erasure code. // Create a copy and fill with zeros all mutable extensions. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); RtpPacketReceived packet_copy(packet); packet_copy.ZeroMutableExtensions(); received_packet->pkt->data = packet_copy.Buffer(); } ++packet_counter_.num_packets; return received_packet; }

2023-07-22 上传