Tarantool هندسة شبكة البيانات والميزات



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

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

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

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



الموصل


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

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


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

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

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

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

 functions: sum: { __file: sum.lua } 

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

تخزين


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

 { "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 DBMS و GraphQL للوصول إلى البيانات.

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

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


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

تدريج


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

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


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

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

المهام


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



هنا نرى دورًا آخر - عداء. لا يحتوي هذا الدور على حالة ، وإذا لزم الأمر ، يمكن إضافة مثيلات تطبيق إضافية مع هذا الدور إلى الكتلة. مسؤولية العداء هي إكمال المهام. كما ذكر ، من الممكن إنشاء مهام جديدة من الصندوق الرملي ؛ يتم وضعها في قائمة الانتظار على التخزين ثم تشغيلها على العداء. هذا النوع من المهام يسمى الوظيفة. لدينا أيضًا نوع من المهام يسمى Task - هذه هي المهام المعرفة من قبل المستخدم والتي من المقرر تشغيلها (باستخدام بناء جملة 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 ، مما سيتيح لك فهم كيفية تنفيذ الطلب:



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

نشر


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

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

أمثلة التطبيق


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

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

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

ما التالي؟


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

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

Source: https://habr.com/ru/post/ar466155/


All Articles