“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

天涯新款 key-list 类型内存数据引擎——Memlink

  • 2010-11-19
  • 本文字数:2032 字

    阅读完需:约 7 分钟

天涯社区最近开发了一款数据引擎—— 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 通常需要如下特点:

  1. list 是海量的、且操作性能高效
  2. 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 原因有以下四点:

  1. Redis 持久化策略 (redo-log) 不能完全满足线上生产的需求。对于一个成熟的互联网应用应该有足够的容错能力。比如系统统重启、宕机等而不丢失数据。Redis 持久化策略一:定时同步磁盘(此期间重启会丢失部分数据);持久化策略二:不断追加 log,这样容易使 log 膨胀,性能降低。Memlink 持久化策略是同时借鉴 Redis 两种策略,在非创建快照期间追加 redo-log,在完成快照后清除 redo-log。
  2. Redis 主从同步策略不够完善。比如:slaver 因为某原因丢失了部分同步数据,则需要重新完全获取一份主节点的所有数据。在大数据量的情况下,不太合适线上生产的需求。
  3. Redis 单线程模式,读写没有分离,只能使用单核。Memlink 为多线程,充分利用多核,并进行了读写分离,优先保证写。
  4. 在内存消耗和性能上 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 产品候选列表的选项,可以从如下维度进行考虑:

  1. 系统的容量、性能、软硬件环境是否符合需求?
  2. 数据的安全机制如何?各种异常是否会丢失数据?
  3. 具备主从复制功能?何种一致性策略?
  4. 可扩展性?自动扩展 or 程序进行扩展?
  5. 系统的可控性?系统的成熟度、对开发者的支持度、bug 谁来修复等等

7. Memlink 现在的版本号是多少?未来的发展计划是怎样的?

Memlink 现在的版本号为 0.2,具备基本 key-list/ 主从复制等功能,目前正在测试中。

在 0.3/0.4 版本中,Memlink 会增加双向队列、用户认证等功能。具体可以见 Memlink 的 RoadMap

长远而言,Memlink 专注为一个高性能、持久化、分布式的 Key=>List/Queue 数据引擎,不会增加其他数据存储模型。

更多关于 Memlink 的信息,请参考 Memlink 的介绍文档设计文档

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2010-11-19 08:2013728
用户头像

发布了 127 篇内容, 共 41.8 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

说说Nodejs高并发的原理

coder2028

node.js

js作用域、作用域链和它的一些优化

hellocoder2029

JavaScript

详解CAN总线:CAN总线报文格式—过载帧

不脱发的程序猿

汽车电子 CAN总线报文格式 详解CAN总线 CAN过载帧

Spring Boot「02」日志配置

Samson

Java spring 学习笔记 spring-boot 10月月更

网络安全【漏洞安全】反序列化漏洞深入分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

requests的介绍

攻城狮Wayne

Python requests 10月月更

一文读懂Js中的this指向

hellocoder2029

JavaScript

【愚公系列】2022年10月 Go教学课程 024-函数

愚公搬代码

10月月更

详解CAN总线:CAN总线报文格式—帧间隔

不脱发的程序猿

汽车电子 CAN总线报文格式 详解CAN总线 CAN帧间隔

数字化转型最核心的是数据吗?不,是数据思维

雨果

数字化转型 数据思维

星汉未来 | 云原生薪火计划——开源大使招募

星汉未来

开源 开发者 云原生 星汉未来 FinOps

数据治理,七种常犯的错误

雨果

数据治理

一文搞懂CAN总线协议帧格式

不脱发的程序猿

汽车电子 CAN总线 CAN总线协议帧格式

爬虫练习题(五)

张立梵

Python. 10月月更 爬虫案例

后端Java随机比大小游戏实战讲解

魏铁锤

10月月更

详解CAN总线:CAN总线报文格式—遥控帧

不脱发的程序猿

汽车电子 CAN总线报文格式 详解CAN总线 CAN遥控帧

李宏毅《机器学习》P1-P2 学习笔记

Clarke

数据结构学习,栈篇(链式栈)

IC00

读书笔记 数据结构 算法 10月月更

被翻译成 12 种语言的深度学习名著重磅升级,75%新内容,让你豁然开朗!

图灵社区

Python 深度学习

详解CAN总线:CAN总线报文格式—错误帧

不脱发的程序猿

汽车电子 CAN总线报文格式 详解CAN总线 CAN错误帧

Vue组件入门(一)组件定义及使用

Augus

Vue3 10月月更

Red Hat Releases OptaPlanner 8

成长兔🐇

我为什么要使用 Tauri 构建 macOS 磁盘清理工具 PrettyClean

NinetyH

tauri ​Rust

令人头疼的Javascript隐式&强制转换

hellocoder2029

JavaScript

深度理解NodeJS事件循环

coder2028

node.js

从手动测试到自动化测试(上)

FunTester

2022-10-10:以下go语言代码输出什么?A:[1 2 3 0 1 2];B:死循环;C:[1 2 3 1 2 3];D:[1 2 3]。 package main import “fmt“

福大大架构师每日一题

golang 福大大 选择题

Beautiful Soup库的介绍

攻城狮Wayne

Python BeautifulSoup 10月月更

理解NodeJS多进程

coder2028

node.js

被翻译成 12 种语言的深度学习名著重磅升级,75%新内容,让你豁然开朗!

图灵教育

Python 深度学习

时间旅行调试与自动化测试的支持

iofod jude

前端 低代码

天涯新款key-list类型内存数据引擎——Memlink_架构_张凯峰_InfoQ精选文章