For log.retention.bytes.per.topic and log.retention.hours.per.topic, the
current interpretation is that those are tight bounds. In other words, only
when those thresholds are violated, a segment is deleted. To further
satisfy log.retention.bytes.global, the per topic thresholds may no longer
be tight, i.e., we may need to delete a segment even when the per topic
threshold is not violated.

Thanks,

Jun


On Tue, May 27, 2014 at 12:22 AM, András Serény <sereny.and...@gravityrd.com
> wrote:

>
> No, I think more specific settings should get a chance first. I'm
> suggesting that provided that there is a segment rolled for a topic, *any
> *of log.retention.bytes.per.topic, log.retention.hours.per.topic, and a
> future log.retention.bytes.global violation would cause segments to be
> deleted.
>
> As far as I understand, the current logic says
>
> (1)
> for each topic, if there is a segment already rolled {
>     mark segments eligible for deletion due to
> log.retention.hours.for.this.topic
>     if log.retention.bytes.for.this.topic is still violated, mark
> segments eligible for deletion due to log.retention.bytes.for.this.topic
> }
>
> After this cleanup cycle, there could be another one,  taking into account
> the global threshold. For instance, something along the lines of
>
> (2)
> if after (1) log.retention.bytes.global is still violated, for each topic,
> if there is a segment already rolled {
>   calculate the required size for this topic (e.g. the proportional size,
> or simply (full size - threshold)/#topics ?)
>   mark segments exceeding the required size for deletion
> }
>
> Regards,
> András
>
>
>
> On 5/23/2014 4:46 PM, Jun Rao wrote:
>
>> Yes, that's possible. There is a default log.retention.bytes for every
>> topic. By introducing a global threshold, we may have to delete data from
>> logs whose size is smaller than log.retention.bytes. So, are you saying
>> that the global threshold has precedence?
>>
>> Thanks,
>>
>> Jun
>>
>>
>> On Fri, May 23, 2014 at 2:26 AM, András Serény
>> <sereny.and...@gravityrd.com>wrote:
>>
>>  Hi Kafka users,
>>>
>>> this feature would also be very useful for us. With lots of topics of
>>> different volume (and as they grow in number) it could become tedious to
>>> maintain topic level settings.
>>>
>>> As a start, I think uniform reduction is a good idea. Logs wouldn't be
>>> retained as long as you want, but that's already the case when a
>>> log.retention.bytes setting is specified. As for early rolling, I don't
>>> think it's necessary: currently, if there is no log segment eligible for
>>> deletion, log.retention.bytes and log.retention.hours settings won't kick
>>> in, so it's possible to exceed these limits, which is completely fine
>>> (please correct me if I'm mistaken here).
>>>
>>> All in all, introducing a global threshold doesn't seem to induce a
>>> considerable change in current retention logic.
>>>
>>> Regards,
>>> András
>>>
>>>
>>> On 5/8/2014 2:00 AM, vinh wrote:
>>>
>>>  Agreed…a global knob is a bit tricky for exactly the reason you've
>>>> identified.  Perhaps the problem could be simplified though by
>>>> considering
>>>> the context and purpose of Kafka.  I would use a persistent message
>>>> queue
>>>> because I want to guarantee that data/messages don't get lost.  But,
>>>> since
>>>> Kafka is not meant to be a long term storage solution (other products
>>>> can
>>>> be used for that), I would clarify that guarantee to apply only to the
>>>> most
>>>> recent messages up until a certain configured threshold (i.e. max 24
>>>> hrs,
>>>> max 500GB, etc).  Once those thresholds are reached, old messages are
>>>> deleted first.
>>>>
>>>> To ensure no message loss (up to a limit), I must ensure Kafka is highly
>>>> available.  There's a small a chance that the message deletion rate is
>>>> the
>>>> same rate that receive rate.  For example, when the incoming volume is
>>>> so
>>>> high that the size threshold is reached before the time threshold.
>>>>  But, I
>>>> may be ok with that because if Kafka goes down, it can cause upstream
>>>> applications to fail.  This can result in higher losses overall, and
>>>> particularly of the most *recent* messages.
>>>>
>>>> In other words, in a persistent but ephemeral message queue, I would
>>>> give
>>>> higher precedence to recent messages over older ones.  On the flip
>>>> side, by
>>>> allowing Kafka to go down when a disk is full, applications are forced
>>>> to
>>>> deal with the issue.  This adds complexity to apps, but perhaps it's
>>>> not a
>>>> bad thing.  After all, in scalability, all apps should be designed to
>>>> handle failure.
>>>>
>>>> Having said that, next is to decide which messages to delete first.  I
>>>> believe that's a separate issue and has its own complexities, too.
>>>>
>>>> The main idea though is that a global knob would provide flexibility,
>>>> even if not used.  From an operation perspective, if we can't ensure HA
>>>> for
>>>> all applications/components, it would be good if we can for at least
>>>> some
>>>> of the core ones, like Kafka.  This is much easier said that done
>>>> though.
>>>>
>>>>
>>>> On May 5, 2014, at 9:16 AM, Jun Rao <jun...@gmail.com> wrote:
>>>>
>>>>   Yes, your understanding is correct. A global knob that controls
>>>> aggregate
>>>>
>>>>> log size may make sense. What would be the expected behavior when that
>>>>> limit is reached? Would you reduce the retention uniformly across all
>>>>> topics? Then, it just means that some of the logs may not be retained
>>>>> as
>>>>> long as you want. Also, we need to think through what happens when
>>>>> every
>>>>> log has only 1 segment left and yet the total size still exceeds the
>>>>> limit.
>>>>> Do we roll log segments early?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Jun
>>>>>
>>>>>
>>>>> On Sun, May 4, 2014 at 4:31 AM, vinh <v...@loggly.com> wrote:
>>>>>
>>>>>   Thanks Jun.  So if I understand this correctly, there really is no
>>>>>
>>>>>> master
>>>>>> property to control the total aggregate size of all Kafka data files
>>>>>> on
>>>>>> a
>>>>>> broker.
>>>>>>
>>>>>> log.retention.size and log.file.size are great for managing data at
>>>>>> the
>>>>>> application level.  In our case, application needs change frequently,
>>>>>> and
>>>>>> performance itself is an ever evolving feature.  This means various
>>>>>> configs
>>>>>> are constantly changing, like topics, # of partitions, etc.
>>>>>>
>>>>>> What rarely changes though is provisioned hardware resources.  So a
>>>>>> setting to control the total aggregate size of Kafka logs (or
>>>>>> persisted
>>>>>> data, for better clarity) would definitely simplify things at an
>>>>>> operational level, regardless what happens at the application level.
>>>>>>
>>>>>>
>>>>>> On May 2, 2014, at 7:49 AM, Jun Rao <jun...@gmail.com> wrote:
>>>>>>
>>>>>>   log.retention.size controls the total size in a log dir (per
>>>>>>
>>>>>>> partition). log.file.size
>>>>>>> controls the size of each log segment in the log dir.
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>> Jun
>>>>>>>
>>>>>>>
>>>>>>> On Thu, May 1, 2014 at 9:31 PM, vinh <v...@loggly.com> wrote:
>>>>>>>
>>>>>>>   In the 0.7 docs, the description for log.retention.size and
>>>>>>> log.file.size
>>>>>>> sound very much the same.  In particular, that they apply to a single
>>>>>>> log
>>>>>>> file (or log segment file).
>>>>>>>
>>>>>>>> http://kafka.apache.org/07/configuration.html
>>>>>>>>
>>>>>>>> I'm beginning to think there is no setting to control the max
>>>>>>>> aggregate
>>>>>>>> size of all logs.  If this is correct, what would be a good approach
>>>>>>>> to
>>>>>>>> enforce this requirement?  In my particular scenario, I have a lot
>>>>>>>> of
>>>>>>>>
>>>>>>>>  data
>>>>>>> being written to Kafka at a very high rate.  So a 1TB disk can easily
>>>>>>>
>>>>>>>> be
>>>>>>>> filled up in 24hrs or so.  One option is to add more Kafka brokers
>>>>>>>> to
>>>>>>>>
>>>>>>>>  add
>>>>>>> more disk space to the pool, but I'd like to avoid that and see if I
>>>>>>>
>>>>>>>> can
>>>>>>>> simply configure Kafka to not write more than 1TB aggregate.  Else,
>>>>>>>>
>>>>>>>>  Kafka
>>>>>>> will OOM and kill itself, and possibly the crash the node itself
>>>>>>>
>>>>>>>> because
>>>>>>>> the disk is full.
>>>>>>>>
>>>>>>>>
>>>>>>>> On May 1, 2014, at 9:21 PM, vinh <v...@loggly.com> wrote:
>>>>>>>>
>>>>>>>>   Using Kafka 0.7.2, I have the following in server.properties:
>>>>>>>>
>>>>>>>>> log.retention.hours=48
>>>>>>>>> log.retention.size=107374182400
>>>>>>>>> log.file.size=536870912
>>>>>>>>>
>>>>>>>>> My interpretation of this is:
>>>>>>>>> a) a single log segment file over 48hrs old will be deleted
>>>>>>>>> b) the total combined size of *all* logs is 100GB
>>>>>>>>> c) a single log segment file is limited to 500MB in size before a
>>>>>>>>> new
>>>>>>>>>
>>>>>>>>>  segment file is spawned spawning a new segment file
>>>>>>>>
>>>>>>>>  d) a "log file" can be composed of many "log segment files"
>>>>>>>>>
>>>>>>>>> But, even after setting the above, I find that the total combined
>>>>>>>>> size
>>>>>>>>>
>>>>>>>>>  of all Kafka logs on disk is 200GB right now.  Isn't
>>>>>>>> log.retention.size
>>>>>>>> supposed to limit it to 100GB?  Am I missing something?  The docs
>>>>>>>> are
>>>>>>>>
>>>>>>>>  not
>>>>>>> really clear, especially when it comes to distinguishing between a
>>>>>>> "log
>>>>>>>
>>>>>>>> file" and a "log segment file".
>>>>>>>>
>>>>>>>>  I have disk monitoring.  But like anything else in software, even
>>>>>>>>>
>>>>>>>>>  monitoring can fail.  Via configuration, I'd like to make sure
>>>>>>>> that
>>>>>>>>
>>>>>>>>  Kafka
>>>>>>> does not write more than the available disk space.  Or something like
>>>>>>>
>>>>>>>> log4j, where I can set a max number of log files and the max size
>>>>>>>> per
>>>>>>>>
>>>>>>>>  file,
>>>>>>> which essentially allows me to set a max aggregate size limit across
>>>>>>>
>>>>>>>> all
>>>>>>>> logs.
>>>>>>>>
>>>>>>>>  Thanks,
>>>>>>>>> -Vinh
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>

Reply via email to