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



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

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

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

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


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

تدريج


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

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


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

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

المهام


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


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

ما التالي؟


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

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

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


All Articles