docker 搭建 kafka集群,基本操作,及查询lan值[消息积压][python脚本 ]

version: '3.0'
services:
  zoo1:
    image: zookeeper:3.4.12
    container_name: zoo1
    ports:
      - "2181:2181"
    volumes:
      - "/Users/docker/data/zookeeper/zookeeper1/data:/data"
      - "/Users/docker/data/zookeeper/zookeeper1/datalog:/datalog"
    environment:
      ZOO_MY_ID: 4
      ZOO_SERVERS: server.4=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  zoo2:
    image: zookeeper:3.4.12
    container_name: zoo2
    ports:
      - "2182:2181"
    volumes:
      - "/Users/docker/data/zookeeper/zookeeper2/data:/data"
      - "/Users/docker/data/zookeeper/zookeeper2/datalog:/datalog"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.4=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
  zoo3:
    image: zookeeper:3.4.12
    container_name: zoo3
    ports:
      - "2183:2181"
    volumes:
      - "/Users/docker/data/zookeeper/zookeeper3/data:/data"
      - "/Users/docker/data/zookeeper/zookeeper3/datalog:/datalog"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.4=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
  broker1:
    image: wurstmeister/kafka
    container_name: broker1
    ports:
      - "9091:9092"
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_HOST_NAME: broker1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_HOST_NAME: broker1
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
      KAFKA_LISTENERS: PLAINTEXT://broker1:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9092
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - "/Users/docker/data/kafka/kafka1/:/kafka"
  broker2:
    image: wurstmeister/kafka
    container_name: broker2
    ports:
      - "9092:9092"
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_HOST_NAME: broker2
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_HOST_NAME: broker2
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
      KAFKA_LISTENERS: PLAINTEXT://broker2:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - "/Users/docker/data/kafka/kafka2/:/kafka"
  broker3:
    image: wurstmeister/kafka
    container_name: broker3
    ports:
      - "9093:9092"
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ADVERTISED_HOST_NAME: broker3
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_HOST_NAME: broker3
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
      KAFKA_LISTENERS: PLAINTEXT://broker3:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9092
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - "/Users/docker/data/kafka/kafka3/:/kafka"
# https://segmentfault.com/a/1190000006907443
# https://issues.apache.org/jira/browse/ZOOKEEPER-3828

测试zk连接

docker run -it --rm \
        --link zoo1:zk1 \
        --link zoo2:zk2 \
        --link zoo3:zk3 \
        --net docker-compose_default --name zk-cluster-test \
        zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181

通过日志查看是否启动成功。

查询lan值

import time
from time import sleep

from kafka import KafkaProducer, KafkaConsumer, TopicPartition


# 获取Lan值
def get_lan(top, producer, consumer):
    partitions = producer.partitions_for(top)
    sum = 0
    for pt in partitions:
        p = TopicPartition(topic=top, partition=pt)
        beginning_offsets = consumer.committed(p)
        end_offsets = consumer.end_offsets([p])
        print(beginning_offsets, end_offsets)
        sum = sum + end_offsets[p] - beginning_offsets
    return sum


if __name__ == '__main__':
    # split_str()
    # consume_info()
    top = 'biturd_urgent'
    top2 = 'biturd_great'

	# groupid是对于consumer来说的,一个group组共用一个位置
    producer = KafkaProducer(
        bootstrap_servers=['ip:9092'])

    consumer = KafkaConsumer(top, group_id='biturd_get2',
                             bootstrap_servers=[
                                 'ip:9092'])]
                                
    while True:
        a = get_lan(top, producer, consumer)
        a2 = get_lan(top2, producer, consumer)
        now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        print(top + "当前积压: " + str(a) + "\t当前时间:" + now)
        print(top2 + "当前积压: " + str(a2) + "\t当前时间:" + now)
        print("========================")
        sleep(10)

基本操作

import time
from time import sleep

from kafka import KafkaProducer, KafkaConsumer, TopicPartition
from kafka.errors import kafka_errors
import traceback
import json


def producer_demo():
    # 假设生产的消息为键值对(不是一定要键值对),且序列化方式为json
    producer = KafkaProducer(
        bootstrap_servers=['localhost:9092'],
        key_serializer=lambda k: json.dumps(k).encode(),
        value_serializer=lambda v: json.dumps(v).encode())
    # 发送三条消息
    for i in range(0, 3):
        future = producer.send(
            'kafka_demo',
            key='count_num',  # 同一个key值,会被送至同一个分区
            value=str(i),
            partition=1)  # 向分区1发送消息
        print("send {}".format(str(i)))
        try:
            future.get(timeout=10)  # 监控是否发送成功
        except kafka_errors:  # 发送失败抛出kafka_errors
            traceback.format_exc()


def consumer_demo():
    consumer = KafkaConsumer(
        'kafka_demo',
        bootstrap_servers=':9092',
        group_id='test'
    )
    for message in consumer:
        print("receive, key: {}, value: {}".format(
            json.loads(message.key.decode()),
            json.loads(message.value.decode())
        ))


def queryMsg():
    consumer = KafkaConsumer(
        "ip:9092")
    # partitions = [TopicPartition(topic, p) for p in consumer.partitions_for_topic(topic)]
    partitions = ""

    print("start to cal offset:")

    # total
    toff = consumer.end_offsets(partitions)
    toff = [(key.partition, toff[key]) for key in toff.keys()]
    toff.sort()
    print("total offset: {}".format(str(toff)))

    # current
    coff = [(x.partition, consumer.committed(x)) for x in partitions]
    coff.sort()
    print("current offset: {}".format(str(coff)))

    # cal sum and left
    toff_sum = sum([x[1] for x in toff])
    cur_sum = sum([x[1] for x in coff if x[1] is not None])
    left_sum = toff_sum - cur_sum
    print("kafka left: {}".format(left_sum))


def consume_info():
    # auto_offset_reset:重置偏移量,earliest移到最早的可用消息,latest最新的消息,默认为latest
    consumer = KafkaConsumer('biturd_great', group_id='biturd_get2', auto_offset_reset='earliest',
                             bootstrap_servers=[
                                 'ip:9092'])

    print(consumer.partitions_for_topic("biturd_joiner"))  # 获取biturd_joiner主题的分区信息
    print(consumer.topics())  # 获取主题列表
    print(consumer.subscription())  # 获取当前消费者订阅的主题
    print(consumer.assignment())  # 获取当前消费者topic、分区信息
    print(consumer.beginning_offsets(consumer.assignment()))  # 获取当前消费者可消费的偏移量
    get_lan()
    # for message in consumer:
    #     print("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
    #                                          message.offset, message.key,
    #                                          message.value))

    # consumer.seek(TopicPartition(topic=u'test', partition=0), 5)  # 重置偏移量,从第5个偏移量消费
    for message in consumer:
        print("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
                                             message.offset, message.key,
                                             message.value))


def split_str():
    a = "ip:9092的字符串"
    b = a.replace(',', "','")
    print("'" + b + "'")


# 获取Lan值
def get_lan(top, producer, consumer):
    partitions = producer.partitions_for(top)
    sum = 0
    for pt in partitions:
        p = TopicPartition(topic=top, partition=pt)
        beginning_offsets = consumer.committed(p)
        end_offsets = consumer.end_offsets([p])
        # print(beginning_offsets, end_offsets)
        sum = sum + end_offsets[p] - beginning_offsets
    return sum


if __name__ == '__main__':
    # split_str()
    # consume_info()
    top = 'ip_urgent'
    top2 = 'ip_great'

    producer = KafkaProducer(
        bootstrap_servers=['ip:9092'])

    consumer = KafkaConsumer(top, group_id='biturd_get2', auto_offset_reset='earliest',
                             bootstrap_servers=[
                                 'ip:9092'])

    while True:
        a = get_lan(top, producer, consumer)
        a2 = get_lan(top2, producer, consumer)
        now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        print(top + "当前积压: " + str(a) + "\t当前时间:" + now)
        print(top2 + "当前积压: " + str(a2) + "\t当前时间:" + now)
        print("========================")
        sleep(10)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Docker搭建kafka集群的过程可以参考以下步骤。首先,需要依赖zookeeper来管理kafka集群的状态和元数据。因此,在搭建kafka集群之前,需要先搭建一个zookeeper集群。可以使用Docker创建一个新的网络,并在该网络上启动一个zookeeper集群。接下来,创建一个docker-compose文件(例如docker-compose-zk.yml),在该文件中定义zookeeper集群的配置和启动参数。然后,使用docker-compose命令启动zookeeper集群。接下来,创建一个新的docker-compose文件(例如docker-compose-kafka.yml),在该文件中定义kafka集群的配置和启动参数。在这个文件中,需要挂载一些文件,这些文件包括kafka的配置文件和数据目录。挂载这些文件的目的是为了保留kafka集群的状态和数据。最后,使用docker-compose命令启动kafka集群。在集群启动后,可以安装kafka-manager来管理kafka集群。可以创建一个新的docker-compose文件(例如docker-compose-kafka-manager.yml),在该文件中定义kafka-manager的配置和启动参数。使用docker-compose命令启动kafka-manager。配置kafka-manager连接到kafka集群,并进行测试。\[1\] 在搭建过程中,可能会遇到一些问题。例如,如果之前已经安装过旧版本的docker,可能会导致安装新版本docker时出现冲突的错误。解决这个问题的方法之一是使用wget命令下载docker-ce.repo文件,并将其放置在/etc/yum.repos.d/目录下。这样可以更新docker的安装源,然后重新安装docker。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker搭建kafka集群](https://blog.csdn.net/weixin_48412846/article/details/128724377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [docker搭建kafka集群](https://blog.csdn.net/fxh13579/article/details/81299185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值