Skip to content
Qiao Junlong edited this page Nov 23, 2015 · 10 revisions

什么情况会造成数据丢失

当librdkafka仍保持着未发送的消息时,logkafka崩溃或被强制退出

我们使用librdkafka作为消息发送的客户端,librdkafka只提供了async接口,并将消息保存在内存队列里。如果设置了message_timeout_ms=0 (默认值),librdkafka会一直保持着未发送的消息,直到其发送成功。如果logkafka意外崩溃或被强制退出(如接收到SIGKILL),而此时librdkafka仍然保持了未发送的消息,那么这些消息就会丢失。

解决方法: 可选的解决方法是librdkafka提供磁盘持久化队列,librdkafka正在改进这一点。

logkafka还未扫描到日志文件,而日志文件已经被删除

假设当前时间是2015.01.01.03,logkafka正在收集文件f1,f2,f3还未被收集。

f1: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.01 (Collecting)
f2: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.02 (Uncollected)
f3: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.03 (Uncollected)

现在删除f1和f2,那么f2的消息会丢失。

logkafka会尽可能快地收集日志文件,但是日志文件如果过大,或者因为其他原因(网络故障)无法发送到kafka服务器,那么就会导致此文件的收集卡住。

解决方法:为了及时感知异常情况,需要监控日志收集状态(利用tools里的监控工具)。

消息是否会乱序

仅当网络出现故障时才会乱序。

Clone this wiki locally