12-Kafka

kafka怎么确保消息不丢失?

生产者

生产者数据传输导致的数据丢失主常见情况是生产者发送消息给 Kafka ,由于网络等原因导致消息 丢失,对于这种情况也是通过在 producer 端设置 ack = all 来处理,这个参数是要求 leader 接收到 消息后,需要等到所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条 件,生产者会自动不断的重试。

消费者

消费者引起消息丢失的主要原因就是消息还未处理完 Kafka 会自动提交了 offset ,那么只要关闭自 动提交 offset ,消费者在处理完之后手动提交 offset ,就可以保证消息不会丢失。

Kafka

Kafka 导致的数据丢失一个常见的场景就是 Kafka 某个 broker 宕机,而这个节点正好是某个partition 的 leader 节点,这时需要重新重新选举该 partition 的 leader 。如果该 partition 的 leader 在宕机时刚好还有些数据没有同步到 follower ,此时 leader 挂了,在选举某个follower 成 leader 之后,就会丢失一部分数据。

解决方案:

  1. 配置参数,要求每个partition必须有至少2个副本;
  2. 配置参数,要求一个leader 至少感知到有至少一个 follower 还跟自己保持联系,没掉队,这样才能确保 leader 挂了还有一个follower 节点。
  3. 生产者配置ack= all, 这个是要求每条数据,必须是写入所有 replica 之后,才能认 为是写成功了;
  4. 在 producer端设置 retries=MAX (很大很大很大的一个值,无限次重试的意思):这个参数的 含义是一旦写入失败,就无限重试,卡在这里了。

Kafka如何保证消息的顺序性

kafka

把要保证有序性的message设置相同的key,那么这些message将会发送到同一个partition中,而且是有序的。

消费者

对于某个partition只能被一个消费者消费,如果这个消费者内部是单线程处理,可以保证有序性
如果是多线程处理,可以在消费者内部预置多个内存queue,具有相同key的数据放在同一个queue中,然后开启多线程,一个线程消费一个queue里面的message

Kafka为什么这么快

  1. 顺序读写
  2. 索引
  3. 批量读写和文件压缩
  4. 零拷贝

零拷贝

传统的IO模型

磁盘 -> fileCache -> 用户缓冲区 -> socket 缓冲区 -> 网卡

0拷贝

磁盘 -> fileCache -> 网卡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了构建 Kafka 的 Docker 镜像,你可以按照以下步骤进行操作: 1. 首先,创建一个新的目录来存放你的 Dockerfile 和其他相关文件。 2. 在该目录下创建一个名为 Dockerfile 的文件,并使用文本编辑器打开。 3. 在 Dockerfile 中,使用以下基础镜像作为起点: ```Dockerfile FROM openjdk:8-jre-alpine ``` 4. 安装 Kafka 的依赖项和其他必要的工具,可以使用以下命令: ```Dockerfile RUN apk add --no-cache bash curl jq ``` 5. 下载并解压 Kafka 的二进制文件。你可以在 Kafka 的官方网站上找到可用的版本。使用以下命令: ```Dockerfile ENV KAFKA_VERSION=<kafka_version> ENV SCALA_VERSION=<scala_version> RUN wget https://downloads.apache.org/kafka/${KAFKA_VERSION}/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz && \ tar -xzf kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz -C /opt && \ rm kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz ``` 请将 `<kafka_version>` 和 `<scala_version>` 替换为适当的 Kafka 版本和 Scala 版本。 6. 设置 Kafka 相关的环境变量,例如 ZooKeeper 的连接地址等。使用以下命令: ```Dockerfile ENV KAFKA_HOME=/opt/kafka_${SCALA_VERSION}-${KAFKA_VERSION} ENV PATH=${KAFKA_HOME}/bin:$PATH ENV KAFKA_ZOOKEEPER_CONNECT=localhost:2181 ENV KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 ENV KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 ``` 你可以根据你的需求修改这些环境变量。 7. 将 Kafka 的启动脚本添加到容器中,并设置可执行权限。使用以下命令: ```Dockerfile COPY start-kafka.sh /usr/bin/start-kafka.sh RUN chmod +x /usr/bin/start-kafka.sh ``` 8. 创建一个用于存储 Kafka 数据的目录,并设置适当的权限。使用以下命令: ```Dockerfile RUN mkdir -p /var/lib/kafka/data RUN chmod -R 777 /var/lib/kafka/data ``` 9. 定义容器启动时要执行的命令。使用以下命令: ```Dockerfile CMD ["start-kafka.sh"] ``` 10. 保存并关闭 Dockerfile 文件。 11. 在相同的目录下,创建一个名为 `start-kafka.sh` 的脚本文件,并使用文本编辑器打开。 12. 在 `start-kafka.sh` 脚本文件中,添加以下内容: ```bash #!/bin/bash $KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties & $KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties ``` 13. 保存并关闭 `start-kafka.sh` 文件。 14. 在终端中,导航到你的 Dockerfile 所在的目录。 15. 使用以下命令来构建 Docker 镜像: ```bash docker build -t kafka:latest . ``` 16. 构建完成后,你可以使用以下命令来运行 Kafka 容器: ```bash docker run -d --name kafka -p 9092:9092 kafka:latest ``` 以上就是构建 Kafka Docker 镜像的基本步骤。你可以根据需要进行调整和优化。注意确保你已经安装了 Docker 并具有适当的权限来执行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值