milvus多个Querynode,资源消耗都打在一个节点上

milvus 查询时的原理
在这里插入图片描述
当读取数据时,MsgStream对象在以下场景中创建:

在 Milvus 中,数据必须先加载后才能读取。当代理收到数据加载请求时,会将请求发送给查询协调器,查询协调器决定如何将分片分配到不同的查询节点。分配信息(即 vchannels 的名称以及 vchannels 与其对应的 pchannels 之间的映射)通过方法调用或 RPC(远程过程调用)发送给查询节点。随后,查询节点会创建相应的 MsgStream 对象来消费数据。

问题的解决:
https://github.com/milvus-io/milvus/discussions/32698

具体为什么会产生这个问题,可以看我上一篇文章
https://blog.csdn.net/IT_Octopus/article/details/141605964?spm=1001.2014.3001.5501

考虑到大家网络可能不好截图出来:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述其中大致的内容都看懂了,比较困难的是

大致上是每个collection有一根数据管道,其中有一个querynode负责管理这根管道,我们称之为shard-leader,它从管道中接收来自pulsar的数据,数据积累在内存里,称为growing segment,当数据达到一定量,比如一百兆,就把这块数据落盘变成sealed segment,其他的querynode等加载sealed segment。
你插入的数据太少,大部分都在growing segment里,所以数据都在shard-leader里。如果你插入10GB的数据,你会发现其他的querynode也开始有数据。
看起来,你们应该有比较多的partition,每个partition都会有growing数据,而growing数据都会在shard delegator上。默认情况下只有一个delegator,因此大部分数据都在一台机器上。
2. 调小segment flush的阈值,使得数据更快flush,growing的数据更少。

这几句话,我个人理解一下哈:
动态的数据:
1.数据量太小,且数据是动态新增的,且没有60s间隔,没有达到segement分区的限制,没有从growingSegement态变成sealed态,所以都落在其中的一个segement。所以没有触发querynode分配。

       数据插入和 Growing Segment: 当新数据被插入 Milvus 时,它们首先被写入 Growing Segment。Growing Segment 是一个可以继续接收新数据的活跃段。
       
       Flush 操作和 Sealed Segment: Flush 操作会将 Growing Segment 中的数据持久化到存储中,并将 Growing Segment 转变为 Sealed Segment。Sealed Segment 是一个已关闭的段,不能再接收新的数据插入。3. Flush 阈值: Milvus 有一个阈值来决定何时自动执行 Flush 操作(60s)。这个阈值通常基于数据量或时间间隔

静态数据 or 封闭数据
“以分片为单位做balance” 这句话是我理解这个问题的核心点,
意思只有到达某个阈值的时候才会开启分配到其他queynode节点
在这里插入图片描述

通过上述搜索原理 和 官方回答的讨论可以得到这个结论
1.数据量不够,没有达到querynode 一个资源的限额。
在这里插入图片描述2.在数据量小的情况下,少querynode ,每个querynode 多资源
3.调整flush的阈值,我觉得在小数据量的情况下操作有点杀鸡用牛刀,完全可以使用命令塞入数据的指定多个副本,做负载…个人观点仅供参考哈

<think>好的,用户之前询问了如何处理海量电影元数据的关联查询,现在他们进一步想了解大规模电影元数据存储方案的设计。我需要结合之前的回答和提供的三个引用内容来构建一个全面的方案。 首先,引用[1]提到了PostgreSQL的改造,适用于元数据管理,用户可能希望利用PostgreSQL的优势,但需要优化。引用[2]强调了数据库设计的目标,如结构合理、性能优良等,这提示我在设计中要注重数据模型和索引优化。引用[3]关于向量数据库,可能涉及推荐系统或相似性搜索,需要整合到存储方案中。 用户的问题是大规模电影元数据存储,所以需要考虑分布式架构、分片策略、混合存储模型。之前的回答提到了分片策略、混合存储、物化视图等,这些都需要融入新方案。同时,需要结合PostgreSQL的优化,比如分库分表、扩展插件,以及向量数据库的应用场景,比如使用PgVector处理向量数据。 要注意用户提到“大规模”,所以扩展性和高可用性很重要。可能需要采用分布式数据库如Citus,或者结合多种存储引擎,如列存和行存。此外,数据分区、索引优化、缓存机制都是关键点。 还需要考虑元数据的关联查询效率,之前提到的多维索引、物化视图、分布式JOIN优化都需要再次强调。同时,根据引用[3],向量数据库用于相似性搜索,比如电影推荐,这部分需要单独说明。 可能用户没有明确提到具体的数据类型,但电影元数据通常包括结构化数据(如标题、导演)和非结构化数据(如描述、海报),需要不同的存储策略。此外,实时更新和查询性能的平衡也是需要考虑的。 总结来说,方案需要涵盖数据模型设计、分布式架构、存储引擎选择、索引优化、扩展性策略,以及结合PostgreSQL和向量数据库的优势。同时,要确保高可用、容灾备份和监控体系,保证系统稳定运行。</think># 大规模电影元数据存储方案设计实践 ## 一、数据模型设计 ### 1. 维度建模优化 ```sql -- 星型模型核心表设计 CREATE TABLE fact_movie ( movie_id BIGSERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, release_date DATE, duration INT CHECK (duration > 0), rating NUMERIC(3,1), genre_id INT REFERENCES dim_genre, language_id INT REFERENCES dim_language ) PARTITION BY RANGE (release_date); CREATE TABLE dim_actor ( actor_id BIGSERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, birthdate DATE, nationality VARCHAR(50) ) WITH (fillfactor=90); ``` ### 2. 混合数据支持 - 结构化数据:使用JSONB字段存储动态属性 ```sql ALTER TABLE fact_movie ADD COLUMN metadata JSONB GENERATED ALWAYS AS (jsonb_build_object( 'awards', awards_list, 'locations', filming_locations )) STORED; ``` ## 二、分布式架构设计 ### 1. 分片策略组合 $$shard\_key = hash(movie\_id) \oplus (release\_year \mod 10)$$ - 采用复合分片键实现双重分布特性 - 演员维度表使用基因分片保持关联本地性[^1] ### 2. 存储引擎选型矩阵 | 数据类型 | 存储引擎 | 压缩算法 | 访问模式 | |---------|----------|---------|---------| | 基础元数据 | PostgreSQL Citus | ZSON | OLTP | | 用户标签 | ClickHouse | LZ4 | OLAP | | 海报特征 | Milvus | PQ | 向量检索 | ## 三、PostgreSQL优化改造 ### 1. 扩展插件应用 ```sql CREATE EXTENSION pg_partman; -- 自动化分区管理 CREATE EXTENSION timescaledb; -- 时序数据优化 CREATE EXTENSION pgvector; -- 向量相似度计算 ``` ### 2. 混合索引策略 ```sql -- GIN多列倒排索引 CREATE INDEX idx_metadata_search ON fact_movie USING gin (metadata jsonb_path_ops); -- BRIN时间范围索引 CREATE INDEX idx_release_date ON fact_movie USING brin (release_date); ``` ## 四、性能优化方案 ### 1. 分级存储架构 ```mermaid graph TD A[热数据:内存缓存] --> B[温数据:SSD阵列] B --> C[冷数据:对象存储] C --> D[归档数据:磁带库] ``` ### 2. 读写分离配置 ```python # 使用ProxySQL实现负载均衡 config = { "writer_group": [ "pg-master-01:5432", "pg-master-02:5432" ], "reader_group": [ "pg-replica-01:5432", "pg-replica-02:5432", "pg-replica-03:5432" ], "query_rules": [ {"rule_type": "read_write_split", "mode": "auto"} ] } ``` ## 五、扩展性设计 ### 1. 弹性伸缩方案 - 垂直扩展:通过cgroup实现资源隔离 - 水平扩展:基于Consul的服务发现 ### 2. 多租户支持 ```sql CREATE ROLE tenant_xxx LOGIN PASSWORD 'xxx'; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO tenant_xxx; ``` ## 六、容灾方案 ### 1. 跨区域同步 ```bash # 使用pglogical配置双向复制 SELECT pglogical.create_node( node_name := 'east_cluster', dsn := 'host=east-pg01 dbname=movie' ); SELECT pglogical.create_subscription( subscription_name := 'west_sync', provider_dsn := 'host=west-pg01 dbname=movie' ); ``` ### 2. 备份策略 | 备份类型 | 频率 | 保留周期 | 存储介质 | |---------|------|---------|---------| | 全量备份 | 每周 | 1个月 | 对象存储 | | 增量备份 | 每天 | 2周 | 本地SSD | | WAL归档 | 实时 | 6个月 | 异地存储 | ## 七、监控体系 ### 1. 关键指标采集 ```prometheus # 自定义指标规则 - record: pg_slow_query_count expr: sum(rate(pg_stat_activity_max_duration[5m])) by (datname) - record: movie_metadata_qps expr: sum(rate(http_requests_total{handler="/metadata"}[1m])) ``` ### 2. 容量预测模型 $$Storage(t) = \alpha \cdot e^{\beta t} + \gamma \cdot t^2$$ 其中$\alpha$为基准增长率,$\beta$为指数因子,$\gamma$为业务扩展系数 ## 八、典型查询优化 ### 1. 复杂关联查询 ```sql EXPLAIN (ANALYZE, BUFFERS) SELECT m.title, a.name, r.role FROM fact_movie m JOIN movie_actor_rel r USING (movie_id) JOIN dim_actor a USING (actor_id) WHERE m.release_date BETWEEN '2020-01-01' AND '2023-12-31' AND a.nationality = '美国' AND m.rating > 7.5; ``` ### 2. 向量相似检索 ```sql SELECT title, poster_vector <-> '[0.12,...,0.88]' AS distance FROM movie_posters ORDER BY distance LIMIT 10; ``` ## 演进路线规划 1. **初级阶段**:单机PostgreSQL + 基础分区 2. **中期扩展**:Citus分布式集群 + 列存扩展 3. **成熟阶段**:多模数据库联邦 + 智能调度 **设计验证指标**: - 单节点承载能力 ≥ 1亿条记录 - 复杂查询P99延迟 ≤ 500ms - 数据压缩率 ≥ 5:1 ## 最佳实践建议 1. 采用**渐进式分片迁移**策略,避免业务中断: ```bash # 使用pg_pathman在线迁移 SELECT partition_table_concurrently( 'fact_movie', batch_size := 100000, sleep_time := 1.0 ); ``` 2. 实施**列存投影**提升分析性能: ```sql CREATE ACCESS METHOD columnar TYPE COLUMNAR HANDLER columnar_handler; CREATE TABLE movie_analytics ( movie_id bigint, stats jsonb ) USING columnar; ``` 3. 使用**HLL近似统计**降低资源消耗: ```sql SELECT hll_cardinality(hll_union(actor_hll)) FROM movie_stats WHERE genre = '科幻'; ``` [^1]: 基因分片技术通过保持关联数据的物理邻近性,可减少分布式JOIN的网络开销 [^2]: Citus通过扩展PostgreSQL实现水平扩展,支持实时分析工作负载 [^3]: 混合存储架构需配合统一元数据服务实现透明访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值