milvus-logo
LFAI
홈페이지
  • 사용자 가이드

파티션 관리

이 가이드에서는 컬렉션에서 파티션을 만들고 관리하는 방법을 안내합니다.

개요

Milvus에서 파티션은 컬렉션의 하위 분할을 나타냅니다. 이 기능을 사용하면 컬렉션의 물리적 저장 공간을 여러 부분으로 나눌 수 있으므로 전체 컬렉션이 아닌 더 작은 데이터 하위 집합으로 초점을 좁혀 쿼리 성능을 개선할 수 있습니다.

컬렉션을 만들면 최소한 _default라는 이름의 기본 파티션이 자동으로 생성됩니다. 컬렉션 내에 최대 1,024개의 파티션을 만들 수 있습니다.

참고

Milvus는 파티션 키라는 기능을 도입하여 기본 파티션을 활용하여 특정 필드의 해시값을 기반으로 엔티티를 저장합니다. 이 기능은 멀티테넌시 구현을 용이하게 하여 검색 성능을 향상시킵니다. 자세한 내용은 파티션 키 사용을 참조하세요.

컬렉션에서 파티션 키 기능이 켜져 있으면 Milvus가 모든 파티션 관리를 처리하므로 사용자는 이러한 부담을 덜 수 있습니다.

준비

아래 코드 스니펫은 기존 코드를 재구성하여 Milvus에 연결을 설정하고 빠른 설정 모드에서 컬렉션을 생성하는 것으로, 컬렉션 생성 시 컬렉션이 로드됨을 나타냅니다.

준비를 위해 MilvusClient 를 사용하여 Milvus에 연결하고 create_collection() 를 사용하여 빠른 설정 모드로 컬렉션을 생성합니다.

준비를 위해 MilvusClientV2 을 사용하여 Milvus에 연결하고 createCollection() 를 사용하여 빠른 설정 모드에서 컬렉션을 생성합니다.

준비하려면 MilvusClient 을 사용하여 Milvus에 연결하고 createCollection() 를 사용하여 빠른 설정 모드에서 컬렉션을 생성합니다.

from pymilvus import MilvusClient, DataType

# 1. Set up a Milvus client
client = MilvusClient(
    uri="http://localhost:19530"
)

# 2. Create a collection
client.create_collection(
    collection_name="quick_setup",
    dimension=5,
)

import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.CreateCollectionReq;

String CLUSTER_ENDPOINT = "http://localhost:19530";

// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
    .uri(CLUSTER_ENDPOINT)
    .build();

MilvusClientV2 client = new MilvusClientV2(connectConfig);

// 2. Create a collection in quick setup mode
CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()
    .collectionName("quick_setup")
    .dimension(5)
    .build();

client.createCollection(quickSetupReq);
const address = "http://localhost:19530"

// 1. Set up a Milvus Client
client = new MilvusClient({address});

// 2. Create a collection in quick setup mode
await client.createCollection({
    collection_name: "quick_setup",
    dimension: 5,
});  

참고

위의 코드 스니펫에서는 컬렉션과 함께 컬렉션의 인덱스가 생성되어 컬렉션이 생성될 때 로드되었음을 나타냅니다.

목록 파티션

컬렉션이 준비되면 컬렉션의 파티션을 나열할 수 있습니다.

파티션을 나열하려면 list_partitions().

파티션을 나열하려면 listPartitions().

파티션을 나열하려면 listPartitions().

# 3. List partitions
res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default"]
import io.milvus.v2.service.partition.request.ListPartitionsReq;

// 3. List all partitions in the collection
ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()
    .collectionName("quick_setup")
    .build();

List<String> partitionNames = client.listPartitions(listPartitionsReq);

System.out.println(partitionNames);

// Output:
// ["_default"]
// 3. List partitions
res = await client.listPartitions({
    collection_name: "quick_setup"
})

console.log(res.partition_names)

// Output
// 
// [ '_default' ]
// 

위 코드 스니펫의 출력에는 지정된 컬렉션 내의 파티션 이름이 포함됩니다.

참고

컬렉션에서 필드를 파티션 키로 설정한 경우 Milvus는 컬렉션과 함께 최소 64개의 파티션을 생성합니다. 파티션을 나열할 때 결과는 위 코드 조각의 출력과 다를 수 있습니다.

자세한 내용은 파티션 키 사용을 참조하세요.

파티션 만들기

컬렉션에 파티션을 더 추가할 수 있습니다. 컬렉션에는 최대 1,024개의 파티션을 가질 수 있습니다.

파티션을 생성하려면 create_partition().

파티션을 생성하려면 createPartition().

파티션을 만들려면 createPartition().

# 4. Create more partitions
client.create_partition(
    collection_name="quick_setup",
    partition_name="partitionA"
)

client.create_partition(
    collection_name="quick_setup",
    partition_name="partitionB"
)

res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default", "partitionA", "partitionB"]
import io.milvus.v2.service.partition.request.CreatePartitionReq;

// 4. Create more partitions
CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

client.createPartition(createPartitionReq);

createPartitionReq = CreatePartitionReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionB")
    .build();

client.createPartition(createPartitionReq);

listPartitionsReq = ListPartitionsReq.builder()
    .collectionName("quick_setup")
    .build();

partitionNames = client.listPartitions(listPartitionsReq);

System.out.println(partitionNames);

// Output:
// [
//     "_default",
//     "partitionA",
//     "partitionB"
// ]
// 4. Create more partitions
await client.createPartition({
    collection_name: "quick_setup",
    partition_name: "partitionA"
})

await client.createPartition({
    collection_name: "quick_setup",
    partition_name: "partitionB"
})

res = await client.listPartitions({
    collection_name: "quick_setup"
})

console.log(res.partition_names)

// Output
// 
// [ '_default', 'partitionA', 'partitionB' ]
// 

위의 코드 스니펫은 컬렉션에 파티션을 만들고 컬렉션의 파티션을 나열합니다.

참고

컬렉션에서 필드를 파티션 키로 설정한 경우 Milvus에서 컬렉션의 파티션 관리를 처리합니다. 따라서 파티션을 만들려고 할 때 메시지가 표시되는 오류가 발생할 수 있습니다.

자세한 내용은 파티션 키 사용을 참조하세요.

특정 파티션 확인

특정 파티션의 존재 여부를 확인할 수도 있습니다.

특정 파티션을 확인하려면 has_partition().

특정 파티션을 확인하려면 hasPartition().

특정 파티션을 확인하려면 hasPartition().

# 5. Check whether a partition exists
res = client.has_partition(
    collection_name="quick_setup",
    partition_name="partitionA"
)
print(res)

# Output
#
# True

res = client.has_partition(
    collection_name="quick_setup",
    partition_name="partitionC"
)
print(res)

# Output
#
# False
import io.milvus.v2.service.partition.request.HasPartitionReq;

// 5. Check whether a partition exists
HasPartitionReq hasPartitionReq = HasPartitionReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

boolean exists = client.hasPartition(hasPartitionReq);

System.out.println(exists);

// Output:
// true

hasPartitionReq = HasPartitionReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionC")
    .build();

exists = client.hasPartition(hasPartitionReq);

System.out.println(exists);

// Output:
// false
// 5. Check whether a partition exists
res = await client.hasPartition({
    collection_name: "quick_setup",
    partition_name: "partitionA"
})

console.log(res.value)

// Output
// 
// true
// 

res = await client.hasPartition({
    collection_name: "quick_setup",
    partition_name: "partitionC"
})

console.log(res.value)

// Output
// 
// false
// 

위의 코드 스니펫은 컬렉션에 partitionApartitionC 이라는 이름의 파티션이 있는지 확인합니다.

파티션 로드 및 해제

특정 파티션을 로드 및 해제하여 검색 및 쿼리에 사용할 수 있게 하거나 사용할 수 없게 할 수 있습니다.

로드 상태 보기

컬렉션 및 해당 파티션의 로드 상태를 확인하려면 get_load_state().

컬렉션 및 해당 파티션의 로드 상태를 확인하려면 getLoadState().

컬렉션 및 해당 파티션의 로드 상태를 확인하려면 getLoadState().

# Release the collection
client.release_collection(collection_name="quick_setup")

# Check the load status
res = client.get_load_state(collection_name="quick_setup")
print(res)

# Output
#
# {
#     "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
    collection_name="quick_setup", 
    partition_name="partitionA"
)

print(res)

# Output
#
# {
#     "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
    collection_name="quick_setup", 
    partition_name="partitionB"
)

print(res)

# Output
#
# {
#     "state": "<LoadState: NotLoad>"
# }

import io.milvus.v2.service.collection.request.GetLoadStateReq;
import io.milvus.v2.service.collection.request.ReleaseCollectionReq;
import io.milvus.v2.service.partition.request.LoadPartitionsReq;
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;

// 6. Load a partition independantly
// 6.1 Release the collection
ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()
    .collectionName("quick_setup")
    .build();

client.releaseCollection(releaseCollectionReq);

// 6.2 Load partitionA
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
    .collectionName("quick_setup")
    .partitionNames(List.of("partitionA"))
    .build();

client.loadPartitions(loadPartitionsReq);

Thread.sleep(3000);

// 6.3 Check the load status of the collection and its partitions
GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .build();

boolean state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// true

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// true

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionB")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// false
// 6. Load a partition indenpendantly
await client.releaseCollection({
    collection_name: "quick_setup"
})

res = await client.getLoadState({
    collection_name: "quick_setup"
})

console.log(res.state)

// Output
// 
// LoadStateNotLoad
// 

await client.loadPartitions({
    collection_name: "quick_setup",
    partition_names: ["partitionA"]
})

await sleep(3000)

res = await client.getLoadState({
    collection_name: "quick_setup"
})

console.log(res.state)

// Output
// 
// LoadStateLoaded
// 

res = await client.getLoadState({
    collection_name: "quick_setup",
    partition_name: "partitionA"
})

console.log(res.state)

// Output
// 
// LoadStateLoaded
// 

res = await client.getLoadState({
    collection_name: "quick_setup",
    partition_name: "partitionB"
})

console.log(res.state)

// Output
// 
// LoadStateLoaded
// 

가능한 로드 상태는 다음 중 하나일 수 있습니다.

  • 로드됨

    컬렉션의 파티션 중 하나 이상이 로드된 경우 컬렉션은 Loaded 으로 표시됩니다.

  • NotLoad

    컬렉션의 파티션이 로드되지 않은 경우 컬렉션은 NotLoad 으로 표시됩니다.

  • 로드 중

    컬렉션의 파티션 중 하나 이상이 로드 중인 경우 컬렉션은 로드 중으로 표시됩니다.

파티션 로드

컬렉션의 모든 파티션을 로드하려면 다음을 호출하면 됩니다. load_collection(). 컬렉션의 특정 파티션을 로드하려면 load_partitions().

컬렉션의 모든 파티션을 로드하려면, 그냥 loadCollection(). 컬렉션의 특정 파티션을 로드하려면 loadPartitions().

컬렉션의 모든 파티션을 로드하려면, 그냥 loadCollection(). 컬렉션의 특정 파티션을 로드하려면 loadPartitions().

client.load_partitions(
    collection_name="quick_setup",
    partition_names=["partitionA"]
)

res = client.get_load_state(collection_name="quick_setup")
print(res)

# Output
#
# {
#     "state": "<LoadState: Loaded>"
# }
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
    .collectionName("quick_setup")
    .partitionNames(List.of("partitionA"))
    .build();

client.loadPartitions(loadPartitionsReq);

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// true
await client.loadPartitions({
    collection_name: "quick_setup",
    partition_names: ["partitionA"]
})

res = await client.getLoadState({
    collection_name: "quick_setup",
    partition_name: "partitionA"
})

console.log(res.state)

// Output
// 
// LoadStateLoaded
//

한 번에 여러 파티션을 로드하려면 다음과 같이 하세요:

client.load_partitions(
    collection_name="quick_setup",
    partition_names=["partitionA", "partitionB"]
)

res = client.get_load_state(
    collection_name="quick_setup",
    partition_name="partitionA"
)

# Output
#
# {
#     "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
    collection_name="quick_setup",
    partition_name="partitionB"
)

# Output
#
# {
#     "state": "<LoadState: Loaded>"
# }
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
    .collectionName("quick_setup")
    .partitionNames(List.of("partitionA", "partitionB"))
    .build();

client.loadPartitions(loadPartitionsReq);

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// true

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionB")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// true
await client.loadPartitions({
    collection_name: "quick_setup",
    partition_names: ["partitionA", "partitionB"]
})

res = await client.getLoadState({
    collection_name: "quick_setup",
    partition_name: "partitionA"
})

console.log(res)

// Output
// 
// LoadStateLoaded
// 

res = await client.getLoadState({
    collection_name: "quick_setup",
    partition_name: "partitionB"
})

console.log(res)

// Output
// 
// LoadStateLoaded
// 

하나 이상의 파티션에서 지정된 필드를 로드하려면 다음과 같이 하세요:

client.load_partitions(
    collection_name="quick_setup",
    partition_names=["partitionA"],
    load_fields=["id", "vector"],
    skip_load_dynamic_field=True
)

load_fields 에 나열된 필드만 검색 및 쿼리에서 필터링 조건 및 출력 필드로 사용할 수 있습니다. 목록에 항상 기본 키를 포함해야 합니다. 로드에서 제외된 필드 이름은 필터링이나 출력에 사용할 수 없습니다.

skip_load_dynamic_field=True 을 사용하여 동적 필드 로드를 건너뛸 수 있습니다. Milvus는 동적 필드를 단일 필드로 취급하므로 동적 필드의 모든 키가 함께 포함되거나 제외됩니다.

파티션 해제

컬렉션의 모든 파티션을 해제하려면 간단히 release_collection(). 컬렉션의 특정 파티션을 해제하려면 release_partitions().

컬렉션의 모든 파티션을 해제하려면 releaseCollection(). 컬렉션의 특정 파티션을 해제하려면 releasePartitions().

컬렉션의 모든 파티션을 해제하려면 다음을 호출하면 됩니다. releaseCollection(). 컬렉션의 특정 파티션을 해제하려면 releasePartitions().

# 7. Release a partition
client.release_partitions(
    collection_name="quick_setup",
    partition_names=["partitionA"]
)

res = client.get_load_state(
    collection_name="quick_setup", 
    partition_name="partitionA"
)

print(res)

# Output
#
# {
#     "state": "<LoadState: NotLoad>"
# }

import io.milvus.v2.service.partition.request.ReleasePartitionsReq;

// 7. Release a partition
ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()
    .collectionName("quick_setup")
    .partitionNames(List.of("partitionA"))
    .build();

client.releasePartitions(releasePartitionsReq);

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .partitionName("partitionA")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// false
// 7. Release a partition
await client.releasePartitions({
    collection_name: "quick_setup",
    partition_names: ["partitionA"]
})

res = await client.getLoadState({
    collection_name: "quick_setup"
})

console.log(res.state)

// Output
// 
// LoadStateNotLoad
// 

한 번에 여러 파티션을 해제하려면 다음과 같이 하세요:

client.release_partitions(
    collection_name="quick_setup",
    partition_names=["_default", "partitionA", "partitionB"]
)

res = client.get_load_state(
    collection_name="quick_setup",
)

# Output
#
# {
#     "state": "<LoadState: NotLoad>"
# }

파티션 삭제

파티션을 릴리스한 후 더 이상 필요하지 않은 경우 파티션을 삭제할 수 있습니다.

파티션을 삭제하려면 drop_partition().

파티션을 삭제하려면 dropPartition().

파티션을 삭제하려면 dropPartition().

# 8. Drop a partition
client.drop_partition(
    collection_name="quick_setup",
    partition_name="partitionB"
)

res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default", "partitionA"]
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;

ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()
    .collectionName("quick_setup")
    .partitionNames(List.of("_default", "partitionA", "partitionB"))
    .build();

client.releasePartitions(releasePartitionsReq);

getLoadStateReq = GetLoadStateReq.builder()
    .collectionName("quick_setup")
    .build();

state = client.getLoadState(getLoadStateReq);

System.out.println(state);

// Output:
// false

await client.releasePartitions({
    collection_name: "quick_setup",
    partition_names: ["_default", "partitionA", "partitionB"]
})

res = await client.getLoadState({
    collection_name: "quick_setup"
})

console.log(res)

// Output
// 
// {
//   status: {
//     error_code: 'Success',
//     reason: '',
//     code: 0,
//     retriable: false,
//     detail: ''
//   },
//   state: 'LoadStateNotLoad'
// }
// 

참고

파티션을 삭제하기 전에 메모리에서 파티션을 해제해야 합니다.

FAQ

  • 파티션에 얼마나 많은 데이터를 저장할 수 있나요?

    파티션에는 1B 미만의 데이터를 저장하는 것이 좋습니다.

  • 생성할 수 있는 파티션의 최대 개수는 몇 개인가요?

    기본적으로 Milvus는 최대 1,024개의 파티션을 생성할 수 있습니다. rootCoord.maxPartitionNum 을 구성하여 최대 파티션 수를 조정할 수 있습니다. 자세한 내용은 시스템 구성을 참조하세요.

  • 파티션과 파티션 키를 어떻게 구분하나요?

    파티션은 물리적 저장 단위인 반면, 파티션 키는 지정된 열을 기반으로 특정 파티션에 데이터를 자동으로 할당하는 논리적 개념입니다.

    예를 들어 Milvus에서 파티션 키가 color 필드로 정의된 컬렉션이 있는 경우, 시스템은 각 엔터티의 color 필드의 해시값을 기반으로 데이터를 파티션에 자동으로 할당합니다. 이 자동화된 프로세스는 사용자가 데이터를 삽입하거나 검색할 때 파티션을 수동으로 지정해야 하는 수고를 덜어줍니다.

    반면에 수동으로 파티션을 생성할 때는 파티션 키의 기준에 따라 각 파티션에 데이터를 할당해야 합니다. 예를 들어 color 필드가 있는 컬렉션이 있는 경우 color 값이 red 인 엔티티는 partition A 에, color 값이 blue 인 엔티티는 partition B 에 수동으로 할당해야 합니다. 이 수동 관리에는 더 많은 노력이 필요합니다.

    요약하면, 파티션과 파티션 키는 모두 데이터 계산을 최적화하고 쿼리 효율성을 향상시키는 데 활용됩니다. 파티션 키를 활성화한다는 것은 파티션 데이터 삽입 및 로딩의 수동 관리에 대한 통제권을 포기하는 것을 의미하며, 이러한 프로세스는 Milvus에서 완전히 자동화되어 처리되므로 이를 인식하는 것이 중요합니다.

번역DeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?