Bean Nuts Hazelnut Sauron Legion
集群架构
简介:
本节仅介绍本项目(Nonjron)的技术细节,Nonjron基于Springboot, Springboot Cloud, Apache Servlet,Pinecone Ursus Java,Web Magic
设计目的: 用于支撑TB、千亿数据量级别以上的大规模分布式爬虫,索伦系统设计数据量包括GPT3模型的基本数据量(45TB),拓展数据量(1万个网站、千亿条记录),目前设计容量100TB,6个存储物理服务器集群。
设计策略: 为了控制成本和容灾,系统完全采用软件RAID 10,即原始数据直写+压缩备份,原始数据小文件仅放固态和内存,大文件仅放机械硬盘,RAID0系统采用完全软件控制,即去中心化分布式直写,阵列卡仅开启直通模式,阵列卡硬件特性:Intel SATA阵列卡+ NVMe阵列卡,面向抽象存储,对于开发者无需修改原始文件系统API,局域网内使用NAS即可,边缘集群使用OBS/OSS/直接通信即可。
数据库: MySQL去中心化集群、Redis去中心化普通集群
通信系统: UlfUMC、RabbitMQ
去中心化策略: 软件半直接控制、不走中心化通信,即所有的冗余和负载均衡交给目标进程控制,仅在开始随机指定,异常直接放弃并等到下一轮重新执行的策略,相当于单个服务拥有极大的自治权。
任务分配调度框架
集群分为4级
A. 1. 物理机大集群; 2. 容器/虚拟机/边缘小集群; 3.单服务; 4.服务中的线程; 线程是原子执行单位,即无论业务多复杂,这个架构必然存在,且仅由线程完成任务。
任务系统分级
B. 1. 业务组(如维基百科[维基百科、医学百科、维基字典等高度相似的业务]组); 2. 业务(维基百科); 3. 任务大页(如维基百科0-1KW的索引页)仅分配给服务; 4.任务页(如维基百科0-100W的索引页); 5. 任务帧(如维基百科第4个索引)
任务帧是最小执行单位,也是OBS(对象存储)下最小信息组单位,所有任务必须通过唯一的ID进行运行、查询等。
调度策略和算法:
业务组、业务的调度: FIFO + 直接任务指定,一个集群/子集群仅进行一个业务组、业务,必须等业务队列当前任务完成才进行下一个队列。
页面调度: 大页面: 不合并的伙伴算法+优先队列
小页面:
C++下采用等额页面池策略(分治策略,无竞争,无锁,可能饥饿)
Java采用无锁队列+竞争性信号量分配算法(抢占策略,高度竞争,无锁,线程调度可能耗时)
1.3任务策略
策略: 批处理,即任何任务必须排队分级处理,本项目主要用于爬虫,采用完全式站点克隆,数据量巨大,如网易云音乐(歌手2千万,专辑1亿,歌曲若干亿),因此采用分治的分布式爬虫,大任务都不竞争,且必须批处理。
基本流程,批处理获取站点索引 -> 批处理缓存所有页面 -> 批处理建模 -> 下一个子任务
每一个流程都必须全部完成且必须缓存到磁盘,才进行下一步
1.4 数据格式
系统配置项:仅使用JSON5、Yaml
任务配置:仅使用JSON5
虚拟化的集群系统:
50组 虚拟机、进程和容器集群
边缘设备集群,真实代理集群,直接与C++服务器通信
Last editor:undefined Update time:2024-08-27 16:01