جداول وطرق عرض نظام Azure Cosmos DB ل PostgreSQL

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

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

بيانات التعريف للمنسق

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

في هذا القسم، نصف كل جدول من جداول بيانات التعريف ومخططها. يمكنك عرض هذه الجداول والاستعلام عنها باستخدام SQL بعد تسجيل الدخول إلى عقدة المنسق.

إشعار

قد لا تقدم المجموعات التي تعمل بالإصدارات القديمة من Citus Engine جميع الجداول المدرجة أدناه.

جدول التقسيم

يخزن الجدول pg_dist_partition بيانات التعريف حول الجداول التي يتم توزيعها في قاعدة البيانات. لكل جدول موزَّع، فإنه يخزن أيضاً معلومات حول طريقة التوزيع ومعلومات مفصلة حول عمود التوزيع.

Name كتابة ‏‏الوصف
logicalrelid regclass الجدول الموزَّع الذي يتوافق معه هذا الصف. تشير هذه القيمة إلى عمود relfilenode في جدول كتالوج نظام pg_class.
partmethod حرف الطريقة المستخدمة من أجل التقسيم / التوزيع. يتم إلحاق قيم هذا العمود المقابلة لأساليب التوزيع المختلفة: "a"، علامة التجزئة: "h"، الجدول المرجعي: "n"
partkey النص معلومات مفصلة حول عمود التوزيع بما في ذلك رقم العمود والنوع والمعلومات الأخرى ذات الصلة.
colocationid integer مجموعة تحديد الموقع التي ينتمي إليها هذا الجدول. تسمح الجداول الموجودة في نفس المجموعة بالصلات ذات الموقع المشترك والتجميعات الموزَّعة بين التحسينات الأخرى. تشير هذه القيمة إلى عمود تحديد الموقع في جدول pg_dist_colocation.
repmodel حرف الأسلوب المستخدم للنسخ المتماثل الخاص بالبيانات. قيم هذا العمود المطابقة لأساليب النسخ المختلفة هي: النسخ المتماثل المستند إلى عبارة Citus: وهو 'c'، النسخ المتماثل المتدفق postgresql: وهو 's'، الالتزام على مرحلتين (للجداول المرجعية): 't'
SELECT * from pg_dist_partition;
 logicalrelid  | partmethod |                                                        partkey                                                         | colocationid | repmodel 
---------------+------------+------------------------------------------------------------------------------------------------------------------------+--------------+----------
 github_events | h          | {VAR :varno 1 :varattno 4 :vartype 20 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 4 :location -1} |            2 | c
 (1 row)

جدول أجزاء

يخزن الجدول pg_dist_shard بيانات التعريف حول الأجزاء الفردية الخاصة بالجدول. يحتوي Pg_dist_shard على معلومات عن أجزاء الجدول الموزعة التي تنتمي إليها، بالإضافة إلي إحصاءات عن عمود التوزيع للأجزاء. بالنسبة إلى إلحاق الجداول الموزَّعة، تتوافق هذه الإحصائيات مع القيم الدنيا/القصوى لعمود التوزيع. بالنسبة لجداول التجزئة الموزَّعة، فهي نطاقات رمز التجزئة المعينة لهذا الجزء. تستخدم هذه الإحصائيات لتقليص الأجزاء غير المرتبطة أثناء استعلامات SELECT.

Name كتابة ‏‏الوصف
logicalrelid regclass الجدول الموزَّع الذي يتوافق معه هذا الصف. تشير هذه القيمة إلى عمود relfilenode في جدول كتالوج نظام pg_class.
shardid عدد صحيح كبير معرف فريد عالميًا تم تعيينه لهذا الجزء.
shardstorage حرف نوع التخزين المستخدم لهذا الجزء. تمت مناقشة أنواع التخزين المختلفة في الجدول أدناه.
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)

أنواع التخزين الخاص بالأجزاء

يشير عمود تخزين الجزء الموجود في pg_dist_shard إلى نوع التخزين المستخدم في الجزء. فيما يلي نظرة عامة موجزة على أنواع تخزين الأجزاء المختلفة وتمثيلها.

نوع التخزين قيمة Shardstorage ‏‏الوصف
TABLE 't' يشير إلى أن الجزء يخزن بيانات تنتمي إلى جدول موزع منتظم.
COLUMNAR 'c' يشير إلى أن الجزء يخزن البيانات العمودية. (مستخدمة بواسطة جداول cstore_fdw الموزَّعة)
FOREIGN 'f' يشير إلى أن الجزء يخزن البيانات الخارجية. (مستخدمة بواسطة جداول file_fdw الموزَّعة)

عرض معلومات أجزاء

بالإضافة إلى جدول بيانات تعريف الجزء منخفض المستوى الموضح أعلاه، يوفر Azure Cosmos DB ل PostgreSQL طريقة citus_shards عرض للتحقق بسهولة:

  • حيث يكون كل جزء (عقدة ومنفذ)،
  • ما نوع الجدول الذي ينتمي إليه، و
  • حجمه

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

SELECT * FROM citus_shards;
.
 table_name | shardid | shard_name   | citus_table_type | colocation_id | nodename  | nodeport | shard_size
------------+---------+--------------+------------------+---------------+-----------+----------+------------
 dist       |  102170 | dist_102170  | distributed      |            34 | localhost |     9701 |   90677248
 dist       |  102171 | dist_102171  | distributed      |            34 | localhost |     9702 |   90619904
 dist       |  102172 | dist_102172  | distributed      |            34 | localhost |     9701 |   90701824
 dist       |  102173 | dist_102173  | distributed      |            34 | localhost |     9702 |   90693632
 ref        |  102174 | ref_102174   | reference        |             2 | localhost |     9701 |       8192
 ref        |  102174 | ref_102174   | reference        |             2 | localhost |     9702 |       8192
 dist2      |  102175 | dist2_102175 | distributed      |            34 | localhost |     9701 |     933888
 dist2      |  102176 | dist2_102176 | distributed      |            34 | localhost |     9702 |     950272
 dist2      |  102177 | dist2_102177 | distributed      |            34 | localhost |     9701 |     942080
 dist2      |  102178 | dist2_102178 | distributed      |            34 | localhost |     9702 |     933888

يشير colocation_id إلى مجموعة الموقع المشترك.

جدول موضع الأجزاء

يتعقب الجدول pg_dist_placement الموقع الخاص بالنسخ المتماثلة للأجزاء على العقد العاملة. تسمى كل نسخة متماثلة من جزء معين لعقدة معينة موضع جزء. يخزن هذا الجدول معلومات عن صحة وموقع كل موضع جزء.

Name كتابة ‏‏الوصف
shardid عدد صحيح كبير معرف الجزء المرتبط بهذا الموضع. تشير هذه القيمة إلى عمود معرف الجزء في جدول كتالوج pg_dist_shard.
shardstate العدد الصحيح يصف حالة هذا التنسيب. نوقشت حالات الأجزاء المختلفة في القسم الوارد أدناه.
shardlength عدد صحيح كبير بالنسبة للجداول الموزعة الملحقة، حجم موضع الجزء على عقدة العامل بالبايت. بالنسبة لجداول التجزئة الموزَّعة، صفر.
placementid عدد صحيح كبير معرّف فريد مُنشأ تلقائياً لكل موضع على حدة.
groupid العدد الصحيح يشير إلى مجموعة من خادم أساسي واحد وخوادم ثانوية صفرية أو أكثر عند استخدام نموذج النسخ المتماثل المتدفق.
SELECT * from pg_dist_placement;
  shardid | shardstate | shardlength | placementid | groupid
 ---------+------------+-------------+-------------+---------
   102008 |          1 |           0 |           1 |       1
   102008 |          1 |           0 |           2 |       2
   102009 |          1 |           0 |           3 |       2
   102009 |          1 |           0 |           4 |       3
   102010 |          1 |           0 |           5 |       3
   102010 |          1 |           0 |           6 |       4
   102011 |          1 |           0 |           7 |       4

الحالات الخاصة بموضع الأجزاء

يدير Azure Cosmos DB ل PostgreSQL صحة الأجزاء على أساس كل موضع. إذا وضع موضع النظام في حالة غير متناسقة، فإن Azure Cosmos DB ل PostgreSQL يضع علامة عليه تلقائيا على أنه غير متوفر. تسجل حالة الموضع في الجدول pg_dist_shard_placement، داخل عمود shardstate. فيما يلي نظرة عامة موجزة على حالات وضع الأجزاء المختلفة:

اسم الولاية قيمة Shardstate ‏‏الوصف
FINALIZED 1 تنشأ الأجزاء الجديدة للحالة في. تعد مواضع الأجزاء في هذه الحالة محدثة وتستخدم في تخطيط الاستعلام وتنفيذه.
isactive 3 تعد مواضع الأجزاء في هذه الحالة غير نشطة نظرًا لكونها غير متزامنة مع النسخ المتماثلة الأخرى للجزء نفسه. يمكن أن تحدث الحالة عند فشل عملية إلحاق أو تعديل (INSERT أو UPDATE أو DELETE) أو عملية DDL لهذا الموضع. سيتجاهل مخطط الاستعلام المواضع في هذه الحالة أثناء التخطيط والتنفيذ. يمكن للمستخدمين مزامنة البيانات الموجودة في هذه الأجزاء مع نسخة متماثلة نهائية كنشاط في الخلفية.
لحذف 4 إذا حاول Azure Cosmos DB ل PostgreSQL إسقاط موضع جزء استجابة لاستدعاء master_apply_delete_command وفشل، يتم نقل الموضع إلى هذه الحالة. يمكن للمستخدمين بعد ذلك حذف هذه الأجزاء كنشاط مهمة في الخلفية لاحق.

جدول عقدة العامل

يحتوي الجدول pg_dist_node على معلومات حول العقد العاملة في نظام المجموعة.

Name كتابة ‏‏الوصف
nodeid العدد الصحيح المعرف المُنشأ تلقائياً لعقدة فردية.
groupid العدد الصحيح المعرف المستخدم من أجل الإشارة إلى مجموعة من خادم أساسي واحد وخوادم ثانوية صفرية أو أكثر، عند استخدام نموذج النسخ المتماثل المتدفق. بشكل افتراضي، يكون هو نفسه معرّف العقدة.
nodename النص اسم المضيف أو عنوان IP لعقدة العامل PostgreSQL.
nodeport العدد الصحيح رقم المنفذ الذي تستمع إليه عقدة العامل PostgreSQL.
noderack النص (اختياري) معلومات وضع الرف للعقدة العاملة.
hasmetadata boolean محجوز للاستخدام الداخلي.
isactive boolean سواء كانت العقدة نشطة في قبول مواضع الأجزاء أم لا.
noderole النص ما إذا كانت العقدة أساسية أو ثانوية
nodecluster النص اسم نظام المجموعة التي تحتوي على هذه العقدة
shouldhaveshards boolean إذا كانت خاطئة، فسيتم نقل القطع من العقدة (التي يتم تصريفها) عند إعادة التوازن، ولن يتم وضع الأجزاء من الجداول الموزَّعة الجديدة على العقدة، ما لم يتم نقلها إلى مكان مع الأجزاء الموجودة بالفعل
SELECT * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | shouldhaveshards
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+------------------
      1 |       1 | localhost |    12345 | default  | f           | t        | primary  | default     | t
      2 |       2 | localhost |    12346 | default  | f           | t        | primary  | default     | t
      3 |       3 | localhost |    12347 | default  | f           | t        | primary  | default     | t
(3 rows)

جدول العنصر الموزَّع

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

Name كتابة ‏‏الوصف
classid معرف العنصر فئة العنصر الموزَّع
objid معرف العنصر معرف العنصر للعنصر الموزَّع
objsubid integer المعرف الفرعي للعنصر الموزَّع، على سبيل المثال، attnum
النوع النص جزء من العنوان الثابت المستخدم أثناء ترقيات pg
object_names text[] جزء من العنوان الثابت المستخدم أثناء ترقيات pg
object_args text[] جزء من العنوان الثابت المستخدم أثناء ترقيات pg
distribution_argument_index integer صالحة فقط للوظائف/الإجراءات الموزَّعة
colocationid integer صالحة فقط للوظائف/الإجراءات الموزَّعة

تحدد "العناوين الثابتة" العناصر بشكل فريد بشكل مستقل عن خادم معين. يتعقب Azure Cosmos DB ل PostgreSQL الكائنات أثناء ترقية PostgreSQL باستخدام عناوين مستقرة تم إنشاؤها باستخدام الدالة pg_identify_object_as_address().

فيما يلي مثال لكيفية إضافة create_distributed_function() adds entries to the citus.pg_dist_object:

CREATE TYPE stoplight AS enum ('green', 'yellow', 'red');

CREATE OR REPLACE FUNCTION intersection()
RETURNS stoplight AS $$
DECLARE
        color stoplight;
BEGIN
        SELECT *
          FROM unnest(enum_range(NULL::stoplight)) INTO color
         ORDER BY random() LIMIT 1;
        RETURN color;
END;
$$ LANGUAGE plpgsql VOLATILE;

SELECT create_distributed_function('intersection()');

-- will have two rows, one for the TYPE and one for the FUNCTION
TABLE citus.pg_dist_object;
-[ RECORD 1 ]---------------+------
classid                     | 1247
objid                       | 16780
objsubid                    | 0
type                        |
object_names                |
object_args                 |
distribution_argument_index |
colocationid                |
-[ RECORD 2 ]---------------+------
classid                     | 1255
objid                       | 16788
objsubid                    | 0
type                        |
object_names                |
object_args                 |
distribution_argument_index |
colocationid                |

طريقة عرض المخططات الموزعة

قدم Citus 12.0 مفهوم التقسيم المستند إلى المخطط ومعه طريقة العرض "citus_schemas"، والتي توضح المخططات التي تم توزيعها في النظام. تسرد طريقة العرض المخططات الموزعة فقط، ولا يتم عرض المخططات المحلية.

Name كتابة ‏‏الوصف
schema_name regnamespace اسم المخطط الموزع
colocation_id integer معرف الموقع المشترك للمخطط الموزع
schema_size النص ملخص الحجم القابل للقراءة البشرية لكافة الكائنات داخل المخطط
schema_owner الاسم الدور الذي يمتلك المخطط

وفيما يلي مثال على ذلك:

 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             1 | 0 bytes     | userservice
 timeservice |             2 | 0 bytes     | timeservice
 pingservice |             3 | 632 kB      | pingservice

عرض الجداول الموزَّعة

citus_tables تعرض طريقة العرض ملخصا لجميع الجداول التي يديرها Azure Cosmos DB ل PostgreSQL (الجداول الموزعة والمرجعية). يجمع العرض بين المعلومات من Azure Cosmos DB لجداول بيانات التعريف PostgreSQL للحصول على نظرة عامة سهلة وقابلة للقراءة من قبل الإنسان لخصائص الجدول هذه:

  • نوع الجدول
  • عمود التوزيع
  • معرّف مجموعة Colocation
  • حجم يمكن قراءته من قبل الإنسان
  • أجزاء العد
  • المالك (مستخدم قاعدة البيانات)
  • طريقة الوصول (كومة أو عمودي)

وفيما يلي مثال على ذلك:

SELECT * FROM citus_tables;
┌────────────┬──────────────────┬─────────────────────┬───────────────┬────────────┬─────────────┬─────────────┬───────────────┐
│ table_name │ citus_table_type │ distribution_column │ colocation_id │ table_size │ shard_count │ table_owner │ access_method │
├────────────┼──────────────────┼─────────────────────┼───────────────┼────────────┼─────────────┼─────────────┼───────────────┤
│ foo.test   │ distributed      │ test_column         │             1 │ 0 bytes    │          32 │ citus       │ heap          │
│ ref        │ reference        │ <none>              │             2 │ 24 GB      │           1 │ citus       │ heap          │
│ test       │ distributed      │ id                  │             1 │ 248 TB     │          32 │ citus       │ heap          │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘

عرض أقسام الوقت

يوفر Azure Cosmos DB ل PostgreSQL UDFs لإدارة أقسام حالة استخدام بيانات Timeseries. كما أنه يحتفظ بطريقة عرض time_partitions لفحص الأقسام التي يديرها.

الأعمدة

  • parent_table الجدول المقسم
  • partition_column العمود الذي تم تقسيم الجدول الأصلي عليه
  • القسم اسم جدول الأقسام
  • from_value الحد الأدنى في الوقت للصفوف في هذا القسم
  • to_value الحد الأعلى في الوقت للصفوف في هذا القسم
  • access_method كومة للتخزين المستند إلى الصفوف والعمودية للتخزين العمودي
SELECT * FROM time_partitions;
┌────────────────────────┬──────────────────┬─────────────────────────────────────────┬─────────────────────┬─────────────────────┬───────────────┐
│      parent_table      │ partition_column │                partition                │     from_value      │      to_value       │ access_method │
├────────────────────────┼──────────────────┼─────────────────────────────────────────┼─────────────────────┼─────────────────────┼───────────────┤
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0000 │ 2015-01-01 00:00:00 │ 2015-01-01 02:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0200 │ 2015-01-01 02:00:00 │ 2015-01-01 04:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0400 │ 2015-01-01 04:00:00 │ 2015-01-01 06:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0600 │ 2015-01-01 06:00:00 │ 2015-01-01 08:00:00 │ heap          │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘

جدول مجموعة الموقع المشترك

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

Name كتابة ‏‏الوصف
colocationid العدد الصحيح المعرّف الفريد لمجموعة الموقع الذي يتوافق معه هذا الصف.
shardcount العدد الصحيح عدد الأجزاء لكافة الجداول الموجودة في مجموعة الموقع المشترك هذه
replicationfactor العدد الصحيح عامل النسخ المتماثل لجميع الجداول في مجموعة الموقع المشترك هذه.
distributioncolumntype معرف العنصر نوع عمود التوزيع لجميع الجداول في مجموعة الموقع المشترك هذه.
SELECT * from pg_dist_colocation;
  colocationid | shardcount | replicationfactor | distributioncolumntype 
 --------------+------------+-------------------+------------------------
			 2 |         32 |                 2 |                     20
  (1 row)

جدول إستراتيجية Rebalancer

يحدد هذا الجدول الاستراتيجيات rebalance_table_shards التي يمكن استخدامها من أجل تحديد مكان نقل الأجزاء.

Name كتابة ‏‏الوصف
default_strategy boolean ما إذا كان يجب على rebalance_table_shards اختيار هذه الإستراتيجية افتراضياً. استخدم citus_set_default_rebalance_strategy لتحديث هذا العمود
shard_cost_function regproc معرف لدالة التكلفة، والتي يجب أن تأخذ معرف الجزء على أنها bigint، وتعيد مفهومها عن التكلفة، كنوع حقيقي
node_capacity_function regproc مُعرّف لوظيفة السعة، والتي يجب أن تأخذ العقدة على أنها int، وتعود مفهومها عن سعة العقدة كنوع حقيقي
shard_allowed_on_node_function regproc يقوم معرف الدالة التي تعطي shardid bigint وnodeidarg int بإرجاع قيمة منطقية لما إذا كان Azure Cosmos DB ل PostgreSQL يمكنه تخزين الجزء على العقدة
default_threshold حُر4 يعد حد اعتبار العقدة ممتلئة جدًا أو فارغة جدًا، والتي تحدد متى يجب أن يحاول rebalance_table_shards نقل الأجزاء
minimum_threshold حُر4 حماية لمنع تعيين وسيطة الحد rebalance_table_shards() علي مستوي منخفض جدًا

بشكل افتراضي، يتم شحن Cosmos DB ل PostgreSQL مع هذه الاستراتيجيات في الجدول:

SELECT * FROM pg_dist_rebalance_strategy;
-[ RECORD 1 ]-------------------+-----------------------------------
Name                            | by_shard_count
default_strategy                | false
shard_cost_function             | citus_shard_cost_1
node_capacity_function          | citus_node_capacity_1
shard_allowed_on_node_function  | citus_shard_allowed_on_node_true
default_threshold               | 0
minimum_threshold               | 0
-[ RECORD 2 ]-------------------+-----------------------------------
Name                            | by_disk_size
default_strategy                | true
shard_cost_function             | citus_shard_cost_by_disk_size
node_capacity_function          | citus_node_capacity_1
shard_allowed_on_node_function  | citus_shard_allowed_on_node_true
default_threshold               | 0.1
minimum_threshold               | 0.01

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

إنشاء إستراتيجيات مخصصة لإعادة التوازن

فيما يلي أمثلة على الدالات التي يمكن استخدامها ضمن استراتيجيات إعادة توازن الأجزاء الجديدة، وتسجيلها في pg_dist_rebalance_strategy مع الدالةcitus_add_rebalance_strategy.

  • تعيين استثناء لسعة العقدة حسب نمط اسم المضيف:

    CREATE FUNCTION v2_node_double_capacity(nodeidarg int)
        RETURNS boolean AS $$
        SELECT
            (CASE WHEN nodename LIKE '%.v2.worker.citusdata.com' THEN 2 ELSE 1 END)
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    
  • إعادة التوازن من خلال عدد الاستعلامات التي تنتقل إلى جزء، كما تم قياسه بواسطة citus_stat_statements:

    -- example of shard_cost_function
    
    CREATE FUNCTION cost_of_shard_by_number_of_queries(shardid bigint)
        RETURNS real AS $$
        SELECT coalesce(sum(calls)::real, 0.001) as shard_total_queries
        FROM citus_stat_statements
        WHERE partition_key is not null
            AND get_shard_id_for_distribution_column('tab', partition_key) = shardid;
    $$ LANGUAGE sql;
    
  • عزل جزء معين (10000) على عقدة (العنوان '10.0.0.1 '):

    -- example of shard_allowed_on_node_function
    
    CREATE FUNCTION isolate_shard_10000_on_10_0_0_1(shardid bigint, nodeidarg int)
        RETURNS boolean AS $$
        SELECT
            (CASE WHEN nodename = '10.0.0.1' THEN shardid = 10000 ELSE shardid != 10000 END)
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    
    -- The next two definitions are recommended in combination with the above function.
    -- This way the average utilization of nodes is not impacted by the isolated shard.
    CREATE FUNCTION no_capacity_for_10_0_0_1(nodeidarg int)
        RETURNS real AS $$
        SELECT
            (CASE WHEN nodename = '10.0.0.1' THEN 0 ELSE 1 END)::real
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    CREATE FUNCTION no_cost_for_10000(shardid bigint)
        RETURNS real AS $$
        SELECT
            (CASE WHEN shardid = 10000 THEN 0 ELSE 1 END)::real
        $$ LANGUAGE sql;
    

جدول إحصائيات الاستعلام

يوفر citus_stat_statements Azure Cosmos DB ل PostgreSQL إحصائيات حول كيفية تنفيذ الاستعلامات، ولمن. إنه مشابه (ويمكن ضمه) لطريقة العرض pg_stat_statements في PostgreSQL، والتي تتعقب الإحصائيات عن سرعة الاستعلام.

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

Name كتابة ‏‏الوصف
queryid عدد صحيح كبير المعرف (جيد لضم pg_stat_statements)
معرف المستخدم معرف العنصر المستخدم الذي قام بتشغيل الاستعلام
dbid معرف العنصر مثيل قاعدة البيانات للمنسق
استعلام النص سلسلة استعلام مجهولة المصدر
executor النص مُنفِّذ Citus المستخدم: التكيفي أو في الوقت الحقيقي أو تعقب المهام أو الموجه أو تحديد الإدخال
partition_key النص قيمة عمود التوزيع في الاستعلامات التي ينفذها الموجه، وإلا NULL
calls عدد صحيح كبير عدد المرات التي تم فيها تنفيذ الاستعلام
-- create and populate distributed table
create table foo ( id int );
select create_distributed_table('foo', 'id');
insert into foo select generate_series(1,100);

-- enable stats
-- pg_stat_statements must be in shared_preload libraries
create extension pg_stat_statements;

select count(*) from foo;
select * from foo where id = 42;

select * from citus_stat_statements;

النتائج:

-[ RECORD 1 ]-+----------------------------------------------
queryid       | -909556869173432820
userid        | 10
dbid          | 13340
query         | insert into foo select generate_series($1,$2)
executor      | insert-select
partition_key |
calls         | 1
-[ RECORD 2 ]-+----------------------------------------------
queryid       | 3919808845681956665
userid        | 10
dbid          | 13340
query         | select count(*) from foo;
executor      | adaptive
partition_key |
calls         | 1
-[ RECORD 3 ]-+----------------------------------------------
queryid       | 5351346905785208738
userid        | 10
dbid          | 13340
query         | select * from foo where id = $1
executor      | adaptive
partition_key | 42
calls         | 1

تحذيرات:

  • لا يتم نسخ بيانات الإحصائيات، ولن تنجو من أعطال قاعدة البيانات أو تجاوز الفشل
  • يتتبع عدداً محدوداً من الاستعلامات التي تم تعيينها بواسطة pg_stat_statements.max GUC (الافتراضي 5000)
  • لاقتطاع الجدول، استخدم الوظيفة citus_stat_statements_reset()

نشاط الاستعلام الموزَّع

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

  • citus_dist_stat_activity: تعرض الاستعلامات الموزَّعة التي يتم تنفيذها على جميع العقد. مجموعة شاملة من pg_stat_activity، يمكن استخدامها أينما كان الأخير.
  • citus_worker_stat_activity: يعرض الاستعلامات عن العمال، بما في ذلك استعلامات التجزئة مقابل الأجزاء الفردية.
  • citus_lock_waits: استعلامات محظورة عبر المجموعة.

يشتمل أول عرضين على جميع أعمدة pg_stat_activity بالإضافة إلى مضيف المضيف/المنفذ للعامل الذي بدأ الاستعلام والمضيف/المنفذ لعقدة منسق المجموعة.

على سبيل المثال، ضع في الاعتبار حساب الصفوف في جدول موزع:

-- run from worker on localhost:9701

SELECT count(*) FROM users_table;

يمكننا أن نرى أن الاستعلام يظهر في citus_dist_stat_activity:

SELECT * FROM citus_dist_stat_activity;

-[ RECORD 1 ]----------+----------------------------------
query_hostname         | localhost
query_hostport         | 9701
master_query_host_name | localhost
master_query_host_port | 9701
transaction_number     | 1
transaction_stamp      | 2018-10-05 13:27:20.691907+03
datid                  | 12630
datname                | postgres
pid                    | 23723
usesysid               | 10
usename                | citus
application\_name      | psql
client\_addr           | 
client\_hostname       | 
client\_port           | -1
backend\_start         | 2018-10-05 13:27:14.419905+03
xact\_start            | 2018-10-05 13:27:16.362887+03
query\_start           | 2018-10-05 13:27:20.682452+03
state\_change          | 2018-10-05 13:27:20.896546+03
wait\_event_type       | Client
wait\_event            | ClientRead
state                  | idle in transaction
backend\_xid           | 
backend\_xmin          | 
query                  | SELECT count(*) FROM users_table;
backend\_type          | client backend

يتطلب هذا الاستعلام معلومات من جميع القطع. بعض المعلومات موجودة في جزء users_table_102038، والذي يخزن في localhost:9700. يمكننا رؤية استعلاما يصل إلى الجزء من خلال النظر إلى citus_worker_stat_activity طريقة العرض:

SELECT * FROM citus_worker_stat_activity;

-[ RECORD 1 ]----------+-----------------------------------------------------------------------------------------
query_hostname         | localhost
query_hostport         | 9700
master_query_host_name | localhost
master_query_host_port | 9701
transaction_number     | 1
transaction_stamp      | 2018-10-05 13:27:20.691907+03
datid                  | 12630
datname                | postgres
pid                    | 23781
usesysid               | 10
usename                | citus
application\_name      | citus
client\_addr           | ::1
client\_hostname       | 
client\_port           | 51773
backend\_start         | 2018-10-05 13:27:20.75839+03
xact\_start            | 2018-10-05 13:27:20.84112+03
query\_start           | 2018-10-05 13:27:20.867446+03
state\_change          | 2018-10-05 13:27:20.869889+03
wait\_event_type       | Client
wait\_event            | ClientRead
state                  | idle in transaction
backend\_xid           | 
backend\_xmin          | 
query                  | COPY (SELECT count(*) AS count FROM users_table_102038 users_table WHERE true) TO STDOUT
backend\_type          | client backend

query يعرض الحقل البيانات التي تنسخ من الجزء المراد حسابه.

إشعار

إذا كان هناك استعلام عن الموجه (على سبيل المثال، مستأجر واحد في تطبيق متعدد المستأجرين، فاختر

  • يتم التنفيذ من جدول tenant_id = X`) بدون كتلة عملية، فإن أعمدة master_query_host_name وmaster_query_host_port ستكون فارغة في citus_worker_stat_activity.

فيما يلي أمثلة على الاستعلامات المفيدة التي يمكنك إنشاؤها باستخدام citus_worker_stat_activity:

-- active queries' wait events on a certain node

SELECT query, wait_event_type, wait_event
  FROM citus_worker_stat_activity
 WHERE query_hostname = 'xxxx' and state='active';

-- active queries' top wait events

SELECT wait_event, wait_event_type, count(*)
  FROM citus_worker_stat_activity
 WHERE state='active'
 GROUP BY wait_event, wait_event_type
 ORDER BY count(*) desc;

-- total internal connections generated per node by Azure Cosmos DB for PostgreSQL

SELECT query_hostname, count(*)
  FROM citus_worker_stat_activity
 GROUP BY query_hostname;

-- total internal active connections generated per node by Azure Cosmos DB for PostgreSQL

SELECT query_hostname, count(*)
  FROM citus_worker_stat_activity
 WHERE state='active'
 GROUP BY query_hostname;

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

CREATE TABLE numbers AS
  SELECT i, 0 AS j FROM generate_series(1,10) AS i;
SELECT create_distributed_table('numbers', 'i');

بعد ذلك، باستخدام جلستين على المنسق، يمكننا تشغيل هذا التسلسل من العبارات:

-- session 1                           -- session 2
-------------------------------------  -------------------------------------
BEGIN;
UPDATE numbers SET j = 2 WHERE i = 1;
                                       BEGIN;
                                       UPDATE numbers SET j = 3 WHERE i = 1;
                                       -- (this blocks)

تظهر طريقة العرض citus_lock_waits الحالة.

SELECT * FROM citus_lock_waits;

-[ RECORD 1 ]-------------------------+----------------------------------------
waiting_pid                           | 88624
blocking_pid                          | 88615
blocked_statement                     | UPDATE numbers SET j = 3 WHERE i = 1;
current_statement_in_blocking_process | UPDATE numbers SET j = 2 WHERE i = 1;
waiting_node_id                       | 0
blocking_node_id                      | 0
waiting_node_name                     | coordinator_host
blocking_node_name                    | coordinator_host
waiting_node_port                     | 5432
blocking_node_port                    | 5432

في هذا المثال، نشأت الاستعلامات على المنسق، ولكن يمكن أن تسرد طريقة العرض أيضا التأمينات بين الاستعلامات التي تنشأ على العمال (يتم تنفيذها باستخدام Azure Cosmos DB ل PostgreSQL MX على سبيل المثال).

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