사용 방법
통합 배치 및 스트림 처리와 클라우드 네이티브 아키텍처를 특징으로 하는 Milvus 2.0은 삭제 기능을 개발하는 과정에서 이전 버전보다 더 큰 도전에 직면하게 됩니다. 하지만 고급 스토리지-컴퓨팅 분리 설계와 유연한 게시/구독 메커니즘 덕분에 이를 달성할 수 있었음을 발표하게 되어 자랑스럽게 생각합니다. Milvus 2.0에서는 기본 키로 특정 컬렉션의 엔터티를 삭제할 수 있으며, 삭제된 엔터티는 더 이상 검색 또는 쿼리 결과에 나열되지 않습니다.
Milvus의 삭제 작업은 논리적 삭제를 의미하며, 물리적 데이터 정리는 데이터 압축 중에 수행된다는 점에 유의하세요. 논리적 삭제는 I/O 속도에 제약을 받는 검색 성능을 크게 향상시킬 뿐만 아니라 데이터 복구도 용이하게 해줍니다. 논리적으로 삭제된 데이터는 시간 이동 기능을 사용해 복구할 수 있습니다.
사용 방법
먼저 Milvus 2.0에서 DELETE 함수를 사용해 보겠습니다. (다음 예제는 Milvus 2.0.0에서 PyMilvus 2.0.0을 사용합니다).
from pymilvus import connections, utility, Collection, DataType, FieldSchema, CollectionSchema
# Connect to Milvus
connections.connect(
alias="default",
host='x.x.x.x',
port='19530'
)
# Create a collection with Strong Consistency level
pk_field = FieldSchema(
name="id",
dtype=DataType.INT64,
is_primary=True,
)
vector_field = FieldSchema(
name="vector",
dtype=DataType.FLOAT_VECTOR,
dim=2
)
schema = CollectionSchema(
fields=[pk_field, vector_field],
description="Test delete"
)
collection_name = "test_delete"
collection = Collection(
name=collection_name,
schema=schema,
using='default',
shards_num=2,
consistency_level="Strong"
)
# Insert randomly generated vectors
import random
data = [
[i for i in range(100)],
[[random.random() for _ in range(2)] for _ in range(100)],
]
collection.insert(data)
# Query to make sure the entities to delete exist
collection.load()
expr = "id in [2,4,6,8,10]"
pre_del_res = collection.query(
expr,
output_fields = ["id", "vector"]
)
print(pre_del_res)
# Delete the entities with the previous expression
collection.delete(expr)
# Query again to check if the deleted entities exist
post_del_res = collection.query(
expr,
output_fields = ["id", "vector"]
)
print(post_del_res)
구현
Milvus 인스턴스에서 데이터 노드는 주로 스트리밍 데이터(로그 브로커의 로그)를 기록 데이터(로그 스냅샷)로 패킹하고 자동으로 객체 스토리지로 플러시하는 역할을 담당합니다. 쿼리 노드는 전체 데이터, 즉 스트리밍 데이터와 기록 데이터 모두에 대한 검색 요청을 실행합니다.
클러스터 내 병렬 노드의 데이터 쓰기 용량을 최대한 활용하기 위해 Milvus는 기본 키 해싱을 기반으로 하는 샤딩 전략을 채택하여 쓰기 작업을 여러 작업자 노드에 균등하게 분산시킵니다. 즉, 프록시는 엔티티의 DML(데이터 조작 언어) 메시지(즉, 요청)를 동일한 데이터 노드와 쿼리 노드로 라우팅합니다. 이러한 메시지는 DML 채널을 통해 게시되고 데이터 노드와 쿼리 노드에서 별도로 소비되어 검색 및 쿼리 서비스를 함께 제공합니다.
데이터 노드
데이터 노드는 데이터 INSERT 메시지를 수신하면 메모리에서 스트리밍 데이터를 수신하기 위해 생성된 새로운 세그먼트인 증가하는 세그먼트에 데이터를 삽입합니다. 데이터 행 수 또는 증가하는 세그먼트의 지속 시간이 임계값에 도달하면 데이터 노드는 세그먼트를 봉인하여 더 이상 데이터가 들어오는 것을 방지합니다. 그런 다음 데이터 노드는 기록 데이터가 포함된 봉인된 세그먼트를 오브젝트 스토리지로 플러시합니다. 한편, 데이터 노드는 새로운 데이터의 기본 키를 기반으로 블룸 필터를 생성하여 봉인된 세그먼트와 함께 오브젝트 스토리지에 플러시하고, 블룸 필터를 세그먼트의 통계 정보가 포함된 통계 바이너리 로그(binlog)의 일부로 저장합니다.
블룸 필터는 긴 이진 벡터와 일련의 무작위 매핑 함수로 구성된 확률적 데이터 구조입니다. 어떤 요소가 집합의 멤버인지 여부를 테스트하는 데 사용할 수 있지만 오탐을 반환할 수 있습니다. -- 위키백과
데이터 삭제 메시지가 들어오면 데이터 노드는 해당 샤드의 모든 블룸 필터를 버퍼링하고 메시지에 제공된 기본 키와 일치시켜 삭제할 엔티티를 포함할 가능성이 있는 모든 세그먼트(성장 중인 세그먼트와 봉인된 세그먼트 모두에서)를 검색합니다. 해당 세그먼트를 정확히 찾아낸 데이터 노드는 메모리에 버퍼링하여 삭제 작업을 기록하는 델타 빈로그를 생성한 다음 해당 빈로그를 세그먼트와 함께 오브젝트 스토리지로 다시 플러시합니다.
데이터 노드
하나의 샤드에는 하나의 DML 채널만 할당되므로 클러스터에 추가된 추가 쿼리 노드는 DML 채널에 가입할 수 없습니다. 모든 쿼리 노드가 DELETE 메시지를 수신할 수 있도록 하기 위해, 데이터 노드는 DML-Channel에서 DELETE 메시지를 필터링하고 이를 Delta-Channel로 전달하여 모든 쿼리 노드에 삭제 작업을 알립니다.
쿼리 노드
오브젝트 스토리지에서 컬렉션을 로드할 때 쿼리 노드는 먼저 각 샤드의 체크포인트를 가져와 마지막 플러시 작업 이후의 DML 작업을 표시합니다. 이 체크포인트를 기반으로 쿼리 노드는 모든 봉인된 세그먼트와 해당 델타 빈로그 및 블룸 필터를 함께 로드합니다. 모든 데이터가 로드되면 쿼리 노드는 DML 채널, 델타 채널, 쿼리 채널에 가입합니다.
컬렉션이 메모리에 로드된 후 더 많은 데이터 INSERT 메시지가 오면 쿼리 노드는 먼저 메시지에 따라 증가하는 세그먼트를 찾아내고 쿼리 전용으로 메모리에 있는 해당 블룸 필터를 업데이트합니다. 이러한 쿼리 전용 블룸 필터는 쿼리가 완료된 후에도 오브젝트 스토리지로 플러시되지 않습니다.
쿼리 노드
위에서 언급했듯이, 특정 수의 쿼리 노드만 DML-Channel로부터 DELETE 메시지를 수신할 수 있으며, 이는 증가하는 세그먼트에서 해당 노드만 DELETE 요청을 실행할 수 있음을 의미합니다. DML-Channel에 가입한 쿼리 노드의 경우, 먼저 성장하는 세그먼트에서 DELETE 메시지를 필터링하고, 제공된 기본 키를 성장하는 세그먼트의 쿼리 전용 블룸 필터와 일치시켜 엔터티를 찾은 다음, 해당 세그먼트에서 삭제 작업을 기록합니다.
DML 채널에 가입할 수 없는 쿼리 노드는 델타 채널에만 가입할 수 있기 때문에 봉인된 세그먼트에 대한 검색 또는 쿼리 요청만 처리하고 데이터 노드가 전달한 DELETE 메시지를 수신할 수 있습니다. 델타 채널에서 봉인된 세그먼트의 모든 DELETE 메시지를 수집한 쿼리 노드는 제공된 기본 키를 봉인된 세그먼트의 블룸 필터와 일치시켜 엔티티를 찾은 다음 해당 세그먼트에서 삭제 작업을 기록합니다.
결국 검색 또는 쿼리에서 쿼리 노드는 삭제 레코드를 기반으로 비트셋을 생성하여 삭제된 엔티티를 생략하고 세그먼트 상태에 관계없이 모든 세그먼트의 나머지 엔티티 중에서 검색합니다. 마지막으로 일관성 수준은 삭제된 데이터의 가시성에 영향을 미칩니다. 이전 코드 샘플에 표시된 것처럼 강력한 일관성 수준에서는 삭제된 엔티티가 삭제 후 즉시 보이지 않습니다. 경계 일관성 수준을 적용하면 삭제된 엔터티가 보이지 않게 되기까지 몇 초의 지연 시간이 발생합니다.
다음 단계는 무엇인가요?
2.0의 새로운 기능 시리즈 블로그에서는 새로운 기능의 설계에 대해 설명할 예정입니다. 이 블로그 시리즈에서 자세히 읽어보세요!
- 구현
- 다음 단계는 무엇인가요?
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word