تمرين: حماية قاعدة البيانات المُرحَّلة ومراقبتها وضبطها

مكتمل

بصفتك مطور لقاعدة بيانات لدى مؤسسة AdventureWorks. تقوم شركة AdventureWorks ببيع الدراجات وقطع غيارها مباشرة إلى المستهلكين النهائيين والموزعين لأكثر من عقد من الزمان. بينما تخزن الأنظمة الخاصة بها المعلومات في قاعدة بيانات قمت بترحيلها سابقًا إلى Azure Database لنظام PostgreSQL.

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

ستقوم خلال هذا التمرين بتنفيذ المهام التالية:

  1. تكوين مقاييس Azure لـ Azure Database الخاصة بخدمة PostgreSQL.
  2. تشغيل نموذج التطبيق بحيث يحاكي العديد من المستخدمين خلال الاستعلام عن قاعدة البيانات.
  3. عرض المقاييس.

إعداد البيئة

تشغيل هذه الأوامر CLI Azure في Cloud Shell؛ لإنشاء قاعدة بيانات Azure لنظام PostgreSQL، مع نسخة من قاعدة بيانات الأعمال الشيقة. ستقوم الأوامر الأخيرة بطباعة اسم الخادم.

SERVERNAME="adventureworks$((10000 + RANDOM % 99999))"
PUBLICIP=$(wget http://ipecho.net/plain -O - -q)
git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git workshop

az postgres server create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --name $SERVERNAME \
    --location westus \
    --admin-user awadmin \
    --admin-password Pa55w.rdDemo \
    --version 10 \
    --storage-size 5120

az postgres db create \
    --name azureadventureworks \
    --server-name $SERVERNAME \
    --resource-group <rgn>[sandbox resource group name]</rgn>

az postgres server firewall-rule create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --server $SERVERNAME \
    --name AllowMyIP \
    --start-ip-address $PUBLICIP --end-ip-address $PUBLICIP

PGPASSWORD=Pa55w.rdDemo psql -h $SERVERNAME.postgres.database.azure.com -U awadmin@$SERVERNAME -d postgres -f workshop/migration_samples/setup/postgresql/adventureworks/create_user.sql

PGPASSWORD=Pa55w.rd psql -h $SERVERNAME.postgres.database.azure.com -U azureuser@$SERVERNAME -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql 2> /dev/null

echo "Your PostgreSQL server name is:\n"
echo $SERVERNAME.postgres.database.azure.com

تكوين مقاييس Azure لـ Azure Database الخاصة بك لخدمة PostgreSQL

  1. باستخدام متصفح الويب، افتح علامة تبويب جديدة وانتقل إلى مدخل Microsoft Azure.

  2. في بوابة Azure، حدد جميع الموارد.

  3. حدد اسم خادم Azure Database for PostgreSQL بدءا من adventureworks.

  4. ضمن Monitoring، حدد Metrics.

  5. في صفحة المخطط البياني، أضف المقياس التالي:

    الخاصية القيمة
    النطاق adventureworks[nnn]
    مساحة الاسم المترية مقاييس خادم PostgreSQL القياسية
    Metric الاتصال النشطة
    التجميع متوسط

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

  6. حدد Add metric، وأضف المقياس التالي:

    الخاصية القيمة
    النطاق adventureworks[nnn]
    مساحة الاسم المترية مقاييس خادم PostgreSQL القياسية
    Metric النسبة المئوية لوحدة المعالجة المركزية
    التجميع متوسط
  7. حدد Add metric، وأضف المقياس التالي:

    الخاصية القيمة
    النطاق adventureworks[nnn]
    مساحة الاسم المترية مقاييس خادم PostgreSQL القياسية
    Metric النسبة المئوية للذاكرة
    التجميع متوسط
  8. حدد Add metric، وأضف المقياس التالي:

    الخاصية القيمة
    النطاق adventureworks[nnn]
    مساحة الاسم المترية مقاييس خادم PostgreSQL القياسية
    Metric النسبة المئوية ل IO
    التجميع متوسط

    توضح هذه المقاييس الثلاثة النهائية كيفية استهلاك الموارد عن طريق تطبيق الاختبار.

  9. تعيين النطاق الزمني للمخطط إلى آخر 30 دقيقة.

  10. حدد تثبيت بلوحة المعلومات، ثم حدد تثبيت.

تشغيل نموذج التطبيق بحيث يحاكي العديد من المستخدمين خلال الاستعلام عن قاعدة البيانات

  1. في مدخل Microsoft Azure، في صفحة خادم Azure Database for PostgreSQL، ضمن الإعدادات، حدد الاتصال سلاسل. انسخ سلسلة الاتصال ADO.NET إلى الحافظة.

  2. انتقل إلى المجلد ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest .

    cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
    
  3. افتح ملف التكوين App.config باستخدام محرر التعليمات البرمجية:

    code App.config
    
  4. استبدل قيمة Database ب azureadventureworks، واستبدل ConectionString0 سلسلة الاتصال من الحافظة. تغيير معرف المستخدمإلى azureuser@adventureworks [nnn]، وتعيين كلمة المرور إلى Pa55w.rd. يجب أن يبدو الملف المكتمل مشابه للمثال التالي:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="INSERT CONNECTION STRING HERE" />
            <add key="ConnectionString2" value="INSERT CONNECTION STRING HERE" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="1"/>
        </appSettings>
    </configuration>
    

    إشعار

    تجاهل إعدادات الاتصال ionString1 و الاتصال ionString2 في الوقت الحالي. سيتم تحديث هذه العناصر لاحقًا في المعمل.

  5. احفظ التغييرات وأغلق المحرر.

  6. في مطالبة Cloud Shell، قم بتشغيل الأمر التالي لإنشاء التطبيق وتشغيله:

    dotnet run
    

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

    Client 48 : SELECT * FROM purchasing.vendor
    Response time: 630 ms
    
    Client 48 : SELECT * FROM sales.specialoffer
    Response time: 702 ms
    
    Client 43 : SELECT * FROM purchasing.vendor
    Response time: 190 ms
    
    Client 57 : SELECT * FROM sales.salesorderdetail
    Client 68 : SELECT * FROM production.vproductanddescription
    Response time: 51960 ms
    
    Client 55 : SELECT * FROM production.vproductanddescription
    Response time: 160212 ms
    
    Client 59 : SELECT * FROM person.person
    Response time: 186026 ms
    
    Response time: 2191 ms
    
    Client 37 : SELECT * FROM person.person
    Response time: 168710 ms
    

    اترك التطبيق قيد التشغيل في أثناء تنفيذ الخطوات التالية.

عرض المقاييس

  1. العودة إلى مدخل Microsoft Azure.

  2. في الجزء الأيسر، حدد Dashboard.

    ينبغي أن تشاهد المخطط البياني الذي يعرض مقاييس Azure Database لخدمة PostgreSQL.

  3. حدد المخطط لفتحه في جزء المقاييس .

  4. اسمح للتطبيق بالعمل لعدة دقائق (كلما كانت مدة أطول كان ذلك أفضل). بمرور الوقت، ينبغي أن تشبه المقاييس في المخطط البياني النمط الموضح في الصورة التالية:

    Image showing the metrics gathered while the sample app is running

    يوضح هذا المخطط البياني النقاط التالية:

    • يعمل المعالج بكامل سعته بنسبة استخدام تصل إلى 100% بسرعة كبيرة.
    • عدد الاتصالات يتزايد ببطء. وقد تم تصميم نموذج التطبيق لبدء عمل 101 عميلاً في تعاقب سريع؛ لكن يمكن التعامل مع الخادم فقط مع فتح اتصالات قليلة في وقت واحد. وعدد الاتصالات المضافة في كل "خطوة" في المخطط البياني يتقلص، والوقت المستغرق بين "خطوات" يتزايد. وبعد مرور 45 دقيقة تقريبًا، كان بإمكان النظام تأسيس اتصالات 70 عميل فقط.
    • يتزايد استخدام الذاكرة بمرور الوقت باستمرار.
    • بينما استخدام IO يقارب الصفر. وتم تخزين كافة البيانات المطلوبة من قبل تطبيقات العميل حاليًا بشكل مؤقت في الذاكرة.

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

    Image showing the connection errors that can occur when the server has insufficient resources available

  5. في قائمة Shell Cloud، اضغط Enter لإيقاف التطبيق.

تكوين الخادم لتجميع بيانات أداء الاستعلام

  1. في مدخل Microsoft Azure، في صفحة خادم Azure Database for PostgreSQL، ضمن الإعدادات، حدد Server parameters.

  2. في صفحة Server parameters ، قم بتعيين المعلمات التالية إلى القيم المحددة في الجدول أدناه.

    المعلمة القيمة
    pg_qs.max_query_text_length 6000
    pg_qs.query_capture_mode جميع
    pg_qs.replace_parameter_placeholders في
    pg_qs.retention_period_in_days 7
    pg_qs.track_utility في
    pg_stat_statements.track جميع
    pgms_wait_sampling.history_period 100
    pgms_wait_sampling.query_capture_mode جميع
  3. حدد حفظ.

فحص الاستعلامات التي يتم تشغيلها عبر التطبيق باستخدام Query Store

  1. ارجع إلى Cloud Shell، وأعد تشغيل نموذج التطبيق:

    dotnet run
    

    اسمح للتطبيق بالعمل لمدة 5 دقائق أو نحو ذلك قبل المتابعة.

  2. اترك التطبيق قيد التشغيل وانتقل إلى مدخل Microsoft Azure

  3. في صفحة خادم Azure Database for PostgreSQL، ضمن Intelligent performance، حدد Query Performance Insight.

  4. في صفحة Query Performance Insight، في علامة التبويب Long running queries، قم بتعيين Number of Queries إلى 10، وتعيين Selected by إلى avg، وتعيين الفترة الزمنية إلى Last 6 hrs.

  5. أعلى المخطط، حدد تكبير (أيقونة عدسة التكبير مع علامة "+") مرتين، لتسجيل الدخول إلى الصفحة الرئيسية على أحدث البيانات.

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

    Image showing the statistics for long running queries captured by using Query Store

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

    SELECT * FROM sales.salesorderdetail
    SELECT * FROM sales.salesorderheader
    SELECT * FROM person.person
    

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

فحص أي أحداث انتظار تقع باستخدام Query Store

  1. حدد علامة التبويب إحصائيات الانتظار.

  2. تعيين الفترة الزمنية إلى آخر 6 ساعات، وتعيين Group By إلى Event، وتعيين الحد الأقصى لعدد المجموعات إلى 5.

    كما هو الحال مع علامة التبويب Long running queries ، يتم تجميع البيانات كل 15 دقيقة. يضم الجدول التالي مخطط بياني يوضح أن النظام كان خاضعًا لنوعين من حدث الانتظار:

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

    Image showing the wait statistics captured by using Query Store

    إشعار

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

  3. ارجع إلى Cloud Shell، واضغط على Enter لإيقاف نموذج التطبيق.

إضافة نسخ متماثلة إلى Azure Database لخدمة PostgreSQL

  1. في مدخل Microsoft Azure، في صفحة خادم Azure Database for PostgreSQL، ضمن الإعدادات، حدد Replication.

  2. في صفحة Replication ، حدد + Add Replica.

  3. في صفحة خادم PostgreSQL، في المربع اسم الخادم، اكتب adventureworks[nnn]-replica1، ثم حدد موافق.

  4. عند إنشاء النسخة المتماثلة الأولى (سيستغرق الأمر عدة دقائق)، كرر الخطوة السابقة وأضف نسخة متماثلة أخرى تسمى adventureworks[nnn]-replica2.

  5. انتظر حتى تتغير حالة النسختين المتماثلتين من النشر إلى متوفر قبل المتابعة.

    Image showing the Replication page for Azure Database for PostgreSQL. Two replicas have been added.

تكوين النسخ المتماثلة لتمكين وصول العميل

  1. حدد اسم النسخة المتماثلة adventureworks[nnn]-replica1 . سيتم نقلك إلى الصفحة لـ Azure Database لنظام PostgreSQL لهذه النسخة المتماثلة.
  2. ضمن الإعدادات، حدد أمان الاتصال ion.
  3. في صفحة أمان الاتصال ion، قم بتعيين Allow access to Azure services إلى ON، ثم حدد Save. يتيح هذا الإعداد تمكين التطبيقات التي تقوم بتشغيلها باستخدام Cloud Shell للوصول إلى الخادم.
  4. عند حفظ الإعداد، كرر الخطوات السابقة واسمح لخدمات Azure بالوصول إلى النسخة المتماثلة adventureworks[nnn]-replica2 .

إعادة تشغيل كل خادم

إشعار

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

  1. انتقل إلى صفحة خادم adventureworks[nnn].
  2. في صفحة نظرة عامة ، حدد إعادة التشغيل.
  3. في مربع الحوار إعادة تشغيل الخادم ، حدد نعم.
  4. انتظر حتى تتم إعادة تشغيل الخادم قبل المتابعة.
  5. باتباع نفس الإجراء، أعد تشغيل خوادم adventureworks[nnn]-replica1 و adventureworks[nnn]-replica2 .

إعادة تكوين نموذج التطبيق لاستخدام النسخ المتماثلة

  1. في Cloud Shell، قم بتحرير ملف App.config.

    code App.config
    
  2. أضف سلاسل الاتصالات لإعدادات الاتصال ionString1 و الاتصال ionString2. يجب أن تكون هذه القيم هي نفسها قيم الاتصال ionString0، ولكن مع استبدال adventureworks[nnn] بالنص adventureworks[nnn]-replica1 و adventureworks[nnn]-replica2 في عناصر Server وUser Id.

  3. تعيين إعداد NumReplicas إلى 3.

    ينبغي أن يبدو ملف App.config الآن مشابهًا لهذا:

    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="Server=adventureworks101-replica1.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica1;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString2" value="Server=adventureworks101-replica2.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica2;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="3"/>
        </appSettings>
    </configuration>
    
  4. احفظ الملف وأغلق المحرر.

  5. ابدأ تشغيل التطبيق مرة أخرى:

    dotnet run
    

    سيتم تشغيل التطبيق كما كان سابقًا. ومع ذلك، سيتم توزيع الطلبات هذه المرة عبر الخوادم الثلاثة.

  6. اسمح للتطبيق بالركض لبضع دقائق قبل المتابعة.

مراقبة التطبيق وملاحظة الاختلافات في مقاييس الأداء

  1. اترك التطبيق قيد التشغيل، وارجع إلى مدخل Microsoft Azure.

  2. في الجزء الأيسر، حدد Dashboard.

  3. حدد المخطط لفتحه في جزء المقاييس .

    تذكر أن هذا الرسم البياني يعرض المقاييس الخاصة بخادم Adventureworks * [nnn] *، ولكن ليس النسخ المتماثلة. يجب أن يكون التحميل لكل نسخة متماثلة هو نفسه.

    يوضح مثال المخطط البياني المقاييس التي تم جمعها للتطبيق خلال فترة 30 دقيقة من بدء التشغيل. يوضح المخطط البياني أن استخدام المعالج كان يستمر في التزايد؛ لكن استخدام الذاكرة ينخفض. بالإضافة إلى ذلك، بعد مرور25 دقيقة تقريبًا، أنشأ النظام اتصالات لأكثر من 30 اتصالاً. قد لا يبدو هذا مقارنة ملائمة للتكوين السابق، الذي دعم 70 اتصالاً بعد 45 دقيقة. غير أن حمل العمل موزع الآن على ثلاثة خوادم تؤدي جميعًا عملها بالمستوى نفسه، وقد أنشئت جميع الوصلات البالغ عددها 101. وعلاوة على ذلك، يمكن للنظام الاستمرار في التشغيل دون الإبلاغ عن أي فشل في الاتصال.

    Image showing the metrics for the Azure Database for PostgreSQL server while running the application, after replication was configured

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

  4. ارجع إلى Cloud Shell، واضغط على Enter لإيقاف التطبيق.

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