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

milvus-logo
LFAI
  • Home
  • Blog
  • كيف تتم معالجة البيانات في قاعدة بيانات المتجهات؟

كيف تتم معالجة البيانات في قاعدة بيانات المتجهات؟

  • Engineering
March 28, 2022
Zhenshan Cao

Cover image صورة الغلاف

هذا المقال بقلم زنشان كاو وترجمة أنجيلا ني.

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

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

بعض الموارد المفيدة قبل البدء مدرجة أدناه. نوصي بقراءتها أولاً لفهم الموضوع في هذا المنشور بشكل أفضل.

واجهة MsgStream

تعدواجهة MsgStream حاسمة لمعالجة البيانات في ميلفوس. عند استدعاء Start() ، يكتب الكوروتين في الخلفية البيانات في وسيط السجل أو يقرأ البيانات من هناك. عند استدعاء Close() ، يتوقف الكوروتين.

MsgStream interface واجهة MsgStream

يمكن أن يعمل MsgStream كمنتج ومستهلك. تُعرّف الواجهة AsProducer(channels []string) الواجهة MsgStream كمنتج بينما يُعرّفها AsConsumer(channels []string, subNamestring)كمستهلك. تتم مشاركة المعلمة channels في كلتا الواجهتين وتستخدم لتحديد القنوات (الفعلية) التي يجب كتابة البيانات فيها أو قراءة البيانات منها.

يمكن تحديد عدد الأجزاء في المجموعة عند إنشاء المجموعة. يتوافق كل جزء مع قناة افتراضية (vchannel). لذلك، يمكن أن تحتوي المجموعة على عدة قنوات افتراضية. يعين Milvus لكل قناة افتراضية في وسيط السجل قناة فعلية (pchannel).

Each virtual channel/shard corresponds to a physical channel. تتوافق كل قناة/قناة افتراضية مع قناة فعلية.

Produce() في واجهة MsgStream المسؤولة عن كتابة البيانات في قنوات pchannels في وسيط السجل. يمكن كتابة البيانات بطريقتين:

  • الكتابة المفردة: تتم كتابة الكيانات في أجزاء مختلفة (قناة افتراضية) بواسطة قيم تجزئة المفاتيح الأساسية. ثم تتدفق هذه الكيانات إلى قنوات pchannels المقابلة في وسيط السجل.
  • كتابة البث: تتم كتابة الكيانات في جميع قنوات pchannels المحددة بواسطة المعلمة channels.

Consume() هو نوع من واجهة برمجة التطبيقات المحظورة. إذا لم تكن هناك بيانات متوفرة في قناة pchannel المحددة، فسيتم حظر الكوروتين عند استدعاء Consume() في واجهة MsgStream. من ناحية أخرى، Chan() هو واجهة برمجة تطبيقات غير محظورة، مما يعني أن الكوروتين يقرأ البيانات ويعالجها فقط في حالة وجود بيانات موجودة في قناة pchannel المحددة. خلاف ذلك، يمكن للكوروتين معالجة مهام أخرى ولن يتم حظره عند عدم توفر بيانات.

Seek() هي طريقة لاستعادة الفشل. عند بدء تشغيل عقدة جديدة، يمكن الحصول على سجل استهلاك البيانات واستئناف استهلاك البيانات من حيث تم إيقافها عن طريق استدعاء Seek().

كتابة البيانات

يمكن أن تكون البيانات المكتوبة في قنوات vchannels (أجزاء) مختلفة إما إدراج رسالة أو حذف رسالة. يمكن أيضًا تسمية هذه القنوات vchannels بقنوات DmChannels (قنوات معالجة البيانات).

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

عندما يتم إنشاء مجموعة، لا يتم تحديد عدد الأجزاء فقط، بل يتم تحديد التعيين بين القنوات الافتراضية والقنوات pchannels في وسيط السجل.

Write path in Milvus مسار الكتابة في ميلفوس

كما هو موضح في الرسم التوضيحي أعلاه، في مسار الكتابة، يكتب الوكلاء البيانات في وسيط السجل عبر واجهة AsProducer() لـ MsgStream. ثم تستهلك عقد البيانات البيانات، ثم تقوم بتحويل البيانات المستهلكة وتخزينها في مخزن الكائنات. مسار التخزين هو نوع من المعلومات الوصفية التي سيتم تسجيلها في إلخd بواسطة منسقي البيانات.

مخطط التدفق

نظرًا لأن المجموعات المختلفة قد تشترك في نفس قنوات pchannels في وسيط السجل، فعند استهلاك البيانات، تحتاج عقد البيانات أو عقد الاستعلام إلى الحكم على المجموعة التي تنتمي إليها البيانات في قناة pchannel. لحل هذه المشكلة، قدمنا مخطط التدفق في ميلفوس. وهو مسؤول بشكل أساسي عن تصفية البيانات في قناة pchannel مشتركة حسب معرّفات المجموعة. لذا، يمكننا القول أن كل مخطط تدفق يعالج تدفق البيانات في جزء (قناة vchannel) مطابق في مجموعة.

Flowgraph in write path مخطط التدفق في مسار الكتابة

إنشاء MsgStream

عند كتابة البيانات، يتم إنشاء كائن MsgStream في السيناريوهين التاليين:

  • عندما يتلقى الوكيل طلب إدراج بيانات، فإنه يحاول أولاً الحصول على التعيين بين قنوات vchannels وقنوات pchannels عبر المنسق الجذر (المنسق الجذر). ثم يقوم الوكيل بإنشاء كائن MsgStream.

Scenario 1 السيناريو 1

  • عند بدء تشغيل عقدة البيانات وقراءة المعلومات الوصفية للقنوات في etcd، يتم إنشاء كائن MsgStream.

Scenario 2 السيناريو 2

قراءة البيانات

Read path in Milvus مسار القراءة في ميلفوس

سير العمل العام لقراءة البيانات موضح في الصورة أعلاه. يتم بث طلبات الاستعلام عبر قناة DqRequestChannel إلى عقد الاستعلام. تقوم عقد الاستعلام بتنفيذ مهام الاستعلام بالتوازي. تمر نتائج الاستعلام من عقد الاستعلام عبر gRPC ويقوم الوكيل بتجميع النتائج وإرجاعها إلى العميل.

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

عندما تتلقى عقد الاستعلام طلبات الاستعلام، فإنها تجري استعلامًا محليًا على كل من البيانات الدفعية المخزنة في قطاعات مختومة وبيانات التدفق التي يتم إدراجها ديناميكيًا في Milvus وتخزينها في قطاعات متزايدة. بعد ذلك، تحتاج عقد الاستعلام إلى تجميع نتائج الاستعلام في كل من القطاعات المختومة والمتنامية. يتم تمرير هذه النتائج المجمعة إلى الوكيل عبر gRPC.

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

مخطط التدفق

Flowgraph in read path مخطط التدفق في مسار القراءة

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

إنشاء MsgStream

Creating MsgStream object in read path إنشاء كائن MsgStream في مسار القراءة

عند قراءة البيانات، يتم إنشاء كائن MsgStream في السيناريو التالي:

  • في Milvus، لا يمكن قراءة البيانات ما لم يتم تحميلها. عندما يتلقى الوكيل طلب تحميل البيانات، فإنه يرسل الطلب إلى منسق الاستعلام الذي يقرر طريقة تعيين الأجزاء إلى عقد استعلام مختلفة. يتم إرسال معلومات التعيين (أي أسماء القنوات الافتراضية والتعيين بين القنوات الافتراضية وقنوات pchannels المقابلة لها) إلى عقد الاستعلام عبر استدعاء الأسلوب أو RPC (استدعاء إجراء عن بعد). بعد ذلك، تنشئ عقد الاستعلام كائنات MsgStream المقابلة لاستهلاك البيانات.

عمليات DDL

يرمز DDL إلى لغة تعريف البيانات. يمكن تصنيف عمليات DDL على البيانات الوصفية إلى طلبات كتابة وطلبات قراءة. ومع ذلك، يتم التعامل مع هذين النوعين من الطلبات بالتساوي أثناء معالجة البيانات الوصفية.

تتضمن طلبات القراءة على البيانات الوصفية ما يلي:

  • مخطط مجموعة الاستعلام
  • معلومات فهرسة الاستعلام والمزيد

تتضمن طلبات الكتابة:

  • إنشاء مجموعة
  • إسقاط مجموعة
  • إنشاء فهرس
  • إسقاط فهرس والمزيد

يتم إرسال طلبات DDL إلى الوكيل من العميل، ويقوم الوكيل كذلك بتمرير هذه الطلبات بالترتيب المستلم إلى التنسيق الجذر الذي يقوم بتعيين طابع زمني لكل طلب DDL وإجراء عمليات فحص ديناميكية للطلبات. يعالج الوكيل كل طلب بطريقة تسلسلية، أي طلب DDL واحد في كل مرة. لن يقوم الوكيل بمعالجة الطلب التالي حتى يكمل معالجة الطلب السابق ويتلقى النتائج من المنسق الجذر.

DDL operations. عمليات DDL.

كما هو موضح في الرسم التوضيحي أعلاه، هناك K طلبات DDL في قائمة انتظار مهام التنسيق الجذر. يتم ترتيب طلبات DDL في قائمة انتظار المهام حسب ترتيب استلامها من قبل المنسق الجذر. لذا، فإن ddl1 هو أول طلب يتم إرساله إلى المنسق الجذر، و ddlK هو آخر طلب في هذه الدفعة. يعالج المنسق الجذري الطلبات واحدًا تلو الآخر بالترتيب الزمني.

في النظام الموزع، يتم تمكين الاتصال بين الوكلاء والتنسيق الجذري بواسطة gRPC. يحتفظ المنسق الجذر بسجل بالحد الأقصى لقيمة الطابع الزمني للمهام المنفذة لضمان معالجة جميع طلبات DDL بالترتيب الزمني.

لنفترض وجود وكيلين مستقلين، الوكيل 1 والوكيل 2. وكلاهما يرسلان طلبات DDL إلى نفس الإحداثي الجذر. ومع ذلك، فإن إحدى المشاكل هي أن الطلبات السابقة لا يتم إرسالها بالضرورة إلى التنسيق الجذر قبل الطلبات التي يتلقاها وكيل آخر في وقت لاحق. على سبيل المثال، في الصورة أعلاه، عندما يتم إرسال DDL_K-1 إلى المنسق الجذر من الوكيل 1، يكون DDL_K من الوكيل 2 قد تم قبوله بالفعل وتنفيذه من قبل المنسق الجذر. كما هو مسجل من قبل الإحداثي الجذر، فإن الحد الأقصى لقيمة الطابع الزمني للمهام المنفذة في هذه المرحلة هو K. لذلك من أجل عدم مقاطعة الترتيب الزمني، سيتم رفض الطلب DDL_K-1 من قبل قائمة انتظار المهام الخاصة بالمنسق الجذر . ومع ذلك، إذا قام الوكيل 2 بإرسال الطلب DDL_K+5 إلى التنسيق الجذر في هذه النقطة، فسيتم قبول الطلب في قائمة انتظار المهام وسيتم تنفيذه لاحقًا وفقًا لقيمة الطابع الزمني الخاص به.

الفهرسة

بناء فهرس

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

Building an index. بناء فهرس.

كما هو موضح أعلاه، عندما يتلقى منسق الفهرس طلبات بناء الفهرس من المنسق الجذر، فإنه يقوم أولاً باستمرار المهمة في مخزن التعريف (إلخd). الحالة الأولية لمهمة بناء الفهرس هي Unissued. يحتفظ منسق الفهرس بسجل لتحميل المهام لكل عقدة فهرس، ويرسل المهام الواردة إلى عقدة فهرس أقل تحميلًا. عند الانتهاء من المهمة، تقوم عقدة الفهرس بكتابة حالة المهمة، إما Finished أو Failed في مخزن التعريف، وهو عبارة عن إلخd في ميلفوس. بعد ذلك سيفهم منسق الفهرس ما إذا كانت مهمة بناء الفهرس قد نجحت أو فشلت من خلال البحث في إلخd. إذا فشلت المهمة بسبب محدودية موارد النظام أو تسرب عقدة الفهرس، سيعيد منسق الفهرس تشغيل العملية بأكملها وتعيين نفس المهمة إلى عقدة فهرس أخرى.

إسقاط فهرس

بالإضافة إلى ذلك، فإن منسق الفهرس مسؤول أيضاً عن طلبات إسقاط الفهارس.

Dropping an index. إسقاط فهرس.

عندما يتلقى منسق الفهرس طلب إسقاط فهرس من العميل، يقوم أولاً بوضع علامة على الفهرس على أنه "تم إسقاطه"، ويعيد النتيجة إلى العميل مع إخطار منسق الفهرس. ثم يقوم منسق الفهرس بتصفية جميع مهام الفهرسة باستخدام IndexID ويتم إسقاط المهام المطابقة للشرط.

سيحذف الروتين الخلفي لمنسق الفهرس تدريجيًا جميع مهام الفهرسة التي تم وضع علامة "مسقطة" عليها من مخزن الكائنات (MinIO و S3). تتضمن هذه العملية واجهة recycleIndexFiles. عندما يتم حذف جميع ملفات الفهرسة المطابقة، تتم إزالة المعلومات الوصفية لمهام الفهرسة المحذوفة من التخزين الوصفية (إلخd).

حول سلسلة الغوص العميق

مع الإعلان الرسمي عن توفر الإصدار 2.0 من Milvus 2.0 بشكل عام، قمنا بتنظيم سلسلة مدونة Milvus Deep Dive هذه لتقديم تفسير متعمق لبنية Milvus ورمز المصدر. تشمل الموضوعات التي تتناولها سلسلة المدونات هذه ما يلي:

Like the article? Spread the word

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