基于Docker的pulsar集群部署方法

GitHub链接

docker-sample/pulsar at master · perayb/docker-sample · GitHub

准备工作

  1. 安装最新版本的docker
  2. 拉取pulsarpulsar-manager镜像
docker pull apachepulsar/pulsar:2.7.2

docker pull apachepulsar/pulsar-manager:v0.2.0

部署流程

standalone方式部署

启动容器

sh startStandalone.sh

等待pulsar-manager启动完成后,初始化管理员信息:

sh initAccount.sh

显示以下内容说明管理员信息初始化成功:

> sh initAccount.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 36 100 36 0 0 130 0 --:--:-- --:--:-- --:--:--   130
{"message":"Add super user success, please login"}%

管理员信息初始化完成后,可从以下地址登入:

pulsar-manager: http://127.0.0.1:9527/#

username: admin, password: pulsar

构建成功后,点击 Clusters -> Cluster Name: standalone -> BROKERS ,可看到broker列表说明standalone方式部署完成

删除容器:

sh stopStandalone.sh

standalone方式容器说明

pulsar-standalone容器

- 配置了集群url地址为`pulsar-standalone`(便于`pulsar-manager`容器管理)
- 未挂载数据盘,每次启动均为新实例

docker run -itd \
    --name pulsar-standalone \
    -p 6650:6650 \
    -p 8080:8080 \
    apachepulsar/pulsar:2.7.2 \
    sh -c  "bin/pulsar standalone > pulsar.log 2>&1 & \
            sleep 30 && bin/pulsar-admin clusters update standalone \
            --url http://pulsar-standalone:8080 \
            --broker-url pulsar://pulsar-standalone:6650 & \
            tail -F pulsar.log"

pulsar-manager容器

- 配置了默认集群环境
- 修改容器日志为`后端日志`

docker run -itd \
    --name pulsar-manager \
    -p 9527:9527 -p 7750:7750 \
    -e SPRING\_CONFIGURATION\_FILE=/pulsar-manager/pulsar-manager/application.properties \
    --link pulsar-standalone \
    --entrypoint="" \
    apachepulsar/pulsar-manager:v0.2.0 \
    sh -c  "sed -i '/^default.environment.name/ s|.\*|default.environment.name=pulsar-standalone|' /pulsar-manager/pulsar-manager/application.properties & \
            sed -i '/^default.environment.service\_url/ s|.\*|default.environment.service\_url=http://pulsar-standalone:8080|' /pulsar-manager/pulsar-manager/application.properties & \
            /pulsar-manager/entrypoint.sh & \
            tail -F /pulsar-manager/pulsar-manager/pulsar-manager.log"

cluster方式部署

启动集群(自动新建初始化数据目录data):

sh startCluster.sh

等待pulsar-manager启动完成后,初始化管理员信息:

sh initAccount.sh

显示以下内容说明管理员信息初始化成功:

> sh initAccount.sh

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 36 100 36 0 0 130 0 --:--:-- --:--:-- --:--:--   130

{"message":"Add super user success, please login"}%

管理员信息初始化完成后,可从以下地址登入:

  • Pulsar Manager
> http://127.0.0.1:9527/#_   

> username: `admin`, password: `pulsar`

  • BookKeeper Visual Manager
> http://127.0.0.1:7750/bkvm/#/login_  

> username: `admin`, password: `admin`

构建成功后,以下两个页面正常说明cluster方式部署完成

  • 点击 Clusters -> Cluster Name: pulsar-cluster-1 -> BROKERS ,可看到broker列表

  • 进入BookKeeper Visual Manager可看到3个BookKeeper节点

删除集群(删除容器,保留数据目录):

sh stopCluster.sh

停止和启动集群(保留容器):

# 停止容器
docker compose -f docker-compose-cluster.yml stop
# 启动容器
docker compose -f docker-compose-cluster.yml start

cluster方式容器说明

容器启动流程如下:

    Zookeeper节点(zk1, zk2, zk3) 
    -> 初始化集群元数据(init-metadata) 
    -> Bookeeper节点(bookie1, bookie2, bookie3)
    -> puslar broker节点(broker1, broker2, broker3)
    -> 反向代理节点(pulsar-proxy)
    -> pulsar manager节点(dashboard)

配置文件参考conf目录,数据目录为data,具体参考docker-compose-cluster.yml

所有容器的重启策略为失败后重启

 restart: on-failure

日志均可通过docker logs <container-name>查看

使用客户端与 pulsar 交互测试验证

pulsar 支持多种语言的 Client API, 不过个人推荐使用基于 Python 的 Client API, 可以通过编写简短的代码,即可完成与 pulsar 的交互和测试验证。地址: client-libraries-python

Producer example script

import pulsar

client = pulsar.Client('pulsar://localhost:6650')

producer = client.create_producer('my-topic')

for i in range(10):
    producer.send(('Hello-%d' % i).encode('utf-8'))

client.close()

Consumer example script

import pulsar

client = pulsar.Client('pulsar://localhost:6650')

consumer = client.subscribe('my-topic', 'my-subscription')

while True:
    msg = consumer.receive()
    try:
        print("Received message '{}' id='{}'".format(msg.data(), msg.message_id()))
        # Acknowledge successful processing of the message
        consumer.acknowledge(msg)
    except Exception:
        # Message failed to be processed
        consumer.negative_acknowledge(msg)

client.close()

参考资料

猜你喜欢

转载自blog.csdn.net/smilejiasmile/article/details/124943019