docker kafka — docker 采用Raft模式部署 kafka

使用docker容器采用Raft模式部署 kafka,去掉kafka对zookeeper的依赖

Docker是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。该服务有免费和高级版本。它于2013年首次发布,由Docker, Inc. 开发

使用docker容器采用Raft模式部署 kafka,去掉kafka对zookeeper的依赖

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

docker compose 文件

services:
  controller-1:
    image: apache/kafka:3.9.0
    container_name: controller-1
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://controller-1:9093
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_KRAFT_METADATA_LOG_DIR: /var/lib/kafka/kraft-metadata
    volumes:
        - "../data/kafka/controller-1:/var/lib/kafka/kraft-metadata"
    healthcheck:
      test: ["CMD", "nc", "-z", "controller-1", "9093"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  controller-2:
    image: apache/kafka:3.9.0
    container_name: controller-2
    environment:
      KAFKA_NODE_ID: 2
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://controller-2:9093
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_KRAFT_METADATA_LOG_DIR: /var/lib/kafka/kraft-metadata
    volumes:
        - "../data/kafka/controller-2:/var/lib/kafka/kraft-metadata"
    healthcheck:
      test: ["CMD", "nc", "-z", "controller-2", "9093"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  controller-3:
    image: apache/kafka:3.9.0
    container_name: controller-3
    environment:
      KAFKA_NODE_ID: 3
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://controller-3:9093
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_KRAFT_METADATA_LOG_DIR: /var/lib/kafka/kraft-metadata
    volumes:
        - "../data/kafka/controller-3:/var/lib/kafka/kraft-metadata"
    healthcheck:
      test: ["CMD", "nc", "-z", "controller-3", "9093"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  broker-1:
    image: apache/kafka:3.9.0
    container_name: broker-1
    user: "0:0"
    ports:
      - 29092:9092
    environment:
      KAFKA_NODE_ID: 4
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: 'PLAINTEXT://:19092,PLAINTEXT_HOST://:9092'
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-1:19092,PLAINTEXT_HOST://host.docker.internal:29092'
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_BROKER_REGISTRATION_TIMEOUT_MS: 60000
      KAFKA_BROKER_HEARTBEAT_INTERVAL_MS: 1000
    depends_on:
      controller-1:
        condition: service_healthy
      controller-2:
        condition: service_healthy
      controller-3:
        condition: service_healthy
    volumes:
      - "../data/kafka/broker-1:/var/lib/kafka/data"
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "19092" ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  broker-2:
    image: apache/kafka:3.9.0
    container_name: broker-2
    user: "0:0"
    ports:
      - 39092:9092
    environment:
      KAFKA_NODE_ID: 5
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: 'PLAINTEXT://:19092,PLAINTEXT_HOST://:9092'
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-2:19092,PLAINTEXT_HOST://host.docker.internal:39092'
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_BROKER_REGISTRATION_TIMEOUT_MS: 60000
      KAFKA_BROKER_HEARTBEAT_INTERVAL_MS: 1000
    depends_on:
      controller-1:
        condition: service_healthy
      controller-2:
        condition: service_healthy
      controller-3:
        condition: service_healthy
    volumes:
      - "../data/kafka/broker-2:/var/lib/kafka/data"
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "19092" ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  broker-3:
    image: apache/kafka:3.9.0
    container_name: broker-3
    user: "0:0"
    ports:
      - 49092:9092
    environment:
      KAFKA_NODE_ID: 6
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: 'PLAINTEXT://:19092,PLAINTEXT_HOST://:9092'
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-3:19092,PLAINTEXT_HOST://host.docker.internal:49092'
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_BROKER_REGISTRATION_TIMEOUT_MS: 60000
      KAFKA_BROKER_HEARTBEAT_INTERVAL_MS: 1000
    depends_on:
      controller-1:
        condition: service_healthy
      controller-2:
        condition: service_healthy
      controller-3:
        condition: service_healthy
    volumes:
      - "../data/kafka/broker-3:/var/lib/kafka/data"
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "19092" ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - kafka-network

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    ports:
      - 8080:8080
    environment:
      KAFKA_CLUSTERS_0_NAME: kafka-cluster-1
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: broker-1:19092,broker-2:19092,broker-3:19092
      TZ: Asia/Shanghai
      LANG: C.UTF-8
    depends_on:
      broker-1:
        condition: service_healthy
      broker-2:
        condition: service_healthy
      broker-3:
        condition: service_healthy
    networks:
      - kafka-network

networks:
  kafka-network:
    driver: bridge

验证测试

创建Topic

docker exec -it broker-1 /opt/kafka/bin/kafka-topics.sh --bootstrap-server broker-1:19092 --create --topic test-topic --partitions 3 --replication-factor 3

查看Topic

 docker exec -it broker-1 /opt/kafka/bin/kafka-topics.sh --bootstrap-server broker-1:19092 --list

Kafka UI

快速部署

docker run -p 8080 \
    --name kafka-ui \
    -e KAFKA_CLUSTERS_0_NAME=kafka9092 \
    -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=localhost:9092 \
    -e KAFKA_CLUSTERS_1_NAME=kafka9093 \
    -e KAFKA_CLUSTERS_1_BOOTSTRAPSERVERS=localhost:9093 \
    -e TZ=Asia/Shanghai \
    -e LANG=C.UTF-8 \
    -d provectuslabs/kafka-ui:latest 

增加登录项

默认kafka-ui是免登录的,为了防止所有人都可以登录产生误操作问题,在docker部署的时候可以添加如下四个环境变量配置用户的登录密码。用户名密码根据自己需求修改倒数两行中的admin。


-e SERVER_SERVLET_CONTEXT_PATH="/" \
-e AUTH_TYPE="LOGIN_FORM" \
-e SPRING_SECURITY_USER_NAME=admin \
-e SPRING_SECURITY_USER_PASSWORD="admin" \

优点

1.topic管理:支持查看topic元信息, 增加、删除topic,清除topic信息,往topic中添加数据等。
2.docker部署,非常方便
3.功能齐全,该有的功能全都有
4.集群连接方便,不管是连接旧版本的kafka还是3.3.1及以后版本的kafka,只需要指定kafka的ip端口即可,不需要指定任何其他内容。

缺点

1.不支持页面添加集群,官方也解释了,这是一个无状态的服务,所以情有可原。但是因为项目是Springboot写的,docker部署的,如果添加集群可以重建docker容器,或者修改配置文件,重启容器,具体可以查看项目github说明,因为我没有用配置文件,这里没有详细介绍。
连接带认证的kafka集群
连接带认证的kafka集群在kafka-ui的github上面也有,但是文章写的不太全面,我测试了如下两种带认证集群的连接方式。需要可以参考。
连接SASL_PLAINTEXT认证的Kafka
如果集群没有配置SASL_PLAINTEXT认证可以参考我写的这篇文章。
连接SASL_PLAINTEXT认证的kafka需要添加如下三个环境变量,KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG变量指定的用户名密码需要与实际情况一致。

docker run -p 1992:8080 \
    --name kafka-ui \
    -e KAFKA_CLUSTERS_0_NAME=kafka9092 \
    -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=localhost:9092 \
    -e KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=SASL_PLAINTEXT \
    -e KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM=PLAIN \
    -e KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG='org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";' \
    -e TZ=Asia/Shanghai \
    -e LANG=C.UTF-8 \
    -d provectuslabs/kafka-ui:latest

5.官方文档非常详细,需要查看详细说明,可以点击链接跳转。

比特币(Bitcoin)和 区块链(Blockchain)

比特币和区块链是相辅相成的概念:比特币是区块链的首个成功应用,区块链是比特币的技术基石。它们的区别在于性质(货币 vs. 技术)、功能(支付 vs. 数据记录)和应用范围(单一 vs. 广泛)。未来,随着区块链技术的发展,可能会出现更多创新应用,而比特币可能继续作为数字黄金存在。

1、 比特币(Bitcoin)

比特币是由中本聪(Satoshi Nakamoto)在2008年提出的去中心化数字货币,2009年正式上线。它是一种基于点对点(P2P)网络的加密货币,允许用户在无需银行或政府等中介的情况下进行交易。其核心目标是提供一种无需信任第三方的价值转移方式。
• 性质:数字资产,类似于电子现金。
• 功能:用于支付、投资、价值存储。
• 运行机制:通过区块链记录所有交易,矿工通过工作量证明(Proof of Work)验证并添加新区块,获得比特币奖励。
• 例子:用户A通过比特币钱包向用户B发送1 BTC,交易记录在区块链上,全球节点可验证。

2、 区块链(Blockchain)

区块链是一种分布式账本技术(Distributed Ledger Technology, DLT),用于以安全、透明和不可篡改的方式记录数据。它由一系列按时间顺序连接的区块组成,每个区块包含数据(如交易)、时间戳、前一区块的哈希值等。
• 性质:技术框架和数据结构。
• 功能:提供去中心化的数据存储和验证机制,可用于多种场景。
• 运行机制:通过加密算法(如SHA-256)、共识机制(如工作量证明)和分布式节点网络确保数据完整性和一致性。
• 例子:除了比特币,区块链还用于以太坊的智能合约、供应链追踪、医疗数据管理等。

3、 比特币与区块链的区别

🏆区块链是比特币的技术基础,比特币是区块链的首个成功应用
• 依赖性:比特币依赖区块链来记录和验证交易。没有区块链,比特币无法实现去中心化、安全性和透明性。
• 起源:区块链的概念因比特币而诞生。中本聪在比特币白皮书中首次提出区块链作为解决双花问题(Double Spending)和去中心化信任的方案。
• 推广:比特币的成功使区块链技术广为人知,催生了其他加密货币(如以太坊、瑞波币)和非货币应用(如去中心化金融DeFi、NFT)。

  1. 性质与目标
    ◦ 比特币的目标是提供一种去中心化的货币系统,解决传统金融体系的信任问题(如银行垄断、货币超发)。
    ◦ 区块链是通用的技术框架,目标是提供安全、透明的数据记录方式,适用于任何需要信任和验证的场景。
  2. 功能与用途
    ◦ 比特币主要用于支付和价值存储。例如,用户可以用比特币购买商品或作为投资资产。
    ◦ 区块链的功能更广泛。例如,以太坊区块链支持智能合约,允许开发者构建去中心化应用(DApps);Hyperledger Fabric用于企业级供应链管理。
  3. 技术范围
    ◦ 比特币是区块链的一种具体实现,其区块链专门为记录比特币交易设计,包含特定规则(如工作量证明、10分钟出块时间)。
    ◦ 区块链是通用技术,可定制不同共识机制(如PoS、DPoS)、权限模型(公有链、联盟链、私有链)和其他特性。
  4. 扩展性
    ◦ 比特币的区块链较为单一,专注于交易记录,扩展性有限(例如,每秒处理7笔交易,远低于Visa的数千笔)。
    ◦ 区块链技术可根据需求优化。例如,以太坊支持更复杂的编程,Solana优化了高吞吐量交易。
    4、 比特币与区块链的联系
    尽管存在显著差异,比特币和区块链在技术、理念和生态上紧密相连:
  5. 技术依赖
    ◦ 比特币的每笔交易都记录在区块链上,通过区块的链式结构、哈希算法和工作量证明确保安全。
    ◦ 区块链的去中心化特性使比特币无需中央机构即可运行,节点共同维护账本。
  6. 理念共享
    ◦ 比特币和区块链都强调去中心化、透明性和安全性,旨在消除对中介的依赖。
    ◦ 比特币通过区块链实现了“无需信任”的交易系统,区块链则将这一理念扩展到其他领域。
  7. 生态影响
    ◦ 比特币的成功推动了区块链技术的发展,催生了数千种加密货币和区块链应用。
    ◦ 区块链技术的进步(如Layer 2解决方案、分片技术)反过来提升了比特币的可扩展性和效率,例如闪电网络(Lightning Network)提高了比特币交易速度。
  8. 实际例子
    ◦ 比特币区块链记录了从2009年创世区块至今的所有交易,任何人都可通过区块链浏览器(如Blockchain.com)查看。
    ◦ 区块链技术的应用已扩展到非金融领域,如IBM的Food Trust使用区块链追踪食品供应链,Walmart用区块链确保产品溯源。
  9. 实际案例分析
    ◦ 比特币应用:2021年,萨尔瓦多成为首个将比特币作为法定货币的国家,公民可使用比特币支付日常消费(如咖啡、税款)。这依赖区块链记录每笔交易,确保透明和安全。
    ◦ 区块链应用:以太坊区块链支持去中心化金融(DeFi)协议,如Uniswap,用户可直接交易代币而无需中介。
  10. 技术实现对比
    比特币区块链的简单实现已在上一回答中详细描述(见Create simple Blockchain using Python | GeeksforGeeks)。相比之下,通用区块链实现可能包括:
    ◦ 智能合约支持:如以太坊的Solidity语言,允许编程复杂逻辑。
    ◦ 不同共识机制:如权益证明(Proof of Stake)替代工作量证明,提高能效。
    ◦ 权限管理:如Hyperledger的私有链,仅允许授权节点参与。
  11. 总结与展望
    比特币和区块链是相辅相成的概念:比特币是区块链的首个成功应用,区块链是比特币的技术基石。它们的区别在于性质(货币 vs. 技术)、功能(支付 vs. 数据记录)和应用范围(单一 vs. 广泛)。未来,随着区块链技术的发展,可能会出现更多创新应用,而比特币可能继续作为数字黄金存在。

大模型体系有哪些

• 纯Decoder系: 与Causal Decoder类似,但通常采用更复杂的注意力机制或训练目标。
• 基于Transformer-XL的模型: 通过引入段落级别的循环机制,提高模型对长序列的建模能力。
• 基于稀疏注意力的模型: 通过减少注意力计算量,提高模型的效率。

目前主流的开源模型体系有哪些 — 大模型体系

Prefix Decoder系

Prefix Decoder,也称为非因果解码器,是Encoder-Decoder架构的一种变体。它在处理输入序列时采用双向注意力机制,以充分理解全局上下文;而在生成输出序列时,则采用单向注意力机制,保证生成的连贯性。

• 核心特点:
◦ 输入双向注意力: 模型在生成文本时,可以同时参考上下文中的前文和后文信息,从而更好地理解语境。
◦ 输出单向注意力: 在生成下一个词时,模型仅关注已经生成的文本部分,这有助于保证生成的文本具有连贯性。
• 代表模型及特点:
◦ ChatGLM、ChatGLM2: 由清华大学开发,在中文对话方面表现出色,尤其擅长多轮对话和复杂任务。
◦ U-PalM: 强调通用性,可以在多种任务上取得较好的效果。
• 优势:
◦ 能够更好地捕捉上下文信息,生成更符合人类语言习惯的文本。
◦ 在对话、生成等任务上表现出色。

Causal Decoder系

Causal Decoder,即因果解码器,是一种自回归模型,广泛应用于文本生成任务中。其核心特点在于生成文本时,每个token(词或字符)的生成仅依赖于它之前的token,而无法利用未来的token信息。这种机制确保了生成的文本在时序上保持连贯性。

• 核心特点:
◦ 从左到右的单向注意力: 模型在生成文本时,只能参考已经生成的文本部分,这使得模型在生成过程中具有很强的自回归性。
• 代表模型及特点:
◦ LLaMA-7B: 由Meta AI发布,在参数量较小的情况下表现出强大的性能,是许多后续模型的基础。
◦ LLaMa衍生物: 许多研究者基于LLaMA进行了改进和优化,产生了众多衍生模型。
• 优势:
◦ 生成文本具有很强的连贯性,适合用于文本生成任务。
◦ 模型结构相对简单,易于训练和部署。

Encoder-Decoder系

Encoder-Decoder框架有一个最显著的特征就是它是一个End-to-End学习的算法;本文将以文本-文本的例子作为介绍,这样的模型往往用在机器翻译中,比如将法语翻译成英语。这样的模型也被叫做 Sequence to Sequence learning[1]。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。

• 核心特点:
◦ 输入双向注意力,输出单向注意力: 与Prefix Decoder类似,但Encoder-Decoder通常在编码阶段对整个输入序列进行编码,从而获得更好的全局表示。
• 代表模型及特点:
◦ T5: 谷歌提出的文本到文本转换模型,可以处理多种自然语言处理任务。
◦ Flan-T5: T5的改进版本,在指令跟随方面表现出色。
◦ BART: Bidirectional and Auto-Regressive Transformer,兼具双向和自回归的特性,可以用于多种生成任务。
• 优势:
◦ 能够更好地处理序列到序列的任务,如机器翻译、文本摘要等。
◦ 在处理长文本时具有优势。

其他值得关注的大模型体系

除了上述三大体系,还有以下一些值得关注的模型体系
• 纯Decoder系: 与Causal Decoder类似,但通常采用更复杂的注意力机制或训练目标。
• 基于Transformer-XL的模型: 通过引入段落级别的循环机制,提高模型对长序列的建模能力。
• 基于稀疏注意力的模型: 通过减少注意力计算量,提高模型的效率。