OVDB(5) InterNetNews Documentation OVDB(5)

ovdb - روش ذخیره‌سازی داده‌های overview برای INN

روش ذخیره‌سازی ovdb overview از کتابخانهٔ Berkeley DB برای ذخیره داده‌های overview استفاده می‌کند. این روش به نسخهٔ 4.4 یا بالاتر از کتابخانهٔ Berkeley DB نیاز دارد (نسخهٔ 4.7+ پیشنهاد می‌شود، زیرا نسخه‌های قدیمی‌تر از مشکلات گوناگونی رنج می‌برند).

روش ovdb overview از قابلیت‌های کامل تراکنش/گزارش‌گیری/قفل‌گذاری (transaction/logging/locking) محیط Berkeley DB بهره می‌برد. کتابخانهٔ Berkeley DB را می‌توان از https://www.oracle.com/database/technologies/related/berkeleydb.html بارگیری کرد و وجود آن برای ساخت زیرسیستم ovdb الزامی است.

این روش به همراه یک ابزار کمکی ارائه می‌شود که امکان دستکاری اطلاعات overview را فراهم می‌کند. برای جزئیات بیشتر به ovdb_stat(8) مراجعه کنید.

روش ذخیره‌سازی ovdb دارای چند نسخه است:

  • نسخهٔ ۱: نسخهٔ اولیه که همراه با INN 2.3.0 تا INN 2.3.5 عرضه شد.
  • نسخهٔ ۲: با کارایی بهبودیافته، از زمان INN 2.4.0 به بعد.
  • نسخهٔ ۳: مطابق با نسخهٔ ۲ به همراه فعال‌سازی فشرده‌سازی، از زمان INN 2.5.0 به بعد.

اگر پایگاه داده‌ای دارید که با نسخه‌های قبلی ovdb ایجاد شده است، باید آن را با استفاده از ovdb_init ارتقا دهید. برای راهنمای ارتقا به صفحهٔ راهنمای ovdb_init(8) و همچنین بخش "فشرده‌سازی (COMPRESSION)" در ادامه مراجعه کنید.

توجه داشته باشید هنگامی که کتابخانهٔ Berkeley DB به نسخهٔ جدیدتری به‌روزرسانی می‌شود، پایگاه دادهٔ ovdb نیز نیاز به ارتقا دارد.

اگر کتابخانهٔ Berkeley DB در زمان پیکربندی (configure) یافت شود، INN با پشتیبانی از Berkeley DB ساخته خواهد شد، مگر اینکه گزینهٔ --without-bdb به‌صورت صریح به اسکریپت configure ارسال شود. به‌طور پیش‌فرض، configure در مسیرهای استاندارد به دنبال Berkeley DB می‌گردد؛ در خروجی configure پیامی نمایش داده خواهد شد که مسیر مورد استفاده را مشخص می‌کند.

می‌توانید با افزودن یک مسیر به این گزینه، مسیر پیش‌فرض را لغو کنید؛ برای نمونه: --with-bdb=/usr/BerkeleyDB.4.4. این شاخه باید شامل زیرشاخه‌های include و lib (پوشه‌های lib32 و lib64 نیز بررسی می‌شوند) باشد که به ترتیب دربردارندهٔ db.h و خود کتابخانه هستند. در صورتی که مسیرهای غیراستاندارد برای کتابخانه‌های Berkeley DB استفاده شده باشد، می‌توان از یک یا هر دو گزینهٔ --with-bdb-include و --with-bdb-lib به همراه مسیر مشخص در هنگام اجرای configure استفاده کرد.

پایگاه دادهٔ ovdb ممکن است برای یک مخزن (spool) مشخص، فضای دیسک بیشتری نسبت به سایر روش‌های overview مصرف کند. برای هر مقاله در مخزن خود حداقل 1.1 کیلوبایت فضا در نظر بگیرید (بدون احتساب crosspostها). بنابراین، اگر ۵ میلیون مقاله دارید، حداقل به 5.5 گیگابایت فضای دیسک برای ovdb نیاز خواهید داشت. با فعال بودن فشرده‌سازی، این برآورد به 0.9 کیلوبایت به ازای هر مقاله کاهش می‌یابد؛ بنابراین برای ۵ میلیون مقاله حداقل به 4.5 گیگابایت فضای دیسک نیاز خواهید داشت. بخش "فشرده‌سازی (COMPRESSION)" را در ادامه ببینید. علاوه بر این، به فضای اضافی برای لاگ‌های تراکنش (transaction logs) نیز نیاز دارید: حداقل 100 مگابایت. به‌طور پیش‌فرض، لاگ‌های تراکنش در همان شاخهٔ پایگاه داده قرار می‌گیرند. برای بهبود کارایی می‌توان آن‌ها را روی یک دیسک دیگر قرار داد -- بخش "DB_CONFIG" را ببینید.

برای فعال کردن روش ovdb overview، پارامتر ovmethod را در inn.conf روی مقدار "ovdb" تنظیم کنید. پایگاه دادهٔ ovdb در شاخه‌ای که توسط پارامتر pathoverview در inn.conf مشخص شده ذخیره می‌شود. این شاخه همان شاخهٔ "DB_HOME" است. برای شروع، این شاخه باید خالی باشد (به‌جز یک فایل اختیاری DB_CONFIG؛ برای جزئیات به "DB_CONFIG" مراجعه کنید)، و innd (یا makehistory) فایل‌های لازم را در آن شاخه ایجاد خواهد کرد. همچنین اطمینان حاصل کنید که مالکیت این شاخه متعلق به کاربر news باشد.

سایر پارامترهای پیکربندی ovdb در فایل پیکربندی ovdb.conf قرار دارند. پارامترهای زیر را می‌توان در آن فایل تنظیم کرد:

اگر INN با zlib کامپایل شده باشد و پارامتر compress روی true تنظیم شده باشد، ovdb رکوردهای overview را که طول آن‌ها بیشتر از ۶۰۰ بایت است فشرده‌سازی می‌کند. بخش "فشرده‌سازی (COMPRESSION)" را در ادامه ببینید.
اندازهٔ حافظهٔ نهان (کش) استخر حافظه بر حسب کیلوبایت. کش دارای یک فایل پشتیبان در شاخهٔ DB خواهد بود که اندازه‌ای حداقل به همان میزان خواهد داشت. به‌طور کلی، هرچه کش بزرگ‌تر باشد، بهتر است. از دستور "ovdb_stat -m" برای مشاهدهٔ درصد اصابت حافظهٔ نهان (cache hit) استفاده کنید. برای اعمال تغییرات این پارامتر، INN را خاموش کرده و دوباره راه‌اندازی کنید (حتماً هنگام خاموش کردن تمام فرآیندهای nnrpd را متوقف کنید). مقدار پیش‌فرض "8000" (کیلوبایت) است که برای سرورهای کوچک تا متوسط مناسب است. سرورهای بزرگ احتمالاً حداقل به "20000" (کیلوبایت) نیاز خواهند داشت.
تعداد بخش‌هایی که کش بین آن‌ها تقسیم می‌شود. اندازهٔ هر بخش برابر است با cachesize تقسیم بر ncache. مقدار پیش‌فرض برای ncache عدد "1" است، به این معنی که حافظهٔ نهان به‌صورت پیوسته در حافظه تخصیص می‌یابد.
داده‌های overview بین این تعداد فایل تقسیم می‌شوند. در حال حاضر، innd همهٔ این فایل‌ها را باز نگه می‌دارد، بنابراین این مقدار را بیش از حد بالا تنظیم نکنید؛ در غیر این صورت ممکن است innd با کمبود توصیف‌کننده‌های فایل (file descriptors) مواجه شود. با این حال، nnrpd در هر لحظه فقط یک فایل را باز می‌کند. می‌توان آن را روی یک یا تعداد کمی فایل تنظیم کرد، اما تنها در صورتی این کار را انجام دهید که سیستم‌عامل شما از فایل‌های بزرگ (بیشتر از 2 گیگابایت) پشتیبانی کند. تغییر این پارامتر تأثیری بر پایگاه داده‌ای که قبلاً ایجاد شده است ندارد. مقدار پیش‌فرض "32" است.
اگر txn_nosync روی false تنظیم شود، Berkeley DB بعد از هر تراکنش، گزارش لاگ را روی دیسک تخلیه (flush) می‌کند. این کار احتمال از دست رفتن تراکنش‌ها در زمان خرابی یا کرش سیستم را به حداقل می‌رساند، اما منجر به کاهش چشمگیر کارایی می‌شود. مقدار پیش‌فرض true است که در این حالت ovdb_monitor لاگ‌های تراکنش را هر ۳۰ ثانیه یک بار روی دیسک تخلیه می‌کند.
اگر useshm روی true تنظیم شود، Berkeley DB به جای mmap از حافظهٔ اشتراکی (shared memory) برای بخش‌های محیطی خود (کش، قفل و غیره) استفاده خواهد کرد. در برخی سیستم‌عامل‌ها این کار ممکن است کارایی را بهبود ببخشد. مقدار پیش‌فرض false است.
کلید حافظهٔ اشتراکی مورد استفاده توسط Berkeley DB را در زمانی که useshm فعال (true) است مشخص می‌کند. کتابخانهٔ Berkeley DB چندین سگمنت حافظهٔ اشتراکی (معمولاً ۵ عدد) را با استفاده از کلیدهای شماره‌گذاری‌شدهٔ متوالی که با "shmkey" شروع می‌شوند ایجاد خواهد کرد. کلیدی را انتخاب کنید که با سگمنت‌های حافظهٔ اشتراکی موجود در سیستم تداخل نداشته باشد. مقدار پیش‌فرض "6400" است.
اندازهٔ صفحه را برای فایل‌های DB (بر حسب بایت) تعیین می‌کند. این مقدار باید توانی از عدد ۲ باشد. بهترین گزینه‌ها "4096" یا "8192" هستند. مقدار پیش‌فرض "8192" است. تغییر این پارامتر بر پایگاه داده‌های از پیش ایجاد شده بی‌تأثیر است.
حداقل تعداد کلیدها در هر صفحه را تعیین می‌کند. برای اطلاعات بیشتر به مستندات Berkeley DB مراجعه کنید. مقدار پیش‌فرض بر اساس اندازهٔ صفحه و فعال بودن یا نبودن فشرده‌سازی تعیین می‌شود:
default_minkey = MAX(2, pagesize / 2600) if compress is false
default_minkey = MAX(2, pagesize / 1500) if compress is true

کمترین مقدار مجاز برای minkey عدد "2" است. تنظیم minkey روی مقداری بالاتر از پیش‌فرض توصیه نمی‌شود، زیرا باعث ایجاد صفحات سرریز (overflow pages) بسیار زیادی در پایگاه‌های داده خواهد شد. تغییر این پارامتر بر پایگاه داده‌های موجود اثری ندارد.

پارامتر lk_max در Berkeley DB را تنظیم می‌کند که حداکثر تعداد قفل‌های همزمان موجود در پایگاه داده است. مقدار پیش‌فرض "4000" است.
پارامتر nocompact بر رفتار expireover تأثیر می‌گذارد. تابع expireover در ovdb می‌تواند کار خود را به یکی از دو روش زیر انجام دهد: با حذف سادهٔ رکوردهای منقضی‌شده از پایگاه داده؛ یا با بازنویسی رکوردهای overview در یک مکان دیگر بدون در نظر گرفتن رکوردهای منقضی‌شده. روش اول سریع‌تر است اما «حفره‌هایی» برجای می‌گذارد که فضای آن‌ها بلافاصله قابل استفادهٔ مجدد نیست. روش دوم با بازنویسی رکوردها، آن‌ها را یکپارچه و فشرده (compact) می‌کند.

اگر این پارامتر روی "0" تنظیم شود، expireover تمام گروه‌های خبری را یکپارچه‌سازی می‌کند؛ اگر روی "1" تنظیم شود، expireover هیچ گروه خبری را فشرده نمی‌کند؛ و اگر روی مقداری بزرگ‌تر از یک تنظیم شود، expireover تنها گروه‌هایی را که تعداد مقالات آن‌ها کمتر از آن مقدار است یکپارچه می‌کند.

تجربه نشان داده است که یکپارچه‌سازی اثر بسیار کمی دارد (به‌جز طولانی‌تر کردن زمان اجرای expireover)، بنابراین مقدار پیش‌فرض "1" است. این پارامتر احتمالاً در آینده حذف خواهد شد.

هنگامی که پارامتر readserver روی false تنظیم شود، هر فرآیند nnrpd مستقیماً به محیط Berkeley DB دسترسی پیدا می‌کند. فرآیند اتصال به پایگاه داده (و قطع اتصال پس از اتمام) نسبتاً سنگین است و می‌تواند در شرایطی که اتصالات خوانندهٔ زیادی با مدت زمان کوتاه وجود دارد، بار کاری بسیار بالایی ایجاد کند.

هنگامی که پارامتر readserver روی true تنظیم شود، فرآیندهای nnrpd از طریق یک سرور کمکی (ovdb_server -- که توسط ovdb_init راه‌اندازی می‌شود) به overview دسترسی خواهند داشت. تمام خواندن‌های ovdb سپس از طریق یک فرآیند واحد با رابطی تمیزتر به پایگاه دادهٔ Berkeley DB زیرین هدایت می‌شوند. این امر منجر به خاموش شدن تمیزتر پایگاه داده، بهبود پایداری و جلوگیری از بن‌بست‌ها (deadlocks)، مشکلات زمان‌بندی و خرابی پایگاه داده خواهد شد. به همین دلیل اگر با هرگونه ناپایداری در روش ovdb overview مواجه شدید، باید این پارامتر را روی true تنظیم کنید.

مقدار پیش‌فرض true است.

این پارامتر تنها زمانی استفاده می‌شود که readserver روی true باشد. این گزینه تعداد فرآیندهای ovdb_server را تعیین می‌کند. از آنجا که هر ovdb_server تنها می‌تواند یک تراکنش را در لحظه پردازش کند، اجرای تعداد بیشتری سرور می‌تواند زمان پاسخ‌دهی به خوانندگان را بهبود ببخشد. مقدار پیش‌فرض "5" است.
این پارامتر تنها زمانی استفاده می‌شود که readserver روی true باشد. این گزینه حداکثر تعداد خوانندگانی را تعیین می‌کند که یک فرآیند مشخص ovdb_server در یک زمان می‌تواند به آن‌ها سرویس دهد. این بدان معنی است که حداکثر تعداد خوانندگان برای تمام فرآیندهای ovdb_server برابر با (numrsprocs * maxrsconn) خواهد بود. این مقدار تعداد واقعی خوانندگان را محدود نمی‌کند، چرا که nnrpd در صورت عدم توانایی در اتصال به یک ovdb_server، به باز کردن مستقیم پایگاه داده روی می‌آورد. مقدار پیش‌فرض "0" است، که به معنای مجاز بودن تعداد نامحدود اتصالات است.

روش ذخیره‌سازی ovdb توانایی فشرده‌سازی داده‌های overview را قبل از ذخیره در پایگاه داده دارد. علاوه بر مصرف کمتر فضای دیسک، فشرده‌سازی میانگین اندازهٔ کلیدهای پایگاه داده را کوچک‌تر نگه می‌دارد. این امر به نوبهٔ خود میانگین تعداد کلیدها در هر صفحه را افزایش می‌دهد که می‌تواند کارایی را به میزان قابل توجهی ارتقا داده و به کم‌حجم ماندن پایگاه داده کمک کند. این قابلیت نیازمند آن است که INN با zlib ساخته شده باشد. فقط رکوردهای بزرگتر از ۶۰۰ بایت فشرده می‌شوند، زیرا از این نقطه به بعد فشرده‌سازی تأثیر ملموس خود را نشان می‌دهد.

اگر فشرده‌سازی فعال نباشد (چه از طریق گزینهٔ compress در ovdb.conf و چه به دلیل عدم ساخت INN با پشتیبانی از zlib)، پایگاه داده با نسخه‌های قدیمی‌تر ovdb سازگار خواهد بود. با این حال، در صورت فعال بودن فشرده‌سازی، پایگاه داده با نسخهٔ جدیدتری نشانه‌گذاری می‌شود که از باز شدن آن توسط نسخه‌های قدیمی‌تر ovdb جلوگیری می‌کند.

شما می‌توانید با تنظیم سادهٔ compress روی true در ovdb.conf، یک پایگاه دادهٔ موجود را به استفاده از فشرده‌سازی ارتقا دهید. توجه داشته باشید که رکوردهای موجود در پایگاه داده به‌صورت فشرده‌نشده باقی می‌مانند؛ تنها رکوردهای جدیدی که پس از فعال‌سازی اضافه می‌شوند فشرده خواهند شد.

اگر فشرده‌سازی را در پایگاه داده‌ای که قبلاً آن را فعال داشته غیرفعال کنید، رکوردهای جدید به‌صورت فشرده‌نشده ذخیره می‌شوند، اما پایگاه داده همچنان با نسخه‌های قدیمی‌تر ovdb ناسازگار خواهد بود (و همچنین اگر INN بدون پشتیبانی از zlib ساخته شده باشد با این نسخه از ovdb نیز ناسازگار است). بنابراین برای بازگشت به یک پایگاه دادهٔ کاملاً فشرده‌نشده، باید پایگاه داده را با استفاده از makehistory بازسازی کنید.

می‌توان فایلی به نام DB_CONFIG را در شاخهٔ پایگاه داده (pathoverview در inn.conf) قرار داد تا محل ذخیرهٔ فایل‌های مختلف پایگاه داده و لاگ‌های تراکنش را سفارشی‌سازی کرد. به‌طور پیش‌فرض، تمام فایل‌ها در شاخهٔ "DB_HOME" نوشته می‌شوند. یکی از روش‌های بهبود کارایی این است که لاگ‌های تراکنش را روی یک دیسک جداگانه قرار دهید. برای این کار، خط زیر را:

DB_LOG_DIR /path/to/logs

در فایل DB_CONFIG قرار دهید. اگر مسیری که وارد می‌کنید با "/" شروع شود، یک مسیر مطلق در نظر گرفته می‌شود؛ در غیر این صورت، نسبت به شاخهٔ "DB_HOME" سنجیده خواهد شد. قبل از راه‌اندازی INN، مطمئن شوید شاخه‌هایی که مشخص کرده‌اید وجود دارند و دارای مجوزها و مالکیت مناسب هستند، زیرا آن‌ها به‌طور خودکار ایجاد نخواهند شد. همچنین در زمانی که هر برنامه‌ای در حال استفاده از ovdb است، فایل DB_CONFIG را تغییر ندهید.

کار دیگری که می‌توانید با این فایل انجام دهید، تقسیم پایگاه دادهٔ overview بین چند دیسک مختلف است. در فایل DB_CONFIG می‌توانید شاخه‌هایی را که Berkeley DB هنگام باز کردن پایگاه داده باید جستجو کند فهرست نمایید.

به‌عنوان مثال، فرض کنید pathoverview روی /mnt/overview تنظیم شده و شما چهار سیستم‌فایل اضافی در /mnt/ovX ایجاد کرده‌اید. می‌توانید فایلی به نام /mnt/overview/DB_CONFIG با خطوط زیر ایجاد کنید:

set_data_dir /mnt/overview
set_data_dir /mnt/ov1
set_data_dir /mnt/ov2
set_data_dir /mnt/ov3
set_data_dir /mnt/ov4

سپس فایل‌های ovNNNNN خود را در این چهار سیستم‌فایل توزیع کنید (برای مثال در هر کدام ۸ فایل). کتابخانهٔ db هنگام باز کردن یک فایل پایگاه داده، به ترتیب در هر یک از شاخه‌های مشخص‌شده جستجو می‌کند. اگر فایل پیدا نشود، یکی در اولین شاخه از آن فهرست ایجاد خواهد شد.

هر زمان که DB_CONFIG را تغییر می‌دهید یا فایل‌های پایگاه داده را جابه‌جا می‌کنید، ابتدا اطمینان حاصل کنید که تمام فرآیندهای news که از پایگاه داده استفاده می‌کنند خاموش شده باشند (از جمله فرآیندهای nnrpd).

قابلیت DB_CONFIG بخشی از خود Berkeley DB است، نه چیزی که توسط ovdb ارائه شده باشد. برای جزئیات کامل به مستندات نسخهٔ مربوط به Berkeley DB مورد استفادهٔ خود مراجعه کنید.

هنگام راه‌اندازی سامانهٔ اخبار (news system)، اسکریپت rc.news برنامهٔ ovdb_init را فراخوانی می‌کند. برای اطلاعات دربارهٔ وظایفی که این برنامه انجام می‌دهد به صفحهٔ راهنمای ovdb_init(8) مراجعه کنید. برنامهٔ ovdb_init باید حتماً قبل از استفاده از پایگاه داده اجرا شود.

و در زمان متوقف کردن INN، اسکریپت rc.news فرآیندهای ovdb_monitor را پس از خاموش شدن سایر فرآیندهای INN متوقف می‌کند.

مشکلات مربوط به ovdb در فایل news.err به همراه عبارت "OVDB" در پیام خطا ثبت می‌شوند.

برنامه‌های INN که از overview استفاده می‌کنند، در صورت عدم اجرای فرآیندهای ovdb_monitor با خطا مواجه شده و شروع به کار نخواهند کرد. پیش از اجرای هر برنامه‌ای که به overview دسترسی دارد، از اجرای ovdb_init اطمینان حاصل کنید.

همچنین، اگر کاربری که برنامه‌های INN استفاده‌کننده از overview را اجرا می‌کند کاربر news نباشد، برنامه‌ها اجرا نخواهند شد.

اگر برنامه‌ای که به پایگاه داده دسترسی دارد دچار خرابی (crash) شود یا به هر دلیلی به‌صورت غیرعادی خاتمه یابد، ممکن است یک قفل منسوخ و کهنه (stale lock) در پایگاه داده باقی بماند. این قفل می‌تواند باعث قفل متقابل و بن‌بست سایر فرآیندها روی آن قفل کهنه شود. برای حل این مشکل، تمام فرآیندهای news را خاموش کرده (در صورت لزوم با استفاده از "kill -9") و سپس سامانه را دوباره راه‌اندازی کنید. برنامهٔ ovdb_init باید یک عملیات بازیابی (recovery) انجام دهد که قفل‌ها را پاک کرده و آسیب‌های ناشی از متوقف کردن اجباری فرآیندهای به بن‌بست رسیده را ترمیم نماید.

پارامترهای ovmethod و pathoverview در این فایل به ovdb مربوط می‌شوند.
فایل پیکربندی اختیاری برای بهینه‌سازی و تنظیمات پیشرفته. بخش "پیکربندی (CONFIGURATION)" در بالا را ببینید.
شاخه‌ای که پایگاه داده در آن قرار می‌گیرد. در Berkeley DB به آن شاخهٔ "DB_HOME" گفته می‌شود.
فایل اختیاری برای پیکربندی چیدمان و ساختار فایل‌های پایگاه داده.
فایلی که توسط هر فرآیند در حال دسترسی به پایگاه داده قفل می‌شود. این فایل توسط ovdb_init استفاده می‌شود تا مشخص شود پایگاه داده فعال است یا غیرفعال/آرام.
شناسهٔ فرآیند (PID) مربوط به ovdb_monitor در این فایل ذخیره می‌شود.

پیاده‌سازی روشی برای محدود کردن تعداد پایگاه‌های داده‌ای که می‌توانند به‌طور همزمان باز باشند (برای کاهش استفاده از توصیف‌کننده‌های فایل)؛ شاید با استفاده از سازوکاری شبیه به کد حافظهٔ نهان در فایل قدیمی ov3.c.

نوشته‌شده توسط Heath Kehoe <hakehoe@avalon.net> برای InterNetNews.

inn.conf(5), innd(8), makehistory(8), nnrpd(8), ovdb_init(8), ovdb_monitor(8), ovdb_stat(8).

مستندات Berkeley DB: در شاخهٔ docs توزیع سورس‌کد Berkeley DB، یا در صفحهٔ وب Oracle Berkeley DB (https://www.oracle.com/database/technologies/related/berkeleydb.html).

2024-05-19 INN 2.7.4