Woodpecker
Woodpecker هو قائمة انتظار الرسائل الافتراضية (سجل الكتابة المسبقة، WAL) في Milvus 3.x. وهو سجل WAL أصلي للسحابة مصمم لتخزين الكائنات، ويوفر إنتاجية عالية، وتكاليف تشغيل منخفضة، وقابلية توسع سلسة. للاطلاع على تفاصيل البنية والمعايير القياسية، راجع Woodpecker.
نظرة عامة
- في Milvus 3.x، يُعد Woodpecker سجل الكتابة المسبق/قائمة انتظار الرسائل الافتراضية، حيث يوفر عمليات كتابة مرتبة واستعادة البيانات بصفته خدمة التسجيل. ولا يلزم وجود خدمة خارجية لقائمة انتظار الرسائل (مثل Pulsar أو Kafka).
- يمكن تشغيل Woodpecker مدمجًا في عقدة Milvus/البث (افتراضيًا)، أو كخدمة مخصصة مع وحدات pod الخاصة بها (الموزعة/العنقودية فقط).
- وهي تدعم ثلاثة أوضاع لـ «
storage.type»: تخزين الكائنات (minio، الوضع الافتراضي)، ونظام الملفات المحلي (local)، وserviceالمخصص. راجع أوضاع النشر.
البدء السريع
لتمكين 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 number of flush retries.
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- النوع:
minioلتخزين الكائنات المتوافق مع MinIO/S3 (MinIO/S3/GCS/OSS، إلخ)؛localلأنظمة الملفات المحلية/المشتركة. - rootPath: المسار الجذري لخلفية التخزين (يسري على
local؛ أما معminio، فتتحدد المسارات حسب الحاوية/البادئة).
- النوع:
أوضاع النشر
يدعم Woodpecker ثلاثة أوضاع لـ storage.type:
storage.type | كيفية تشغيل Woodpecker | الخلفية WAL | Milvus المستقل | Milvus الموزع (المجموعة) |
|---|---|---|---|---|
minio (الافتراضي) | مُدمج في عقدة Milvus/البث | تخزين الكائنات (متوافق مع MinIO/S3) | مدعوم | مدعوم |
local | مدمج في عقدة Milvus/البث | نظام الملفات المحلي | مدعوم | محدود (تحتاج جميع العقد إلى نظام ملفات مشترك، مثل NFS) |
service | خدمة Woodpecker مخصصة (بودات خاصة بها) | تخزين الكائنات (متوافق مع MinIO/S3) | غير مدعوم | مدعوم |
ملاحظات:
- مع وضع "
minio"، يشارك Woodpecker نفس تخزين الكائنات مع Milvus (MinIO/S3/GCS/OSS، إلخ). - مع وضع "التخزين المباشر" (
local)، لا يناسب القرص المحلي ذو العقدة الواحدة سوى وضع "المستقل" (Standalone). إذا كان بإمكان جميع البودات الوصول إلى نظام ملفات مشترك (مثل NFS)، فيمكن لوضع "العنقود" (Cluster) أيضًا استخدام وضع "التخزين المباشر" (local). serviceيعمل هذا الوضع على تشغيل Woodpecker كخدمة منفصلة وقابلة للتوسع بشكل مستقل، وهو متاح فقط لعمليات النشر الموزعة/العنقودية. تستخدم عمليات النشر المستقلة الأوضاع المدمجة (minioأوlocal).
توافق تخزين الكائنات مع storage.type=minio
تلخص المصفوفة التالية التوافق المعروف حاليًا لخلفية تخزين الكائنات عند تكوين Woodpecker باستخدام storage.type=minio. تستند هذه المعلومات إلى مناقشة GitHub رقم 150.
| المزود / الخدمة | الحالة | ملاحظات |
|---|---|---|
| تخزين Azure Blob | مدعوم | يستخدم Azure SDK الأصلي. |
| AWS S3 | مدعوم | S3 الأصلي مع دعم كامل للكتابة المشروطة. |
MinIO (>= 2024-12) | مدعوم | دعم كامل للكتابة المشروطة لـ S3. |
| Aliyun OSS | مدعوم | مدعوم من خلال واجهته المتوافقة مع S3. |
| Tencent COS | مدعوم | مدعوم من خلال واجهته المتوافقة مع S3. |
| Google Cloud Storage (GCS) | مدعوم | مدعوم من خلال وضع التوافق مع S3. |
| Huawei Cloud OBS | غير مدعوم | يفتقر إلى دلالات الكتابة الشرطية المطلوبة. |
| VAST Data | مدعوم | تم التحقق منه من قبل المجتمع؛ يعمل مع مجموعات التخزين غير المُصنفة حسب الإصدار فقط. |
| وسائط تخزين أخرى متوافقة مع S3 | جزئي | يعتمد على الدعم الكامل لدلالات الكتابة المشروطة لـ S3. |
ملاحظات:
- يعتمد التوافق على الدعم الأصلي لـ SDK أو الدعم لدلالات الكتابة الشرطية لـ S3.
- إذا كنت تستضيف 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 كقائمة انتظار الرسائل وتمكين Streaming Node. قد يستغرق التشغيل الأول بعض الوقت لسحب الصور؛ انتظر حتى تصبح جميع البودات جاهزة:
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، فاتبع الإعدادات الموضحة في قسم «التكوين».
تمكين Woodpecker لمجموعة Milvus على Kubernetes (مخطط Helm، التخزين=minio)
أولاً، أضف مخطط Helm الخاص بـ Milvus وقم بتحديثه كما هو موضح في «تشغيل Milvus في Kubernetes باستخدام Helm».
ثم قم بالنشر باستخدام أحد الأمثلة التالية:
– نشر الكتلة (الإعدادات الموصى بها مع تمكين Woodpecker و Streaming Node):
helm install my-release zilliztech/milvus \
--set image.all.tag=v3.0.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=v3.0.0 \
--set cluster.enabled=false \
--set pulsarv3.enabled=false \
--set standalone.messageQueue=woodpecker \
--set woodpecker.enabled=true \
--set streaming.enabled=true
بعد النشر، اتبع الإرشادات الواردة في الوثائق لإعادة توجيه المنافذ والاتصال. لضبط معلمات Woodpecker، اتبع الإعدادات الموضحة في «التكوين».
تمكين Woodpecker لـ Milvus المستقل في Docker (storage=local)
في Milvus 3.x، يستخدم النشر المستقل في Docker Woodpecker مع نظام الملفات المحلي كخلفية WAL بشكل افتراضي — ولا يلزم إجراء أي تكوين إضافي. اتبع إرشادات تشغيل 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
bash standalone_embed.sh start
لضبط Woodpecker، قم بتحرير ملف user.yaml الذي تم إنشاؤه بعد التشغيل الأول وقم بتشغيل الأمر bash standalone_embed.sh restart لتطبيق التغييرات (يؤدي تشغيل start جديد إلى إعادة إنشاء ملف user.yaml ، لذا قم بتطبيق التعديلات باستخدام الأمر restart):
# user.yaml
woodpecker:
logstore:
segmentSyncPolicy:
maxFlushThreads: 16
تمكين 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/v3.0.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 لمجموعة Milvus (Helm)
بالنسبة لوضع خدمة Woodpecker، نوصي باستخدام الإصدار القادم Milvus 3.0.1 أو إصدار أحدث مع Woodpecker v0.1.37 أو أحدث من أجل تنظيف الضغط وتحسينات الالتزام الجماعي.
يُعد وضع خدمة Woodpecker إحدى ميزات Milvus 3.0. بالنسبة لعمليات النشر الموزعة/في الكتلة، يمكنك تشغيل Woodpecker كخدمة مخصصة (pods منفصلة) بدلاً من تضمينه في عقدة البث عن طريق تعيين streaming.woodpecker.embedded=false:
helm install my-release zilliztech/milvus \
--set image.all.tag=v3.0.0 \
--set woodpecker.enabled=true \
--set woodpecker.image.tag=v0.1.37 \
--set streaming.enabled=true \
--set streaming.woodpecker.embedded=false
يؤدي هذا إلى نشر Woodpecker كمجموعة StatefulSet مخصصة (my-release-milvus-woodpecker ، 4 نسخ متماثلة افتراضيًا) مدعومة بخدمة بدون واجهة مستخدم، ومجمعة عبر بروتوكول gossip على المنافذ 18080 (الخدمة)، و 17946 (gossip)، و 9091 (المقاييس)، مع استخدام MinIO كخلفية تخزين لها. تحتاج الخدمة إلى نصاب قانوني مكون من 3 عقد؛ ويحافظ الإعداد الافتراضي المكون من 4 نسخ متماثلة على النصاب القانوني مع تحمل تعطل عقدة واحدة، لذا لا تقم بتعيين woodpecker.replicaCount على قيمة أقل من 3. ثم تتضمن المجموعة مجموعة بودات woodpecker منفصلة:
my-release-milvus-woodpecker-0
my-release-milvus-woodpecker-1
my-release-milvus-woodpecker-2
my-release-milvus-woodpecker-3
يُستخدم وضع Woodpecker service للنشر الموزع/المجمّع فقط — أما عمليات النشر المستقلة فتعمل باستخدام Woodpecker المدمج (minio أو local). لا يدعم Milvus Operator حتى الآن وضع خدمة Woodpecker.
نصائح لضبط معدل النقل
يختلف ملف أداء Woodpecker من حيث السعة والكمون بين الوضع المدمج ووضع الخدمة (إحدى ميزات Milvus 3.0). تم تنظيم الإرشادات أدناه حسب الوضع.
الوضع المدمج
استنادًا إلى المعايير المرجعية وحدود الخلفية في Woodpecker، قم بتحسين معدل نقل البيانات للكتابة من البداية إلى النهاية من الجوانب التالية:
- جانب التخزين
- تخزين الكائنات (متوافق مع MinIO/S3): قم بزيادة التزامن وحجم الكائنات (تجنب الكائنات الصغيرة جدًا). راقب حدود عرض النطاق الترددي للشبكة وحاوية التخزين. غالبًا ما يبلغ الحد الأقصى لعقدة MinIO واحدة على SSD حوالي 100 ميجابايت/ثانية محليًا؛ بينما يمكن أن يصل EC2 واحد إلى S3 إلى جيجابايت/ثانية.
- أنظمة الملفات المحلية/المشتركة (محلية): يُفضل استخدام NVMe/الأقراص السريعة. تأكد من أن نظام الملفات يتعامل جيدًا مع عمليات الكتابة الصغيرة وزمن انتقال fsync.
- مقابض Woodpecker
- قم بزيادة القيم في
logstore.segmentSyncPolicy.maxFlushSizeوmaxFlushThreadsللحصول على عمليات مسح أكبر وتوازي أعلى. - اضبط
maxIntervalوفقًا لخصائص الوسائط (استبدل زمن الوصول بالإنتاجية مع تجميع أطول). - بالنسبة لتخزين الكائنات، ضع في اعتبارك زيادة
segmentRollingPolicy.maxSizeلتقليل عمليات تبديل المقاطع.
- قم بزيادة القيم في
- جانب العميل/التطبيق
- استخدم أحجام دفعات أكبر وعددًا أكبر من الكُتّاب/العملاء المتزامنين.
- تحكم في توقيت التحديث/إنشاء الفهرس (تجميع الدُفعات قبل التشغيل) لتجنب عمليات الكتابة الصغيرة المتكررة.
وضع الخدمة (Milvus 3.0+)
يحافظ وضع الخدمة على معدل نقل البيانات العالي لـ WAL المدعوم بتخزين الكائنات مع إضافة زمن انتقال منخفض (انظر زمن الانتقال). لا تزال عمليات الضبط المذكورة أعلاه من جانب التخزين وجانب العميل سارية؛ بالإضافة إلى ذلك، نظرًا لأن Woodpecker يعمل كخدمة مستقلة، يمكنك توسيع سعة الكتابة أفقيًا عن طريق إضافة نسخ متماثلة (woodpecker.replicaCount ، الافتراضي 4)، وتستفيد عمليات الكتابة من النسخ المتماثل بنظام النصاب القانوني ذي RTT واحد وعمليات القراءة التي تراعي الطوبولوجيا والتي تتجنب إعادة التوجيه عبر الوسيط.
عرض توضيحي للإدراج الدفعي — استخدم ما يلي لقياس معدل نقل البيانات للكتابة:
from pymilvus import MilvusClient
import random
import time
# 1. Set up a Milvus client
client = MilvusClient(
uri="http://<Proxy Pod IP>:19530",
)
# 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 ميغابايت بشكل افتراضي.
وضع الخدمة (Milvus 3.0+)
يوفر وضع الخدمة زمن انتقال للكتابة بمستوى الميلي ثانية — من نفس مرتبة WAL التقليدي ذي النسخ الثلاث على القرص المحلي — مع الحفاظ على التكلفة منخفضة. في النشر النموذجي ذي النسخ الثلاث عبر مناطق التوافر (AZ)، يظل زمن انتقال الكتابة في نطاق الميلي ثانية. ويحقق ذلك من خلال:
- عمليات الكتابة ذات النصاب القانوني في جولةواحدة (One-RTT) — حيث يكمل النسخ المتماثل الذي يحركه العميل عملية الكتابة ذات النصاب القانوني خلال جولة واحدة، مع تثبيت حركة المرور عبر المناطق (AZ) عند حجم بيانات نسختين متماثلتين (مقارنةً بحركة المرور الإضافية عبر المناطق التي تبلغ حوالي 1/3، وهي النسبة النموذجية للنسخ المتماثل القائم على الوسيط/القائد).
- عمليات قراءة أحادية القفزة تراعي التوبولوجيا — تذهب كل عملية قراءة مباشرةً إلى النسخة المتماثلة الأقرب بدلاً من إعادة توجيهها عبر وسيط، مما يتجنب عمليات القراءة العشوائية عبر المناطق التشغيلية (حوالي ثلثي حركة مرور القراءة عبر المناطق التشغيلية) في الأنظمة القائمة على الوسيط.
- التحميل الفوري إلى تخزين الكائنات بعد تدوير المقطع — يتتبع كل مقطع دورة حياته الكاملة ويتم تحميله إلى تخزين الكائنات فور تدويره، مما يحافظ على انخفاض الحجم على القرص المحلي وتكلفة التخزين دون المساومة على زمن الوصول.
- لا يوجد تكرار مستمر من عقدة إلى أخرى — يتم الاحتفاظ بالسجلات في تخزين الكائنات الذي يعمل كوحدة تخزين مشتركة، لذا فإن التحويل التلقائي في حالة الفشل يعيد تحميل النسخ المتبقية فقط (بدون نسخ العقدة بأكملها)، ولا يكون التوسع مقيدًا بنطاق ترددي التكرار بين العقد، ولا يتسبب استبدال العقد على نطاق واسع في حدوث «عواصف تكرار».
في عمليات النشر عبر مناطق التوافر (AZ)، يوفر وضع الخدمة أيضًا ما يقارب ثلث حركة مرور الكتابة وثلثي حركة مرور القراءة عبر شبكات مناطق التوافر مقارنةً بأنظمة السجلات القائمة على الوسيط. للاطلاع على التصميم الكامل وتحليل التكلفة، راجع «بنية Woodpecker».
للحصول على تفاصيل حول البنية وأوضاع النشر (MemoryBuffer / QuorumBuffer) والأداء، راجع «بنية Woodpecker».
لمزيد من التفاصيل حول المعلمات، راجع مستودع Woodpecker على GitHub.