بخش اول: مفاهیم پایه، معماری و Kafka Core
بخش دوم : سایر بازیگران اکوسیستم کافکا
بخش سوم ابزارهای جانبی کافکا : کانکت و رجیستری
بخش چهارم : پردازش جریان در عمل
بخش پنجم :‌ مباحث مدیریتی و تکمیلی

تنظیمات کلیدی تاپیک‌ها و سیاست‌های نگهداری داده‌ها

هر تاپیک در Kafka دارای تنظیماتی است که رفتار آن را کنترل می‌کند:

دسته‌بندینمونه تنظیماتکاربرد
تعداد پارتیشن و تکثیرnum.partitions, replication.factorموازی‌سازی و تحمل خطا
نگهداری / پاکسازیlog.retention.ms, log.retention.bytes, cleanup.policyمدت زمان و حجم نگهداری لاگ‌ها؛ حذف یا فشرده‌سازی
مدیریت فایل و سگمنت‌هاlog.segment.bytes, log.segment.msزمان چرخش لاگ‌ها
اندازه پیام و فشرده‌سازیmax.message.bytes, compression.typeمحدودیت اندازه پیام و صرفه‌جویی در ذخیره‌سازی
ایندکس‌هاindex.interval.bytesجزئیات ایندکس آفست
انتخاب رهبر / ISRmin.insync.replicasتعداد رپلکاهایی که باید نوشتن را تایید کنند تا عملیات موفق باشد (توجه: فقط وقتی acks=all فعال است کاربرد دارد)

مشاهده تنظیمات تاپیک

برای مشاهده تنظیمات یک تاپیک (مثلاً users):

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users --describe

نمونه خروجی:

Topic: users  PartitionCount: 4  ReplicationFactor: 1  Configs: segment.bytes=1073741824, retention.ms=604800000

تغییر تنظیمات تاپیک

تغییر زمان نگهداری

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users \
  --alter --add-config retention.ms=3600000
  • نگهداری را روی ۱ ساعت (۳۶۰۰۰۰۰ میلی‌ثانیه) تنظیم می‌کند
  • Kafka به‌طور خودکار سگمنت‌های قدیمی‌تر از این زمان را حذف می‌کند

تغییر اندازه سگمنت‌ها

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users \
  --alter --add-config log.segment.bytes=10485760
  • سگمنت‌های ۱۰ مگابایتی → فایل‌های کوچکتر و چرخش سریع‌تر
  • مفید برای فشرده‌سازی یا تست حذف سریع لاگ‌ها

فعال کردن فشرده‌سازی لاگ (Log Compaction)

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users \
  --alter --add-config cleanup.policy=compact
  • فقط برای تاپیک‌های Keyed کاربرد دارد
  • Kafka تنها آخرین پیام برای هر کلید را نگه می‌دارد
  • مفید برای تاپیک‌هایی مانند پروفایل کاربر یا وضعیت حساب‌ها

تغییر min.insync.replicas برای دوام داده‌ها

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users \
  --alter --add-config min.insync.replicas=2
  • تضمین می‌کند حداقل ۲ رپلکا قبل از موفقیت نوشتن، تایید کنند
  • فقط زمانی کاربرد دارد که acks=all فعال باشد
  • نیازمند replication-factor ≥ ۲ است
  • از دست رفتن داده هنگام شکست رهبر را کاهش می‌دهد

فعال کردن فشرده‌سازی پیام‌ها

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users \
  --alter --add-config compression.type=snappy
  • گزینه‌های دیگر: gzip, lz4, zstd
  • مصرف دیسک و ترافیک شبکه را کاهش می‌دهد

ایجاد تاپیک با تنظیمات سفارشی

kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic users-tuned \
  --partitions 4 --replication-factor 2 \
  --config cleanup.policy=compact \
  --config min.insync.replicas=2 \
  --config log.retention.ms=86400000 \
  --config log.segment.bytes=10485760 \
  --config compression.type=snappy
  • تاپیک آماده برای محیط تولید با تنظیمات بهینه

بازنشانی یا حذف تنظیمات

برای بازگرداندن یک تنظیم به مقدار پیش‌فرض:

kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name users-tuned \
  --alter --delete-config retention.ms

سیاست‌های پاکسازی (cleanup.policy)

مقدارمعنیمثال کاربرد
deleteحذف سگمنت‌های قدیمی بر اساس retentionبیشتر تاپیک‌های event log و استریم
compactنگه داشتن تنها آخرین پیام هر کلیدتاپیک‌هایی با latest state per key
delete,compactترکیب حذف و فشرده‌سازیوقتی می‌خواهید هم حالت state و هم retention داشته باشید

حذف لاگ (Delete)

  • توسط log.retention.ms یا log.retention.bytes کنترل می‌شود
  • توسط Log Retention Thread هر log.retention.check.interval.ms بررسی می‌شود

فشرده‌سازی لاگ (Compaction)

  • کلید محور و توسط Log Cleaner Threads انجام می‌شود
  • تنظیمات مهم:
پارامترتوضیحمقدار پیش‌فرض
log.cleaner.enableفعال کردن کامپکتینگ پس‌زمینهtrue
log.cleaner.threadsتعداد نخ‌های کامپکت۱
log.cleaner.backoff.msزمان خواب بین اجرای کامپکت۱۵۰۰۰ ms
log.cleaner.min.cleanable.ratioحداقل نسبت داده قدیمی برای شروع کامپکت۰.۵
log.cleaner.delete.retention.msزمان نگهداری tombstone ها قبل از حذف۸۶۴۰۰۰۰۰ ms

نکات عملی

  • delete برای اکثر تاپیک‌ها پیش‌فرض است
  • compact فقط برای پیام‌های Keyed کار می‌کند
  • delete,compact نادر است اما برای state-store topics کاربرد دارد
  • سگمنت‌ها باید بچرخند (log.segment.bytes یا log.segment.ms) تا کامپکت اجرا شود

محدوده log.retention.bytes

  • اعمال به هر پارتیشن به صورت جداگانه
  • وقتی مجموع سایز سگمنت‌های یک پارتیشن از حد مجاز عبور کند، سگمنت‌های قدیمی حذف می‌شوند
  • سگمنت‌های جداگانه توسط log.segment.bytes کنترل می‌شوند
  • مجموع کل تاپیک = تعداد پارتیشن × مقدار تنظیم شده

جدول خلاصه

ویژگیمحدودهتاثیربازه معمول
log.segment.bytesهر پارتیشنزمان ایجاد سگمنت جدید100MB – 1GB
log.retention.bytesهر پارتیشنحذف سگمنت‌های قدیمی1GB – 100GB
log.retention.msهر پارتیشنحذف بر اساس زمانساعت تا هفته

حتماً! در محیط تولید، باید مقادیر به گونه‌ای انتخاب شوند که تعادل بین دوام داده، کارایی و مصرف دیسک/شبکه برقرار باشد. جدول زیر پیشنهادات عملی برای تنظیمات مهم تاپیک‌ها در محیط واقعی است:


تنظیمات پیشنهادی تاپیک Kafka برای محیط تولید

ویژگیمقدار پیشنهادیتوضیح / دلیل
num.partitions۴ – ۱۲ (یا بیشتر بسته به حجم)تعداد پارتیشن‌ها تعیین‌کننده موازی‌سازی مصرف و تولید است. برای تاپیک‌های با حجم بالا تعداد بیشتر پیشنهاد می‌شود.
replication.factor۳برای تحمل خطا و حفظ داده، حداقل ۳ رپلکا توصیه می‌شود.
min.insync.replicas۲ (زمانی که acks=all)تضمین می‌کند که حداقل ۲ رپلکا نوشتن را تایید کنند. فقط وقتی acks=all فعال است کاربرد دارد.
cleanup.policydelete یا compact یا delete,compactdelete: برای event logها- compact: برای وضعیت آخرین پیام هر کلید (مثل پروفایل کاربر)- delete,compact: ترکیبی برای حالت‌های هیبرید
log.retention.ms۷ روز – ۳۰ روزبرای تاپیک‌های event stream; بر اساس نیاز کسب‌وکار و ظرفیت دیسک تنظیم می‌شود.
log.retention.bytes50GB – 500GB پارتیشنمحدودیت حجمی برای هر پارتیشن، جلوگیری از پر شدن دیسک.
log.segment.bytes1GB – 5GBاندازه هر سگمنت قبل از چرخش، تعادل بین تعداد فایل‌ها و سرعت چرخش.
log.segment.ms۱ ساعت – ۱ روزمی‌توان برای مدیریت چرخش زمان‌محور استفاده کرد.
max.message.bytes1MB – 10MBحداکثر اندازه پیام، باید متناسب با حجم پیام‌های واقعی باشد.
compression.typelz4 یا snappyفشرده‌سازی سریع و کم هزینه CPU برای کاهش مصرف دیسک و شبکه.
log.retention.check.interval.ms۵ دقیقه (۳۰۰۰۰۰ ms)فاصله بررسی برای حذف سگمنت‌های قدیمی، تنظیم پیش‌فرض معمول.
log.cleaner.enabletrueفعال کردن کامپکتینگ اگر از cleanup.policy=compact استفاده می‌کنید.
log.cleaner.threads۱ – ۴تعداد نخ‌های کامپکت، بسته به حجم داده و تعداد پارتیشن‌ها.
log.cleaner.backoff.ms۱۵۰۰۰ – ۶۰۰۰۰فاصله زمانی بین هر اجرای کامپکت برای کاهش فشار روی Broker.
log.cleaner.min.cleanable.ratio۰.۵ – ۰.۷حداقل نسبت داده قدیمی قبل از شروع کامپکت.

💡 نکات عملی:

  1. Replication و min.insync.replicas
    • اگر replication-factor=3 و min.insync.replicas=2، حتی با از دست رفتن یک Broker داده‌ها ایمن می‌مانند.
    • فقط وقتی acks=all فعال باشد، min.insync.replicas اعمال می‌شود.
  2. سگمنت‌ها و retention
    • اندازه سگمنت‌ها کوچک → چرخش سریع‌تر و پاکسازی سریع‌تر، ولی تعداد فایل بیشتر
    • retention بر اساس زمان یا حجم → دیسک را کنترل می‌کند
  3. Compression
    • lz4 سریع و بهینه برای بیشتر موارد
    • snappy نیز خوب است، کمی فشرده‌سازی کمتر ولی CPU کمتر مصرف می‌کند
  4. Compaction
    • برای داده‌های وضعیت آخرین پیام (state) استفاده می‌شود
    • حتما log.segment.bytes مناسب باشد تا عملیات کامپکت اجرا شود

فروشگاه
جستجو
دوره ها

لطفا کلمات کلیدی را وارد کنید