بنية وقدرات شبكة بيانات Tarantool

بنية وقدرات شبكة بيانات Tarantool

في عام 2017، فزنا بمسابقة لتطوير جوهر المعاملات لأعمال الاستثمار في Alfa-Bank وبدأنا العمل (في HighLoad++ 2018 بتقرير عن جوهر أعمال الاستثمار سلك فلاديمير درينكين، رئيس قسم المعاملات للأعمال الاستثمارية في بنك ألفا). كان من المفترض أن يقوم هذا النظام بتجميع بيانات المعاملات من مصادر مختلفة بتنسيقات مختلفة، وجمع البيانات في نموذج موحد، وتخزينها وتوفير الوصول إليها.

أثناء عملية التطوير، تطور النظام واكتسب وظائفه، وفي مرحلة ما أدركنا أننا كنا نبلور شيئًا أكثر بكثير من مجرد برنامج تطبيقي تم إنشاؤه لحل مجموعة محددة بدقة من المهام: لقد نجحنا نظام لبناء التطبيقات الموزعة مع التخزين المستمر. الخبرة التي اكتسبناها شكلت الأساس لمنتج جديد - شبكة بيانات Tarantool (تدغ).

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

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

بنية وقدرات شبكة بيانات Tarantool

الموصل

الموصل مسؤول عن التواصل مع العالم الخارجي؛ ومهمتها هي قبول الطلب، وتحليله، وإذا نجح ذلك، يتم إرسال البيانات للمعالجة إلى معالج الإدخال. نحن ندعم تنسيقات HTTP وSOAP وKafka وFIX. تسمح لك البنية ببساطة بإضافة دعم للتنسيقات الجديدة، مع دعم IBM MQ قريبا. إذا فشل تحليل الطلب، فسيقوم الموصل بإرجاع خطأ؛ وإلا فسيتم الرد بأن الطلب قد تمت معالجته بنجاح، حتى لو حدث خطأ أثناء معالجته الإضافية. تم ذلك خصيصًا للعمل مع الأنظمة التي لا تعرف كيفية تكرار الطلبات - أو على العكس من ذلك، تفعل ذلك بإصرار شديد. من أجل عدم فقدان البيانات، يتم استخدام قائمة انتظار الإصلاح: يدخل الكائن إليه أولاً وفقط بعد إزالة المعالجة الناجحة منه. يمكن للمسؤول تلقي تنبيهات حول الكائنات المتبقية في قائمة انتظار الإصلاح، وبعد إزالة خطأ في البرنامج أو فشل في الأجهزة، حاول مرة أخرى.

معالج الإدخال

يقوم معالج الإدخال بتصنيف البيانات المستلمة وفقًا للميزات المميزة ويستدعي المعالجات المناسبة. المعالجات هي رمز Lua الذي يتم تشغيله في وضع الحماية، لذا لا يمكنها التأثير على عمل النظام. في هذه المرحلة، يمكن تقليل البيانات إلى النموذج المطلوب، وإذا لزم الأمر، يمكن إطلاق عدد عشوائي من المهام التي يمكنها تنفيذ المنطق اللازم. على سبيل المثال، في منتج MDM (إدارة البيانات الرئيسية) المبني على Tarantool Data Grid، عند إضافة مستخدم جديد، من أجل عدم إبطاء معالجة الطلب، نطلق إنشاء سجل ذهبي كمهمة منفصلة. يدعم Sandbox طلبات قراءة البيانات وتغييرها وإضافتها، ويسمح لك بتنفيذ بعض الوظائف على جميع أدوار نوع التخزين وتجميع النتيجة (خريطة/تصغير).

يمكن وصف المعالجات في الملفات:

sum.lua

local x, y = unpack(...)
return x + y

ثم أعلن في التكوين:

functions:
  sum: { __file: sum.lua }

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

الخزائن

يقوم التخزين بتخزين البيانات المستمرة. قبل الحفظ، يتم التحقق من صحة البيانات مقابل مخطط البيانات. لوصف الدائرة نستخدم تنسيقًا موسعًا اباتشي افرو. مثال:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

بناءً على هذا الوصف، يتم إنشاء DDL (لغة تعريف البيانات) تلقائيًا لنظام إدارة قواعد بيانات Tarantula و GraphQL مخطط للوصول إلى البيانات.

يتم دعم النسخ المتماثل للبيانات غير المتزامنة (هناك خطط لإضافة نسخة متزامنة).

معالج الإخراج

في بعض الأحيان يكون من الضروري إخطار المستهلكين الخارجيين بوصول بيانات جديدة؛ ولهذا الغرض، هناك دور معالج الإخراج. بعد حفظ البيانات، يمكن تمريرها إلى المعالج المقابل (على سبيل المثال، لإحضارها إلى النموذج الذي يطلبه المستهلك) - ثم تمريرها إلى الموصل للإرسال. يتم أيضًا استخدام قائمة انتظار الإصلاح هنا: إذا لم يقبل أحد الكائن، فيمكن للمسؤول المحاولة مرة أخرى لاحقًا.

تدريج

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

خصائص البيانات

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

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

المهام

من بين الميزات المثيرة للاهتمام، تجدر الإشارة إلى القدرة على إطلاق المهام وفقًا لجدول زمني، بناءً على طلب المستخدم، أو برمجيًا من وضع الحماية:

بنية وقدرات شبكة بيانات Tarantool

هنا نرى دورًا آخر - العداء. هذا الدور عديم الحالة، ويمكن إضافة مثيلات تطبيق إضافية بهذا الدور إلى المجموعة حسب الحاجة. مسؤولية العداء هي إكمال المهام. كما ذكرنا سابقًا، من الممكن إنشاء مهام جديدة من وضع الحماية؛ يتم حفظها في قائمة انتظار على وحدة التخزين ثم يتم تنفيذها على العداء. هذا النوع من المهام يسمى الوظيفة. لدينا أيضًا نوع مهمة يسمى "المهمة" - وهي مهام محددة من قبل المستخدم ويتم تشغيلها وفقًا لجدول زمني (باستخدام بناء جملة cron) أو عند الطلب. لبدء مثل هذه المهام وتتبعها، لدينا مدير مهام مناسب. لكي تكون هذه الوظيفة متاحة، يجب عليك تمكين دور المجدول؛ هذا الدور له حالة، لذلك لا يتم قياسه، وهو أمر غير مطلوب؛ في الوقت نفسه، مثل جميع الأدوار الأخرى، يمكن أن يكون لها نسخة طبق الأصل تبدأ العمل إذا رفض السيد فجأة.

مسجل

دور آخر يسمى المسجل. يقوم بجمع السجلات من جميع أعضاء المجموعة ويوفر واجهة لتحميلها وعرضها من خلال واجهة الويب.

الخدمات

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

الخدمة موضحة في ملف التكوين:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

يتم إنشاء واجهة برمجة تطبيقات GraphQL تلقائيًا وتصبح الخدمة متاحة للاتصال:

query {
   sum(x: 1, y: 2) 
}

هذا سوف يستدعي المعالج sumوالتي سوف تعيد النتيجة:

3

ملفات تعريف الاستعلام والمقاييس

لفهم تشغيل النظام وطلبات التوصيف، قمنا بتنفيذ دعم لبروتوكول OpenTracing. يمكن للنظام إرسال معلومات عند الطلب إلى الأدوات التي تدعم هذا البروتوكول، مثل Zipkin، مما سيسمح لك بفهم كيفية تنفيذ الطلب:

بنية وقدرات شبكة بيانات Tarantool

وبطبيعة الحال، يوفر النظام مقاييس داخلية يمكن جمعها باستخدام Prometheus وتصورها باستخدام Grafana.

نشر

يمكن نشر Tarantool Data Grid من حزم RPM أو أرشيف، باستخدام أداة مساعدة من التوزيع أو Ansible، وهناك أيضًا دعم لـ Kubernetes (مشغل Tarantool Kubernetes).

يتم تحميل التطبيق الذي ينفذ منطق الأعمال (التكوين والمعالجات) في مجموعة Tarantool Data Grid المنشورة في شكل أرشيف من خلال واجهة المستخدم أو باستخدام برنامج نصي من خلال واجهة برمجة التطبيقات التي نقدمها.

مقدمات الفلسفة

ما التطبيقات التي يمكن إنشاؤها باستخدام Tarantool Data Grid؟ في الواقع، ترتبط معظم مهام العمل بطريقة أو بأخرى بمعالجة تدفق البيانات وتخزينها والوصول إليها. لذلك، إذا كان لديك تدفقات كبيرة من البيانات التي تحتاج إلى تخزينها والوصول إليها بشكل آمن، فيمكن لمنتجنا أن يوفر لك الكثير من وقت التطوير والتركيز على منطق عملك.

على سبيل المثال، نريد جمع معلومات حول سوق العقارات، بحيث يكون لدينا في المستقبل، على سبيل المثال، معلومات حول أفضل العروض. وفي هذه الحالة سنسلط الضوء على المهام التالية:

  1. الروبوتات التي تجمع المعلومات من المصادر المفتوحة ستكون مصادر بياناتنا. يمكنك حل هذه المشكلة باستخدام الحلول الجاهزة أو كتابة التعليمات البرمجية بأي لغة.
  2. بعد ذلك، ستقبل شبكة Tarantool Data Grid البيانات وتحفظها. إذا كان تنسيق البيانات من مصادر مختلفة مختلفًا، فيمكنك كتابة التعليمات البرمجية في Lua التي ستقوم بإجراء التحويل إلى تنسيق واحد. في مرحلة ما قبل المعالجة، ستتمكن أيضًا، على سبيل المثال، من تصفية العروض المكررة أو بالإضافة إلى ذلك تحديث المعلومات حول الوكلاء العاملين في السوق في قاعدة البيانات.
  3. الآن لديك بالفعل حل قابل للتطوير في مجموعة يمكن ملؤها بالبيانات وإجراء تحديدات البيانات. ثم يمكنك تنفيذ وظائف جديدة، على سبيل المثال، كتابة خدمة ستقدم طلبًا للبيانات وتقدم العرض الأكثر فائدة يوميًا - سيتطلب ذلك بضعة أسطر في ملف التكوين ورمز Lua الصغير.

ما هي الخطوة التالية؟

أولويتنا هي تحسين سهولة التطوير باستخدام شبكة بيانات Tarantool. على سبيل المثال، هذا هو IDE مع دعم ملفات التعريف ومعالجات التصحيح التي تعمل في وضع الحماية.

نحن أيضًا نولي اهتمامًا كبيرًا لقضايا السلامة. نحن حاليًا نخضع لشهادة FSTEC من روسيا لتأكيد المستوى العالي من الأمان وتلبية متطلبات اعتماد منتجات البرامج المستخدمة في أنظمة معلومات البيانات الشخصية وأنظمة المعلومات الحكومية.

المصدر: www.habr.com

إضافة تعليق