一个分布式的纯实时搜索与分析引擎INFINI Pizza 演讲人:Medcl 现状、背景、痛点 Pizza名称的来历?定位场景 Pizza 技术选型数据的组织分片的设计分布式的设计实时的设计 公司成立于2021年12月3日,公司成员搜索行业背景深厚。公司致力于帮助客户解决实际搜索需求,打造极致易用的数据探索与分析体验。客户至上,产品驱动型公司,公司没有融资,目前盈亏平衡。我们正在寻找志同道合的小伙伴,欢迎联系:medcl@infinilabs.com ●Elasticsearch企业级平替综合解决方案●一站式企业搜索基础设施平台建设方案●核心业务场景的海量数据实时搜索方案 INFINIEasysearch是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的ApacheLucene。Easysearch的目标是提供一个自主可控的轻量级的Elasticsearch可替代版本,并继续完善和支持更多的企业级功能,为国内Elasticsearch客户提供国产化替代迁移、技术兜底和长期售后技术支持服务。 目前:墨天轮搜索型数据库排行榜#1,数据库总榜#33 ES国产化平替,自主可控可信 起源 Why webuild another SearchEngine? WhyReal-Time? Do youlike towait? 数据消费的体验越来越实时,终端用户的体验越来越好 It’s time tomove fromNear-Real-Time Search toReal-Time Search. 客户集群目前是156个节点,其中150个data节点是部署在30台高配置物理机上。 阿里云上直接可以购买的机器:256C、1TB内存,JVM默默叹了一 每天晚上还在重建索引的兄弟们你们还好么? 如:数据结构和算法未充分利用现代CPU指令集的优势 分片太多、分片太小,这是个难题,可能又需要重建,节点一多又需要拆集群,哎... 口气,多实例吧先 软件成为系统的新的瓶颈,而大多数搜索软件还是几十年前的架构 需要高频修改、实时可见 如何提高多核和海量内存的资源利用率-Scaleupbefore scaleout -CPU密集-IO密集 -PB级别数据-超大规模分布式 一个分布式的纯实时搜索与分析引擎 Pizza- Pizza •接口、语言、框架•总体程序架构•数据的组织•分片的设计•分布式的设计•实时的设计 Pizza-asFeature PizzaAPI PizzaRust C++is stillkingbutI chooseRust! NonUniformMemory Access(NUMA) Sharenothing? -ScyllaDB10x faster> Cassandra-Redpanda6x storage saving>Kafka Pizza采用sharenothing架构! Pizza Pizza ●原始文档使用列存●索引按需构建●由用户选择成本优先,还是性能优先●可挂载外部存储● ●JSON●结构化,支持嵌套●表达能力丰富●动态Schema ●可扩展外部存储,如Parquet、Hbase等●可扩展索引类型●向量索引●地理索引●… Pizza -Parquet PizzaDoc Store -可插拔设计,目前支持:Parquet •DataLake事实标准•高效列存•压缩率高•通用的数据格式,适合数据交换•可外部构建,复用湖仓数据•Pizza直接配置挂载•存储和索引分离•按需构建索引•没有索引,也可以降级为列存查询 Pizza - PizzaIndex Store -可插拔设计,目前仅实现倒排索引 Pizza 通过多级元数据管理,实现局部数据治理;避免部分节点、索引的故障㐀成的集群层面大面积瘫痪;支持海量分片,应对数据量的无限增长。核心要点:如何支撑万亿数据规模采用多级架构设计的分布式元数据引擎;●●●●● Pizza 世界三大难题之一:一个索引多大的分片才合适? .数据如何分布式主要看如何设计分片?.一个索引多少分片合适?.一个分片放多少数据合适?.一个分片多大尺寸合适?.分片如何拆分?.分片如何合并? ID ID ID 一个业务文档一定有且只有一个唯一的ID,才能确保其可原子操作,修改和删除 PizzaID •系统ID采用数字类型,紧凑,并且需要支撑海量数据•系统ID采用复合结构,二维结构•系统ID格式:[RollingID],[Rolling内文档ID]•系统ID自带分区位置,便于快⃞数据定位•RollingID自增,Rolling内文档ID自增•单个Collection内文档的取值范围-[UInt8,UInt32]—[0:1,095,216,660,225]1-[0:255],[0:4,294,967,295]-[UInt16,UInt32]—[0:281,470,681,677,825]281-[0:65,535],[0:4,294,967,295]•用户的自定义ID,会映射得到唯一的一个系统ID Pizza名称的来历! MorePizza -Rolling •单个Rolling的最大容量默认为42.9亿条记录;•超过Rolling的容量,自动切换到下一个Rolling继续写入;•Rolling可以无限增长,满足持续增长的需求。 PackagedPizza ●每个Rolling大小尺寸固定●便于分发和物理资源承载●分片的个数和大小可预测●按需生成,无需提前规划●可以无限水平扩容●读写性能稳定可预测 SlicingPizza -Partition &Shard 单个Rolling默认最多能拆分为256个物理分区(创建时可以配置最大的分区参数); 采用查找表来维护逻辑分区和物理分片的关系; 物理的分片和逻辑的分区可以动态分拆、组合,在写入压力比较小的场景,单个分片内的所有分区数据都在一起,物理上表现为一个数据目录; 自定义ID或系统ID和分区存在Hash一一对应关系:HASH(UUID) / SYS_ID %256 =PARTITION_ID Shard 当写入压力比较大的情况下,分区可以拆分到不同的节点上,用于并行分担写入压力。写入压力峰值过去之后,多个分区可以合并到单个Shard。 Shard 当写入压力比较大的情况下,分区可以拆分到不同的节点上,用于并行分担写入压力。写入压力峰值过去之后,多个分区可以合并到单个Shard。 RollingID RollingPartitionReplica Pizza的实时性设计 Sincemillion secondmatters! Pizza HTTP+RESTful+JSON still doing great,but>Single query engine,multidialects •各模块插件扩展机制•部分字段更新•原地字段更新•向量索引支持•大模型Pipeline•高效跨Collection JOIN•跨Collection物化视图•Kernelbypass•DPDK•SPDK•… 即将开 https://pizza.rs/ https://github.com/infinilabs/pizza/ https://discord.com/invite/4tKTMkkvVX 谢谢观看