العقد والجداول في Azure Cosmos DB ل PostgreSQL

ينطبق على: Azure Cosmos DB ل PostgreSQL (مدعوم بملحق قاعدة بيانات Citus إلى PostgreSQL)

الُعقد

يسمح Azure Cosmos DB ل PostgreSQL لخوادم PostgreSQL (تسمى العقد) بالتنسيق مع بعضها البعض في بنية "لا شيء مشترك". تحتوي العقد في نظام المجموعة بشكل جماعي على بيانات أكثر وتستخدم المزيد من الذاكرات الأساسية لوحدة المعالجة المركزية مما قد يكون ممكنا على خادم واحد. تسمح البنية أيضا لقاعدة البيانات بالتحجيم عن طريق إضافة المزيد من العقد إلى نظام المجموعة.

المنسق والعمال

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

يسمح Azure Cosmos DB ل PostgreSQL لمسؤول قاعدة البيانات بتوزيع الجداول و/أو المخططات، وتخزين صفوف مختلفة على عقد عاملة مختلفة. الجداول و/أو المخططات الموزعة هي مفتاح Azure Cosmos DB لأداء PostgreSQL. يؤدي الفشل في توزيع الجداول و/أو المخططات إلى تركها بالكامل على عقدة المنسق ولا يمكن الاستفادة من التوازي عبر الأجهزة.

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

أنواع الجداول

هناك خمسة أنواع من الجداول في نظام مجموعة، يتم تخزين كل منها بشكل مختلف على العقد وتستخدم لأغراض مختلفة.

النوع 1: الجداول الموزعة

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

لا يعمل Azure Cosmos DB ل PostgreSQL فقط على تشغيل عبارات SQL ولكن DDL في جميع أنحاء نظام المجموعة. يتعاقب تغيير مخطط الجدول الموزع لتحديث كل مقاطع الجدول عبر العقد العاملة.

عمود التوزيع

يستخدم Azure Cosmos DB ل PostgreSQL التقسيم الخوارزمي لتعيين صفوف للأجزاء. يتم إجراء التخصيص بشكل حاسم بناءً على قيمة عمود الجدول المسمى عمود التوزيع. يجب على مسؤول نظام المجموعة تعيين هذا العمود عند توزيع جدول. يعد اتخاذ القرار الصحيح أمراً مهماً للأداء والوظائف.

النوع 2: الجداول المرجعية

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

عادة ما تكون الجداول المرجعية صغيرة وتستخدم لتخزين البيانات ذات الصلة بالاستعلامات التي تعمل على أي عقدة عاملة. مثال على ذلك القيم المعدودة مثل حالات الطلب أو فئات المنتجات.

النوع 3: الجداول المحلية

عند استخدام Azure Cosmos DB ل PostgreSQL، تكون عقدة المنسق التي تتصل بها هي قاعدة بيانات PostgreSQL عادية. يمكنك إنشاء جداول عادية على المنسق واختيار عدم تقسيمها.

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

النوع 4: الجداول المدارة المحلية

قد يضيف Azure Cosmos DB ل PostgreSQL تلقائيا جداول محلية إلى بيانات التعريف إذا كان هناك مرجع مفتاح خارجي بين جدول محلي وجدول مرجعي. بالإضافة إلى ذلك، يمكن إنشاء الجداول المدارة محليا يدويا عن طريق تنفيذ وظيفة create_reference_table citus_add_local_table_to_metadata على الجداول المحلية العادية. تعتبر الجداول الموجودة في بيانات التعريف جداول مدارة ويمكن الاستعلام منها من أي عقدة، يعرف Citus التوجيه إلى المنسق للحصول على البيانات من الجدول المدار المحلي. يتم عرض هذه الجداول كجداول محلية في طريقة العرض citus_tables .

النوع 5: جداول المخطط

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

المقاطع

وصف القسم السابق كيفية تخزين الجداول الموزعة كمقاطع على العقد العاملة. يناقش هذا القسم المزيد من التفاصيل الفنية.

يحتوي جدول بيانات التعريف pg_dist_shard في المنسق على صف لكل مقطع من كل جدول موزع في النظام. يطابق الصف معرف المقطع مع نطاق من الأعداد الصحيحة في مساحة تجزئة (shardminvalue، shardmaxvalue).

SELECT * from pg_dist_shard;
 logicalrelid  | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
 github_events |  102026 | t            | 268435456     | 402653183
 github_events |  102027 | t            | 402653184     | 536870911
 github_events |  102028 | t            | 536870912     | 671088639
 github_events |  102029 | t            | 671088640     | 805306367
 (4 rows)

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

مواضع المقاطع

لنفترض أن المقطع 102027 مقترن بالصف المعني. تتم قراءة الصف أو كتابته في جدول يسمى github_events_102027 في أحد العقد العاملة. أي عقدة عاملة؟ يتم تحديد ذلك بالكامل بواسطة جداول بيانات التعريف. يُعرف تعيين المقطع إلى عقدة عاملة باسم موضع المقطع.

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

SELECT
    shardid,
    node.nodename,
    node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
  ON placement.groupid = node.groupid
 AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename  │ nodeport │
├─────────┼───────────┼──────────┤
│  102027 │ localhost │     5433 │
└─────────┴───────────┴──────────┘

الخطوات التالية