أعد هذا المقال أعضاء فريق Yandex.Cloud: إيفان فيتكاسوف - المهندس المعماري ، ليونيد كلايف - محرر
في الآونة الأخيرة ، تحدثنا عن بنية Yandex.Cloud . الآن دعنا ننتقل من النظرية إلى الممارسة. هناك العديد من الخدمات في السحابة للتحكم الآلي في نظام إدارة قواعد البيانات (DBMS): الخدمة المدارة لـ ClickHouse والخدمة المدارة لـ PostgreSQL والخدمة المدارة لـ MongoDB. جميعها تعتمد على النظام الأساسي وتتيح لك التركيز على مهمة تخزين البيانات ، وليس على إدارة البنية التحتية. لكن من المهم في بعض الأحيان التحكم في الأجهزة الظاهرية للكتلة. على سبيل المثال ، قد تنشأ مهمة تحجيم استجابة لزيادة أو نقصان في الحمل. عادةً ما يكون هذا السيناريو أحد أكثر العمليات التي تستغرق وقتًا طويلاً من الناحية العملية. سنخبرك اليوم كيف تسمح لك Yandex.Cloud بأتمتة مهام التحجيم المعقدة ، والتأكد من أن قاعدة البيانات تظل متاحة في عملية تغيير حجم الكتلة.
بيان المشكلة
عند إنشاء مجموعة من كل خدمة ، يمكن للمستخدم تحديد عدد مضيفي الكتلة ومنطقة التوفر (AZ) ، والتي تتوافق مع مركز البيانات الفعلي. الآن Yandex.Cloud يستخدم ثلاثة مراكز بيانات Yandex الموجودة في المنطقة الوسطى من روسيا. لذلك ، فإن التكوين الموصى به هو مجموعة قواعد البيانات (DBMS) مع ثلاثة مضيفين - باعتبارها الأكثر توافقًا مع مبادئ بناء بنية آمنة من الفشل ومقاومة للكوارث.
لذلك ، تخيل موقفًا عندما تجاوز التحميل على نظام إدارة قواعد البيانات DBMS قدرات قاعدة البيانات وحان الوقت لإضافة موارد الحوسبة. يمكن القيام بذلك على حد سواء أفقيًا - عن طريق إضافة مضيفين إلى الكتلة ، وعموديًا - عن طريق إضافة موارد إلى كل جهاز من أجهزة الكتلة. النظر في الخيار الثاني ، باعتباره الأكثر استهلاكا للوقت ومعرضة لخطر الأخطاء. لماذا هذا الخيار شاقة؟ لأنه في الحالة العامة ، سيبدو الإجراء الخاص بإضافة الموارد مثل هذا: تبديل دور المضيف ؛ إذا لزم الأمر ، وقف DBMS ؛ قم بإيقاف تشغيل الجهاز الظاهري ؛ تغيير التكوين الخاص به ؛ نبدأ تغيير معلمات DBMS ؛ نبدأ DBMS. نحن في انتظار مزامنة تغييرات البيانات المتراكمة. وهكذا بالنسبة لجميع المضيفين الثلاثة بدورهم. العديد من الخطوات - خطر الأخطاء كبير. يمكنك أتمتة هذه العملية - فقط قبل بدء حل الأتمتة المحدد يجب اختباره. عادة لا يوجد ما يكفي من الوقت للاختبار ، ولكن في Yandex.Cloud يتم تشغيله بسرعة ودون إجراءات غير ضرورية من جانبك. لنبدأ.
الخطوات الأولية وعملية الاختبار
لإعداد نحتاج:
- الوصول إلى المنصة. الآن يمكن لأي شخص إعداد فترة تجريبية على موقع الويب على موقع Yandex.Cloud .
- الشبكة السحابية (سأطلق عليها testvpc في مثالي) وثلاث شبكات فرعية موجودة في AZ مختلفة. نطاقات عناوين الشبكات الفرعية في هذه الحالة ليست مهمة.
- معقل المضيف. على الرغم من حقيقة أن Yandex.Cloud يمكنه فتح وصول خارجي إلى DBMS عبر IP العام ، فإن نشر DBMS في المجال العام ليس هو القرار الصحيح. لذلك ، نضيف مضيفًا معقلًا إلى المخطط ، حيث سنفتح اتصالات للمضيفين. بصفتك مضيفًا ، يمكنك استخدام آلة ذات استخدام جزئي (5 بالمائة) للنواة. يجب تثبيت Clickhouse- العميل على الجهاز الظاهري. بالإضافة إلى ذلك ، وفقًا لتعليمات الاتصال بالخدمة ، يلزمك تنزيل شهادة SSL.
- CLI سنعمل مع Yandex.Cloud ليس من خلال وحدة التحكم ، ولكن من خلال الأداة المساعدة لسطر الأوامر ، والتي تحتاج أيضًا إلى التثبيت والبدء وفقًا للوثائق .
سيكون سيناريو الاختبار بسيطًا: فتح ثلاث جلسات لتوصيل مضيف bastion بكل مضيف من مجموعة قاعدة البيانات ، قم بتشغيل استعلام SQL في دورة بفترة ، مثلاً ، ثانية واحدة ، وبعدها نرسل أمرًا لتوسيع الكتلة وننظر إلى سلوك النظام.
لحظة الحقيقة
اختر DBMS لإظهار التحجيم. في PostgreSQL ، يتم تعيين أدوار للمضيفين ، لكن الخدمة لم يكن لديها بعد تبديل شفاف عند القياس - هذه الوظيفة في خططنا. نظرًا لأن بقية آليات زيادة وخفض الكتلة تتشابه تقريبًا في الحالة في جميع قواعد إدارة قواعد البيانات الثلاثة ، على سبيل المثال ، استخدم ClickHouse.
لنقم بإنشاء كائن تجربة - مجموعة تتكون من ثلاثة مضيفات موجودة على شبكات فرعية افتراضية مختلفة. للقيام بذلك ، أدخل الأمر
yc managed-clickhouse cluster create
باستخدام الوسائط الضرورية. يتوافق ترتيب الوسائط مع إدراجها في إخراج "yc --help". إن جوهر الأمر بسيط: نقوم بإنشاء مجموعة ch-to-size في بيئة إنتاج مع testvpc الموجود على الشبكة الافتراضية ، وقم بتعيين اسم وكلمة مرور ، و 10 غيغابايت من مساحة القرص والحد الأدنى s1.nano للفئة. الخصائص التالية تتوافق مع هذه الفئة: 1 وحدة المعالجة المركزية ، 4 غيغابايت من ذاكرة الوصول العشوائي. في المستقبل ، للتحجيم ، سننتقل إلى فئة s1.micro ، بحيث يتضاعف عدد وحدة المعالجة المركزية وذاكرة الوصول العشوائي. لمعرفة فئات المضيف الأخرى التي يمكنك تعيينها ، فقط أدخل الأمر
yc managed-clickhouse resource-preset list
.
وبالتالي ، يجب أن يكون الأمر لإنشاء الكتلة كما يلي:
yc managed-clickhouse cluster create --name ch-to-resize --environment production --network-name testvpc --host zone-id=ru-central1-a,subnet-id=e9bfnjacigdo9p6j7j2s,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-b,subnet-id=e2l8iamol3b9mrtskb8q,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-c,subnet-id=b0c6qit7u9e8r0egedvj,assign-public-ip=false,type=clickhouse --user name=test,password=test123123 --database name=testdb --clickhouse-disk-size 10 --clickhouse-resource-preset s1.nano --clickhouse-disk-type network-nvme –async
استجابة لذلك ، نحصل على معرّف نظام المجموعة وقائمة بأسماء المضيفين للمضيفين:
yc managed-clickhouse cluster list +----------------------+--------------+-----------------------------+--------+---------+ | ID | NAME | CREATED AT | HEALTH | STATUS | +----------------------+--------------+-----------------------------+--------+---------+ | c9q7cr4ji2fe462qej8p | ch-to-resize | 2018-12-10T08:59:09.100272Z | ALIVE | RUNNING | +----------------------+--------------+-----------------------------+--------+---------+ yc managed-clickhouse host list --cluster-id c9q7cr4ji2fe462qej8p +-------------------------------------------+----------------------+---------+---------------+ | NAME | CLUSTER ID | HEALTH | ZONE ID | +-------------------------------------------+----------------------+---------+---------------+ | rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-a | | rc1a-sgxazra54xv6lhni.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-a | | rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-b | | rc1b-j1rtvsuz6t8x6ev2.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-b | | rc1c-emo0f2990povj7ie.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-c | | rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-c | +-------------------------------------------+----------------------+---------+---------------+
لنفتح اتصالًا بكل مضيف ونقوم بتشغيل استعلام إلى قاعدة البيانات:
clickhouse-client --host rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 1" clickhouse-client --host rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive!') from system.clusters where replica_num = 2" clickhouse-client --host rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 3"
أخيرًا ، أرسل طلبًا لزيادة الكتلة:
yc managed-clickhouse cluster update --id c9q7cr4ji2fe462qej8p --clickhouse-resource-preset s1.micro -–async
شرح تقليل الكتلةإذا كنا نريد تقليل حجم الموارد بدلاً من زيادته ، فنحن بحاجة إلى تحديد فئة أصغر ، في إشارة إلى المخرجات
yc managed-clickhouse resource-preset list
- على سبيل المثال ، s1.nano. في الوقت نفسه ، يبقى هيكل الفريق نفسه كما هو.
قمت بإعادة توجيه إخراج الاستعلام إلى ملف. هنا قائمة مختصرة:
rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net Mon Dec 10 12:47:35 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:36 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:37 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:38 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:39 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:40 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:47:51 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:02 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:11 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:12 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:13 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:14 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:15 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:16 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:17 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:18 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:19 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:20 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net: Mon Dec 10 12:50:58 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:59 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:00 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:01 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:12 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:23 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:34 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:35 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:36 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:37 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:38 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:39 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:40 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:41 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:42 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:43 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:44 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:45 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:46 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net: Mon Dec 10 12:49:15 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:16 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:17 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:18 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:19 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:30 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:41 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:52 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:56 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:57 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:58 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:59 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:00 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:01 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:03 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:04 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:05 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:06 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:07 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive!
توضح القائمة اللحظات التي يتم فيها إيقاف تشغيل كل مضيف من الكتلة (عند بدء مهلة الاتصال) ، اللحظات التي يتم فيها تشغيل المضيف وبدء ClickHouse بالتحميل (عند رفض الاتصال) ، وكذلك اللحظات التي يعود فيها المضيف إلى التشغيل. الشيء الأكثر أهمية هو الفصل بين الفترات الزمنية عندما لم تكن الأجهزة المضيفة متاحة. طوال الوقت ، تم توفير مضيفين على الأقل لتنفيذ الاستعلام. يمكن ملاحظة ذلك في الرسم البياني:

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