
EulerMaker存储设计揭秘etcd与Elasticsearch双引擎协同方案【免费下载链接】EulerMakerA software package build system that completes the build from source code to binary packages and supports developers in customizing OS scenarios.项目地址: https://gitcode.com/openeuler/EulerMaker前往项目官网免费下载https://ar.openeuler.org/ar/EulerMaker作为openEuler社区的开源软件包构建系统其存储架构采用了创新的etcd与Elasticsearch双引擎协同方案为开发者提供了高效、可靠的数据管理能力。这种独特的存储设计不仅确保了系统的高可用性还实现了实时数据同步与快速检索的完美结合成为构建系统领域的存储设计典范。 为什么需要双引擎存储架构在传统的构建系统中存储方案往往面临一个两难选择要么选择强一致性的KV存储如etcd来保证数据可靠性要么选择全文搜索引擎如Elasticsearch来支持复杂的查询需求。EulerMaker巧妙地将两者结合充分发挥了各自的优势etcd提供强一致性、高性能的键值存储支持watch机制实现实时变更通知Elasticsearch提供强大的全文搜索和索引能力支持复杂的查询和分析️ 双引擎协同工作原理数据流架构EulerMaker的存储架构遵循清晰的数据流向用户请求 → ebs-gateway → ebs-apiserver → [etcd Elasticsearch]所有组件都通过统一的API访问存储层这种设计确保了系统的可维护性和扩展性。核心存储组件1. etcd主存储路径etcd作为主存储负责持久化所有资源对象并维护resourceVersion。在EulerMaker中etcd采用以下路径结构/registry/ebs/projects/{name} /registry/ebs/snapshots/{project}/{name} /registry/ebs/builds/{project}/{name} /registry/ebs/jobs/{project}/{name} /registry/ebs/runners/{name}这种层级结构设计使得全局list/watch可以监听资源前缀如/registry/ebs/builds项目内list/watch可以监听项目子前缀如/registry/ebs/builds/{project}2. Elasticsearch索引设计Elasticsearch作为增强存储为每个资源类型创建独立的索引ebs-projects ebs-snapshots ebs-builds ebs-jobs ebs-runners每个索引都包含标准化的映射结构确保数据的一致性和查询效率。 双引擎协同机制详解读写操作协同策略EulerMaker通过EnricherStore实现了etcd与Elasticsearch的智能协同创建操作Createfunc (e *EnricherStore) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { if err : e.indexES(ctx, obj); err ! nil { return nil, fmt.Errorf(ES index failed: %w, err) } return e.etcdStore.Create(ctx, obj, createValidation, options) }关键点先写Elasticsearch再写etcd。ES写入失败会导致整个创建操作失败确保数据一致性。读取操作Getfunc (e *EnricherStore) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { var ( obj runtime.Object esData json.RawMessage etcdErr error esErr error wg sync.WaitGroup ) wg.Add(2) go func() { obj, etcdErr e.etcdStore.Get(ctx, name, options) }() go func() { esData, esErr e.esClient.Get(ctx, e.resource, esDocID) }() wg.Wait() if etcdErr ! nil { return nil, etcdErr } if esErr nil esData ! nil { json.Unmarshal(esData, obj) // 用ES数据增强返回对象 } return obj, nil }创新点并发读取etcd和Elasticsearch用ES中的增强数据覆盖返回对象实现数据融合。更新操作Updatefunc (e *EnricherStore) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) { result, wasCreated, err : e.etcdStore.Update(ctx, name, objInfo, createValidation, updateValidation, forceAllowCreate, options) if err ! nil { return nil, false, err } if err : e.indexES(ctx, result); err ! nil { return result, wasCreated, nil // ES失败不影响etcd更新 } return result, wasCreated, nil }设计哲学先更新etcd再尝试更新Elasticsearch。ES写入失败不会阻断etcd更新保证系统可用性。删除操作Deletefunc (e *EnricherStore) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) { obj, wasImmediate, err : e.etcdStore.Delete(ctx, name, deleteValidation, options) if err ! nil { return nil, false, err } e.esClient.Delete(ctx, e.resource, esDocID) // 异步删除ES数据 return obj, wasImmediate, nil }容错设计先删etcd再删除ES文档即使ES删除失败也不影响主要业务流程。文档ID命名策略对于命名空间化的对象EulerMaker采用{project}/{name}作为文档IDesDocID : name if ns, ok : genericapirequest.NamespaceFrom(ctx); ok ns ! { esDocID ns / name }这种命名策略确保了文档的唯一性和可读性同时兼容URL编码要求。️ 实际应用场景场景一构建状态实时监控当用户创建新的构建任务时构建请求通过ebs-gateway到达ebs-apiserverapiserver将构建对象写入Elasticsearch索引ebs-buildsapiserver将构建对象写入etcd路径/registry/ebs/builds/{project}/{name}控制器通过watch机制监听到新构建开始调度执行执行过程中状态更新会同时同步到两个存储引擎场景二复杂查询与统计项目经理需要查询特定时间段内所有失败的构建任务{ query: { bool: { must: [ { term: { status.phase: Failed } }, { range: { metadata.creationTimestamp: { gte: 2024-01-01 } } } ] } } }这种复杂查询直接在Elasticsearch中执行无需遍历etcd中的所有数据大大提升了查询效率。场景三项目资源管理系统管理员需要查看某个项目的所有资源# 通过etcd watch机制实时获取项目资源变化 watch /registry/ebs/builds/project-alpha watch /registry/ebs/jobs/project-alpha同时可以通过Elasticsearch进行跨项目统计和分析。⚡ 性能优化策略1. 并发读取优化通过并发读取etcd和ElasticsearchEulerMaker将读取延迟降低到两个存储系统中较慢的那个wg.Add(2) go func() { /* 读取etcd */ }() go func() { /* 读取ES */ }() wg.Wait()2. 异步写入容错对于更新操作ES写入失败不会影响etcd更新确保系统的高可用性if err : e.indexES(ctx, result); err ! nil { return result, wasCreated, nil // 静默处理ES错误 }3. 智能索引管理Elasticsearch客户端在启动时自动创建并配置索引func (c *Client) ensureIndices() error { for _, index : range indices { // 检查索引是否存在不存在则创建 mapping : { settings: { number_of_shards: 1, number_of_replicas: 0 }, mappings: { /* 优化字段映射 */ } } } } 部署与配置Docker Compose部署测试环境可以通过hacks/docker-compose.yml快速启动所有组件etcd: image: quay.io/coreos/etcd:v3.5.0 ports: - 2379:2379 elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0 ports: - 9200:9200 ebs-apiserver: build: ./components/ebs-apiserver ports: - 8443:8443 environment: - ETCD_SERVERShttp://etcd:2379 - ES_SERVERShttp://elasticsearch:9200关键配置参数参数默认值说明--etcd-servershttp://etcd:2379etcd服务地址--es-servershttp://elasticsearch:9200Elasticsearch服务地址--secure-port8443HTTPS监听端口 设计优势总结1. 数据一致性保证etcd提供强一致性保证关键操作Create采用两阶段提交模式更新操作以etcd为准ES作为增强存储2. 查询性能提升简单查询走etcd复杂查询走Elasticsearch并发读取减少总体延迟索引优化提升搜索效率3. 系统可扩展性存储层与业务逻辑解耦支持水平扩展的存储集群灵活的索引策略支持不同查询需求4. 开发体验优化统一的API接口简化客户端开发实时watch机制支持响应式应用丰富的查询能力满足复杂业务场景 最佳实践建议1. 生产环境部署为etcd和Elasticsearch配置高可用集群根据数据量调整Elasticsearch的分片和副本数定期备份关键数据2. 监控与告警监控etcd集群健康状态监控Elasticsearch索引性能设置存储空间使用率告警3. 性能调优根据查询模式优化Elasticsearch索引映射调整etcd的watch缓冲区大小合理设置连接池参数 未来发展方向EulerMaker的双引擎存储架构为构建系统提供了坚实的基础未来可以在以下方向继续演进多级缓存优化引入Redis等内存缓存进一步提升热点数据访问性能数据湖集成对接大数据分析平台支持构建数据的深度分析存储插件化支持更多存储后端如TiKV、MongoDB等智能索引管理基于查询模式自动优化索引策略 学习资源想要深入了解EulerMaker存储设计的开发者可以查看以下源码存储协同核心components/ebs-apiserver/pkg/storage/hybrid/store.go - 双引擎存储协同实现Elasticsearch客户端components/ebs-apiserver/pkg/storage/es/client.go - ES客户端封装架构设计文档docs/zh/design/architecture.md - 系统架构详细说明数据模型定义docs/zh/design/data-models.md - 资源对象模型定义EulerMaker的etcd与Elasticsearch双引擎协同方案展示了现代构建系统存储设计的先进理念通过巧妙的架构设计在保证数据一致性的同时提供了强大的查询和分析能力。这种设计模式值得其他分布式系统借鉴和学习。无论你是正在构建新的软件包构建系统还是优化现有系统的存储架构EulerMaker的实践经验都能为你提供宝贵的参考。【免费下载链接】EulerMakerA software package build system that completes the build from source code to binary packages and supports developers in customizing OS scenarios.项目地址: https://gitcode.com/openeuler/EulerMaker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考