| OVSQLITE(5) | InterNetNews Documentation | OVSQLITE(5) |
نام (NAME)
ovsqlite - روش ذخیرهسازی دادههای کلی مبتنی بر SQLite برای INN
توضیحات (DESCRIPTION)
این روش از 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") ارائه میشود که امکان دسترسی و دستکاری اطلاعات کلی را فراهم میکنند. برای جزئیات بیشتر درباره امکانات آنها، به صفحات راهنمای مربوطه مراجعه کنید.
نصب (INSTALLATION)
اسکریپت پیکربندی (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) نیاز خواهید داشت.
پیکربندی (CONFIGURATION)
برای انتخاب ovsqlite به عنوان روش نمای کلی خود، پارامتر ovmethod را در inn.conf روی "ovsqlite" تنظیم کنید. فایل پایگاه داده در دایرکتوری مشخصشده توسط پارامتر pathoverview در inn.conf ایجاد خواهد شد. برای اعمال این تغییرات، INN را مجدداً راهاندازی کنید (در صورت نیاز، پس از بازسازی دادههای کلی موجود با makehistory).
این پارامترهای اضافی از فایل پیکربندی ovsqlite.conf خوانده میشوند:
- cachesize
- اندازه حافظه نهان (cache) صفحه در حافظه SQLite به کیلوبایت برای دیمن نوشتن ovsqlite-server. مقدار پیشفرض به کتابخانه SQLite واگذار شده است و به نظر میرسد روی 2000 کیلوبایت ثابت باشد.
- compress
- اگر INN با پشتیبانی از zlib کامپایل شده باشد و این پارامتر true باشد، ovsqlite رکوردهای کلی را در هر زمان که باعث صرفهجویی در فضا شود فشرده میکند. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی میشود. فعال کردن فشردهسازی حدود 55 % از فضای دیسک را در دادههای کلی استاندارد صرفهجویی میکند. مقدار پیشفرض false است.
- mmapsize
- حداکثر تعداد بایتهای فایل پایگاه داده که SQLite در حافظه نگاشت (memory-map) میکند. در صورت تنظیم، SQLite دادهها را مستقیماً از حافظه نهان صفحه سیستمعامل از طریق mmap میخواند، به جای اینکه آن را در حافظه نهان صفحه خود کپی کند؛ این ویژگی میتواند عملکرد خواندن را برای پایگاههای داده بزرگ بهطور چشمگیری بهبود بخشد. هنگامی که walmode فعال باشد، فرایندهای خواننده nnrpd نیز این تنظیم را رعایت میکنند که علاوه بر این به آنها اجازه میدهد صفحات حافظه فیزیکی مربوط به همان نواحی پایگاه داده را از طریق حافظه نهان صفحه سیستمعامل به اشتراک بگذارند. این کار در ZFS یا سایر سیستمهایی که فاقد حافظه نهان بافر یکپارچه هستند سود چندانی ندارد، چرا که صفحات نگاشتشده صرفاً دو بار کش میشوند. یک مقدار شروع مناسب، اندازه فایل پایگاه داده یا میزان حافظه در دسترس است، هر کدام که کمتر باشد. برای مثال، مقدار "4294967296" اجازه میدهد تا 4 گیگابایت در حافظه نگاشت شود. مقدار پیشفرض "0" ورودی/خروجی نگاشتشده در حافظه را غیرفعال میکند.
- walmode
- اگر این
پارامتر true
باشد، ovsqlite از
حالت
ژورنال WAL (Write-Ahead Logging)
مربوط به SQLite
به جای حالت
پیشفرض PERSIST
استفاده
میکند.
حالت WAL
اجازه
خواندن و
نوشتن
همزمان
بدون
مسدودسازی
را میدهد،
که عملکرد
خواندن را
هنگام
دسترسی
همزمان
چندین
فرایند nnrpd
به پایگاه
داده
دادههای
کلی بهطور
چشمگیری
بهبود
میبخشد.
همچنین
پارامتر
"synchronous" را
روی "NORMAL"
تنظیم
میکند که
با WAL امن است
و بار اضافی
ناشی از
fsyncهای
غیرضروری
را کاهش
میدهد.
هنگام خاموش شدن، ژورنال WAL به داخل فایل اصلی پایگاه داده منتقل (checkpoint) شده و کوتاه (truncate) میشود.
نکته: حالت WAL به پشتیبانی از حافظه مشترک (shared-memory) نیاز دارد و روی سیستمفایلهای شبکهای مانند NFS کار نمیکند. اگر pathoverview روی یک سیستمفایل شبکهای قرار دارد، این پارامتر را فعال نکنید.
مقدار پیشفرض false است.
- readercachesize
- اندازه
حافظه نهان
صفحه در
حافظه SQLite به
کیلوبایت
برای هر
فرایند
خواننده nnrpd.
هنگامی که
walmode فعال
باشد،
فرایندهای
nnrpd پایگاه
داده
دادههای
کلی را
مستقیماً
برای
دسترسی
فقطخواندنی
باز
میکنند و
دیمن ovsqlite-server را
دور
میزنند.
این امر بار
اضافی IPC را
حذف کرده و
اجازه
میدهد
عملکرد
خواندن با
تعداد
فرایندهای
خواننده
مقیاسپذیر
شود. هر
فرایند nnrpd
حافظه نهان
خود را
دریافت
میکند،
بنابراین
این مقدار
معمولاً
باید
کوچکتر یا
مساوی با cachesize
باشد. حافظه
نهان فایل
سیستمعامل
(یا ARC در ZFS) به
عنوان یک
لایه دوم کش
مشترک بین
تمام
خوانندهها
عمل میکند.
حالت خواننده مستقیم فقط زمانی فعال میشود که walmode فعال باشد. بدون WAL، نویسندهها قفلهای انحصاری ایجاد میکنند که خوانندههای مستقیم را در طول اعمال تغییرات (commits) مسدود میکند، بنابراین به جای آن از مسیر سرور استفاده میشود. مقدار پیشفرض "2000" (حدود 2 مگابایت) است.
- walcheckpointthreshold
- تعداد
صفحات WAL که
در آن ovsqlite-server یک
بررسی و
تخلیه (checkpoint)
اجباری را
اعمال
میکند.
هنگامی که WAL
فراتر از
این تعداد
صفحه رشد
کند، سرور
در طول دوره
بیکاری
بعدی خود یک
checkpoint از نوع TRUNCATE
را اجرا
میکند و تا
۱۰ ثانیه
منتظر
میماند تا
خوانندهها
پرسوجوهای
فعلی خود را
پیش از
تخلیه
محتوای WAL به
فایل
پایگاه
داده به
پایان
برسانند.
این کار از
رشد
بیرویه WAL
جلوگیری
میکند و
وضعیت آن
بدتر از
مسیر غیر WAL
نیست که در
آن هر ثبت
تراکنش یک
قفل
انحصاری
میگیرد.
اگر
خوانندهها
در محدوده
مهلت زمانی
کار را به
پایان
نرسانند،
عملیات checkpoint
نادیده
گرفته شده و
در چرخه
بیکاری
بعدی
دوباره
تلاش
میشود.
این پارامتر تنها زمانی مؤثر است که walmode فعال باشد. مقدار پیشفرض "1000" است.
- pagesize
- اندازه صفحه پایگاه داده SQLite به بایت. باید توانی از ۲ باشد، حداقل ۵۱۲ و حداکثر ۶۵۵۳۶. مقادیر مناسب شامل اندازه صفحه حافظه مجازی و اندازه بلوک تخصیص سیستمفایل است. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی میشود. مقدار پیشفرض به کتابخانه SQLite واگذار شده و در نسخههای مختلف متفاوت است.
- transrowlimit
- حداکثر تعداد ردیفهای مقالهای که میتوان در یک تراکنش واحد SQL درج یا حذف کرد. مقدار پیشفرض "10000" است.
- transtimelimit
- حداکثر طول عمر تراکنش SQL به ثانیه. مقدار پیشفرض "10" است.
یک تراکنش به ازای هر transrowlimit مقاله یا هر transtimelimit ثانیه (هر کدام که زودتر فرا برسد) رخ میدهد. توصیه میشود مقدار پیشفرض را برای محدودیت ردیفها حفظ کنید و در عوض، محدودیت زمانی را با توجه به تعداد مقالاتی که سرور اخبار شما معمولاً در هر ثانیه در طول عملیات عادی میپذیرد تنظیم نمایید (میتوانید آمارهای مربوط به مقالات ورودی را در گزارشهای روزانه Usenet خود بیابید). درج یا حذف یک ردیف پایگاه داده در یک تراکنش بسیار سریع است در حالی که ثبت یک تراکنش (commit) به ویژه در حافظههای ذخیرهسازی چرخشی (هارد دیسک) کند است. تنظیم محدودیتهای تراکنش روی مقادیر بیش از حد پایین منجر به افت کارایی میشود. هنگام بازسازی دادههای کلی، ممکن است در سیستمهایی با پردازنده ضعیف یا ذخیرهسازی چرخشی، افزایش موقت این مقادیر مفید باشد (برای مثال، ضرب مقادیر پیشفرض در ۱۰). عملکرد در سیستمهای سریع تغییر چندانی نخواهد کرد.
اجرا (RUNNING)
عملیات نوشتن (دریافت مقالات، انقضا) از طریق دیمن ovsqlite-server انجام میشود. در حالت عادی، rc.news آن را بهطور خودکار شروع و متوقف میکند. اگر میخواهید در حالی که innd در حال اجرا نیست به پایگاه داده دادههای کلی دسترسی پیدا کنید، باید ابتدا ovsqlite-server را بهطور دستی اجرا نمایید. به ovsqlite-server(8) مراجعه کنید.
هنگامی که walmode فعال باشد، فرایندهای خواننده nnrpd پایگاه داده دادههای کلی را مستقیماً با دسترسی فقطخواندنی باز میکنند و ovsqlite-server را برای عملیات خواندن دور میزنند. این امر رفتوبرگشت IPC و تنگنای سریالسازی سرور را حذف کرده و اجازه میدهد عملکرد خواندن متناسب با تعداد خوانندههای همزمان مقیاسپذیر شود.
تاریخچه (HISTORY)
پیادهسازی اولیه ovsqlite توسط بو لیندبرگ (Bo Lindbergh) <2bfjdsla52kztwejndzdstsxl9athp@gmail.com> برای InterNetNews نوشته شده است.
همچنین ببینید (SEE ALSO)
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 |