一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论

背景

背景是设计一个实时数据接入的模块,负责接收客户端的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(后续提供HBase上的查询),或先持久化到Kafka里,方便后续进行一些计算和处理,再下沉到文件系统或做别的输出。

在设计中,对于客户端和服务端有这么些目标。

客户端需要支持多语言(Java,C++),做得尽量轻量级,只要连上服务端的ip:port,以RPC的形式调用简单的write就可以把数据写出去。客户端不承担任何逻辑的处理,服务端的负载均衡对客户端是透明的。

服务端想要做的是一个去中心化的节点集群,节点之间汇报各自的负载情况,每个节点能知道全局的负载情况,在接收客户端的连接请求的时候,能返回负载合适的节点让客户端往目标节点写。另外,服务端能容忍高并发的写入操作,某节点挂掉后要能让客户端选择新的低负载节点,不影响客户端的数据写入。服务端对业务系统的接入配置记录在DB里,能选择合适的处理逻辑,把数据写到HBase或kafka里。

设计

客户端与服务端使用Thrift来通信,由.thrift来约定写数据的接口和结构,客户端所要做的是从初始配置里选择一个可用服务节点,向其询问目前负载最低的节点进行数据写入,或者客户端本身选择服务节点的时候就是以偏随机和均衡的方式。这两种方式在后面讨论服务端实现的时候都会涉及到。

下面说说服务端的几种方案。

其实在规划的时候,服务端是往p2p大量节点的方向设计的,后续我又提出了些自己的看法,做了一些讨论。所以下面先介绍比较复杂些的实现方案。

一致性哈希+p2p广播 方案

如上图所示,绿色FeedsGroup是每个服务节点,具体是一个JVM进程,一台实体机器上可以部署多个。主要思路是通过Chord算法来维护和管理网络结构,通过类gossip的实现来广播节点的负载信息。Chord是一致性哈希的一种实现,是p2p里比较重要的一个算法。一致性哈希保证了整个网络结构和可扩展性,且客户端可以通过hash的方式比较随机分散地分布到整个哈希环上,让各个节点上的连接数比较平均。此外,Chord算法的每个节点维护了一个全局的Finger Table,这个Finger表是每个节点对整个网络的"全局视图",本身是用来做类二分的节点查找的,我们在这把它当作一个路由表,除了客户端可以通过访问一个节点找到自己落在环上的位置外,这个路由表还用来让节点们做gossip通信。gossip是p2p网络里在无中心情况下广播自己信息和获得其他节点信息的协议。实现方式有很多,在下面介绍纯gossip的实现方式的时候再具体介绍。关于chord算法的一些内容,可以参考我之前写的这篇文章

后半部分是不同Sink目标,通过DB配置的方式为不同业务系统绑定不同的处理逻辑和数据下沉方案,包括具体schema的设计。

纯gossip广播 方案

纯gossip方案实现参考了Cassandra的实现方式,为每个FG进程配置了几个种子节点,即每个FG起来之后都会与种子节点交换自己的信息和其他节点的信息,然后通过种子节点维护的节点列表,再随机选取两个或三个节点进行通信。种子节点的设定避免的信息孤岛。Cassandra内gossip通信协议的实现说明可以参考DataStax的文章

其实纯gossip实现和上面第一种实现相比,少了DHT(Distributed Hash Table)这一块,对于客户端来说,每次连接需要节点返回一个全局负载最低节点给他来进行数据写入。

小规模集群 基于zk实现方案

以上实现方式,归根到底是为了能承受客户端高并发的连接和写入需求,并且要做到可扩展,负载均衡和去中心化。且上面两种方案在成千上万个节点下面可能会比较有优势,因为chord和gossip本身的一些网络开销和信息维护都是适合于p2p网络下面大量节点的管理和维护。

在实际开发中,可能我们最多起到上百个节点,甚至几十个节点。我考虑了简化的实现方式,不过本身也存在争议 :)。

最简单的情况下,其实我们只有数据的写,没有第二次来同节点进行查询的请求。所以场景并不太像一致性哈希本身的数据存取场景,要简单很多。单纯是一个服务节点列表,不需要任何哈希环,也可以解决我们的写入需求。不过这样可能就没啥设计可言了。

我考虑在节点数目比较少的情况下,可以把节点在哈希环上的大整数值记录在zk上,如此就会在zk上维护一个类似哈希环的节点列表,且按顺序排列。节点之间维护一致哈希环也不需要额外的互相通信开销,而是直接从zk上进行读取操作,或者在zk上设置watch通知已有节点变更情况。以此换来的代价是,在zk上会有比较多的读请求,写请求非常少,zk充当了一个可靠的节点列表存储的地方,把网络通信的开销转移到了zk上面。在节点数目比较少的情况下,通过zk维护全局列表的方式可以完成哈希环的管理、客户端对节点的选取、节点之间互相广播通信的事情。

总结

在设计之初,我们也有考虑直接拿kafka来做写入的事情,客户端做个producer,让kafka来承担并发写和负载的事情也完全可以其实。不过考虑到实时接入场景的多样性,本文的实现满足的是直接同步写入的场景以及先持久化后计算的场景。

第一种方案在设计上比较优雅,而且会很适合大量节点数目的场景。

第二种方案产生的原因其实是,我们的写需求其实并不符合一致性哈希的场景,所以没有环这个东西也没啥问题,所以纯广播的方式照样是可以保证的。

第三种方案是我自己YY的,不过也是比较鸡肋,比较奇怪,既然写zk了,就算没有环这个概念,直接把存活节点记录在上面,通过让客户端取余或别的随机方案选择目标节点也完全可以,好像也没有必要搞成一个哈希值什么的了。我感觉如果单纯是一致性哈希算法的实现的话,基于zk上的这种实现方式在节点规模比较小的情况下应该还是可行的,只是通信量级会与节点数目成正比,在合理的设计下,感觉还是简单可行的一种实现方案。

全文完 :)

一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论,布布扣,bubuko.com

时间: 2024-10-14 11:55:06

一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论的相关文章

区块链对人工智能的变革:去中心化将带来数据新范式

区块链对人工智能的变革:去中心化将带来数据新范式 2017-01-03 14:59:27  来源:网络大数据  CIO时代抢沙发 摘要:本文基于我个人在人工智能和区块链研究方面的经验,描述了区块链技术可以如何辅助人工智能.二者结合一处即发!区块链技术--尤其是行星尺度的--可以帮助实现人工智能和数据团体长期以来的一些梦想,并打开一些机会.关键词: 区块链 人工智能 近年,从围棋到人类水平的语音识别,人工智能(AI)研究者终于在他们几十年一直努力探索的领域取得了突破.取得突破进展的关键一点是研究者

以太坊开发完整去中心化应用 —— 区块链投票系统

第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. ethereum logo 通过本课程的学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成本课程,最好对以下技术已经有一些基本了解

我们开发了一个去中心化虚拟互联网,请评测。

经过40天的努力,新的去中化虚拟互联网DVPN,中文名字昆仑网发布了. 在这个网络中,网络中的基础架构最主要体现在如下几个版块: 1.实现P2P域名系统,域名可以无阻碍使用任何文字和后缀,域名实现和传统域名并用,不发生冲突,同一个网站,可以在两个网中同时运行.:(a.传统互联网上所有的域名都可以再注册一遍,也可以是单词,也可以是一句话:b.秒杀花生壳) 2.实现P2P远程代理功能.既我能上这个网,我邀请你,你能通过我上这个网:(这个是一个非常个性化的代理上网方式,比如你有亲人和朋友在国外,你就可

BLOCKCHAIN 区块链的去中心化P2P服务的JAVA代码的实现

为什么要用去中心化? 借贷关系证明举例 中心化借贷关系证明带来的问题: 机器挂了,公司倒闭了,被黑客黑了,借贷关系就不存在了 借贷关系涉及到个人隐私,中心化的机构会拿去做大数据分析.例如各大电子商务公司,会根据购物习惯,分析个人喜好,继而指导利益可图的商业行为,但这本身是侵犯隐私的. 去中心化可以解决上述的问题: 去中心化的一个节点挂了,对数据丢失影响很小,节点越多,黑客越难攻击. 使用复杂的密码学,保证隐私 区块链中的P2P概念 P2P(Peer to Peer)对等计算机或对等网络,一种计算

谈谈几种去中心化币币交易所的优缺点

微信公众号:GAIAWorld  回顾加密货币的发展历程,凭借"安全可靠,难于追踪,去中心化"的优点受到全世界的追捧.全球加密货币总市值超过3000亿美金,成为新经济的标志.  然而,全球大部分交易所都是中心化的,他们既不安全也不匿名,而且被少数实体控制.过去的十年,不断有加密货币交易所被攻破,加密货币被盗等事件发生.旧的中心化加密货币交易所倒下了,新的中心化加密货币交易所又站了起来.  中心化交易所的现状和不足时刻提醒人们,加密货币的未来还有很长的路要走,至少现在的它并不像想象中那么

buckaroo 去中心化的c++包管理工具

buckaroo 是一款去中心化的c++ 包管理工具,使用上,类似yarn(nodejs),cargo (rust) ,使用buckaroo 我们可以很容易集成一个大规模的项目 支持以下特性 直接从GitHub,BitBucket,GitLab,托管Git和HTTP中提取依赖项 完全可重现的构建和依赖性解析 完全分散 - 没有中央服务器或发布过程 允许任何构建配置 私有和公共依赖,以避免“依赖地狱” 每个包有多个库,因此像Lerna这样的工具是不必要的 将单个包装从单体仓库中取出 完全支持语义版

理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器.坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂.耐心看完,必有收获. 为什么需要稳定币 如果一个货币其价值时刻在剧烈波动,就无法作为一个日常支付和交易的货币,谁也无法承担今天发的工资,第二天就跌掉了三分之一. 在币价高度不稳定时,在不退出加密货币市场的情况下,稳定币就可以提供价值保值. 通常发行稳定币的方式是通过资产担保来发行,像USDT.TUSD等就是通过美元资产

去中心化交易所大势所趋,Tark诚邀上币方

钱包由于满足了用户管理通证的刚需,所以用户量可以做到很高,今天币圈投资者基本上几乎没有人不知道Tark钱包的.随着去中心化交易所技术的不断改善和提高,我们有理由相信钱包内置去中心化交易平台会是一个大趋势,一旦人们的交易需求被满足,那么人们极有可能会抛弃中心化交易所.br/>![](https://s1.51cto.com/images/blog/201905/24/91bea2e84d16ca24060657b1c3f5ec7a.jpg?x-oss-process=image/watermark

中心化与去中心化,BDEX或将终结交易所世纪之争

数字资产交易所领域一直有一个世纪之争---中心化,还是去中心化? 都说币圈一天,世间一年.币圈一个小小的举动,就有可能在你不经意之间掀起一番巨浪,或者直接迎来一个时代的变革.那么,去中心化跨链交易所BDEX的横空出世,圈内如何评判,看好还是看空?它是否会终结中心化与去中心化的世纪之争?我们从以下几个方面聊起: 一.去中心化---区块链技术的最大特征之一提到区块链,相信90%以上的人首先想到的就是去中心化这一关键词.区块链的本质就是一个去中心化的分布式账本或数据库,它依靠遍布全球的全节点运行,每个