一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论
背景
背景是设计一个实时数据接入的模块,负责接收client的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(兴许提供HBase上的查询),或先持久化到Kafka里。方便兴许进行一些计算和处理,再下沉到文件系统或做别的输出。
在设计中,对于client和服务端有这么些目标。
client须要支持多语言(Java。C++),做得尽量轻量级。仅仅要连上服务端的ip:port。以RPC的形式调用简单的write就能够把数据写出去。client不承担不论什么逻辑的处理。服务端的负载均衡对client是透明的。
服务端想要做的是一个去中心化的节点集群,节点之间汇报各自的负载情况,每一个节点能知道全局的负载情况,在接收client的连接请求的时候。能返回负载合适的节点让client往目标节点写。另外,服务端能容忍高并发的写入操作。某节点挂掉后要能让client选择新的低负载节点,不影响client的数据写入。
服务端对业务系统的接入配置记录在DB里,能选择合适的处理逻辑,把数据写到HBase或kafka里。
设计
client与服务端使用Thrift来通信,由.thrift来约定写数据的接口和结构。client所要做的是从初始配置里选择一个可用服务节点。向其询问眼下负载最低的节点进行数据写入。或者client本身选择服务节点的时候就是以偏随机和均衡的方式。这两种方式在后面讨论服务端实现的时候都会涉及到。
以下说说服务端的几种方案。
事实上在规划的时候,服务端是往p2p大量节点的方向设计的,兴许我又提出了些自己的看法,做了一些讨论。所以以下先介绍比較复杂些的实现方案。
一致性哈希+p2p广播 方案
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVsaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
如上图所看到的,绿色FeedsGroup是每一个服务节点,详细是一个JVM进程。一台实体机器上能够部署多个。主要思路是通过Chord算法来维护和管理网络结构。通过类gossip的实现来广播节点的负载信息。Chord是一致性哈希的一种实现,是p2p里比較重要的一个算法。一致性哈希保证了整个网络结构和可扩展性。且client能够通过hash的方式比較随机分散地分布到整个哈希环上,让各个节点上的连接数比較平均。此外,Chord算法的每一个节点维护了一个全局的Finger Table,这个Finger表是每一个节点对整个网络的"全局视图"。本身是用来做类二分的节点查找的,我们在这把它当作一个路由表。除了client能够通过訪问一个节点找到自己落在环上的位置外,这个路由表还用来让节点们做gossip通信。
gossip是p2p网络里在无中心情况下广播自己信息和获得其它节点信息的协议。实现方式有非常多,在以下介绍纯gossip的实现方式的时候再详细介绍。
关于chord算法的一些内容,能够參考我之前写的这篇文章。
后半部分是不同Sink目标,通过DB配置的方式为不同业务系统绑定不同的处理逻辑和数据下沉方案,包含详细schema的设计。
纯gossip广播 方案
纯gossip方案实现參考了Cassandra的实现方式,为每一个FG进程配置了几个种子节点,即每一个FG起来之后都会与种子节点交换自己的信息和其它节点的信息。然后通过种子节点维护的节点列表,再随机选取两个或三个节点进行通信。
种子节点的设定避免的信息孤岛。Cassandra内gossip通信协议的实现说明能够參考DataStax的文章。
事实上纯gossip实现和上面第一种实现相比,少了DHT(Distributed Hash Table)这一块,对于client来说。每次连接须要节点返回一个全局负载最低节点给他来进行数据写入。
小规模集群 基于zk实现方案
以上实现方式。归根究竟是为了能承受client高并发的连接和写入需求,并且要做到可扩展,负载均衡和去中心化。且上面两种方案在成千上万个节点以下可能会比較有优势,由于chord和gossip本身的一些网络开销和信息维护都是适合于p2p网络以下大量节点的管理和维护。
在实际开发中。可能我们最多起到上百个节点,甚至几十个节点。我考虑了简化的实现方式,只是本身也存在争议 :)。
最简单的情况下。事实上我们仅仅有数据的写,没有第二次来同节点进行查询的请求。所以场景并不太像一致性哈希本身的数据存取场景,要简单非常多。单纯是一个服务节点列表,不须要不论什么哈希环。也能够解决我们的写入需求。只是这样可能就没啥设计可言了。
我考虑在节点数目比較少的情况下,能够把节点在哈希环上的大整数值记录在zk上,如此就会在zk上维护一个相似哈希环的节点列表,且按顺序排列。节点之间维护一致哈希环也不须要额外的互相通信开销,而是直接从zk上进行读取操作,或者在zk上设置watch通知已有节点变更情况。
以此换来的代价是,在zk上会有比較多的读请求,写请求非常少,zk充当了一个可靠的节点列表存储的地方,把网络通信的开销转移到了zk上面。
在节点数目比較少的情况下,通过zk维护全局列表的方式能够完毕哈希环的管理、client对节点的选取、节点之间互相广播通信的事情。
总结
在设计之初。我们也有考虑直接拿kafka来做写入的事情,client做个producer,让kafka来承担并发写和负载的事情也全然能够事实上。只是考虑到实时接入场景的多样性,本文的实现满足的是直接同步写入的场景以及先持久化后计算的场景。
第一种方案在设计上比較优雅,并且会非常适合大量节点数目的场景。
另外一种方案产生的原因事实上是,我们的写需求事实上并不符合一致性哈希的场景,所以没有环这个东西也没啥问题。所以纯广播的方式照样是能够保证的。
第三种方案是我自己YY的,只是也是比較鸡肋,比較奇怪,既然写zk了,就算没有环这个概念。直接把存活节点记录在上面,通过让client取余或别的随机方案选择目标节点也全然能够。好像也没有必要搞成一个哈希值什么的了。
我感觉假设单纯是一致性哈希算法的实现的话,基于zk上的这样的实现方式在节点规模比較小的情况下应该还是可行的,仅仅是通信量级会与节点数目成正比,在合理的设计下。感觉还是简单可行的一种实现方案。
全文完 :)
一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论的更多相关文章
- ImCash:币安下架BSV之辩:规则、中立与去中心化
一种看法是:一个引用价格数据和执行交易的加密货币交易所,其业务决策往往是在链外发生的,不受制于严格的.类似于准宪法的链上规则的约束,加密货币交易所可以拒绝任何人喜欢的价格和交易,而且这样做并不会损害底 ...
- PPIO去中心化存储的了解和记录
目录 介绍 FileCoin P2P技术给去中心化云存储的好处 剩余资源的再次使用 市场竞争会激发民间的智慧 PPIO的2种冗余模式 全副本模式 纠删副本模式 为什么PPIO要设计支付代理节点? 一些 ...
- Filecoin:一种去中心化的存储网络(一)
开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...
- NGK公链:去中心化交易+挖矿生态体系共舞
NGK生态公链是一个安全.透明.专业的去中心化商业应用平台.作为一条具有技术信任甚至是公众信任的公链,NGK以区块链技术为支撑,利用区块链透明.公正.公开.数据不可篡改.分布式存储.可追溯等技术优势, ...
- 去中心化存储的QoS是什么?
我的前面一篇文章讲到如何做去中化存储,文其中提到了QoS (Quality of Service),那么QoS是什么?为什么QoS那么重要?下面将详细描述. 什么是QoS? 提到QoS,就要先了解Qo ...
- 人物传记STEPHEN LITAN:去中心化存储是Web3.0生态重要组成
近期,NGK.IO的开发团队首席技术官STEPHEN LITAN分享了自己对去中心化储存的观点,以下为分享内容. 目前的存储方式主要是集中式存储,随着数据规模和复杂度的迅速增加,集中存储的数据对于系统 ...
- 为什么说NGK的去中心化预言机越来越受欢迎?
2020年区块链市场非常火热,从年初的交易所杠杆,到Defi热潮,一波连着一波,风向不断切换,很多人无奈感叹跟不上时代,很多人欢欣雀跃登上了早班车.随着Defi的不断火热,预言机也进入了大众视野.NG ...
- 小众Tox——大众的“去中心化”聊天软件
★Tox是什么 一个反窥探的开源项目:一种基于DHT(BitTorrent)技术的即时通讯协议:一个为安全而生的加密通讯系统 .美国棱镜计划曝光后,一个名为 irungentoo 的牛人于17天后的2 ...
- 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目技术对比(下)
在上篇文章中,我们主要从价值定位.技术层次架构.服务质量.去中心化程度,和经济激励机制五个方面分析了三个项目的不同.在这一篇文章中,我们将着重从区块链的架构设计.数据传输技术设计和数据存储技术设计三方 ...
随机推荐
- Foundation 框架 归档
一.使用XML属性列表归档 此方法适用于NSString.NSDictionary.NSarray.NSDate.NSnumber,其中atomically参数表示先将字典写入临时备份文件,成功之后, ...
- 移动端开发(四):swiper.js
swiper.js中文网:http://www.swiper.com.cn/ 文档结构 swiper.jquery.js 是需要引用jquery.js 或者 zepto.js 时,只需直接引用该 ...
- slf4j+log4j配置(Maven)
首先配置Maven依赖 <!-- http://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency& ...
- ajax验证码检测
1.验证码文件 <%@ page language="java" pageEncoding="UTF-8"%> <%@ page conten ...
- BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )
有点类似背包 , 就是那样子搞... --------------------------------------------------------------------------------- ...
- js函数变量
局部 JavaScript 变量 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名称相同的局部 ...
- JavaScript表单验证年龄
JavaScript表单验证年龄,判断一个输入量是否符合年龄,通过正则表达式实现. //检查年龄 function isAge(str){ var mydate=new Date; var now=m ...
- Python collections.defaultdict 笔记
其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...
- DM368 arm板GDB远程调试
参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...
- 玩转无线 — GNURADIO 简单运用
大家好, 我是Insight-labs的旺财,这里放出个旺财在Bsides Toronto 2013 会上RF-Ninjia Hacking议题中的一个案例,随着物联网越来越火热,而物联网又离不开无线 ...