.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man 5.0102 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "OVSQLITE 5" .TH OVSQLITE 5 2026-06-12 "INN 2.7.4" "InterNetNews Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" ovsqlite \- روش ذخیره‌سازی داده‌های کلی مبتنی بر SQLite برای INN .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" این روش از SQLite برای ذخیره‌سازی داده‌های کلی (overview) استفاده می‌کند. این روش به نسخه 3.8.2 یا جدیدتر کتابخانه SQLite نیاز دارد (نسخه +3.20.0 توصیه می‌شود). .PP کد منبع، مستندات و موارد دیگر SQLite در در دسترس است. یکی از اهداف اعلام‌شده قالب فایل SQLite، پایداری و سازگاری طولانی‌مدت است، که این روش ذخیره‌سازی را به انتخابی عالی برای ذخیره داده‌های کلی تبدیل می‌کند. .PP در حال حاضر تنها یک نسخه از پروتکل روش ذخیره‌سازی ovsqlite وجود دارد که از نسخه INN\ 2.7.0 پیاده‌سازی شده است. .PP این روش به همراه یک ابزار کمکی (\fBovsqlite-util\fR) و یک ماژول پرل (\f(CW\*(C`INN::ovsqlite_client\*(C'\fR) ارائه می‌شود که امکان دسترسی و دستکاری اطلاعات کلی را فراهم می‌کنند. برای جزئیات بیشتر درباره امکانات آن‌ها، به صفحات راهنمای مربوطه مراجعه کنید. .SH "نصب (INSTALLATION)" .IX Header "INSTALLATION" اسکریپت پیکربندی (configure) در صورت یافتن کتابخانه SQLite، پشتیبانی از ovsqlite را به‌طور خودکار فعال می‌کند. اگر کتابخانه در یک مکان استاندارد نصب نشده باشد، ممکن است لازم باشد گزینه \fB\-\-with\-sqlite3\fR را مشخص کنید تا configure در یافتن آن کمک شود. برای موارد پیچیده‌تر، می‌توانید از گزینه‌های جداگانه \&\fB\-\-with\-sqlite3\-include\fR و \fB\-\-with\-sqlite3\-lib\fR استفاده کنید. در نهایت، اگر با وجود نصب بودن کتابخانه SQLite روی سیستم، پشتیبانی از ovsqlite را \fIنمی‌خواهید\fR، می‌توانید از گزینه \fB\-\-without\-sqlite3\fR استفاده کنید. .PP اگر توزیع لینوکس جدیدی دارید، SQLite به احتمال زیاد از قبل نصب شده است. ممکن است برای دریافت فایل‌های سرآیند (header) مورد نیاز، لازم باشد بسته‌ای جداگانه با نامی شبیه به \f(CW\*(C`libsqlite3\-dev\*(C'\fR را نصب کنید. .PP برای هر مقاله در مخزن مقالات (spool) خود (بدون احتساب ارسال‌های متقاطع یا crosspostها)، حداقل 0.93\ کیلوبایت فضا در نظر بگیرید. بنابراین، اگر ۵ میلیون مقاله دارید، حداقل به 4.65\ گیگابایت فضای دیسک برای ovsqlite نیاز خواهید داشت. با فعال بودن فشرده‌سازی، این تخمین به 0.4\ کیلوبایت به ازای هر مقاله تغییر می‌کند، بنابراین برای ۵ میلیون مقاله حداقل به 2\ گیگابایت فضای دیسک نیاز خواهید داشت. علاوه بر این، به فضای اضافی برای گزارش‌های تراکنش (چند مگابایت، یا به‌طور موقت تا چند صد مگابایت در صورت فعال بودن \fIwalmode\fR) نیاز خواهید داشت. .SH "پیکربندی (CONFIGURATION)" .IX Header "CONFIGURATION" برای انتخاب ovsqlite به عنوان روش نمای کلی خود، پارامتر \fIovmethod\fR را در \fIinn.conf\fR روی \f(CW\*(C`ovsqlite\*(C'\fR تنظیم کنید. فایل پایگاه داده در دایرکتوری مشخص‌شده توسط پارامتر \fIpathoverview\fR در \fIinn.conf\fR ایجاد خواهد شد. برای اعمال این تغییرات، INN را مجدداً راه‌اندازی کنید (در صورت نیاز، پس از بازسازی داده‌های کلی موجود با \fBmakehistory\fR). .PP این پارامترهای اضافی از فایل پیکربندی \fIovsqlite.conf\fR خوانده می‌شوند: .IP \fIcachesize\fR 4 .IX Item "cachesize" اندازه حافظه نهان (cache) صفحه در حافظه SQLite به کیلوبایت برای دیمن نوشتن \fBovsqlite-server\fR. مقدار پیش‌فرض به کتابخانه SQLite واگذار شده است و به نظر می‌رسد روی 2000\ کیلوبایت ثابت باشد. .IP \fIcompress\fR 4 .IX Item "compress" اگر INN با پشتیبانی از zlib کامپایل شده باشد و این پارامتر true باشد، ovsqlite رکوردهای کلی را در هر زمان که باعث صرفه‌جویی در فضا شود فشرده می‌کند. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی می‌شود. فعال کردن فشرده‌سازی حدود 55\ % از فضای دیسک را در داده‌های کلی استاندارد صرفه‌جویی می‌کند. مقدار پیش‌فرض false است. .IP \fImmapsize\fR 4 .IX Item "mmapsize" حداکثر تعداد بایت‌های فایل پایگاه داده که SQLite در حافظه نگاشت (memory-map) می‌کند. در صورت تنظیم، SQLite داده‌ها را مستقیماً از حافظه نهان صفحه سیستم‌عامل از طریق mmap می‌خواند، به جای اینکه آن را در حافظه نهان صفحه خود کپی کند؛ این ویژگی می‌تواند عملکرد خواندن را برای پایگاه‌های داده بزرگ به‌طور چشمگیری بهبود بخشد. هنگامی که \fIwalmode\fR فعال باشد، فرایندهای خواننده \fBnnrpd\fR نیز این تنظیم را رعایت می‌کنند که علاوه بر این به آن‌ها اجازه می‌دهد صفحات حافظه فیزیکی مربوط به همان نواحی پایگاه داده را از طریق حافظه نهان صفحه سیستم‌عامل به اشتراک بگذارند. این کار در ZFS یا سایر سیستم‌هایی که فاقد حافظه نهان بافر یکپارچه هستند سود چندانی ندارد، چرا که صفحات نگاشت‌شده صرفاً دو بار کش می‌شوند. یک مقدار شروع مناسب، اندازه فایل پایگاه داده یا میزان حافظه در دسترس است، هر کدام که کمتر باشد. برای مثال، مقدار \f(CW\*(C`4294967296\*(C'\fR اجازه می‌دهد تا 4\ گیگابایت در حافظه نگاشت شود. مقدار پیش‌فرض \f(CW\*(C`0\*(C'\fR ورودی/خروجی نگاشت‌شده در حافظه را غیرفعال می‌کند. .IP \fIwalmode\fR 4 .IX Item "walmode" اگر این پارامتر true باشد، ovsqlite از حالت ژورنال WAL (Write-Ahead Logging) مربوط به SQLite به جای حالت پیش‌فرض PERSIST استفاده می‌کند. حالت WAL اجازه خواندن و نوشتن همزمان بدون مسدودسازی را می‌دهد، که عملکرد خواندن را هنگام دسترسی همزمان چندین فرایند \fBnnrpd\fR به پایگاه داده داده‌های کلی به‌طور چشمگیری بهبود می‌بخشد. همچنین پارامتر \f(CW\*(C`synchronous\*(C'\fR را روی \&\f(CW\*(C`NORMAL\*(C'\fR تنظیم می‌کند که با WAL امن است و بار اضافی ناشی از fsyncهای غیرضروری را کاهش می‌دهد. .Sp هنگام خاموش شدن، ژورنال WAL به داخل فایل اصلی پایگاه داده منتقل (checkpoint) شده و کوتاه (truncate) می‌شود. .Sp \&\fBنکته:\fR حالت WAL به پشتیبانی از حافظه مشترک (shared-memory) نیاز دارد و روی سیستم‌فایل‌های شبکه‌ای مانند NFS کار نمی‌کند. اگر \&\fIpathoverview\fR روی یک سیستم‌فایل شبکه‌ای قرار دارد، این پارامتر را فعال نکنید. .Sp مقدار پیش‌فرض false است. .IP \fIreadercachesize\fR 4 .IX Item "readercachesize" اندازه حافظه نهان صفحه در حافظه SQLite به کیلوبایت برای هر فرایند خواننده \fBnnrpd\fR. هنگامی که \fIwalmode\fR فعال باشد، فرایندهای \fBnnrpd\fR پایگاه داده داده‌های کلی را مستقیماً برای دسترسی فقط‌خواندنی باز می‌کنند و دیمن \fBovsqlite-server\fR را دور می‌زنند. این امر بار اضافی IPC را حذف کرده و اجازه می‌دهد عملکرد خواندن با تعداد فرایندهای خواننده مقیاس‌پذیر شود. هر فرایند \fBnnrpd\fR حافظه نهان خود را دریافت می‌کند، بنابراین این مقدار معمولاً باید کوچکتر یا مساوی با \fIcachesize\fR باشد. حافظه نهان فایل سیستم‌عامل (یا ARC در ZFS) به عنوان یک لایه دوم کش مشترک بین تمام خواننده‌ها عمل می‌کند. .Sp حالت خواننده مستقیم فقط زمانی فعال می‌شود که \fIwalmode\fR فعال باشد. بدون WAL، نویسنده‌ها قفل‌های انحصاری ایجاد می‌کنند که خواننده‌های مستقیم را در طول اعمال تغییرات (commits) مسدود می‌کند، بنابراین به جای آن از مسیر سرور استفاده می‌شود. مقدار پیش‌فرض \f(CW\*(C`2000\*(C'\fR (حدود 2\ مگابایت) است. .IP \fIwalcheckpointthreshold\fR 4 .IX Item "walcheckpointthreshold" تعداد صفحات WAL که در آن \fBovsqlite-server\fR یک بررسی و تخلیه (checkpoint) اجباری را اعمال می‌کند. هنگامی که WAL فراتر از این تعداد صفحه رشد کند، سرور در طول دوره بیکاری بعدی خود یک checkpoint از نوع TRUNCATE را اجرا می‌کند و تا ۱۰ ثانیه منتظر می‌ماند تا خواننده‌ها پرس‌وجوهای فعلی خود را پیش از تخلیه محتوای WAL به فایل پایگاه داده به پایان برسانند. این کار از رشد بی‌رویه WAL جلوگیری می‌کند و وضعیت آن بدتر از مسیر غیر WAL نیست که در آن هر ثبت تراکنش یک قفل انحصاری می‌گیرد. اگر خواننده‌ها در محدوده مهلت زمانی کار را به پایان نرسانند، عملیات checkpoint نادیده گرفته شده و در چرخه بیکاری بعدی دوباره تلاش می‌شود. .Sp این پارامتر تنها زمانی مؤثر است که \fIwalmode\fR فعال باشد. مقدار پیش‌فرض \f(CW\*(C`1000\*(C'\fR است. .IP \fIpagesize\fR 4 .IX Item "pagesize" اندازه صفحه پایگاه داده SQLite به بایت. باید توانی از ۲ باشد، حداقل ۵۱۲ و حداکثر ۶۵۵۳۶. مقادیر مناسب شامل اندازه صفحه حافظه مجازی و اندازه بلوک تخصیص سیستم‌فایل است. این پارامتر تنها هنگام ایجاد یک پایگاه داده جدید بررسی می‌شود. مقدار پیش‌فرض به کتابخانه SQLite واگذار شده و در نسخه‌های مختلف متفاوت است. .IP \fItransrowlimit\fR 4 .IX Item "transrowlimit" حداکثر تعداد ردیف‌های مقاله‌ای که می‌توان در یک تراکنش واحد SQL درج یا حذف کرد. مقدار پیش‌فرض \f(CW\*(C`10000\*(C'\fR است. .IP \fItranstimelimit\fR 4 .IX Item "transtimelimit" حداکثر طول عمر تراکنش SQL به ثانیه. مقدار پیش‌فرض \&\f(CW\*(C`10\*(C'\fR است. .PP یک تراکنش به ازای هر \fItransrowlimit\fR مقاله یا هر \fItranstimelimit\fR ثانیه (هر کدام که زودتر فرا برسد) رخ می‌دهد. توصیه می‌شود مقدار پیش‌فرض را برای محدودیت ردیف‌ها حفظ کنید و در عوض، محدودیت زمانی را با توجه به تعداد مقالاتی که سرور اخبار شما معمولاً در هر ثانیه در طول عملیات عادی می‌پذیرد تنظیم نمایید (می‌توانید آمارهای مربوط به مقالات ورودی را در گزارش‌های روزانه Usenet خود بیابید). درج یا حذف یک ردیف پایگاه داده در یک تراکنش بسیار سریع است در حالی که ثبت یک تراکنش (commit) به ویژه در حافظه‌های ذخیره‌سازی چرخشی (هارد دیسک) کند است. تنظیم محدودیت‌های تراکنش روی مقادیر بیش از حد پایین منجر به افت کارایی می‌شود. هنگام بازسازی داده‌های کلی، ممکن است در سیستم‌هایی با پردازنده ضعیف یا ذخیره‌سازی چرخشی، افزایش موقت این مقادیر مفید باشد (برای مثال، ضرب مقادیر پیش‌فرض در ۱۰). عملکرد در سیستم‌های سریع تغییر چندانی نخواهد کرد. .SH "اجرا (RUNNING)" .IX Header "RUNNING" عملیات نوشتن (دریافت مقالات، انقضا) از طریق دیمن \&\fBovsqlite-server\fR انجام می‌شود. در حالت عادی، \fBrc.news\fR آن را به‌طور خودکار شروع و متوقف می‌کند. اگر می‌خواهید در حالی که \&\fBinnd\fR در حال اجرا نیست به پایگاه داده داده‌های کلی دسترسی پیدا کنید، باید ابتدا \fBovsqlite-server\fR را به‌طور دستی اجرا نمایید. به ovsqlite\-server(8) مراجعه کنید. .PP هنگامی که \fIwalmode\fR فعال باشد، فرایندهای خواننده \fBnnrpd\fR پایگاه داده داده‌های کلی را مستقیماً با دسترسی فقط‌خواندنی باز می‌کنند و \fBovsqlite-server\fR را برای عملیات خواندن دور می‌زنند. این امر رفت‌وبرگشت IPC و تنگنای سریال‌سازی سرور را حذف کرده و اجازه می‌دهد عملکرد خواندن متناسب با تعداد خواننده‌های همزمان مقیاس‌پذیر شود. .SH "تاریخچه (HISTORY)" .IX Header "HISTORY" پیاده‌سازی اولیه ovsqlite توسط بو لیندبرگ (Bo Lindbergh) <2bfjdsla52kztwejndzdstsxl9athp@gmail.com> برای InterNetNews نوشته شده است. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" INN::ovsqlite_client(3pm), inn.conf(5), makehistory(8), ovsqlite\-server(8), ovsqlite\-util(8), rc.news(8).