OVSQLITE(5) InterNetNews Documentation OVSQLITE(5)

ovsqlite - روش ذخیره‌سازی داده‌های کلی مبتنی بر SQLite برای INN

این روش از SQLite برای ذخیره‌سازی داده‌های کلی (overview) استفاده می‌کند. این روش به نسخه 3.8.2 یا جدیدتر کتابخانه SQLite نیاز دارد (نسخه +3.20.0 توصیه می‌شود).

کد منبع، مستندات و موارد دیگر SQLite در https://www.sqlite.org در دسترس است. یکی از اهداف اعلام‌شده قالب فایل SQLite، پایداری و سازگاری طولانی‌مدت است، که این روش ذخیره‌سازی را به انتخابی عالی برای ذخیره داده‌های کلی تبدیل می‌کند.

در حال حاضر تنها یک نسخه از پروتکل روش ذخیره‌سازی ovsqlite وجود دارد که از نسخه INN 2.7.0 پیاده‌سازی شده است.

این روش به همراه یک ابزار کمکی (ovsqlite-util) و یک ماژول پرل ("INN::ovsqlite_client") ارائه می‌شود که امکان دسترسی و دستکاری اطلاعات کلی را فراهم می‌کنند. برای جزئیات بیشتر درباره امکانات آن‌ها، به صفحات راهنمای مربوطه مراجعه کنید.

اسکریپت پیکربندی (configure) در صورت یافتن کتابخانه SQLite، پشتیبانی از ovsqlite را به‌طور خودکار فعال می‌کند. اگر کتابخانه در یک مکان استاندارد نصب نشده باشد، ممکن است لازم باشد گزینه --with-sqlite3 را مشخص کنید تا configure در یافتن آن کمک شود. برای موارد پیچیده‌تر، می‌توانید از گزینه‌های جداگانه --with-sqlite3-include و --with-sqlite3-lib استفاده کنید. در نهایت، اگر با وجود نصب بودن کتابخانه SQLite روی سیستم، پشتیبانی از ovsqlite را نمی‌خواهید، می‌توانید از گزینه --without-sqlite3 استفاده کنید.

اگر توزیع لینوکس جدیدی دارید، SQLite به احتمال زیاد از قبل نصب شده است. ممکن است برای دریافت فایل‌های سرآیند (header) مورد نیاز، لازم باشد بسته‌ای جداگانه با نامی شبیه به "libsqlite3-dev" را نصب کنید.

برای هر مقاله در مخزن مقالات (spool) خود (بدون احتساب ارسال‌های متقاطع یا crosspostها)، حداقل 0.93 کیلوبایت فضا در نظر بگیرید. بنابراین، اگر ۵ میلیون مقاله دارید، حداقل به 4.65 گیگابایت فضای دیسک برای ovsqlite نیاز خواهید داشت. با فعال بودن فشرده‌سازی، این تخمین به 0.4 کیلوبایت به ازای هر مقاله تغییر می‌کند، بنابراین برای ۵ میلیون مقاله حداقل به 2 گیگابایت فضای دیسک نیاز خواهید داشت. علاوه بر این، به فضای اضافی برای گزارش‌های تراکنش (چند مگابایت، یا به‌طور موقت تا چند صد مگابایت در صورت فعال بودن walmode) نیاز خواهید داشت.

برای انتخاب ovsqlite به عنوان روش نمای کلی خود، پارامتر ovmethod را در inn.conf روی "ovsqlite" تنظیم کنید. فایل پایگاه داده در دایرکتوری مشخص‌شده توسط پارامتر pathoverview در inn.conf ایجاد خواهد شد. برای اعمال این تغییرات، INN را مجدداً راه‌اندازی کنید (در صورت نیاز، پس از بازسازی داده‌های کلی موجود با makehistory).

این پارامترهای اضافی از فایل پیکربندی ovsqlite.conf خوانده می‌شوند:

اندازه حافظه نهان (cache) صفحه در حافظه SQLite به کیلوبایت برای دیمن نوشتن ovsqlite-server. مقدار پیش‌فرض به کتابخانه SQLite واگذار شده است و به نظر می‌رسد روی 2000 کیلوبایت ثابت باشد.
اگر INN با پشتیبانی از zlib کامپایل شده باشد و این پارامتر true باشد، ovsqlite رکوردهای کلی را در هر زمان که باعث صرفه‌جویی در فضا شود فشرده می‌کند. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی می‌شود. فعال کردن فشرده‌سازی حدود 55 % از فضای دیسک را در داده‌های کلی استاندارد صرفه‌جویی می‌کند. مقدار پیش‌فرض false است.
حداکثر تعداد بایت‌های فایل پایگاه داده که SQLite در حافظه نگاشت (memory-map) می‌کند. در صورت تنظیم، SQLite داده‌ها را مستقیماً از حافظه نهان صفحه سیستم‌عامل از طریق mmap می‌خواند، به جای اینکه آن را در حافظه نهان صفحه خود کپی کند؛ این ویژگی می‌تواند عملکرد خواندن را برای پایگاه‌های داده بزرگ به‌طور چشمگیری بهبود بخشد. هنگامی که walmode فعال باشد، فرایندهای خواننده nnrpd نیز این تنظیم را رعایت می‌کنند که علاوه بر این به آن‌ها اجازه می‌دهد صفحات حافظه فیزیکی مربوط به همان نواحی پایگاه داده را از طریق حافظه نهان صفحه سیستم‌عامل به اشتراک بگذارند. این کار در ZFS یا سایر سیستم‌هایی که فاقد حافظه نهان بافر یکپارچه هستند سود چندانی ندارد، چرا که صفحات نگاشت‌شده صرفاً دو بار کش می‌شوند. یک مقدار شروع مناسب، اندازه فایل پایگاه داده یا میزان حافظه در دسترس است، هر کدام که کمتر باشد. برای مثال، مقدار "4294967296" اجازه می‌دهد تا 4 گیگابایت در حافظه نگاشت شود. مقدار پیش‌فرض "0" ورودی/خروجی نگاشت‌شده در حافظه را غیرفعال می‌کند.
اگر این پارامتر true باشد، ovsqlite از حالت ژورنال WAL (Write-Ahead Logging) مربوط به SQLite به جای حالت پیش‌فرض PERSIST استفاده می‌کند. حالت WAL اجازه خواندن و نوشتن همزمان بدون مسدودسازی را می‌دهد، که عملکرد خواندن را هنگام دسترسی همزمان چندین فرایند nnrpd به پایگاه داده داده‌های کلی به‌طور چشمگیری بهبود می‌بخشد. همچنین پارامتر "synchronous" را روی "NORMAL" تنظیم می‌کند که با WAL امن است و بار اضافی ناشی از fsyncهای غیرضروری را کاهش می‌دهد.

هنگام خاموش شدن، ژورنال WAL به داخل فایل اصلی پایگاه داده منتقل (checkpoint) شده و کوتاه (truncate) می‌شود.

نکته: حالت WAL به پشتیبانی از حافظه مشترک (shared-memory) نیاز دارد و روی سیستم‌فایل‌های شبکه‌ای مانند NFS کار نمی‌کند. اگر pathoverview روی یک سیستم‌فایل شبکه‌ای قرار دارد، این پارامتر را فعال نکنید.

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

اندازه حافظه نهان صفحه در حافظه SQLite به کیلوبایت برای هر فرایند خواننده nnrpd. هنگامی که walmode فعال باشد، فرایندهای nnrpd پایگاه داده داده‌های کلی را مستقیماً برای دسترسی فقط‌خواندنی باز می‌کنند و دیمن ovsqlite-server را دور می‌زنند. این امر بار اضافی IPC را حذف کرده و اجازه می‌دهد عملکرد خواندن با تعداد فرایندهای خواننده مقیاس‌پذیر شود. هر فرایند nnrpd حافظه نهان خود را دریافت می‌کند، بنابراین این مقدار معمولاً باید کوچکتر یا مساوی با cachesize باشد. حافظه نهان فایل سیستم‌عامل (یا ARC در ZFS) به عنوان یک لایه دوم کش مشترک بین تمام خواننده‌ها عمل می‌کند.

حالت خواننده مستقیم فقط زمانی فعال می‌شود که walmode فعال باشد. بدون WAL، نویسنده‌ها قفل‌های انحصاری ایجاد می‌کنند که خواننده‌های مستقیم را در طول اعمال تغییرات (commits) مسدود می‌کند، بنابراین به جای آن از مسیر سرور استفاده می‌شود. مقدار پیش‌فرض "2000" (حدود 2 مگابایت) است.

تعداد صفحات WAL که در آن ovsqlite-server یک بررسی و تخلیه (checkpoint) اجباری را اعمال می‌کند. هنگامی که WAL فراتر از این تعداد صفحه رشد کند، سرور در طول دوره بیکاری بعدی خود یک checkpoint از نوع TRUNCATE را اجرا می‌کند و تا ۱۰ ثانیه منتظر می‌ماند تا خواننده‌ها پرس‌وجوهای فعلی خود را پیش از تخلیه محتوای WAL به فایل پایگاه داده به پایان برسانند. این کار از رشد بی‌رویه WAL جلوگیری می‌کند و وضعیت آن بدتر از مسیر غیر WAL نیست که در آن هر ثبت تراکنش یک قفل انحصاری می‌گیرد. اگر خواننده‌ها در محدوده مهلت زمانی کار را به پایان نرسانند، عملیات checkpoint نادیده گرفته شده و در چرخه بیکاری بعدی دوباره تلاش می‌شود.

این پارامتر تنها زمانی مؤثر است که walmode فعال باشد. مقدار پیش‌فرض "1000" است.

اندازه صفحه پایگاه داده SQLite به بایت. باید توانی از ۲ باشد، حداقل ۵۱۲ و حداکثر ۶۵۵۳۶. مقادیر مناسب شامل اندازه صفحه حافظه مجازی و اندازه بلوک تخصیص سیستم‌فایل است. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی می‌شود. مقدار پیش‌فرض به کتابخانه SQLite واگذار شده و در نسخه‌های مختلف متفاوت است.
حداکثر تعداد ردیف‌های مقاله‌ای که می‌توان در یک تراکنش واحد SQL درج یا حذف کرد. مقدار پیش‌فرض "10000" است.
حداکثر طول عمر تراکنش SQL به ثانیه. مقدار پیش‌فرض "10" است.

یک تراکنش به ازای هر transrowlimit مقاله یا هر transtimelimit ثانیه (هر کدام که زودتر فرا برسد) رخ می‌دهد. توصیه می‌شود مقدار پیش‌فرض را برای محدودیت ردیف‌ها حفظ کنید و در عوض، محدودیت زمانی را با توجه به تعداد مقالاتی که سرور اخبار شما معمولاً در هر ثانیه در طول عملیات عادی می‌پذیرد تنظیم نمایید (می‌توانید آمارهای مربوط به مقالات ورودی را در گزارش‌های روزانه Usenet خود بیابید). درج یا حذف یک ردیف پایگاه داده در یک تراکنش بسیار سریع است در حالی که ثبت یک تراکنش (commit) به ویژه در حافظه‌های ذخیره‌سازی چرخشی (هارد دیسک) کند است. تنظیم محدودیت‌های تراکنش روی مقادیر بیش از حد پایین منجر به افت کارایی می‌شود. هنگام بازسازی داده‌های کلی، ممکن است در سیستم‌هایی با پردازنده ضعیف یا ذخیره‌سازی چرخشی، افزایش موقت این مقادیر مفید باشد (برای مثال، ضرب مقادیر پیش‌فرض در ۱۰). عملکرد در سیستم‌های سریع تغییر چندانی نخواهد کرد.

عملیات نوشتن (دریافت مقالات، انقضا) از طریق دیمن ovsqlite-server انجام می‌شود. در حالت عادی، rc.news آن را به‌طور خودکار شروع و متوقف می‌کند. اگر می‌خواهید در حالی که innd در حال اجرا نیست به پایگاه داده داده‌های کلی دسترسی پیدا کنید، باید ابتدا ovsqlite-server را به‌طور دستی اجرا نمایید. به ovsqlite-server(8) مراجعه کنید.

هنگامی که walmode فعال باشد، فرایندهای خواننده nnrpd پایگاه داده داده‌های کلی را مستقیماً با دسترسی فقط‌خواندنی باز می‌کنند و ovsqlite-server را برای عملیات خواندن دور می‌زنند. این امر رفت‌وبرگشت IPC و تنگنای سریال‌سازی سرور را حذف کرده و اجازه می‌دهد عملکرد خواندن متناسب با تعداد خواننده‌های همزمان مقیاس‌پذیر شود.

پیاده‌سازی اولیه ovsqlite توسط بو لیندبرگ (Bo Lindbergh) <2bfjdsla52kztwejndzdstsxl9athp@gmail.com> برای InterNetNews نوشته شده است.

INN::ovsqlite_client(3pm), inn.conf(5), makehistory(8), ovsqlite-server(8), ovsqlite-util(8), rc.news(8).

2026-06-12 INN 2.7.4