Tao Hui http://weibo.com/taohui3
النسخة الإنجليزية
مفهوم التصميم
كانت لوشان قاعدة بيانات ذات قيمة مفتاح خفيفة الوزن في الإصدار 1.0. باستخدام Lushan ، يمكنك بسهولة بناء مجموعة على عدة آلات مثل Memcached. يعد Lushan 2.0 أيضًا إطار عمل خفيف الوزن يمكنه تركيب العديد من المكتبات المشتركة ، بحيث يكون لديك القدرة على الوصول إلى البيانات والحساب في عملية واحدة في نفس الوقت ، مما يجعله من السهل على ما لا يتجاوز كتابة خدمات كبيرة للبيانات وخدمات عالية الأداء. مناسبة بشكل خاص لسيناريوهات العمل لتوصيات الإنترنت والإعلان والبحث. تم استخدام Lushan في Sina Weibo التوصية والأعمال الإعلانية لسنوات عديدة.
حوالي عام 2013 ، كنت أقوم بتطوير توصية "Weibo". أحتاج إلى توفير العديد من متاجر البيانات عبر الإنترنت لتجربة خوارزميات مختلفة ، بالإضافة إلى إصداراتها عبر الإنترنت واختبارها. هذا يتطلب نشر العديد من الأنظمة. هذا النهج منخفض للغاية. لذلك ، في عطلة نهاية أسبوع طورت لوشان ، والتي يمكن أن تحررك من هذه الأشياء ، رائعة جدًا.
هذا صحيح ، أصبح لوشان منذ ذلك الحين البنية التحتية لتوصية Weibo وأعمال الإعلان. الآن هناك مجموعتان تعملان وصيانتهما ، مع 12 آلة على التوالي ، تخدم بيانات الاستعلام عبر الإنترنت من T ، مع أكثر من مليار استعلام يوميًا.
عندما انتهيت من تطوير الإصدار الأول من لوشان ، كان لدي دائمًا الرغبة في السماح لوشان بتركيب المكتبة المشتركة في نفس الوقت. لكنني لم أكن أتفرج منذ فترة طويلة ، لأنني أعتقد أن الإطار يجب أن يكون له وضعه الخاص ، والآخر هو أنه يجب فصل الجزء الذي تم تغييره بسهولة عن الجزء المستقر في الهندسة المعمارية. ومع ذلك ، في عام 2015 ، عند تطوير إعلانات Weibo ، تم تصنيف بيانات اهتمام المستخدم والبيانات العلائقية وبيانات بتقديرات النقر إلى الوزراء من خلال Hadoop وتخزينها في Lushan في هذا الوقت. لذلك تخليت عن فكرتي الأصلية وقمت بتطبيق الإصدار الثاني ، مما جعل وظيفة لوشان أكثر قوة. في التطبيقات الفعلية ، لا يزال بإمكانك استخدام Lushan فقط كقاعدة بيانات ذات قيمة رئيسية ، أو نشر مجموعات Lushan التي توفر فقط البيانات والمجموعات التي توفر الحوسبة في نفس الوقت بشكل منفصل.
تم توفير عينة من مكتبة في دليل الأمثلة ، وقم بتثبيتها وفقًا للخطوات التالية:
الإخراج هو القيمة المقابلة للمفتاح 123456.
اشرح كل خطوة:
عند استخدامه كإطار حوسبة ، يدعم Lushan بروتوكولين ، على غرار بروتوكول "عنوان URL" الخط الواحد لـ HTTP ، وبروتوكول مشابه لـ HTTP Post الذي يحدد طول قيمة الإرسال ، والذي يدعم أيضًا إرسال البيانات الثنائية. يتم توفير مثالين في دليل الوحدات النمطية: Lproxy و Lecho ، والتي تظهر هذين البروتوكولات على التوالي.
مثال Lproxy ، للمفتاح المطلوب ، Redis Query أولاً ، والعودة مباشرة إذا كان هناك redis ، واستعلام المكتبات المحلية المحلية إذا كان هناك redis. في الحالات البسيطة ، يمكن أيضًا استخدام هذا المثال في بيئات الإنتاج.
اتبع الخطوات أدناه:
قم بإنشاء ملف نصي x.txt ، وأدخل الخطين التاليين ، وعلامة التبويب الأولى هي المفتاح ، والما يلي هي القيمة ، على النحو التالي:
168 hello lushan
187 line 2
استخدم Lushan_line_maker في أدوات لتحويله إلى تنسيق ملف Lushan.
ابدأ redis على الجهاز ، و set dbno هو 1 ، ثم إضافة سجل ، مفتاح هو 168 ، القيمة هي "Hello redis"
تنفيذ Make في دليل hproxy ، ضع hmodule.so و hmodule.conf في دليل HMOD/15/1.0.0 ، وقم بتعديل المضيف والمنفذ في hmodule.conf لنشر IP ومنفذ Redis لك.
ينفذ:
echo -ne "hmod_open /mnt/lushan/hmod/15/1.0.0/ 15rn" | nc 127.0.0.1 9999
إذا تم إرجاع فتحه ، فسيتم تشغيله بنجاح ، وإلا تحقق مما إذا كان libhiredis في ld_library_path.
استفسار:
echo -ne "get m15?k=1-168rn" | nc 127.0.0.1 9999
VALUE m15?k=1-168 0 11
hello redis
END
echo -ne "get m15?k=1-187rn" | nc 127.0.0.1 9999
VALUE m15?k=1-187 0 6
line 2
END
ثم ، كما نتوقع ، في حالة وجود Redis ، سيتم إرجاع نتيجة Redis ، وإلا سيتم الاستعلام عن بيانات Lushan.
أغلق وحدة:
echo -ne "hmod_close 15rn" | nc 127.0.0.1 9999
إذا لم يكن لكل وحداتك متغيرات عالمية ، فيمكنك استخدام HMOD_OPEN لاستبدال المكتبة القديمة مباشرة ، بحيث لا توجد خسارة للخدمات عبر الإنترنت.
مثال Lecho متشابه ، ما عليك سوى إرجاع البيانات التي طلبتها.
HDICT هو تنسيق المكتبة مثبت على لوشان. إنه بسيط للغاية. هناك ملفان ضروريان في دليل HDICT_XXXX و DAT و IDX. الأول يحتوي على بياناتك ، والأخير هو رسم خرائط للمفتاح لقيمة إزاحة موضع القيمة في ملف DAT. تعريف:
typedef struct {
uint64_t key;
uint64_t pos;
} idx_t;
المفتاح هو هيكل عظمي طويل غير موقّع 64 بت لا يتضمن رقم المكتبة. يتكون POS من طول القيمة وإزاحةها في ملف DAT:
pos = (length << 40) | offset;
يجب ترتيب ملف IDX بترتيب تصاعدي لـ IDX_T.Key. ملفات DAT غير مطلوبة. يمكنك إما إنشاء فهرس على ملف DAT الموجود بالفعل ، أو إنشاء فهرس في نفس الوقت عند إخراج الملف.
الملفات المطلوبة شائعة جدًا في النماذج الحسابية لتصميم الخريطة. يمكنك تحديد تنسيق ملف الإخراج في Hadoop لإنشاء مكتبة بتنسيق HDICT. على سبيل المثال ، الأمر التالي:
job.setOutputFormat(LushanFileOutputFormat.class);
هناك ثلاثة أوامر للحصول على بيانات الحالة الإحصائية: الإحصائيات والمعلومات و HMOD_INFO. يقوم السابق بإخراج البيانات العالمية ، في حين أن اثنين من البيانات الأخيرين يخرجان لكل مكتبة وكل وحدة نمطية.
echo -n -e "statsrn" | nc 127.0.0.1 9999
STAT pid 13810
STAT uptime 1435075686
STAT curr_connections 1411
STAT connection_structures 4061
STAT cmd_get 2099151223
STAT get_hits 3950240117
STAT get_misses 2443878402
STAT threads 16
STAT timeouts 117
STAT waiting_requests 0
STAT ialloc_failed 0
END
echo -n -e "inforn" | nc 127.0.0.1 9999
id label state ref num_qry idx_num open_time path
----------------------------------------------------------------
1 interest_CF_trends OPEN 0 139922 18419392 150824-042654 /mnt/lushan/hdb/12/hdict_20150711204737
2 interest_CF_trends OPEN 0 190508 26175141 150824-050246 /mnt/lushan/hdb/12/hdict_20150711204737
echo -ne "hmod_inforn" | nc 127.0.0.1 9999
id label state ref num_qry open_time path
----------------------------------------------------------------
0 OPEN 0 267130787 180419-174502 /mnt/lushan/hmod/0
5 OPEN 0 336829974 180419-174503 /mnt/lushan/hmod/5
يمكنك استخدام lushan.php لإنشاء صفحات حالة إحصائيات رسومية.
إذا كانت لديك خبرة مع MySQL ، فسيكون من السهل بناء مجموعة بسيطة. أولاً ، تريد تقسيم بياناتك إلى مجموعات ، وعادة ما تكون مضاعفة رقم جهازك. ثم ضع في اعتبارك عدد مجموعات الخدمات التي تريد نشرها ، وعادة ما تكون مجموعتان من الموزعة في IDCs مختلفة. ثم اتبع قواعد التجميع للاستعلام عن بياناتك من خلال العميل Memcached.
على الرغم من أنه بسيط للغاية ، إلا أن لوشان لا يزال يوفر إطارًا بسيطًا لمساعدتك في التعامل مع بعض تفاصيل نقل البيانات.
بروتوكول memcached بسيط نسبيا. يدعم أمر SET CLASS الطلبات المعقدة ، ولكنه يدعم فقط نتائج بسيطة نسبيًا. قامت Lushan بتغييرات على ذلك.
يمكن أن يتجاوز "المفتاح" لطلب الحصول على حد 250 بايت. الإعدادات عند الإرسال:
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 0);
بهذه الطريقة ، لا توجد مشكلة في إرسال libmemcached. عند إرجاع النتيجة ، تحتاج إلى إرجاع المفتاح في غضون 250 بايت. طالما كنت تقرأ وفقًا للمفتاح المقطوع عند القراءة ، والمفتاح المقطوع لا يتعارض.
الاستخدام يحصل على دعم إرسال خطوط متعددة من الطلبات. عادةً ما يكون طلب الحصول على GET بسيطًا كافيًا ، ولكن إذا كنت ترغب في إرسال طلب مشابه لـ JSON ، فأنت بحاجة إلى بروتوكول أكثر تعقيدًا. قام Lushan بإعادة تعديل بروتوكول GOT وتعديله إلى نفس البروتوكول الذي تم تعيينه. عند استخدام العميل ، اضغط على الإعدادات أعلاه للتحقق من شرعية المفتاح ، ثم إرسال حزمة بالتنسيق التالي:
gets key 0 0 value_lenrn
valuern
فقط جلب المفتاح في نتيجة العودة. يتم إجراء التغليف في lutil.h ، واتصل فقط hrequest_pack.
هناك مهلة أكثر في القانون الأساسي ، أو تقوم بتسجيل المزيد من الطلبات من العميل إلى أوقات مهلة أكبر من أو تساوي تكوينك.
هناك العديد من ملفات HDICT التي لم يتم نقلها تحت عدد معين من التحميلات ، مما يعني عادةً أن البرنامج النصي لإرسالك سيتم مقاطعة قبل نقله.