سفر خاک

یادداشت های غلامحسین توسلی

سفر خاک

یادداشت های غلامحسین توسلی

جز غبار از سفر خاک چه حاصل کردیم؟ / سفر آن بود که ما در قدم دل کردیم

LevelDB یک موتور پایگاه داده کلید-مقدار سریعه که توسط گوگل به زبان ++C به نگارش دراومده. در حقیقت سازندگان Google MapReduce و BigTable این کتابخانه را با تاکید بر روی دسترسی تصادفی کارا مبتنی بر هارد دیسک بوجود آوردند. این موتور به صورت متن باز عرضه شده. این پایگاه داده نگاشتی از کلیدهای رشته ای به مقادیر رشته ای فراهم می کنه. سوال اول اینه که تفاوت این پایگاه داده با پایگاه داده ای مثل MySQL چیه؟ خوب هر دو از هارد دیسک برای ذخیره سازی داده استفاده می کنند. هر دو یک پایگاه داده ماندگار (persistent) ایجاد می کنن؛ به این معنی که داده ها پس از ذخیره سازی و پایان برنامه بر روی هارد دیسک باقی می مونن.


فرق اصلی که بین این دو پایگاه داده وجود داره اینه که پایگاه داده MySQL یک پایگاه داده رابطه ایست که در آن شما می تونید با استفاده از Queryهای SQL با داده ها در پایگاه داده کار کنید؛ در حالی که LevelDB به شما یک پایگاه داده رابطه ای نمیده بلکه فقط یک پایگاه داده کلید - مقداره که داده ها را به صورت مرتب شده بر اساس کلید نگهداری می کنه. ... تفاوت دیگه ای که بین این دو وجود داره اینه که شما برای کار با MySQL حتماً به یک سرویس دهنده پایگاه داده نیاز دارید؛ یعنی وقتی شما یک برنامه دسکتاپ می نویسید که می خواد از پایگاه داده MySQL استفاده کنه نیاز دارید که اون رو هم کنار برنامتون ارائه و نصب کنید. در حالی که LevelDB یک کتابخانه است که می تونید از اون تو برنامتون استفاده کنید و بدون نصب هیچ برنامه اضافی دیگه به برنامه قابلیت پایگاه داده رو بدید. اصلاحاً به چنین موتوری، پایگاه داده تعبیه شده (Embedded) می گن.

شاید از این منظر مقایسه ی LevelDB با SQLite و یا BerkelyDB مناسب تر باشه تا MySQL؛ چون SQLite هم یک کتابخانه برای ایجاد پایگاه داده ماندگاره؛ برای مثال songbird برای نگهداری اطلاعات آهنگ ها از SQLite استفاده می کنه. گوگل هم برای مقایسه کارایی پایگاه داده LevelDB اون رو با SQLite مقایسه کرده.

سوال بعدی اینه که کاربرد چنین پایگاه داده ای چی میتونه باشه؟ بذارید ببینیم نظر گوگل راجع به کاربرد این پایگاه داده چیه. "برای مثال، LevelDB می تونه تو مرورگرهای وب برای نگهداری کَش صفحات وبی که اخیراً مورد دسترسی قرار گرفته اند، استفاده بشه. و یا اینکه سیستم عامل میتونه برای نگهداری فهرست بسته های نصب شده و نیازمندی های اون ها از این کتابخانه استفاده کنه. و یا یک برنامه کاربردی برای نگهداری تنظیمات کاربر می تونه از این پایگاه داده استفاده کنه. ما [یعنی گوگل] این پایگاه داده رو طوری طراحی کرده ایم تا به عنوان یک بلوک سازنده برای سیستم های ذخیره سازی سطح بالاتر بتوان از آن استفاده کرد. در نسخه های جدید مرورگر Chrome برای پیاده سازی APIی IndexedDBی HTML5 از LevelDB استفاده شده است. پایگاه داده توزیع شده Riak پشتیبانی از استفاده از LevelDB رو به عنوان منبع ذخیره سازی برای هر گره رو به امکاناتش اضافه کرده است."

گوگل این پایگاه داده رو با حداقل نیازمندی ها طراحی کرده تا بشه براحتی از اون در سیستم های جدید استفاده کرد. علی الحساب از این موتور توی سیستم های مبتنی بر Unix، Mac OS X، ویندوز و اندروید میشه استفاده کرد. گوگل از نظر کارایی این پایگاه داده رو با SQLite و Kyoto Cabinet مقایسه کرده. تیم Riak هم اون رو با InnoDB مقایسه کردند. به گفته گوگل LevelDB برای بروزرسانی هایِ دسته ای که در اون کلید های زیادی که بر روی یک فضای کلید بزرگ پراکنده شده اند، دستکاری می شود، بهینه سازی شده است؛

ویژگی ها

  • این کتابخانه متن باز است.
  • از این پایگاه داده می توانید برای ذخیره سازی کلید - مقداری داده استفاده کنید که در آن کلید و مقدار می تواند آرایه ای از بایت ها (رشته) باشد.
  • داده ها به صورت مرتب بر اساس کلید نگهداری می شوند.
  • برای انجام مرتب سازی می توانید تابع سفارشی شده خود را به کتابخانه معرفی کنید.
  • چندین تغییر را می توان در قالب یک عمل اتمیک انجام دهید. (به این معنی که به ظاهر یک دستور اجرا میشه ولی در عمل چندین دستور رو اجرا می کنید. در واقع یا همه دستور ها اجرا می شوند و یا هیچ کدام از آن ها)
  • کاربر می تونه یک snapshot موقتی از پایگاه داده بگیره و به عنوان یک view بر روی اون کار کنه.
  • داده ها به صورت پیشفرض به صورت فشرده نگهداری میشه. LevelDB برای این کار از کتابخانه فشرده سازی Snappy استفاده می کنه.
  • برای بهبود وضعیت حافظه این کتابخانه از کلیدهایی با اندازه متغیر استفاده می کند.

محدودیت

  • همونطور که قبلا هم اشاره کردم LevelDB یک پایگاه داده SQL نیست و مبتنی بر مدل رابطه ای طراحی نشده است و از کوئری های SQL و Index پشتیبانی نمی کند.

تجربه شخصی

راحت نصب شد و خیلی راحت تونستم باهاش کار کنم (++C). شما می تونید این کتابخانه رو از گوگل کد دانلود کنید. واسه دوستانی هم که به گوگل کد دسترسی ندارند آخرین نسخه اون (Sep 19, 2013) رو اینجا آپلودش کردم. همراه کتابخانه یک مستند با مثال برای کار با LevelDB هم ارائه شده. در کل خوشم اومد ازش! نکته ای که باید به اون اشاره کنم اینه که در آن واحد تنها یک پردازه میتونه از یک پایگاه داده استفاده کنه؛ ولی خوشبختانه در یک برنامه چند نخی هیچ محدودیتی در استفاده نخ ها در یک پردازه از یک پایگاه داده وجود نداره. خود کتابخانه دسترسی نخ های مختلف به یک پایگاه داده رو مدیریت می کنه.
همونطور که اینجا بهش اشاره کرده درخت LSM که این کتابخانه از اون استفاده می کنه از نظر کارایی نوشتن بهتر از BTree عمل می کنه؛ و این کتابخانه هم برای نوشتن تصادفی بهینه سازی شده. در این نوع ذخیره سازی (درخت LSM) همیشه عمل الحاق به انتهای فایل log انجام میشه و یا فایل های موجود با هم ادغام شده و یک فایل جدید از روی اون ساخته میشه. اگر احیانا وسط ثبت رکوردی OS کرش کنه کدهای بازیابی LevelDB با استفاده از checksumها این مشکل رو شناسایی کرده و رکوردهای ناقص رو نادیده میگیره. نکات ریز بسیار مفیدی رو راجع به این پایگاه داده می تونید از اینجا دریافت کنید. برای مثال انتخاب بلاک های بزرگتر مناسب تر از بلام های با اندازه کوچکه؛ برای همین خوبه که اندازه بلاک ها رو از 64K به 256K تغییر بدید. و یا اینکه نوشتن دسته ای به مراتب کارایی را بیشتر از یکی یکی نوشتن افزایش میده. هر چه حافظه در دسترس این کتابخانه بزرگتر باشه کارایی اون رو افزایش میده؛ چون بافر نوشتن بزرگتر باعث میشه کمتر به ادغام فایل های مرتب شده نیاز بشه.

به نظرم برای آشنایی همین مقدار کافیه؛ ایشاالله در فرصت مناسب برنامه نمونه از این پایگاه داده رو هم بررسی می کنم.

لعل الله یحدث بعد ذلک امراً
  • موافقین ۲ مخالفین ۰
  • ۹۲/۰۷/۰۷
  • ۱۲۱۰ نمایش
  • غلامحسین توسلی

کتابخانه برنامه نویسی

library

database

پایگاه داده

noSQL

google

leveldb

نظرات (۳)

سلام
وبلاگ قشنگی دارید... با توجه به عزم راسخی که از شما سرغ داریم انشاالله وبلاگ رو با قدرت  پیش می برید
 به نظر میرسه هر روز استفاده از بانک های اطلاعاتی NoSQL رایجتر میشه و نرم افزار های قدرتمند تری در این زمینه ارائه میشن...
من هم قبلا خیلی مختصر با یکی از این نوع بانک ها به نام RavenDB آشنا شدم. البته بیشتر برای دات نت کارا مناسبه. برخی از ویزگی هاش:
  • بر اساس زبان سی شارپ نوشته شده است و همچنین با LINQ خیلی خوب کار می‌کند.
  • Transaction را پشتیبانی می‌کند.
  • اساس ذخیره سازی آن JSON است.
  • محیط مدیریت کاربر پسندی دارد.(این محیط قبلا با سیلورلایت پیداسازی شده بود ولی به تازگی-حدود یک ماه- این محیط رو تغییر داده و از یک UI مبتنی بر  HTML5 و JavaScript استفاده کرده)

  • مجید رحیمی
  • ممنون از پست خوب شما!

    لطفا راجع به SQLite هم مطلب بگذارید!

     

    پاسخ:
    ممنون از لطفتون، تو برنامم هست.
    سلام. مطلب خوبی بود. فقط یه سوال داشتم دوست عزیز شما اگه ایرانی هستی؟ پس همیشه ایرانی و فارس باش و فارسی بنویس تا ایرانی نمیره!
    مطلب خوبی بود. تشکر @-}--. 
    پاسخ:
    سلام
    ممنون از لطفت؛ تمام سعیم رو می‌کنم تا همیشه فارسی بنویسم ولی طبیعت رشته‌ام جوریه که بعضی اوقات از دستم در میره. البته همچنان محاوره‌ای نوشتن تو وبلاگ رو دوست‌تر دارم.
    باز هم ممنون /(^_^)
    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی