为什么 GridDB 大规模并行写入返回的查询结果不一致?

问题描述 投票:0回答:1

我在分布式环境中使用 GridDB 来同时处理大量数据写入和查询。在负载下测试系统时,我遇到了并行写入操作期间查询结果不一致的问题。

场景:

  1. 集群配置:5节点GridDB集群。
  2. 数据类型:存储在容器中的时间序列数据。
  3. 存储:使用具有默认持久性和复制设置的 SSD。
  4. 版本:GridDB 4.6.1。

重现步骤:

  1. 为传感器数据创建容器:
CREATE TIME_SERIES temperature_data (
    timestamp TIMESTAMP,
    sensor_id STRING,
    temperature DOUBLE
);
  1. 同时运行:
import threading
import griddb_python as griddb

def insert_data(container, data):
    for record in data:
        container.put(record)

# Connect to GridDB
factory = griddb.StoreFactory.get_instance()
gridstore = factory.get_store(
    host="127.0.0.1",
    port=10001,
    cluster_name="defaultCluster",
    username="admin",
    password="admin"
)
container = gridstore.get_container("temperature_data")

# Generate data and write in parallel
threads = []
for i in range(10):
    data = [(f"2024-12-19T{i}:{j}:00", f"sensor_{i}", 25 + i * 0.1) for j in range(100)]
    thread = threading.Thread(target=insert_data, args=(container, data))
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

• 查询数据的单独线程:

query = "SELECT * FROM temperature_data WHERE sensor_id = 'sensor_5';"
rs = container.query(query).fetch()
for row in rs:
    print(row)
  1. 在写入操作期间监视查询结果。 当写入操作正在进行时,查询偶尔会返回。
INFO: Received write requests for container 'temperature_data'.  
WARNING: Write conflict detected for partition 3. Retrying operation.  
INFO: Query executed: SELECT * FROM temperature_data WHERE sensor_id = 'sensor_5';  
ERROR: Partition 3 replication delayed due to high write load.  
INFO: Temporary inconsistency observed in container 'temperature_data'.  
  1. GridDB 的设计目的是在不影响一致性的情况下处理并发的大容量写入和查询吗?

  2. 如何配置GridDB以确保在大量写入操作期间查询结果保持一致?

  3. 是否有特定的调整参数或架构考虑因素可以有效地处理这种情况?

griddb
1个回答
0
投票

用户在 GridDB 集群中的多个并行写入操作之间收到不一致的查询结果,尤其是时间序列数据。此行为类似于 5 节点集群,其中写入和读取同时发生。这会导致写入冲突警告和延迟恢复。

回答 由于数据库和并发进程的分布式特性,GridDB 中高度相关的记录操作之间可能会出现不一致的查询结果。当多个线程尝试同时保存数据时尤其是在高负载环境中。可能会出现不一致的情况。这会导致暂时的不一致。

为了更轻松地尝试以下步骤:

调整文本匹配级别:调整文本匹配级别 GridDB 允许您设置不同的一致性级别,这有助于了解创作操作的接受方式以及这些操作如何影响它们。如何完成阅读查询?

分布:确保您的内容均匀分布在各个部分。分配不平衡可能会导致热点、延迟和冲突。

批量写入:使用批量写入代替一次一批输入文档,以减少写入量并提高生产率。

调优参数:检查和调整与写操作相关的GridDB调优参数,例如max_write_threads和write_timeout。为了更好地支撑高负载

类分离:使用类分离技术,例如统计类。这样查询在复杂写入期间不会看到中间格式的数据。

© www.soinside.com 2019 - 2024. All rights reserved.