جداول النظام وطرق العرض
يقوم Hyperscale (Citus) بإنشاء جداول خاصة تحتوي على معلومات حول البيانات الموزعة في مجموعة الخوادم والاحتفاظ بها. تستشير عقدة المنسق هذه الجداول عند التخطيط لكيفية تشغيل الاستعلامات عبر العقد العاملة.
البيانات الوصفية للمنسق
يقسم Hyperscale (Citus) كل جدول موزع إلى شظايا منطقية متعددة استنادا إلى عمود التوزيع. ثم يحتفظ المنسق بجداول البيانات الوصفية لتتبع الإحصاءات والمعلومات حول صحة هذه الشظايا وموقعها.
في هذا القسم، نصف كل جدول من جداول البيانات الوصفية هذه ومخططها. يمكنك عرض هذه الجداول والاستعلام عنها باستخدام SQL بعد تسجيل الدخول إلى عقدة المنسق.
ملاحظة
قد لا تقدم مجموعات خوادم Hyperscale (Citus) التي تقوم بتشغيل إصدارات أقدم من Citus Engine كافة الجداول المدرجة أدناه.
جدول الأقسام
يخزن جدول pg_dist_partition بيانات التعريف حول الجداول التي يتم توزيعها في قاعدة البيانات. لكل جدول موزع ، فإنه يخزن أيضا معلومات حول طريقة التوزيع ومعلومات مفصلة حول عمود التوزيع.
| الاسم | النوع | الوصف |
|---|---|---|
| منطقي | ريج كلاس | الجدول الموزع الذي يتوافق معه هذا الصف. تشير هذه القيمة إلى العمود relfilenode في جدول كتالوج النظام pg_class. |
| طريقة جزئية | حرف | الطريقة المستخدمة للتقسيم / التوزيع. يتم إلحاق قيم هذا العمود المقابلة لطرق التوزيع المختلفة: "a" ، التجزئة: "h" ، الجدول المرجعي: "n" |
| بارتكي | نص | معلومات مفصلة حول عمود التوزيع بما في ذلك رقم العمود ونوعه والمعلومات الأخرى ذات الصلة. |
| colocationid | عدد صحيح | مجموعة التجميع التي ينتمي إليها هذا الجدول. تسمح الجداول في نفس المجموعة بالوصول إلى المواقع المشتركة ومجموعة التحديثات الموزعة بين التحسينات الأخرى. تشير هذه القيمة إلى عمود colocationid في جدول pg_dist_colocation. |
| ريبمود | حرف | الطريقة المستخدمة لنسخ البيانات. قيم هذا العمود المقابلة لطرق النسخ المتماثل المختلفة هي: النسخ المتماثل المستند إلى بيان 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.
| الاسم | النوع | الوصف |
|---|---|---|
| منطقي | ريج كلاس | الجدول الموزع الذي يتوافق معه هذا الصف. تشير هذه القيمة إلى العمود relfilenode في جدول كتالوج النظام pg_class. |
| شارديد | عدد صحيح كبير | معرف فريد عالميا مخصص لهذا الشظية. |
| شظايا التخزين | حرف | نوع التخزين المستخدم لهذا الشظية. تتم مناقشة أنواع التخزين المختلفة في الجدول أدناه. |
| شاردمينفالي | نص | لإلحاق الجداول الموزعة، الحد الأدنى لقيمة عمود التوزيع في هذا الشظية (شامل). بالنسبة للجداول الموزعة للتجزئة ، الحد الأدنى لقيمة رمز التجزئة المعينة لهذا الشظية (شامل). |
| شاردماكس فاليو | نص | لإلحاق الجداول الموزعة، القيمة القصوى لعمود التوزيع في هذا الشظية (شاملة). بالنسبة للجداول الموزعة للتجزئة ، يتم تعيين الحد الأقصى لقيمة رمز التجزئة إلى هذا الشظية (شامل). |
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 إلى نوع التخزين المستخدم للشظايا. فيما يلي نظرة عامة موجزة على أنواع تخزين الشظايا المختلفة وتمثيلها.
| نوع التخزين | قيمة التخزين الشاردي | الوصف |
|---|---|---|
| جدول | 'ر' | يشير إلى أن shard يخزن البيانات التي تنتمي إلى جدول موزع منتظم. |
| عمودي | 'ج' | يشير إلى أن الشظية تخزن البيانات العمودية. (تستخدم من قبل الجداول cstore_fdw الموزعة) |
| أجنبي | 'و' | يشير إلى أن شارد يخزن البيانات الأجنبية. (تستخدم من قبل الجداول file_fdw الموزعة) |
عرض معلومات شارد
بالإضافة إلى جدول البيانات الوصفية للشارد منخفض المستوى الموضح أعلاه، يوفر Hyperscale (Citus) طريقة 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 موقع النسخ المتماثلة للشارد على عقد العمال. تسمى كل نسخة طبق الأصل من شظية معينة بموضع شظية. يخزن هذا الجدول معلومات حول صحة وموقع كل موضع شظية.
| الاسم | النوع | الوصف |
|---|---|---|
| شارديد | عدد صحيح كبير | معرف شارد المرتبط بهذا الموضع. تشير هذه القيمة إلى العمود الموضح في جدول كتالوج pg_dist_shard. |
| شظايا | Int | يصف حالة هذا الموضع. تتم مناقشة حالات الشظايا المختلفة في القسم أدناه. |
| شاردطول | عدد صحيح كبير | لإلحاق الجداول الموزعة، حجم موضع الشظية على العقدة العاملة بالبايت. بالنسبة للجداول الموزعة بالتجزئة، صفر. |
| الموضع | عدد صحيح كبير | معرف فريد يتم إنشاؤه تلقائيا لكل موضع على حدة. |
| معرف المجموعة | Int | يشير إلى مجموعة من خادم أساسي واحد وخوادم ثانوية صفرية أو أكثر عند استخدام نموذج النسخ المتماثل للتدفق. |
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
شارد التنسيب الدول
يدير Hyperscale (Citus) صحة الشظايا على أساس كل موضع. إذا وضع موضع النظام في حالة غير متناسقة، فإن Citus يضع عليه تلقائيا علامة غير متوفر. يتم تسجيل حالة الموضع في جدول pg_dist_shard_placement، داخل عمود shardstate. فيما يلي نظرة عامة موجزة على حالات وضع الشظايا المختلفة:
| اسم الولاية | قيمة شاردستات | الوصف |
|---|---|---|
| وضع الصيغه النهائيه | 1 | يتم إنشاء شظايا جديدة الدولة في. تعتبر مواضع Shard في هذه الحالة محدثة وتستخدم في تخطيط الاستعلام وتنفيذه. |
| كسلان | 3 | تعتبر مواضع Shard في هذه الحالة غير نشطة نظرا لعدم مزامنتها مع النسخ المتماثلة الأخرى لنفس الشظية. يمكن أن تحدث الحالة عند فشل إلحاق أو تعديل (إدراج أو تحديث أو حذف) أو عملية DDL لهذا الموضع. سيتجاهل مخطط الاستعلام المواضع في هذه الحالة أثناء التخطيط والتنفيذ. يمكن للمستخدمين مزامنة البيانات الموجودة في هذه الشظايا مع نسخة متماثلة منتهية كنشاط في الخلفية. |
| TO_DELETE | 4 | إذا حاول Citus إسقاط موضع شظية استجابة لمكالمة master_apply_delete_command وفشل، نقل الموضع إلى هذه الحالة. يمكن للمستخدمين بعد ذلك حذف هذه الشظايا كنشاط لاحق في الخلفية. |
جدول عقدة العامل
يحتوي جدول pg_dist_node على معلومات حول العقد العاملة في المجموعة.
| الاسم | النوع | الوصف |
|---|---|---|
| العقدة | Int | معرف تم إنشاؤه تلقائيا لعقدة فردية. |
| معرف المجموعة | Int | يستخدم المعرف للدلالة على مجموعة من خادم أساسي واحد وصفر أو أكثر من الخوادم الثانوية، عند استخدام نموذج النسخ المتماثل للتدفق. بشكل افتراضي ، يكون هو نفسه العقدة. |
| اسم العقدة | نص | اسم المضيف أو عنوان IP لعقدة عامل PostgreSQL. |
| العقدة | Int | رقم المنفذ الذي تستمع إليه عقدة عامل PostgreSQL. |
| نوديراك | نص | (اختياري) معلومات موضع الحامل لعقدة العامل. |
| يحتوي على بيانات وصفية | منطقي | محجوز للاستخدام الداخلي. |
| نشط | منطقي | ما إذا كانت العقدة نشطة في قبول مواضع الشظايا. |
| العقدة | نص | ما إذا كانت العقدة أساسية أو ثانوية |
| عقدة كلاستر | نص | اسم المجموعة التي تحتوي على هذه العقدة |
| ينبغيهاشدشدات | منطقي | إذا كانت خاطئة ، نقل الشظايا من العقدة (تصريفها) عند إعادة التوازن ، ولن يتم وضع شظايا من الجداول الموزعة الجديدة على العقدة ، ما لم تكن موجودة مع شظايا موجودة بالفعل |
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 على قائمة بالكائنات مثل الأنواع والدالات التي تم إنشاؤها على عقدة المنسق ونشرها على العقد العاملة. عندما يضيف مسؤول عقد عامل جديدة إلى المجموعة، يقوم Hyperscale (Citus) تلقائيا بإنشاء نسخ من الكائنات الموزعة على العقد الجديدة (بالترتيب الصحيح لتلبية تبعيات الكائن).
| الاسم | النوع | الوصف |
|---|---|---|
| كلاسويد | oid | فئة الكائن الموزع |
| اوبيج | oid | معرف الكائن للكائن الموزع |
| objsubid | عدد صحيح | معرف الكائن الفرعي للكائن الموزع ، على سبيل المثال ، attnum |
| النوع | نص | جزء من العنوان المستقر المستخدم أثناء ترقيات pg |
| object_names | النص[] | جزء من العنوان المستقر المستخدم أثناء ترقيات pg |
| object_args | النص[] | جزء من العنوان المستقر المستخدم أثناء ترقيات pg |
| distribution_argument_index | عدد صحيح | صالح فقط للوظائف/الإجراءات الموزعة |
| colocationid | عدد صحيح | صالح فقط للوظائف/الإجراءات الموزعة |
تحدد "العناوين المستقرة" الكائنات بشكل فريد بشكل مستقل عن خادم معين. يتتبع Hyperscale (Citus) الكائنات أثناء ترقية PostgreSQL باستخدام عناوين مستقرة تم إنشاؤها باستخدام الدالة pg_identify_object_as_address().
فيما يلي مثال على كيفية create_distributed_function() إضافة إدخالات إلى الجدول 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_tables طريقة العرض ملخصا لجميع الجداول التي يديرها Hyperscale (Citus) (الجداول الموزعة والمرجعية). تجمع طريقة العرض معلومات من جداول بيانات تعريف Hyperscale (Citus) للحصول على نظرة عامة سهلة وقابلة للقراءة البشرية لخصائص الجدول هذه:
- نوع الجدول
- عمود التوزيع
- معرف مجموعة الموقع المشترك
- حجم قابل للقراءة من قبل الإنسان
- عدد الشارد
- المالك (مستخدم قاعدة البيانات)
- طريقة الوصول (كومة أو عمودية)
وفيما يلي مثال على ذلك:
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 │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘
طريقة عرض أقسام الوقت
يوفر Hyperscale (Citus) UDFs لإدارة الأقسام لحالة استخدام بيانات السلسلة الزمنية. كما أنه يحتفظ بعرض 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 على معلومات حول شظايا الجداول التي يجب وضعها معا أو وضعها في مكان واحد. عندما يكون جدولان في نفس مجموعة الموقع المشترك، يضمن Hyperscale (Citus) وضع شظايا بنفس قيم عمود التوزيع على نفس العقد العاملة. يتيح Colocation تحسينات الانضمام وبعض مجموعات التحديثات الموزعة ودعم المفاتيح الخارجية. يتم الاستدلال على تحديد موقع Shard المشترك عندما تتطابق أعداد الشظايا وعوامل النسخ المتماثل وأنواع أعمدة الأقسام بين جدولين. ومع ذلك، قد يتم تحديد مجموعة تحديد موقع مشترك مخصصة عند إنشاء جدول موزع، إذا رغبت في ذلك.
| الاسم | النوع | الوصف |
|---|---|---|
| colocationid | Int | معرف فريد لمجموعة الموقع المشترك يتوافق معه هذا الصف. |
| شظايا | Int | عدد الشارد لجميع الجداول في مجموعة التجميع هذه |
| عامل النسخ المتماثل | Int | عامل النسخ المتماثل لكافة الجداول في مجموعة التجميع هذه. |
| توزيعنوع العمود | oid | نوع عمود التوزيع لكافة الجداول في مجموعة الموقع المشترك هذه. |
SELECT * from pg_dist_colocation;
colocationid | shardcount | replicationfactor | distributioncolumntype
--------------+------------+-------------------+------------------------
2 | 32 | 2 | 20
(1 row)
جدول استراتيجية إعادة التوازن
يحدد هذا الجدول الاستراتيجيات التي يمكن rebalance_table_shards استخدامها لتحديد مكان تحريك الشظايا.
| الاسم | النوع | الوصف |
|---|---|---|
| default_strategy | منطقي | ما إذا كان يجب على rebalance_table_shards اختيار هذه الاستراتيجية افتراضيا. استخدام citus_set_default_rebalance_strategy لتحديث هذا العمود |
| shard_cost_function | ريجبروك | معرف دالة التكلفة ، والتي يجب أن تأخذ شارديد على أنها bigint ، وإرجاع مفهومها عن التكلفة ، كنوع حقيقي |
| node_capacity_function | ريجبروك | معرف دالة السعة، التي يجب أن تأخذ العقدة على أنها int، وتعيد مفهومها عن سعة العقدة كنوع حقيقي |
| shard_allowed_on_node_function | ريجبروك | يقوم معرف الدالة التي تعطي bigint شارديد ، و nodeidarg int ، بإرجاع منطقي لما إذا كان Citus قد يخزن الشظية على العقدة |
| default_threshold | حُر4 | عتبة اعتبار العقدة ممتلئة جدا أو فارغة جدا ، والتي تحدد متى يجب أن يحاول rebalance_table_shards تحريك الشظايا |
| minimum_threshold | حُر4 | ضمانة لمنع وضع حجة العتبة rebalance_table_shards () منخفضة للغاية |
يأتي تركيب Hyperscale (Citus) مع هذه الاستراتيجيات في الجدول:
SELECT * FROM pg_dist_rebalance_strategy;
-[ RECORD 1 ]-------------------+-----------------------------------
Name | by_shard_count
default_strategy | true
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 | false
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_shard_count، تعين كل شظية بنفس التكلفة. تأثيره هو معادلة عدد الشظايا عبر العقد. الاستراتيجية الأخرى المحددة مسبقا ، 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 Hyperscale (Citus) إحصائيات حول كيفية تنفيذ الاستعلامات ، ولمن. إنه مشابه (ويمكن الانضمام إليه) طريقة العرض pg_stat_statements في PostgreSQL ، والتي تتعقب الإحصائيات حول سرعة الاستعلام.
يمكن لطريقة العرض هذه تتبع الاستعلامات إلى المستأجرين الناشئين في تطبيق متعدد المستأجرين، مما يساعد على تحديد وقت إجراء عزل المستأجر.
| الاسم | النوع | الوصف |
|---|---|---|
| الاستعلام | عدد صحيح كبير | المعرف (مناسب pg_stat_statements الانضمامات) |
| معرف المستخدم | oid | المستخدم الذي قام بتشغيل الاستعلام |
| دبيد | oid | مثيل قاعدة بيانات المنسق |
| استعلام | نص | سلسلة استعلام مجهولة المصدر |
| المنفذ | نص | Citus executor المستخدم: التكيف، في الوقت الحقيقي، تعقب المهام، جهاز التوجيه، أو إدراج التحديد |
| 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.maxGUC (الافتراضي 5000) - لاقتطاع الجدول، استخدم الدالة
citus_stat_statements_reset()
نشاط الاستعلام الموزع
يوفر Hyperscale (Citus) طرق عرض خاصة لمشاهدة الاستعلامات والأقفال في جميع أنحاء المجموعة، بما في ذلك الاستعلامات الخاصة بالشظايا المستخدمة داخليا لإنشاء نتائج للاستعلامات الموزعة.
- 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 البيانات التي يتم نسخها من الشظية المراد حسابها.
ملاحظة
إذا كان هناك استعلام عن جهاز توجيه (على سبيل المثال، مستأجر واحد في تطبيق متعدد المستأجرين، "SELECT
- من الجدول حيث يتم تنفيذ tenant_id = X') بدون كتلة معاملات ، master_query_host_name والأعمدة master_query_host_port NULL في 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 Citus
SELECT query_hostname, count(*)
FROM citus_worker_stat_activity
GROUP BY query_hostname;
-- total internal active connections generated per node by Citus
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
في هذا المثال، نشأت الاستعلامات على المنسق، ولكن يمكن لطريقة العرض أيضا سرد الأقفال بين الاستعلامات التي تنشأ على العمال (يتم تنفيذها باستخدام Hyperscale (Citus) MX على سبيل المثال).
الخطوات التالية
- تعرف على كيفية قيام بعض وظائف Hyperscale (Citus) بتغيير جداول النظام
- مراجعة مفاهيم العقد والجداول