基于Aerospike的用户数据管理系统实践

2024-01-21 07:48

本文主要是介绍基于Aerospike的用户数据管理系统实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2015-05-12  FreeWheel

基于Aerospike的用户数据管理系统实践

作者:王敏

‍ 在互联网广告行业中,根据用户的信息和购买兴趣进行精准广告投放已成为一个基本需求。为了满足这一需求,需要搭建一个支持高并发、低延迟、可扩展的用户数据库,这是很多实时广告系统面临的一个技术挑战。

FreeWheel的用户数据库目前存储着6亿多条用户数据,每天更新的数据约1亿条,要求达到10ms量级的用户数据读取性能。我们在用户数据库的架构设计上做过很多尝试和改进,本文介绍了我们最近基于Aerospike的一些实践。


Aerospike’s Technology

如上图所示,Aerospike主要分为3层:

Client Layer,Distribution Layer 和 Data Storage Layer

  • Client Layer可以访问Aerospike Server中的数据(读、写操作等)。Aerospike Client包含了多种高效的开源语言(比如:C、Golang、Libevent、Python等等)。Aerospike Client 端能够监控cluster的所有nodes,并且能自动感知nodes的更新,同时掌握数据在cluster内的分布。Aerospike Client 具有以下特点:

    o 高效性:Client的基础架构确保request都能直接到相应的nodes读写数据,进而减少响应时间。

    o 稳定性:如果nodes出错,不需要重启Client 端,并且保持服务的正确性。

    o 链接池:为了减少频繁的Open/Close TCP 操作,Client会在内部维护一个链接池保持长链接。

  • Distribution Layer 负责管理cluster内数据平衡分布、备份、容错和不同cluster之间的数据同步。基于“shared nothing”的架构,如果要提升Aerospike cluster的性能,只需要简单的向cluster添加新的server,并且不需要停止当前的服务。Distribution Layer主要包含3个模块:

    o Cluster Management Module:基于“Paxos-like consensus voting process”算法来管理和维护cluster内的nodes,并且用“heartbeat”(含active 和 passive)来监听nodes的状态。

    o Data Migration Module:当有node添加或移除时,该模块保证数据的重新分布。

    o Transaction Processing Module:确保读写的一致性,写操作先写Replica,再写Master。

  • Data Storage Layer负责数据储存,Aerospike是schema-less的key-value 数据库,数据存储模式如下:

    o 命名空间:数据存在namespace中(类比RDBMS中的database);namespace可以分为不同的sets(tables)和records(rows);每条record包含一个唯一的key和一个或多个bins值(columns)。

    o 索引:Aeorpsike Indexes包含Primary Indexes和Second Indexes。为了更高的性能,Aerospike Indexes都只存在内存中并不会存在SSD中。

    o 磁盘:与其它基于文件系统数据库的不同之处,Aerospike为了达到更好的性能选择了raw device —— 直接访问SSD中的raw blocks,同时Aerospike特别优化小块读,大块写和并行SSD来增加响应速度和吞吐量。

  • Aerospike Cross Data-Center Replication (XDR):除了基本的Aerospike Server外,Aerospike还提供跨数据中心数据同步的功能。

    o 实时性:Aerospike XDR同步的基本单位是record。

    o 稳定性:类似于Aerospike Client, XDR也具有良好的稳定性和错误处理,无论是local cluster的node错误还是remote cluster的node错误,XDR都能保证服务的正确。

FreeWheel用户数据库一方面要维护大量的用户数据,并根据用户数据实时投放广告,另一方面每天还有大量用户数据更新并实时地同步到所有数据中心,所以我们对用户数据库的响应速度、稳定性和可扩展性都有极高的要求。经过对不同数据库的调研和性能评估,Aerospike不仅在性能上最优,而且能够方便地动态扩展,因此我们最终选择了Aerospike作为存储用户信息的数据库,并根据我们的业务需求对 Aerospike的功能进行了以下定制:

  • 在Aerospike Client端,为了更快的响应速度,我们选择了Aerospike Libevent,实现了异步和同步的读写操作。

  • 在Aerospike Server 端,设置Replication factor=2,在确保当有一个node错误时服务的稳定性,并且避免硬件的浪费。同时在保持单机性能的情况下通过增加nodes数量,扩展Aerospike性能。

  • 在Aerospike Storage端,因为Aerospike要求不同的namespace必须在不同的物理设备上,所以我们只创建了必要的namespaces,动态的添加sets来分区不同的数据。在满足MegaCLI测试结果的情况下,为了更好的分离硬件和数据,我们选择了RAID 5,保证磁盘的损坏不影响数据。

由于我们需要实时同步大量用户数据到所有的数据中心,基于Aerospike XDR的功能,我们建立了如下数据流的拓扑图,减少不同数据中心的依赖:


Aerospike Data Flow in Freewheel

切换到Aerospike后,我们的广告投放系统不仅在响应速度上有很大的提升,而且跨数据中心同步平均延迟控制在毫秒级,基本到达实时更新的需求。下图是切换到Aerospike前后响应时间大于100ms的广告决策数量变化。



Switching to Aerospike

作者简介:

王敏,2012年毕业于北京大学计算机系,获工学硕士学位,2013年加入Freehweel,现任广告预测组资深工程师,主要负责用户数据管理系统的架构设计和开发工作。联系方式:mwang@freewheel.tv。


王敏说:

aerospike的一个问题,tcp connection会比较多,以及如果xdr的话都是by record,可能会很多小包(根据你的存的内容)

然后xdr的性能也是有点瓶颈,普通的read/write performance倒是没有问题

普通的read/write performance的瓶颈更容易在带宽上

另外开始建立好namespace,加新namespace好费劲

对于内存、磁盘的使用量建议不要超过60%


这篇关于基于Aerospike的用户数据管理系统实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628840

相关文章

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE