🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI

التحضير

  • Engineering
April 13, 2020
milvus

في هذه المقالة، سنقوم بشكل أساسي بوصف كيفية تسجيل البيانات المتجهة في ذاكرة ميلفوس وكيفية الحفاظ على هذه السجلات.

فيما يلي أهداف التصميم الرئيسية لدينا:

  1. يجب أن تكون كفاءة استيراد البيانات عالية.
  2. يمكن رؤية البيانات في أقرب وقت ممكن بعد استيراد البيانات.
  3. تجنب تجزئة ملفات البيانات.

لذلك، أنشأنا مخزن ذاكرة مؤقت (مخزن إدراج مؤقت) لإدخال البيانات لتقليل عدد عمليات تبديل سياق الإدخال والإخراج العشوائي على القرص ونظام التشغيل لتحسين أداء إدخال البيانات. تمكننا بنية تخزين الذاكرة المستندة إلى MemTable و MemTableFile من إدارة البيانات وتسلسلها بشكل أكثر ملاءمة. يتم تقسيم حالة المخزن المؤقت إلى قابل للتغيير وغير قابل للتغيير، مما يسمح باستمرار البيانات على القرص مع الحفاظ على الخدمات الخارجية متاحة.

التحضير

عندما يكون المستخدم جاهزًا لإدراج متجه في ميلفوس، يحتاج أولًا إلى إنشاء مجموعة (* يعيد ميلفوس تسمية الجدول إلى مجموعة في الإصدار 0.7.0). المجموعة هي الوحدة الأساسية لتسجيل المتجهات والبحث عنها في ملفوس.

تحتوي كل مجموعة على اسم فريد وبعض الخصائص التي يمكن تعيينها، ويتم إدراج المتجهات أو البحث عنها بناءً على اسم المجموعة. عند إنشاء مجموعة جديدة، تقوم ميلفوس بتسجيل معلومات هذه المجموعة في البيانات الوصفية.

إدراج البيانات

عندما يرسل المستخدم طلبًا لإدراج البيانات، يتم تسلسل البيانات وإلغاء تسلسلها للوصول إلى خادم Milvus. تتم الآن كتابة البيانات في الذاكرة. تنقسم كتابة الذاكرة تقريبًا إلى الخطوات التالية:

2-data-insertion-milvus.png 2-إدخال البيانات-إدراج-ملفوس.png

  1. في MemManager، ابحث عن MemTable جديد أو أنشئ MemTable جديدًا مطابقًا لاسم المجموعة. يتوافق كل MemTable مع مخزن مؤقت للمجموعة في الذاكرة.
  2. سيحتوي جدول MemTable على ملف MemTableFile واحد أو أكثر. كلما أنشأنا ملف MemTableFile جديد، سنقوم بتسجيل هذه المعلومات في Meta في نفس الوقت. نقسم ملف MemTableFile إلى حالتين: قابل للتغيير وغير قابل للتغيير. عندما يصل حجم ملف MemTableFile إلى الحد الأدنى، سيصبح غير قابل للتغيير. يمكن لكل MemTable Table أن يحتوي على ملف MemTableFile واحد فقط قابل للتغيير ليتم كتابته في أي وقت.
  3. سيتم تسجيل بيانات كل ملف MemTableFile في النهاية في الذاكرة بتنسيق نوع الفهرس المحدد. MemTableFile هو الوحدة الأساسية لإدارة البيانات في الذاكرة.
  4. في أي وقت، لن يتجاوز استخدام الذاكرة للبيانات المدرجة القيمة المحددة مسبقاً (insert_buffer_size). هذا لأن كل طلب لإدراج البيانات يأتي، يمكن لـ MemManager بسهولة حساب الذاكرة التي يشغلها MemTableFile الموجود في كل MemTable، ومن ثم تنسيق طلب الإدراج وفقًا للذاكرة الحالية.

من خلال بنية MemManager و MemTable و MemTableFile متعددة المستويات، يمكن إدارة إدراج البيانات وصيانتها بشكل أفضل. بالطبع، يمكنهم القيام بأكثر من ذلك بكثير.

استعلام شبه فوري

في Milvus، تحتاج فقط إلى الانتظار لمدة ثانية واحدة على أقصى تقدير حتى تنتقل البيانات المدرجة من الذاكرة إلى القرص. يمكن تلخيص هذه العملية بأكملها تقريبًا بالصورة التالية:

2-near-real-time-query-milvus.png 2-near-real-time-query-milvus.png

أولاً، ستدخل البيانات المدرجة إلى مخزن مؤقت للإدراج في الذاكرة. سيتغير المخزن المؤقت بشكل دوري من الحالة الأولية القابلة للتغيير إلى الحالة الثابتة استعدادًا للتسلسل. بعد ذلك، سيتم تسلسل هذه المخازن المؤقتة غير القابلة للتغيير إلى القرص بشكل دوري بواسطة مؤشر ترابط التسلسل في الخلفية. بعد وضع البيانات، سيتم تسجيل معلومات الترتيب في البيانات الوصفية. في هذه المرحلة، يمكن البحث في البيانات!

الآن، سنقوم بوصف الخطوات في الصورة بالتفصيل.

نحن نعلم بالفعل عملية إدراج البيانات في المخزن المؤقت القابل للتغيير. الخطوة التالية هي التبديل من المخزن المؤقت القابل للتغيير إلى المخزن المؤقت غير القابل للتغيير:

3-mutable-buffer-immutable-buffer-milvus.png 3-المخزن المؤقت القابل للتغيير-المخزن المؤقت القابل للتغيير-المخزن المؤقت الثابت-ميلفوس.png

ستزود قائمة الانتظار غير القابلة للتغيير مؤشر ترابط التسلسل في الخلفية بالحالة غير القابلة للتغيير وملف MemTableFile الجاهز للتسلسل. يدير كل MemTableable قائمة الانتظار غير القابلة للتغيير الخاصة به، وعندما يصل حجم ملف MemTableFile الوحيد القابل للتغيير في MemTable إلى الحد الأدنى، سيدخل إلى قائمة الانتظار غير القابلة للتغيير. سيقوم مؤشر ترابط في الخلفية مسؤول عن ToImmutable بسحب جميع ملفات MemTableFiles في قائمة الانتظار غير القابلة للتغيير التي تديرها MemTable بشكل دوري وإرسالها إلى قائمة الانتظار الإجمالية غير القابلة للتغيير. تجدر الإشارة إلى أن عمليتي كتابة البيانات في الذاكرة وتغيير البيانات الموجودة في الذاكرة إلى حالة لا يمكن كتابتها لا يمكن أن تحدثا في نفس الوقت، ويلزم وجود قفل مشترك. ومع ذلك، فإن عملية ToImmutable بسيطة للغاية ولا تسبب أي تأخير تقريبًا، لذا فإن تأثير الأداء على البيانات المدرجة يكون ضئيلًا للغاية.

الخطوة التالية هي تسلسل ملف MemTableFile في قائمة انتظار التسلسل إلى القرص. ينقسم هذا بشكل أساسي إلى ثلاث خطوات:

4-serialize-memtablefile-milvus.png 4-تسلسل ملف MemTablefile-memtablefile-milvus.png

أولاً، سيقوم مؤشر ترابط التسلسل في الخلفية بسحب ملفات MemTableFile بشكل دوري من قائمة الانتظار الثابتة. بعد ذلك، يتم تسلسلها إلى ملفات خام ذات حجم ثابت (Raw TableFiles). أخيرًا، سنسجل هذه المعلومات في البيانات الوصفية. عندما نجري بحثًا متجهًا، سنستعلم عن TableFile المقابل في البيانات الوصفية. من هنا، يمكن البحث عن هذه البيانات!

بالإضافة إلى ذلك، وفقًا للمجموعة index_file_size، بعد أن يكمل مؤشر ترابط التسلسل دورة التسلسل، سيقوم بدمج بعض ملفات TableFiles ذات الحجم الثابت في TableFile، وتسجيل هذه المعلومات أيضًا في البيانات الوصفية. في هذا الوقت، يمكن فهرسة TableFile. بناء الفهرس غير متزامن أيضًا. سيقوم مؤشر ترابط آخر في الخلفية مسؤول عن بناء الفهرس بقراءة TableFile بشكل دوري في حالة ToIndex للبيانات الوصفية لتنفيذ بناء الفهرس المقابل.

في الواقع، ستجد أنه بمساعدة TableFile والبيانات الوصفية يصبح البحث المتجه أكثر سهولة وملاءمة. بشكل عام، نحن بحاجة إلى الحصول على ملفات TableFiles المطابقة للمجموعة التي تم الاستعلام عنها من بيانات التعريف، والبحث في كل ملف TableFile، وأخيرًا الدمج. في هذه المقالة، لا نخوض في التنفيذ المحدد للبحث.

إذا كنت ترغب في معرفة المزيد، فمرحبًا بك في قراءة الكود المصدري، أو قراءة مقالاتنا التقنية الأخرى حول ميلفوس!

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

استمر في القراءة