Menggunakan WoodpeckerCompatible with Milvus 2.6.x
Panduan ini menjelaskan cara mengaktifkan dan menggunakan Woodpecker sebagai Write-Ahead Log (WAL) di Milvus 2.6.x. Woodpecker adalah WAL cloud-native yang dirancang untuk penyimpanan objek, menawarkan throughput yang tinggi, overhead operasional yang rendah, dan skalabilitas yang lancar. Untuk detail arsitektur dan tolok ukur, lihat Woodpecker.
Gambaran Umum
- Dimulai dari Milvus 2.6, Woodpecker adalah WAL opsional yang menyediakan penulisan dan pemulihan yang dipesan sebagai layanan pencatatan.
- Sebagai pilihan antrean pesan, ia berperilaku mirip dengan Pulsar/Kafka dan dapat diaktifkan melalui konfigurasi.
- Dua backend penyimpanan didukung: sistem berkas lokal (
local) dan penyimpanan objek (minio/Kompatibel dengan S3).
Memulai dengan cepat
Untuk mengaktifkan Woodpecker, atur jenis MQ ke Woodpecker:
mq:
type: woodpecker
Catatan: Mengalihkan mq.type untuk cluster yang sedang berjalan merupakan operasi upgrade. Ikuti prosedur peningkatan dengan hati-hati dan validasi pada cluster yang baru sebelum mengalihkan produksi.
Konfigurasi
Di bawah ini adalah blok konfigurasi Woodpecker lengkap (edit milvus.yaml atau timpa di 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.
Catatan kunci:
woodpecker.meta- tipe: Saat ini hanya
etcdyang didukung. Gunakan kembali etcd yang sama dengan Milvus untuk menyimpan metadata ringan. - prefix: Awalan kunci untuk metadata. Default:
woodpecker.
- tipe: Saat ini hanya
woodpecker.client- Mengontrol perilaku penambahan/pengguliran/pengauditan segmen di sisi klien untuk menyeimbangkan throughput dan latensi ujung ke ujung.
woodpecker.logstore- Mengontrol kebijakan sinkronisasi/flush/pemadatan/pembacaan untuk segmen log. Ini adalah tombol utama untuk penyetelan throughput/latensi.
woodpecker.storage- tipe:
miniountuk penyimpanan objek yang kompatibel dengan MinIO/S3 (MinIO/S3/GCS/OSS, dll.);localuntuk sistem berkas lokal/bersama. - rootPath: Jalur root untuk backend penyimpanan (efektif untuk
local; denganminio, jalur ditentukan oleh bucket/prefix).
- tipe:
Mode penyebaran
Milvus mendukung mode Standalone dan Cluster. Matriks dukungan backend penyimpanan Woodpecker:
storage.type=local | storage.type=minio | |
|---|---|---|
| Milvus Standalone | Didukung | Didukung |
| Milvus Cluster | Terbatas (membutuhkan FS bersama) | Didukung |
Catatan:
- Dengan
minio, Woodpecker berbagi penyimpanan objek yang sama dengan Milvus (MinIO / S3 / GCS / OS, dll.). - Dengan
local, disk lokal simpul tunggal hanya cocok untuk Standalone. Jika semua pod dapat mengakses sistem berkas bersama (misal, NFS), mode Cluster juga dapat menggunakanlocal.
Kompatibilitas penyimpanan objek untuk storage.type=minio
Matriks berikut ini merangkum kompatibilitas yang diketahui saat ini dari backend penyimpanan objek saat Woodpecker dikonfigurasi dengan storage.type=minio. Informasi ini didasarkan pada Diskusi GitHub #150.
| Penyedia / layanan | Status | Catatan |
|---|---|---|
| Penyimpanan Azure Blob | Didukung | Menggunakan SDK Azure asli. |
| AWS S3 | Didukung | S3 asli dengan dukungan Penulisan Bersyarat penuh. |
MinIO (>= 2024-12) | Didukung | Dukungan penuh S3 Conditional Write. |
| Aliyun OSS | Didukung | Didukung melalui antarmuka yang kompatibel dengan S3. |
| Tencent COS | Didukung | Didukung melalui antarmuka yang kompatibel dengan S3. |
| Google Cloud Storage (GCS) | Didukung | Didukung melalui mode interoperabilitas S3. |
| Huawei Cloud OBS | Tidak didukung | Tidak memiliki semantik Tulis Bersyarat yang diperlukan. |
| Data yang sangat besar | Didukung | Diverifikasi oleh komunitas; hanya berfungsi dengan bucket yang tidak berversi. |
| Penyimpanan lain yang kompatibel dengan S3 | Sebagian | Bergantung pada dukungan penuh untuk semantik S3 Conditional Write. |
Catatan:
- Kompatibilitas bergantung pada dukungan SDK asli atau dukungan untuk semantik S3 Conditional Write.
- Jika Anda menghosting sendiri MinIO untuk Woodpecker, gunakan
RELEASE.2024-12-18T13-15-44Zatau yang lebih baru. - Matriks ini mencerminkan diskusi saat ini dan dapat berkembang seiring dengan dukungan backend yang divalidasi lebih lanjut.
Panduan penerapan
Aktifkan Woodpecker untuk Milvus Cluster di Kubernetes (Milvus Operator, storage=minio)
Setelah menginstal Milvus Operator, mulai cluster Milvus dengan Woodpecker yang diaktifkan menggunakan sampel resmi:
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_woodpecker.yaml
Sampel ini mengonfigurasi Woodpecker sebagai antrean pesan dan mengaktifkan Streaming Node. Startup pertama mungkin memerlukan waktu untuk menarik gambar; tunggu sampai semua pod siap:
kubectl get pods
kubectl get milvus my-release -o yaml | grep -A2 status
Jika sudah siap, Anda akan melihat pod yang mirip dengan:
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
Jalankan perintah berikut untuk mencopot pemasangan cluster Milvus.
kubectl delete milvus my-release
Jika Anda perlu menyesuaikan parameter Woodpecker, ikuti pengaturan yang dijelaskan dalam konfigurasi penyimpanan pesan.
Mengaktifkan Woodpecker untuk Milvus Cluster di Kubernetes (Helm Chart, storage=minio)
Pertama-tama, tambahkan dan perbarui bagan Helm Milvus seperti yang dijelaskan di Menjalankan Milvus di Kubernetes dengan Helm.
Kemudian, terapkan dengan salah satu contoh berikut:
- Penempatan cluster (pengaturan yang disarankan dengan mengaktifkan Woodpecker dan 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
- Penempatan mandiri (Woodpecker diaktifkan):
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
Setelah penerapan, ikuti dokumen untuk meneruskan porting dan menghubungkan. Untuk menyesuaikan parameter Woodpecker, ikuti pengaturan yang dijelaskan dalam konfigurasi penyimpanan pesan.
Mengaktifkan Woodpecker untuk Milvus Standalone di Docker (penyimpanan = lokal)
Ikuti Jalankan Milvus di Docker. Contoh:
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
Untuk mengubah pengaturan Woodpecker lebih lanjut, perbarui user.yaml dan jalankan bash standalone_embed.sh restart.
Mengaktifkan Woodpecker untuk Milvus Standalone dengan Docker Compose (storage=minio)
Ikuti Jalankan Milvus dengan Docker Compose. Contoh:
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
Kiat penyetelan throughput
Berdasarkan tolok ukur dan batas backend di Woodpecker, optimalkan throughput penulisan end-to-end dari aspek-aspek berikut:
- Sisi penyimpanan
- Penyimpanan objek (kompatibel dengan minio/S3): Tingkatkan konkurensi dan ukuran objek (hindari objek kecil). Perhatikan batas bandwidth jaringan dan bucket. Satu node MinIO pada SSD sering kali memiliki batas sekitar 100 MB/s secara lokal; satu EC2 ke S3 dapat mencapai GB/s.
- Sistem file lokal/bersama (lokal): Lebih memilih NVMe/disk cepat. Pastikan FS menangani penulisan kecil dan latensi fsync dengan baik.
- Tombol-tombol pelatuk
- Tingkatkan
logstore.segmentSyncPolicy.maxFlushSizedanmaxFlushThreadsuntuk flush yang lebih besar dan paralelisme yang lebih tinggi. - Setel
maxIntervalsesuai dengan karakteristik media (tukar latensi dengan throughput dengan agregasi yang lebih panjang). - Untuk penyimpanan objek, pertimbangkan untuk meningkatkan
segmentRollingPolicy.maxSizeuntuk mengurangi perpindahan segmen.
- Tingkatkan
- Sisi klien/aplikasi
- Gunakan ukuran batch yang lebih besar dan lebih banyak penulis/klien secara bersamaan.
- Kontrol waktu penyegaran/pembuatan indeks (batch up sebelum pemicuan) untuk menghindari penulisan kecil yang sering terjadi.
Demo Penyisipan Batch
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}")
Latensi
Woodpecker adalah WAL cloud-native yang dirancang untuk penyimpanan objek dengan trade-off antara throughput, biaya, dan latensi. Mode tertanam ringan yang saat ini didukung memprioritaskan pengoptimalan biaya dan keluaran, karena sebagian besar skenario hanya membutuhkan data untuk ditulis dalam waktu tertentu daripada menuntut latensi rendah untuk setiap permintaan penulisan. Oleh karena itu, Woodpecker menggunakan penulisan batch, dengan interval default 10 ms untuk backend penyimpanan sistem berkas lokal dan 200 ms untuk backend penyimpanan seperti MinIO. Selama operasi penulisan yang lambat, latensi maksimum sama dengan waktu interval ditambah waktu flush.
Perhatikan bahwa penyisipan batch tidak hanya dipicu oleh interval waktu tetapi juga oleh ukuran batch, yang secara default adalah 2MB.
Untuk detail tentang arsitektur, mode penyebaran (MemoryBuffer / QuorumBuffer), dan kinerja, lihat Arsitektur Woodpecker.
Untuk detail parameter lebih lanjut, lihat repositori GitHub Woodpecker.