我所读过的最好的一篇分布式技术文章 学习笔记:The Log( 九 )


6) 处理节点间的负载均衡 。
以上,大概是一个完整的分布式系统中应提供的大部分功能了(Jay哥确实爱Log 。) 。剩下的就是的API和诸如一些构建索引的事了,比方全文索引须要获取全部的,而针对主键的查询,仅仅须要在某个中获取数据 。
(那把剩下的事情也交代下吧,Jay哥威武!)
系统可被分为两个逻辑组件(这强大的理解和功力):
1) Log层
2) 服务层
Log层,以序列化的、有序的方式捕获状态的变化 。而服务层,则存储外部查询须要的索引,比方一个K-V存储可能须要B-tree、索引 。而一个搜索服务须要倒排索引 。
写操作既能够直接入log层,也能够通过服务层做代理 。
写入log会产生一个逻辑上的时间戳(log的索引) 。比方一个数字ID,假设系统化了,那么 。服务层和log层会拥有同样的(但其各自的机器数可能不同) 。
服务层订阅到log层,而且以最快的速度、按log存储的顺序追log 。将数据和状态变化同步进自己的本地索引中 。
将会得到read-your-write的语义:
通过对任一一个节点,在查询时携带其写入时的时间戳,服务层的节点收到此查询 。通过和其本地索引比較时间戳,假设必要 。为了防止返回过期的老数据 。推迟请求的运行,直到此服务节点的索引同步跟上了时间戳 。
服务层的节点,或许须要、或许不须要知道的概念 。在非常多简单的用例中,服务层可不构建节点,由于log就是事实的来源 。
还有一个问题,怎样处理节点失败后的恢复问题 。能够这样做,在log中保留一个固定大小的时间窗体,同一时候对数据维护快照 。也能够让log保留数据的全量备份并使用log合并技术完毕log自身的垃圾回收 。
这样的方法,将服务层的众多复杂性移至log层 。由于服务层是系统相关(-)的,而log层确能够通用 。
基于log系统,能够提供一组完备的、供开发使用的、可作为其他系统的ETL数据源、并供其他系统订阅的API 。
Full Stack !

显然 。一个以log为核心的分布式系统,其本身马上成为了可对其他系统提供数据装载支持及数据流处理的角色 。
同样的,一个流处理系统 。也能够同一时候消费多个数据流,并通过对这些数据流进行索引然后输出的还有一个系统,来对外提供服务 。
基于log层和服务层来构建系统 。使得查询相关的因素与系统的可用性、一致性等因素解耦 。
或许非常多人觉得在log中维护数据的单独备份 。特别是做全量数据拷贝太浪费、太奢侈 。但事实并不是如此:
1) (注:2013年)的kafka生产集群维护了每数据中心75TB的数据,而应用集群须要的存储空间和存储条件(SSD+很多其他的内存)比kafka集群要高 。
2) 全文搜索的索引 。最好全部装入内存,而logs由于都是线性读写,所以能够利用便宜的大容量磁盘 。
3) 由于kafka集群实际运作在多个订阅者的模式之下,多个系统消费数据,所以log集群的开销被摊还了 。
4) 全部以上原因 。导致基于外部log系统(kafka或者相似系统)的开销变得非常小 。
2.13 结语
Jay哥在最后,不仅厚道地留下了非常多学术、上的有价值的论文和參考链接,还非常谦逊地留下了这句话:
If you made it this far you know most of what I know about logs.
终 。