Использование WoodpeckerCompatible with Milvus 2.6.x
В этом руководстве объясняется, как включить и использовать Woodpecker в качестве журнала опережающей записи (WAL) в Milvus 2.6.x. Woodpecker - это облачный WAL, предназначенный для хранения объектов, обеспечивающий высокую пропускную способность, низкие эксплуатационные расходы и плавную масштабируемость. Подробную информацию об архитектуре и эталонных образцах см. в разделе Woodpecker.
Обзор
- Начиная с Milvus 2.6, Woodpecker - это дополнительный WAL, который обеспечивает упорядоченную запись и восстановление в качестве службы протоколирования.
- В качестве очереди сообщений он ведет себя аналогично Pulsar/Kafka и может быть включен через конфигурацию.
- Поддерживаются два бэкенда хранения данных: локальная файловая система (
local) и объектное хранилище (minio/S3-совместимое ).
Быстрый запуск
Чтобы включить Woodpecker, установите для типа MQ значение Woodpecker:
mq:
type: woodpecker
Примечание: Переключение mq.type для работающего кластера является операцией обновления. Внимательно выполните процедуру обновления и проверьте ее на свежем кластере, прежде чем переключать производство.
Конфигурация
Ниже приведен полный блок конфигурации Woodpecker (отредактируйте milvus.yaml или переопределите в user.yaml):
# Related configuration of woodpecker, used to manage Milvus logs of recent mutation operations, output streaming log, and provide embedded log sequential read and write.
woodpecker:
meta:
type: etcd # The Type of the metadata provider. currently only support etcd.
prefix: woodpecker # The Prefix of the metadata provider. default is woodpecker.
client:
segmentAppend:
queueSize: 10000 # The size of the queue for pending messages to be sent of each log.
maxRetries: 3 # Maximum number of retries for segment append operations.
segmentRollingPolicy:
maxSize: 256M # Maximum size of a segment.
maxInterval: 10m # Maximum interval between two segments, default is 10 minutes.
maxBlocks: 1000 # Maximum number of blocks in a segment
auditor:
maxInterval: 10s # Maximum interval between two auditing operations, default is 10 seconds.
logstore:
segmentSyncPolicy:
maxInterval: 200ms # Maximum interval between two sync operations, default is 200 milliseconds.
maxIntervalForLocalStorage: 10ms # Maximum interval between two sync operations local storage backend, default is 10 milliseconds.
maxBytes: 256M # Maximum size of write buffer in bytes.
maxEntries: 10000 # Maximum entries number of write buffer.
maxFlushRetries: 5 # Maximum size of write buffer in bytes.
retryInterval: 1000ms # Maximum interval between two retries. default is 1000 milliseconds.
maxFlushSize: 2M # Maximum size of a fragment in bytes to flush.
maxFlushThreads: 32 # Maximum number of threads to flush data
segmentCompactionPolicy:
maxSize: 2M # The maximum size of the merged files.
maxParallelUploads: 4 # The maximum number of parallel upload threads for compaction.
maxParallelReads: 8 # The maximum number of parallel read threads for compaction.
segmentReadPolicy:
maxBatchSize: 16M # Maximum size of a batch in bytes.
maxFetchThreads: 32 # Maximum number of threads to fetch data.
storage:
type: minio # The Type of the storage provider. Valid values: [minio, local]
rootPath: /var/lib/milvus/woodpecker # The root path of the storage provider.
Ключевые замечания:
woodpecker.meta- тип: В настоящее время поддерживается только
etcd. Используйте тот же etcd, что и Milvus, для хранения легких метаданных. - префикс: Префикс ключа для метаданных. По умолчанию:
woodpecker.
- тип: В настоящее время поддерживается только
woodpecker.client- Управляет поведением сегмента при добавлении/прокрутке/аудите на стороне клиента, чтобы сбалансировать пропускную способность и сквозную задержку.
woodpecker.logstore- Управляет политиками синхронизации/промывки/компактирования/чтения для сегментов журнала. Это основные регуляторы для настройки пропускной способности/задержки.
woodpecker.storage- type:
minioдля MinIO/S3-совместимых объектных хранилищ (MinIO/S3/GCS/OSS и т. д.);localдля локальных/общих файловых систем. - rootPath: Корневой путь для бэкенда хранилища (эффективно для
local; в случаеminioпути определяются bucket/prefix).
- type:
Режимы развертывания
Milvus поддерживает как автономный, так и кластерный режимы. Матрица поддержки бэкендов хранения Woodpecker:
storage.type=local | storage.type=minio | |
|---|---|---|
| Milvus Standalone | Поддерживается | Поддерживается |
| Milvus Cluster | Ограниченно (требуется общая ФС) | Поддерживается |
Примечания:
- При использовании
minioWoodpecker разделяет с Milvus одно и то же хранилище объектов (MinIO/S3/GCS/OSS и т. д.). - При использовании
localлокальный диск на одном узле подходит только для Standalone. Если все подсистемы могут получить доступ к общей файловой системе (например, NFS), в режиме кластера также можно использоватьlocal.
Совместимость объектных хранилищ для storage.type=minio
В следующей матрице приведена известная на данный момент совместимость бэкендов объектных хранилищ, когда Woodpecker настроен на storage.type=minio. Эта информация основана на GitHub Discussion #150.
| Провайдер / сервис | Статус | Примечания |
|---|---|---|
| Azure Blob Storage | Поддерживается | Используется собственный Azure SDK. |
| AWS S3 | Поддерживается | Родной S3 с полной поддержкой условной записи. |
MinIO (>= 2024-12) | Поддерживается . | Полная поддержка условной записи в S3. |
| Aliyun OSS | Поддерживается | Поддерживается через S3-совместимый интерфейс. |
| Tencent COS | Поддерживается | Поддерживается через интерфейс, совместимый с S3. |
| Облачное хранилище Google (GCS) | Поддерживается . | Поддерживается через режим совместимости с S3. |
| Huawei Cloud OBS | Не поддерживается . | Отсутствует необходимая семантика условной записи. |
| Данные VAST | Поддерживается | Проверено сообществом; работает только с неверсированными ведрами. |
| Другие S3-совместимые хранилища | Частично | Зависит от полной поддержки семантики S3 Conditional Write. |
Примечания:
- Совместимость зависит от нативной поддержки SDK или поддержки семантики S3 Conditional Write.
- Если вы самостоятельно устанавливаете MinIO для Woodpecker, используйте
RELEASE.2024-12-18T13-15-44Zили более позднюю версию. - Эта матрица отражает текущее обсуждение и может меняться по мере подтверждения поддержки бэкенда.
Руководства по развертыванию
Включение Woodpecker для кластера Milvus на Kubernetes (Milvus Operator, storage=minio)
После установки Milvus Operator запустите кластер Milvus с включенным Woodpecker, используя официальный пример:
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_woodpecker.yaml
Этот пример настраивает Woodpecker в качестве очереди сообщений и включает потоковый узел. При первом запуске может потребоваться время для извлечения изображений; подождите, пока все поды будут готовы:
kubectl get pods
kubectl get milvus my-release -o yaml | grep -A2 status
После готовности вы должны увидеть стручки, похожие на:
NAME READY STATUS RESTARTS AGE
my-release-etcd-0 1/1 Running 0 17m
my-release-etcd-1 1/1 Running 0 17m
my-release-etcd-2 1/1 Running 0 17m
my-release-milvus-datanode-7f8f88499d-kc66r 1/1 Running 0 16m
my-release-milvus-mixcoord-7cd7998d-x59kg 1/1 Running 0 16m
my-release-milvus-proxy-5b56cf8446-pbnjm 1/1 Running 0 16m
my-release-milvus-querynode-0-558d9cdd57-sgbfx 1/1 Running 0 16m
my-release-milvus-streamingnode-58fbfdfdd8-vtxfd 1/1 Running 0 16m
my-release-minio-0 1/1 Running 0 17m
my-release-minio-1 1/1 Running 0 17m
my-release-minio-2 1/1 Running 0 17m
my-release-minio-3 1/1 Running 0 17m
Выполните следующую команду, чтобы удалить кластер Milvus.
kubectl delete milvus my-release
Если вам нужно настроить параметры Woodpecker, следуйте настройкам, описанным в message storage config.
Включение Woodpecker для кластера Milvus на Kubernetes (Helm Chart, storage=minio)
Сначала добавьте и обновите диаграмму Milvus Helm, как описано в разделе Запуск Milvus в Kubernetes с помощью Helm.
Затем выполните развертывание в одном из следующих примеров:
- Кластерное развертывание (рекомендуемые настройки с включенным Woodpecker и Streaming Node):
helm install my-release zilliztech/milvus \
--set image.all.tag=v2.6.0 \
--set pulsarv3.enabled=false \
--set woodpecker.enabled=true \
--set streaming.enabled=true \
--set indexNode.enabled=false
- Автономное развертывание (Woodpecker включен):
helm install my-release zilliztech/milvus \
--set image.all.tag=v2.6.0 \
--set cluster.enabled=false \
--set pulsarv3.enabled=false \
--set standalone.messageQueue=woodpecker \
--set woodpecker.enabled=true \
--set streaming.enabled=true
После развертывания следуйте документации для переадресации портов и подключения. Чтобы настроить параметры Woodpecker, следуйте настройкам, описанным в конфигурации хранилища сообщений.
Включите Woodpecker для Milvus Standalone в Docker (storage=local)
Выполните команду Запустить Milvus в Docker. Пример:
mkdir milvus-wp && cd milvus-wp
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
# Create user.yaml to enable Woodpecker with local filesystem
cat > user.yaml <<'EOF'
mq:
type: woodpecker
woodpecker:
storage:
type: local
rootPath: /var/lib/milvus/woodpecker
EOF
bash standalone_embed.sh start
Чтобы дополнительно изменить настройки Woodpecker, обновите user.yaml и запустите bash standalone_embed.sh restart.
Включить Woodpecker для Milvus Standalone с помощью Docker Compose (storage=minio)
Выполните команду Запустить Milvus с помощью Docker Compose. Пример:
mkdir milvus-wp-compose && cd milvus-wp-compose
wget https://github.com/milvus-io/milvus/releases/download/v2.6.0/milvus-standalone-docker-compose.yml -O docker-compose.yml
# By default, the Docker Compose standalone uses Woodpecker
sudo docker compose up -d
# If you need to change Woodpecker parameters further, write an override:
docker exec -it milvus-standalone bash -lc 'cat > /milvus/configs/user.yaml <<EOF
mq:
type: woodpecker
woodpecker:
logstore:
segmentSyncPolicy:
maxFlushThreads: 16
storage:
type: minio
EOF'
# Restart the container to apply the changes
docker restart milvus-standalone
Советы по настройке пропускной способности
Основываясь на бенчмарках и ограничениях бэкенда в Woodpecker, оптимизируйте сквозную пропускную способность записи со следующих точек зрения:
- Хранилище
- Объектное хранилище (совместимое с minio/S3): Увеличьте параллельность и размер объектов (избегайте маленьких объектов). Следите за ограничениями пропускной способности сети и ведра. Пропускная способность одного узла MinIO на SSD часто составляет около 100 МБ/с на локальном уровне; скорость одного узла EC2 в S3 может достигать ГБ/с.
- Локальные/общие файловые системы (локальные): Предпочитайте NVMe/быстрые диски. Убедитесь, что ФС хорошо справляется с небольшими записями и задержками fsync.
- Ручки дятла
- Увеличьте
logstore.segmentSyncPolicy.maxFlushSizeиmaxFlushThreadsдля больших объемов флеша и более высокого параллелизма. - Настройте
maxIntervalв соответствии с характеристиками носителя (обменяйте задержку на пропускную способность при более длительной агрегации). - Для объектных хранилищ следует увеличить
segmentRollingPolicy.maxSize, чтобы уменьшить переключение сегментов.
- Увеличьте
- Сторона клиента/приложения
- Используйте большие размеры пакетов и большее число одновременно работающих писателей/клиентов.
- Контролируйте время обновления/создания индекса (пакетная вставка перед срабатыванием), чтобы избежать частых небольших записей.
Демонстрация пакетной вставки
from pymilvus import MilvusClient
import random
# 1. Set up a Milvus client
client = MilvusClient(
uri="http://<Proxy Pod IP>:27017",
)
# 2. Create a collection
res = client.create_collection(
collection_name="test_milvus_wp",
dimension=512,
metric_type="IP",
shards_num=2,
)
print(res)
# 3. Insert randomly generated vectors
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = []
batch_size = 1000
batch_count = 2000
for j in range(batch_count):
start_time = time.time()
print(f"Inserting {j}th vectors {j * batch_size} startTime{start_time}")
for i in range(batch_size):
current_color = random.choice(colors)
data.append({
"id": (j*batch_size + i),
"vector": [ random.uniform(-1, 1) for _ in range(512) ],
"color": current_color,
"color_tag": f"{current_color}_{str(random.randint(1000, 9999))}"
})
res = client.insert(
collection_name="test_milvus_wp",
data=data
)
data = []
print(f"Inserted {j}th vectors endTime:{time.time()} costTime:{time.time() - start_time}")
Латентность
Woodpecker - это облачный нативный WAL, предназначенный для объектного хранилища с компромиссами между пропускной способностью, стоимостью и задержкой. В поддерживаемом в настоящее время облегченном встроенном режиме приоритет отдается оптимизации стоимости и пропускной способности, поскольку в большинстве сценариев требуется только запись данных в течение определенного времени, а не низкая задержка для отдельных запросов на запись. Поэтому Woodpecker использует пакетную запись с интервалами по умолчанию 10 мс для локальных файловых систем и 200 мс для MinIO-подобных систем хранения. При медленных операциях записи максимальная задержка равна времени интервала плюс время промывки.
Обратите внимание, что пакетная вставка инициируется не только временными интервалами, но и размером пакета, который по умолчанию равен 2 МБ.
Подробные сведения об архитектуре, режимах развертывания (MemoryBuffer / QuorumBuffer) и производительности см. в разделе Архитектура Woodpecker.
Для получения более подробной информации о параметрах обратитесь к репозиторию Woodpecker на GitHub.