كيف قمنا بتطبيق ذاكرة التخزين المؤقت على قاعدة بيانات Tarantool

يوم جيد!

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

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

في بحث آخر عن البدائل والمشورة من صديقي العزيز mr_elzor ، تقرر تجربة قاعدة بيانات Tarantool.

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

خوادم الاختبار مع التكوين: 8 وحدة المعالجة المركزية ، ذاكرة الوصول العشوائي 16 جيجابايت ، 100 جيجابايت محرك الأقراص الصلبة ، ديبيان 9.4.

تم التثبيت وفقًا لتعليمات الموقع. وهكذا حصلت على خيار مثال. ظهرت الفكرة على الفور عن واجهة بصرية يعمل بها الدعم بسهولة. أثناء البحث السريع ، وجدت وتكوين tarantool-admin . يعمل في Docker ويغطي مهام الدعم بنسبة 100٪ ، على الأقل حتى الآن.

ولكن دعنا نتحدث عن أكثر إثارة للاهتمام.

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

بعد قضاء بعض الوقت في فهم lua ووصف التكوين ، أقوم بتشغيل المعالج.

# systemctl start tarantool@master Job for tarantool@master.service failed because the control process exited with error code. See "systemctl status tarantool@master.service" and "journalctl -xe" for details. 

أقع على الفور في ذهول ولا أفهم سبب الخطأ ، لكنني أرى أنه في حالة "التحميل".

 # systemctl status tarantool@master ● tarantool@master.service - Tarantool Database Server Loaded: loaded (/lib/systemd/system/tarantool@.service; enabled; vendor preset: enabled) Active: activating (start) since Tue 2019-02-19 17:03:24 MSK; 17s ago Docs: man:tarantool(1) Process: 20111 ExecStop=/usr/bin/tarantoolctl stop master (code=exited, status=0/SUCCESS) Main PID: 20120 (tarantool) Status: "loading" Tasks: 5 (limit: 4915) CGroup: /system.slice/system-tarantool.slice/tarantool@master.service └─20120 tarantool master.lua <loading> Feb 19 17:03:24 tarantuldb-tst4 systemd[1]: Starting Tarantool Database Server... Feb 19 17:03:24 tarantuldb-tst4 tarantoolctl[20120]: Starting instance master... Feb 19 17:03:24 tarantuldb-tst4 tarantoolctl[20120]: Run console at unix/:/var/run/tarantool/master.control Feb 19 17:03:24 tarantuldb-tst4 tarantoolctl[20120]: started 

أركض عبد:

 # systemctl start tarantool@slave2 Job for tarantool@slave2.service failed because the control process exited with error code. See "systemctl status tarantool@slave2.service" and "journalctl -xe" for details. 

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

 # systemctl status tarantool@slave2 ● tarantool@slave2.service - Tarantool Database Server Loaded: loaded (/lib/systemd/system/tarantool@.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2019-02-19 17:04:52 MSK; 27s ago Docs: man:tarantool(1) Process: 20258 ExecStop=/usr/bin/tarantoolctl stop slave2 (code=exited, status=0/SUCCESS) Process: 20247 ExecStart=/usr/bin/tarantoolctl start slave2 (code=exited, status=1/FAILURE) Main PID: 20247 (code=exited, status=1/FAILURE) Status: "running" Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Unit entered failed state. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Failed with result 'exit-code'. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Service hold-off time over, scheduling restart. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: Stopped Tarantool Database Server. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Start request repeated too quickly. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: Failed to start Tarantool Database Server. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Unit entered failed state. Feb 19 17:04:52 tarantuldb-tst4 systemd[1]: tarantool@slave2.service: Failed with result 'exit-code'. 

ولكن في الوقت نفسه ، بدأ السيد العمل:

 # ps -ef | grep taran taranto+ 20158 1 0 17:04 ? 00:00:00 tarantool master.lua <running> root 20268 2921 0 17:06 pts/1 00:00:00 grep taran 

إعادة تشغيل العبد لا يساعد. أتساءل لماذا؟

أوقف السيد. وتنفيذ الإجراءات في ترتيب عكسي.

أرى أن العبد يحاول البدء.

 # ps -ef | grep taran taranto+ 20399 1 0 17:09 ? 00:00:00 tarantool slave2.lua <loading> 

أبدأ المعالج وأرى أنه لم يرتفع وتحولت عمومًا إلى حالة اليتيم ، بينما انخفض العبد بشكل عام.

 # ps -ef | grep taran taranto+ 20428 1 0 17:09 ? 00:00:00 tarantool master.lua <orphan> 

يصبح أكثر إثارة للاهتمام.

أرى في سجلات الرقيق أنه رأى السيد وحاول المزامنة.

 2019-02-19 17:13:45.113 [20751] iproto/101/main D> binary: binding to 0.0.0.0:3302... 2019-02-19 17:13:45.113 [20751] iproto/101/main I> binary: bound to 0.0.0.0:3302 2019-02-19 17:13:45.113 [20751] iproto/101/main D> binary: listening on 0.0.0.0:3302... 2019-02-19 17:13:45.113 [20751] iproto D> cpipe_flush_cb: locking &endpoint->mutex 2019-02-19 17:13:45.113 [20751] iproto D> cpipe_flush_cb: unlocking &endpoint->mutex 2019-02-19 17:13:45.113 [20751] main D> cbus_endpoint_fetch: locking &endpoint->mutex 2019-02-19 17:13:45.113 [20751] main D> cbus_endpoint_fetch: unlocking &endpoint->mutex 2019-02-19 17:13:45.113 [20751] main/101/slave2 I> connecting to 1 replicas 2019-02-19 17:13:45.113 [20751] main/106/applier/replicator@tarantuldb-t D> => CONNECT 2019-02-19 17:13:45.114 [20751] main/106/applier/replicator@tarantuldb-t I> remote master 825af7c3-f8df-4db0-8559-a866b8310077 at 10.78.221.74:3301 running Tarantool 1.10.2 2019-02-19 17:13:45.114 [20751] main/106/applier/replicator@tarantuldb-t D> => CONNECTED 2019-02-19 17:13:45.114 [20751] main/101/slave2 I> connected to 1 replicas 2019-02-19 17:13:45.114 [20751] coio V> loading vylog 14 2019-02-19 17:13:45.114 [20751] coio V> done loading vylog 2019-02-19 17:13:45.114 [20751] main/101/slave2 I> recovery start 2019-02-19 17:13:45.114 [20751] main/101/slave2 I> recovering from `/var/lib/tarantool/cache_slave2/00000000000000000014.snap' 2019-02-19 17:13:45.114 [20751] main/101/slave2 D> memtx_tuple_new(47) = 0x7f99a4000080 2019-02-19 17:13:45.114 [20751] main/101/slave2 I> cluster uuid 4035b563-67f8-4e85-95cc-e03429f1fa4d 2019-02-19 17:13:45.114 [20751] main/101/slave2 D> memtx_tuple_new(11) = 0x7f99a4004080 2019-02-19 17:13:45.114 [20751] main/101/slave2 D> memtx_tuple_new(17) = 0x7f99a4008068 

وكانت المحاولة ناجحة:

 2019-02-19 17:13:45.118 [20751] main/101/slave2 D> memtx_tuple_new(40) = 0x7f99a40004c0 2019-02-19 17:13:45.118 [20751] main/101/slave2 I> assigned id 1 to replica 825af7c3-f8df-4db0-8559-a866b8310077 2019-02-19 17:13:45.118 [20751] main/101/slave2 D> memtx_tuple_new(40) = 0x7f99a4000500 2019-02-19 17:13:45.118 [20751] main/101/slave2 I> assigned id 2 to replica 403c0323-5a9b-480d-9e71-5ba22d4ccf1b 2019-02-19 17:13:45.118 [20751] main/101/slave2 I> recover from `/var/lib/tarantool/slave2/00000000000000000014.xlog' 2019-02-19 17:13:45.118 [20751] main/101/slave2 I> done `/var/lib/tarantool/slave2/00000000000000000014.xlog' 

حتى بدأت:

 2019-02-19 17:13:45.119 [20751] main/101/slave2 D> systemd: sending message 'STATUS=running' 

ولكن لأسباب غير معروفة ، فقد الاتصال وسقط:

 2019-02-19 17:13:45.129 [20751] main/101/slave2 D> SystemError at /build/tarantool-1.10.2.146/src/coio_task.c:416 2019-02-19 17:13:45.129 [20751] main/101/slave2 tarantoolctl:532 E> Start failed: /usr/local/share/lua/5.1/http/server.lua:1146: Can't create tcp_server: Input/output error 

محاولة لبدء الرقيق مرة أخرى لا يساعد.

الآن احذف الملفات التي أنشأتها المثيلات. في حالتي ، أحذف كل شيء من دليل / var / lib / tarantool.

أبدأ العبد أولاً ، وعندها فقط أتقن. وها هوذا ...

 # ps -ef | grep tara taranto+ 20922 1 0 17:20 ? 00:00:00 tarantool slave2.lua <running> taranto+ 20933 1 1 17:21 ? 00:00:00 tarantool master.lua <running> 

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

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

في أيديولوجية n vCPU ، يمكننا رفع السيد والعبد n-2 للقراءة.

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

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

مثال


كان لدي بالفعل تكوين يعمل مع معالج واثنين من العبيد.

قررت أن أضيف عبدا ثالثا.

قمت بتسجيله على السيد وأعدت تشغيله أولاً ، وهذا ما رأيته:

 # ps -ef | grep tara taranto+ 20922 1 0 Feb19 ? 00:00:29 tarantool slave2.lua <running> taranto+ 20965 1 0 Feb19 ? 00:00:29 tarantool slave3.lua <running> taranto+ 21519 1 0 09:16 ? 00:00:00 tarantool master.lua <orphan> 

أي أصبح سيدنا وحيدًا ، وانهار التكرار.

إن البدء بعبد جديد لن يساعدك وسيؤدي إلى حدوث خطأ:

 # systemctl restart tarantool@slave4 Job for tarantool@slave4.service failed because the control process exited with error code. See "systemctl status tarantool@slave4.service" and "journalctl -xe" for details. 

وفي السجلات رأيت إدخالاً مفيداً قليلاً:

 2019-02-20 09:20:10.616 [21601] main/101/slave4 I> bootstrapping replica from 3c77eb9d-2fa1-4a27-885f-e72defa5cd96 at 10.78.221.74:3301 2019-02-20 09:20:10.617 [21601] main/106/applier/replicator@tarantuldb-t I> can't join/subscribe 2019-02-20 09:20:10.617 [21601] main/106/applier/replicator@tarantuldb-t xrow.c:896 E> ER_READONLY: Can't modify data because this instance is in read-only mode. 2019-02-20 09:20:10.617 [21601] main/106/applier/replicator@tarantuldb-t D> => STOPPED 2019-02-20 09:20:10.617 [21601] main/101/slave4 xrow.c:896 E> ER_READONLY: Can't modify data because this instance is in read-only mode. 2019-02-20 09:20:10.617 [21601] main/101/slave4 F> can't initialize storage: Can't modify data because this instance is in read-only mode. 

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

 # ps -ef | grep tara taranto+ 20922 1 0 Feb19 ? 00:00:29 tarantool slave2.lua <running> taranto+ 20965 1 0 Feb19 ? 00:00:30 tarantool slave3.lua <running> taranto+ 21659 1 0 09:23 ? 00:00:00 tarantool slave4.lua <loading> 

ولكن عندما تبدأ سيدًا ، يتعطل العبد الجديد ، ولا يتطابق السيد مع حالة التشغيل.

 # ps -ef | grep tara taranto+ 20922 1 0 Feb19 ? 00:00:29 tarantool slave2.lua <running> taranto+ 20965 1 0 Feb19 ? 00:00:30 tarantool slave3.lua <running> taranto+ 21670 1 0 09:23 ? 00:00:00 tarantool master.lua <orphan> 

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

 # ps -ef | grep tarantool taranto+ 21892 1 0 09:30 ? 00:00:00 tarantool slave4.lua <running> taranto+ 21907 1 0 09:30 ? 00:00:00 tarantool slave3.lua <running> taranto+ 21922 1 0 09:30 ? 00:00:00 tarantool slave2.lua <running> taranto+ 21931 1 0 09:30 ? 00:00:00 tarantool master.lua <running> 

كل شيء بدأ بنجاح.

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

نتيجة لذلك ، تم تجميع التكوين التالي:

2 خوادم.
2 سيد. احتياطي ساخن.
12 عبيدا. كلها نشطة.

في منطق tarantool ، تم استخدام http.server حتى لا يتم حظر المحول الإضافي (تذكر البائع ، والنظام الأساسي ، والصابون) أو ربط المكتبة بكل عملية تجارية.

لتجنب التناقض بين الأساتذة أو على الموازن (NetScaler أو HAProxy أو أي مفضل آخر) ، فإننا نضع قاعدة الحجز ، أي إدراج وتحديث وحذف عمليات الانتقال فقط إلى سيد النشط الأول.

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

في لوا ، نفذت عمليات CRUD لقيمة المفتاح. في الوقت الحالي ، هذا يكفي لحل المشكلة.

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

إذا كانت البيانات الرئيسية موجودة ، فسيتم إرجاعها على الفور. إذا لم يكن كذلك ، فسيتم إرسال طلب إلى النظام الرئيسي وتخزينه في قاعدة بيانات Tarantool.

نتيجة لذلك ، تقوم إحدى العمليات التجارية في الاختبارات بمعالجة ما يصل إلى 4 آلاف طلب. في هذه الحالة ، يكون زمن الاستجابة من الرتيلاء حوالي 1 مللي ثانية. متوسط ​​زمن الاستجابة يصل إلى 3 مللي ثانية.

فيما يلي بعض المعلومات من الاختبارات:



كانت هناك 50 عملية تجارية تنتقل إلى 4 أنظمة رئيسية وبيانات ذاكرة التخزين المؤقت في ذاكرتهم. ازدواجية المعلومات في النمو الكامل في كل حالة. بالنظر إلى أن جافا تحب بالفعل الذاكرة ... فإن الاحتمال ليس هو الأفضل.

الان


50 عملية تجارية تطلب معلومات من خلال ذاكرة التخزين المؤقت. الآن يتم تخزين المعلومات من 4 مثيلات من المعالج في مكان واحد ، ولا يتم تخزينها في ذاكرة التخزين المؤقت في كل حالة. كان من الممكن تقليل العبء على النظام الرئيسي بشكل كبير ، لا توجد نسخ مكررة من المعلومات وانخفض استهلاك الذاكرة في الحالات التي يكون فيها منطق العمل.

مثال على حجم تخزين المعلومات في ذاكرة الرتيلاء:



في نهاية اليوم ، قد تتضاعف هذه الأرقام ، ولكن لا يوجد "سحب" في الأداء.

في المعركة ، ينشئ الإصدار الحالي طلبات من 2 كيلو - 2.5 كيلو في الثانية من الحمل الحقيقي. يشبه متوسط ​​زمن الاستجابة الاختبارات التي تصل إلى 3 مللي ثانية.

إذا نظرت إلى htop على أحد الخوادم باستخدام tarantool ، فسوف نرى أنها "تبريد":



ملخص


على الرغم من كل التفاصيل الدقيقة والفروق الدقيقة في قاعدة بيانات Tarantool ، يمكنك تحقيق أداء رائع.

آمل أن يتطور هذا المشروع وسيتم حل هذه اللحظات غير المريحة.

Source: https://habr.com/ru/post/ar441686/


All Articles