天涯社区最近开发了一款数据引擎——Memlink
,并将其开源。对于为什么会出现这样一款开源项目、它的能力和市面上的其他款同类型项目相比有怎样的优势,InfoQ中文站特地采访了天涯社区在北京研发中心的技术负责人冯勇先生。
1. 您好,能请您先自我介绍一下吗?您最近在做哪些有趣的事情呢?
大家好!我是天涯技术中心系统平台部负责人冯勇,系统平台部是今年刚组建的部门,旨在优化天涯线上产品的系统架构。天涯是一个有十二年历史的网站,对于一个累积了十二年补丁的系统进行重构、优化,本身就是一件很有趣、很有挑战的事情。
2. 是出于什么初衷,天涯会开发出这样一款数据引擎出来呢?并且最后要开源出来。
近些年,Nosql系统非常流行,也确实对sql系统进行了合理补充,为Web应用提供多种数据解决方案。但是在开源Nosql系统中,key-
value系统可选择较多,而key-list/queue系统可选择较少,因此我们开发了memlink来满足我们自己的需要。
在这里,需要强调一些key-list的概念,在实际场景中有大量需要key-list的地方。比如:论坛中的主题列表、回复列表,微博中的用户关
注列表、用户feed列表、用户关注feed列表等等。如果使用key-value中的value来存储list(比如:list打包成json放入
value中),其操作性能是非常低效的。
理想的Key-list通常需要如下特点:
- list是海量的、且操作性能高效
- list是有序的、且可动态调整顺序
至于为什么开源?一方面,我们很多工作都得益于已有的开源系统,所以回馈开源社区是我们应做的义务;另一方面,技术分享也有利于公司本身技术的成长,并吸引更多的技术人才。
3. 能介绍一下Memlink的特性吗?
Memlink是一个高性能、持久化、分布式的Key=>List/Queue数据引擎。正如名称中的Mem所示,所有数据都建构在内存中,
保证了系统的高性能,同时使用块链进行内存压缩,使用redo-log技术保证数据的持久化。此外,Memlink还支持主从复制、读写分离、数据项过滤
操作等功能。
特点:
- 内存数据引擎,性能极为高效
- List中的Node采用块链组织,精简内存,优化查找效率
- Node数据项可自定义Mask表,支持多种过滤操作
- 支持redo-log,数据持久化,非Cache模式
- 分布式,主从同步
- 读写分离,写优先处理。
4. 我们知道市面上还有一些其他基于内存的数据引擎,比如Redis和Scalaris,跟它们相比Memlink解决了什么特别的问题吗?
在设计和开发memlink之前,我们也认真分析对比了Redis。最终没有采用Redis原因有以下四点:
- Redis持久化策略(redo-log)不能完全满足线上生产的需求。对于一个成熟的互联网应用应该有足够的容错能力。比如系统统重
启、宕机等而不丢失数据。Redis持久化策略一:定时同步磁盘(此期间重启会丢失部分数据);持久化策略二:不断追加log,这样容易使log膨胀,性
能降低。Memlink持久化策略是同时借鉴Redis两种策略,在非创建快照期间追加redo-log,在完成快照后清除redo-log。
- Redis主从同步策略不够完善。比如:slaver因为某原因丢失了部分同步数据,则需要重新完全获取一份主节点的所有数据。在大数据量的情况下,不太合适线上生产的需求。
- Redis单线程模式,读写没有分离,只能使用单核。Memlink为多线程,充分利用多核,并进行了读写分离,优先保证写。
- 在内存消耗和性能上Memlink要优于Redis。
Memlink是key=>list/queue引擎,Scalaris是key-value,两者功能出发点上不一样。
5. Memlink在天涯内部的哪些系统中得到了采用?可以提供一下Memlink带来的性能变化的数据吗?
Memlink主要应用于天涯论坛类型产品(论坛、来吧)中。比如论坛的主题列表,当数据达到百万、千万量级,采用Mysql系统进行分页浏览时,基本上不能响应,而Memlink则性能提升了上百倍。具体可见Benchmark
。
6. 能向广大的开发者朋友们介绍一下,如何来选择一款适用自己的NoSQL产品呢?
首先需要确定业务需求,是否需要NoSQL产品。对于大多数百万量级、千万量级的应用,MySQL也能支持。
其次在明确需要NoSQL产品后,应根据业务需求抽象出数据模型,比如:有些数据是需要采用key-value系统存储,有些数据是需要采用key-list系统存储,有些数据是采用文档数据库存储等等。
对于NoSQL产品候选列表的选项,可以从如下维度进行考虑:
- 系统的容量、性能、软硬件环境是否符合需求?
- 数据的安全机制如何?各种异常是否会丢失数据?
- 具备主从复制功能?何种一致性策略?
- 可扩展性?自动扩展 or 程序进行扩展?
- 系统的可控性?系统的成熟度、对开发者的支持度、bug谁来修复等等
7. Memlink现在的版本号是多少?未来的发展计划是怎样的?
Memlink现在的版本号为0.2,具备基本key-list/主从复制等功能,目前正在测试中。
在0.3/0.4版本中,Memlink会增加双向队列、用户认证等功能。具体可以见Memlink的RoadMap
。
长远而言,Memlink专注为一个高性能、持久化、分布式的Key=>List/Queue数据引擎,不会增加其他数据存储模型。
更多关于Memlink的信息,请参考Memlink的介绍文档
和设计文档
。
原文:http://www.infoq.com/cn/news/2010/11/tianya-memlink
分享到:
相关推荐
Memlink是一款由天涯社区研发并开源的数据引擎,旨在解决Web应用中对key-list/queue系统的需求。与传统的key-value系统相比,Memlink专注于提供更高效的操作性能,尤其是在处理大规模数据集时表现出色。它通过将所有...
基于 Linux 内核的 Key-Value 存储系统——KStore 本文主要介绍了一种基于 Linux 内核的 Key-Value 存储系统——KStore,该系统解决了现有 Key-Value 存储系统在用户态空间设计和实现时存在的频繁模式切换和上下文...
Memlink是天涯社区开发的一个高性能、持久化、分布式的Key-list/queue数据引擎。正如名称中的memlink所示,所有数据都 建构在内存中,保证了系统的高性能 (大约是redis几倍),同时使用了redo-log技术保证数据的持久...
"前端开源库-key-list"是一个专注于提取带插值字符串中键列表的库,它对于处理本地化、模板渲染等场景尤其有用。本文将深入探讨这个库的核心功能、应用场景以及使用方法。 首先,我们要理解什么是带插值的字符串。...
综上所述,本文所研究与实现的多存储引擎Key-Value分布式内存数据库结合了当前多种分布式系统设计中的先进技术和策略,力图在保证数据持久化、可靠性、一致性的前提下,通过合理的数据分布策略和读写优化手段,大幅...
- **Redis**:一个流行的开源内存数据结构存储,支持多种数据结构,包括Key-Value、List、Set、Sorted Set等,广泛用于缓存和实时数据处理。 - **Memcached**:另一个轻量级的内存键值存储,主要用于Web应用程序的...
文章目录目录结构api 和 views封装 axiosaxios 基本案例axios.create 示例... key() { return this.$route.path } } 参考链接 【小慕读书】管理后台 手摸手,带你用vue撸后台 系列一(基础篇) 作者:何去何从2857
云计算系统中Key-Value数据管理研究这篇文献主要围绕云计算环境下的关键值(Key-Value)数据存储系统展开,探讨了其数据模型、读写方式、索引机制和查询操作。内容涵盖了大数据管理技术的核心组成部分,并对NoSQL...
—————————————————————————————————— 生成私钥 - ssh-keygen -t rsa -b 2048 -f private.key —————————————————————————————————— 生成公钥 ...
今天我们要探讨的是其中一个极具价值的插件——Key-Promoter X 5.12,它被誉为提升IDEA开发效率的秘密武器。 Key-Promoter X是一款专为IntelliJ IDEA设计的快捷键提示工具,它的核心功能在于引导用户更多地使用键盘...
标题提到的"Key-Value双向快速高效查找类C,C++高手实现"是一个针对中等规模数据进行快速查找的设计实例,它利用了空间优化来换取时间效率。这个设计适用于需要频繁进行键值对查找的场景,比如数据库索引、缓存系统...
Go-Snapshot是一款基于Golang语言开发的Key-Value(KV)存储系统,它的设计目标是提供强大的数据持久化能力和高效的读写性能。本文将深入探讨Go-Snapshot的实现原理、主要特性以及在实际应用中的优势。 一、Go-...
现有地址输入提示方法涉及标准地址和POI的研究较少,地址字符串的索引大多采用...实验结果表明,基于key-value数据库构建的Trie树索引较基于内存构建的Trie树索引在事务响应性能和内存消耗方面具有明显的优势和效率。
+—-+————-+——-+——-+——————-+———+———+——-+——+——-+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +—-+————-+——-+——-+——...
数据类型:List(列表)-函数;List(列表)——函数;List(列表)——函数;max()方法:返回列表元素中的最大值。 max()方法:语法:max(list);min() 方法返回列表元素中的最小值。 min()方法语法:min(list);reverse...
深度学习技术的快速发展,使得计算机能够在复杂的数据环境中识别模式和处理非结构化数据,如文本、图像和声音。这对学术搜索引擎来说是一个重大突破,因为它能够更准确地理解用户的需求并提供更丰富的搜索结果。 ...
在本节内容中,我们将深入探讨Kotlin编程语言的数据类型,这是Kotlin基础知识的重要组成部分。Kotlin被广泛用于Android应用开发,因此理解其数据类型对于Android开发者尤其关键。 首先,Kotlin提供了两种主要的数据...
**基于内存的K-V数据平台——Memcached** Memcached是一款高性能、分布式内存对象缓存系统,主要用于加速动态Web应用,通过将数据存储在内存中,减少数据库的访问次数,从而提高应用性能。它是一个轻量级的服务,...
在这个场景下,"nginx-accesskey-2.0.3"是一个专门针对Nginx设计的第三方模块——ngx_http_accesskey_module,它的主要功能是为实现下载文件的防盗链机制。本文将深入探讨这个模块的工作原理、配置方法以及它在Nginx...
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-...Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。