الخدمات المُصغرة

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

  • إنشاء نظام مجموعة
  • إنشاء أدوار لخدماتك المصغرة
  • استخدام الأداة المساعدة psql لإنشاء الأدوار والمخططات الموزعة
  • إنشاء جداول لنموذج الخدمات
  • تكوين الخدمات
  • تشغيل الخدمات
  • استكشاف قاعدة البيانات

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

المتطلبات الأساسية

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

إنشاء نظام مجموعة

سجل الدخول إلى مدخل Microsoft Azure واتبع هذه الخطوات لإنشاء نظام مجموعة Azure Cosmos DB ل PostgreSQL:

انتقل إلى إنشاء Azure Cosmos DB لنظام مجموعة PostgreSQL في مدخل Microsoft Azure.

في نموذج إنشاء Azure Cosmos DB لنظام مجموعة PostgreSQL:

  1. املأ المعلومات في علامة التبويب الأساسيات .

    لقطة شاشة تعرض علامة التبويب

    معظم الخيارات تفسر بعضها بعضًا، لكن ضع في اعتبارك:

    • يحدد اسم نظام المجموعة اسم DNS الذي تستخدمه التطبيقات للاتصال، في النموذج <node-qualifier>-<clustername>.<uniqueID>.postgres.cosmos.azure.com.
    • يمكنك اختيار إصدار PostgreSQL رئيسي مثل 15. يدعم Azure Cosmos DB ل PostgreSQL دائما أحدث إصدار من Citus لإصدار Postgres الرئيسي المحدد.
    • يجب أن يكون اسم المستخدم المسؤول هو القيمة citus.
    • يمكنك ترك اسم قاعدة البيانات بقيمته الافتراضية "citus" أو تعريف اسم قاعدة البيانات الوحيد. لا يمكنك إعادة تسمية قاعدة البيانات بعد توفير نظام المجموعة.
  2. حدد Next : Networking أسفل الشاشة.

  3. في شاشة Networking ، حدد Allow public access from Azure services and resources within Azure to this cluster.

    لقطة شاشة تعرض علامة التبويب Networking في شاشة Create.

  4. حدد Review + create، وعند اجتياز التحقق من الصحة، حدد Create لإنشاء نظام المجموعة.

  5. يستغرق التزويد بضع دقائق. تعيد الصفحة توجيهها لمراقبة التوزيع. عندما تتغير الحالة من النشر قيد التقدم إلى اكتمال النشر الخاص بك، حدد Go to resource.

إنشاء أدوار لخدماتك المصغرة

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

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

نستخدم ثلاث خدمات في مثالنا:

  • المستخدم
  • time
  • بينج

اتبع الخطوات التي تصف كيفية إنشاء أدوار المستخدم وإنشاء الأدوار التالية لكل خدمة:

  • userservice
  • timeservice
  • pingservice

استخدام الأداة المساعدة psql لإنشاء مخططات موزعة

بمجرد الاتصال ب Azure Cosmos DB ل PostgreSQL باستخدام psql، يمكنك إكمال بعض المهام الأساسية.

هناك طريقتان يمكن من خلالهما توزيع المخطط في Azure Cosmos DB ل PostgreSQL:

يدويا عن طريق استدعاء citus_schema_distribute(schema_name) الدالة:

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

SELECT citus_schema_distribute('userservice');
SELECT citus_schema_distribute('timeservice');
SELECT citus_schema_distribute('pingservice');

يسمح لك هذا الأسلوب أيضا بتحويل المخططات العادية الموجودة إلى مخططات موزعة.

إشعار

يمكنك فقط توزيع المخططات التي لا تحتوي على جداول موزعة ومرجعية.

النهج البديل هو تمكين متغير تكوين citus.enable_schema_based_sharding:

SET citus.enable_schema_based_sharding TO ON;

CREATE SCHEMA AUTHORIZATION userservice;
CREATE SCHEMA AUTHORIZATION timeservice;
CREATE SCHEMA AUTHORIZATION pingservice;

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

يمكنك سرد المخططات الموزعة حاليا عن طريق تشغيل:

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             5 | 0 bytes     | userservice
 timeservice |             6 | 0 bytes     | timeservice
 pingservice |             7 | 0 bytes     | pingservice
(3 rows)

إنشاء جداول لنموذج الخدمات

تحتاج الآن إلى الاتصال ب Azure Cosmos DB ل PostgreSQL لكل خدمة مصغرة. يمكنك استخدام الأمر \c لتبديل المستخدم داخل مثيل psql موجود.

\c citus userservice
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);
\c citus timeservice
CREATE TABLE query_details (
    id SERIAL PRIMARY KEY,
    ip_address INET NOT NULL,
    query_time TIMESTAMP NOT NULL
);
\c citus pingservice
CREATE TABLE ping_results (
    id SERIAL PRIMARY KEY,
    host VARCHAR(255) NOT NULL,
    result TEXT NOT NULL
);

تكوين الخدمات

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

git clone https://github.com/citusdata/citus-example-microservices.git
$ tree
.
├── LICENSE
├── README.md
├── ping
│   ├── app.py
│   ├── ping.sql
│   └── requirements.txt
├── time
│   ├── app.py
│   ├── requirements.txt
│   └── time.sql
└── user
    ├── app.py
    ├── requirements.txt
    └── user.sql

قبل تشغيل الخدمات ومع ذلك، قم بتحرير user/app.py، ping/app.py والملفات time/app.py التي توفر تكوين الاتصال لنظام مجموعة Azure Cosmos DB ل PostgreSQL:

# Database configuration
db_config = {
    'host': 'c-EXAMPLE.EXAMPLE.postgres.cosmos.azure.com',
    'database': 'citus',
    'password': 'SECRET',
    'user': 'pingservice',
    'port': 5432
}

بعد إجراء التغييرات، احفظ جميع الملفات المعدلة وانتقل إلى الخطوة التالية لتشغيل الخدمات.

تشغيل الخدمات

قم بالتغيير إلى كل دليل تطبيق وتشغيله في python env الخاص به.

cd user
pipenv install
pipenv shell
python app.py

كرر الأوامر لخدمة الوقت وping، وبعد ذلك يمكنك استخدام واجهة برمجة التطبيقات.

إنشاء بعض المستخدمين:

curl -X POST -H "Content-Type: application/json" -d '[
  {"name": "John Doe", "email": "john@example.com"},
  {"name": "Jane Smith", "email": "jane@example.com"},
  {"name": "Mike Johnson", "email": "mike@example.com"},
  {"name": "Emily Davis", "email": "emily@example.com"},
  {"name": "David Wilson", "email": "david@example.com"},
  {"name": "Sarah Thompson", "email": "sarah@example.com"},
  {"name": "Alex Miller", "email": "alex@example.com"},
  {"name": "Olivia Anderson", "email": "olivia@example.com"},
  {"name": "Daniel Martin", "email": "daniel@example.com"},
  {"name": "Sophia White", "email": "sophia@example.com"}
]' http://localhost:5000/users

سرد المستخدمين الذين تم إنشاؤهم:

curl http://localhost:5000/users

الحصول على الوقت الحالي:

Get current time:

تشغيل ping مقابل example.com:

curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping

استكشاف قاعدة البيانات

الآن بعد أن قمت باستدعاء بعض وظائف واجهة برمجة التطبيقات، تم تخزين البيانات ويمكنك التحقق مما إذا كان citus_schemas يعكس ما هو متوقع:

select * from citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             1 | 112 kB      | userservice
 timeservice |             2 | 32 kB       | timeservice
 pingservice |             3 | 32 kB       | pingservice
(3 rows)

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

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
nodename  | nodeport |         table_name         | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
 localhost |     9702 | pingservice.ping_results  | 32 kB

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

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

يمكنك بسهولة إعادة توازن نظام المجموعة حسب حجم القرص:

select citus_rebalance_start();
NOTICE:  Scheduled 1 moves as job 1
DETAIL:  Rebalance scheduled as background job
HINT:  To monitor progress, run: SELECT * FROM citus_rebalance_status();
 citus_rebalance_start
-----------------------
                     1
(1 row)

عند الانتهاء، يمكنك التحقق من شكل التخطيط الجديد:

  select nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
    from citus_shards
group by nodename,nodeport, table_name;
 nodename  | nodeport |         table_name        | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     9701 | timeservice.query_details | 32 kB
 localhost |     9701 | pingservice.ping_results  | 32 kB
 localhost |     9702 | userservice.users         | 112 kB
(3 rows)

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

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

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

  • تعرف على أنواع عقد نظام المجموعة