هر تاپیک در 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 | جزئیات ایندکس آفست |
| انتخاب رهبر / ISR | min.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-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
تغییر 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, zstdkafka-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 داشته باشید |
log.retention.ms یا log.retention.bytes کنترل میشودlog.retention.check.interval.ms بررسی میشود| پارامتر | توضیح | مقدار پیشفرض |
|---|---|---|
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.byteslog.segment.bytes کنترل میشوند| ویژگی | محدوده | تاثیر | بازه معمول |
|---|---|---|---|
log.segment.bytes | هر پارتیشن | زمان ایجاد سگمنت جدید | 100MB – 1GB |
log.retention.bytes | هر پارتیشن | حذف سگمنتهای قدیمی | 1GB – 100GB |
log.retention.ms | هر پارتیشن | حذف بر اساس زمان | ساعت تا هفته |
حتماً! در محیط تولید، باید مقادیر به گونهای انتخاب شوند که تعادل بین دوام داده، کارایی و مصرف دیسک/شبکه برقرار باشد. جدول زیر پیشنهادات عملی برای تنظیمات مهم تاپیکها در محیط واقعی است:
| ویژگی | مقدار پیشنهادی | توضیح / دلیل |
|---|---|---|
| num.partitions | ۴ – ۱۲ (یا بیشتر بسته به حجم) | تعداد پارتیشنها تعیینکننده موازیسازی مصرف و تولید است. برای تاپیکهای با حجم بالا تعداد بیشتر پیشنهاد میشود. |
| replication.factor | ۳ | برای تحمل خطا و حفظ داده، حداقل ۳ رپلکا توصیه میشود. |
| min.insync.replicas | ۲ (زمانی که acks=all) | تضمین میکند که حداقل ۲ رپلکا نوشتن را تایید کنند. فقط وقتی acks=all فعال است کاربرد دارد. |
| cleanup.policy | delete یا compact یا delete,compact | – delete: برای event logها- compact: برای وضعیت آخرین پیام هر کلید (مثل پروفایل کاربر)- delete,compact: ترکیبی برای حالتهای هیبرید |
| log.retention.ms | ۷ روز – ۳۰ روز | برای تاپیکهای event stream; بر اساس نیاز کسبوکار و ظرفیت دیسک تنظیم میشود. |
| log.retention.bytes | 50GB – 500GB پارتیشن | محدودیت حجمی برای هر پارتیشن، جلوگیری از پر شدن دیسک. |
| log.segment.bytes | 1GB – 5GB | اندازه هر سگمنت قبل از چرخش، تعادل بین تعداد فایلها و سرعت چرخش. |
| log.segment.ms | ۱ ساعت – ۱ روز | میتوان برای مدیریت چرخش زمانمحور استفاده کرد. |
| max.message.bytes | 1MB – 10MB | حداکثر اندازه پیام، باید متناسب با حجم پیامهای واقعی باشد. |
| compression.type | lz4 یا snappy | فشردهسازی سریع و کم هزینه CPU برای کاهش مصرف دیسک و شبکه. |
| log.retention.check.interval.ms | ۵ دقیقه (۳۰۰۰۰۰ ms) | فاصله بررسی برای حذف سگمنتهای قدیمی، تنظیم پیشفرض معمول. |
| log.cleaner.enable | true | فعال کردن کامپکتینگ اگر از cleanup.policy=compact استفاده میکنید. |
| log.cleaner.threads | ۱ – ۴ | تعداد نخهای کامپکت، بسته به حجم داده و تعداد پارتیشنها. |
| log.cleaner.backoff.ms | ۱۵۰۰۰ – ۶۰۰۰۰ | فاصله زمانی بین هر اجرای کامپکت برای کاهش فشار روی Broker. |
| log.cleaner.min.cleanable.ratio | ۰.۵ – ۰.۷ | حداقل نسبت داده قدیمی قبل از شروع کامپکت. |
💡 نکات عملی:
acks=all فعال باشد، min.insync.replicas اعمال میشود.lz4 سریع و بهینه برای بیشتر مواردsnappy نیز خوب است، کمی فشردهسازی کمتر ولی CPU کمتر مصرف میکندlog.segment.bytes مناسب باشد تا عملیات کامپکت اجرا شود