由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

Pulsar介绍和集群部署

中间件 西门飞冰 2425℃
[隐藏]

1.Pulsar 基本介绍

1.1.背景

Apache Pulsar 是一个云原生企业级的发布订阅(pub-sub)消息系统2012年雅虎孵化,2016年开源成为apache的顶级项目,Pulsar 已经被腾讯、智联招聘、涂鸦智能、中国移动、中国电信、360、达达集团(京东到家)、苏宁、平安证券、华为等各个领域的巨头争先广泛实践,有全面赶超 Kafka 的趋势,和当年阿里推动 Flink 取代 Spark 的态势非常相似!

Apache Pulsar的功能与特性:

1、多租户模式

2、灵活的消息系统

3、云原生架构

4、segmented Sreams(分片流)

5、支持跨地域复制

1.2.优势

1、Pulsar 不仅可以如同 Kafka 一样处理高速率实时场景,还能支持传统的标准消息队列模式,例如多消费者和失效备援订阅及延时消息等。很多公司常常会在 Kafka 和 MQ 之间做选择,这是因为在实时流式架构中,消息用例可被分为两类:队列和流。而 Pulsar 最优秀的地方正在于此,它将队列和流合二为一,统一为消息传递模型(producer-topic-subscription-consumer)!一个 Pulsar 系统,直接让你拥有 RabbitMQ + RocketMQ + Kafka 的各项特性!

2、Pulsar 采用云原生架构,它的架构设计能够充分利用分布式且能弹性扩容云端资源,快速告别性能不足,集群扩容缩容非常方便。

3、采用多租户的管理,分层结构管理topic,租户(团队)–>Namespace(团队产品)–>topic,可以根据租户来进行资源隔离和授权,一个大的集群里面支持整个公司的业务,一个平台实现数据共享。

4、支持跨地域复制,多个Pulsar cluster 可以双向复制,且多Pulsar cluster offset可以同步到多个集群。Kafka 仅支持单项复制。

5、Consumer 可以动态扩容缩容,处理队列消息积压,Kafka受限于分区,动态缩容很复杂,且一个分区近支持一个Consumer处理,扩容Kafka分区需要程序重启适配。

1.3.缺点

1、Pulsar 一些大厂有过测试,读写性能只有Kafka的一半左右,主要是Pulsar设计之初就是强一致、不丢数据

2、大部分技术团队储备薄弱,无生产实践经验

Pulsar官方性能测试场景少有些片面(同步、异步,不同ack机制不一样,多大的批,一条数据多大,延时和吞吐量都是相反的)

2. kafka目前存在的痛点

Pulsar 诞生之初就一直拿Kafka 做对比,并且最大的竞争对手也是Kafka,这里列出了一些Kafka的缺点,在pulsar中都有比较好的解决方法。

1、Kafka 很难进行扩展,因为 Kafka 把消息持久化在 broker 中,迁移主题分区时,需要把分区的数据完全复制到其他 broker 中,这个操作非常耗时。

2、当需要通过更改分区大小以获得更多的存储空间时,会与消息索引产生冲突,打乱消息顺序。因此,如果用户需要保证消息的顺序,Kafka 就变得非常棘 手了。

3、如果分区副本不处于 ISR(同步)状态,那么 leader 选取可能会紊乱。一般地,当原始主分区出现故障时,应该有一个 ISR 副本被征用,但是这点并 不能完全保证。若在设置中并未规定只有 ISR 副本可被选为 leader 时,选出一个处于非同步状态的副本做 leader,这比没有 broker 服务该 partition 的情况更糟糕。

4、使用 Kafka 时,你需要根据现有的情况并充分考虑未来的增量计划,规划 broker、主题、分区和副本的数量,才能避免 Kafka 扩展导致的问题。这是 理想状况,实际情况很难规划,不可避免会出现扩展需求。

5、Kafka 集群的分区再均衡会影响相关生产者和消费者的性能。

6、发生故障时,Kafka 主题无法保证消息的完整性(特别是遇到第 3 点中的情况,需要扩展时极有可能丢失消息)。

7、众所周知,Kafka 原生的跨地域复制机制(MirrorMaker)有问题,即使只在两个数据中心也无法正常使用跨地域复制。因此,甚至 Uber 都不得不创建 另一套解决方案来解决这个问题,并将其称为 uReplicator (https://eng.uber.com/ureplicator/)。

8、Kafka 没有原生的多租户功能来实现租户的完全隔离,它是通过使用主题授权等安全功能来完成的

3.pulsar 架构介绍

单个Pulsar集群由以下三部分组成:

  • 多个 broker 负责处理和负载均衡 producer 发出的消息,并将这些消息分派给 consumer;Broker 与 Pulsar 配 置存储交互来处理相应的任务,并将消息存储在 BookKeeper 实例中(又称 bookies);Broker 依赖 ZooKeeper 集群处理特定的任务,等等。
  • 多个 bookie 的 BookKeeper 集群负责消息的持久化存储。
  • 一个zookeeper集群,用来处理多个Pulsar集群之间的协调任务。

image-20221013104238592

3.1.Brokers介绍

Pulsar的broker是一个无状态组件, 主要负责运行另外的两个组件:

  • 一个 HTTP 服务器, 它暴露了 REST 系统管理接口以及在生产者和消费者之间进行 Topic查找的API。
  • 一个调度分发器, 它是异步的TCP服务器,通过自定义 二进制协议应用于所有相关的数据传输。

出于性能考虑,消息通常从Managed Ledger缓存中分派出去,除非积压超过缓存大小。如果积压的消息对于缓存来说太 大了, 则Broker将开始从BookKeeper那里读取Entries(Entry同样是BookKeeper中的概念,相当于一条记录)。

最后,为了支持全局Topic异地复制,Broker会控制Replicators追踪本地发布的条目,并把这些条目用Java 客户端重 新发布到其他区域

3.2.Zookeeper的元数据存储

Pulsar使用Apache Zookeeper进行元数据存储、集群配置和协调

  • 配置存储: 存储租户,命名域和其他需要全局一致的配置项
  • 每个集群有自己独立的ZooKeeper保存集群内部配置和协调信息,例如归属信息,broker负载报告,BookKeeper ledger信息(这个是BookKeeper本身所依赖的)等等

3.3.bookKeeper持久化存储

Pulsar用 Apache bookKeeper作为持久化存储。 bookKeeper是一个分布式的预写日志(WAL)系统,有如下几个特性特别适合Pulsar的应用场景:

1、使pulsar能够利用独立的日志,称为ledgers. 可以随着时间的推移为topic创建多个Ledgers

2、它为处理顺序消息提供了非常有效的存储

3、保证了多系统挂掉时Ledgers的读取一致性

4、提供不同的Bookies之间均匀的IO分布的特性

5、它在容量和吞吐量方面都具有水平伸缩性。能够通过增加bookies立即增加容量到集群中,并提升吞吐量

6、Bookies被设计成可以承载数千的并发读写的ledgers。 使用多个磁盘设备 (一个用于日志,另一个用于一般存 储) ,这样Bookies可以将读操作的影响和对于写操作的延迟分隔开。

image-20221013105353915

Ledger是一个只追加的数据结构,并且只有一个写入器,这个写入器负责多个bookKeeper存储节点(就是Bookies)的写入 。 Ledger的条目会被复制到多个bookies。 Ledgers本身有着非常简单的语义:

 

  • Pulsar Broker可以创建ledeger,添加内容到ledger和关闭ledger。
  • 当一个ledger被关闭后,除非明确的要写数据或者是因为写入器挂掉导致ledger关闭,ledger只会以只读模式打开。
  • 最后,当ledger中的条目不再有用的时候,整个ledger可以被删除(ledger分布是跨Bookies的)。

3.4.Pulsar 代理 (可选)

Pulsar客户端和Pulsar集群交互的一种方式就是直连Pulsar brokers。然而,在某些情况下,这种直连既不可行也不可 取,因为客户端并不知道broker的地址。 例如在云环境或者Kubernetes以及其他类似的系统上面运行Pulsar,直连 brokers就基本上不可能了。

Pulsar proxy 为这个问题提供了一个解决方案, 为所有的broker提供了一个网关, 如果选择运行了Pulsar Proxy. 所有 的客户都会通过这个代理而不是直接与brokers通信

4.pulsar 分布式模式部署

4.1.部署说明

搭建 Pulsar 集群至少需要 3 个组件:ZooKeeper 集群、BookKeeper 集群和 broker 集群(Broker 是 Pulsar 的自身实例)。这 三个集群组件如下:

  • ZooKeeper 集群(3 个 ZooKeeper 节点组成)
  • bookie 集群(也称为 BookKeeper 集群,3 个 BookKeeper 节点组成)
  • broker 集群(3 个 Pulsar 节点组成)

搭建版本pulsar 2.8.1

4.2.zookeeper搭建

docker run --privileged=true -d --name zookeeper -p 2181:2181 -d zookeeper:latest

图省事:这里Zookeeper使用docker安装一个节点,线上需要使用三个节点

4.3.pulsar 安装配置

(1)pulsar 下载安装

cd /opt/module/
wget https://archive.apache.org/dist/pulsar/pulsar-2.8.1/apache-pulsar-2.8.1-bin.tar.gz
tar xf apache-pulsar-2.8.1-bin.tar.gz
ln -s apache-pulsar-2.8.1 pulsar

(2)bookkeeper配置

]# vim pulsar/conf/bookkeeper.conf 
#设置成本机的IP地址,这里的pulsar01配置了hosts
advertisedAddress=pulsar01
journalDirectory=/data/bookkeeper/journal
ledgerDirectories=/data/bookkeeper/ledgers
zkServers=pulsar01:2181

(3)修改broker集群的配置文件

]# vim pulsar/conf/broker.conf
# 配置集群名称
clusterName=pulsar-cluster
# 配置zookeeper集群地址
zookeeperServers=pulsar01
# 配置zookeeper集群地址
configurationStoreServers=pulsar01
# 设置成本机IP地址
advertisedAddress=pulsar01

(4)将配置好的pulsar目录推送到pulsar02和pulsar03节点

(5)pulsar02和pulsar03节点修改broker和bookkeeper地址为本机IP

4.4.pulsar初始化

注意:pulsar 初始化之前需要保障zookeeper集群是正常运行

初始化集群步骤如下:

cd /opt/module/pulsar/bin/
./pulsar initialize-cluster-metadata \
--cluster pulsar-cluster \
--zookeeper pulsar01:2181 \
--configuration-store pulsar01:2181 \
--web-service-url http://pulsar01:8080,pulsar02:8080,pulsar03:8080 \
--web-service-url-tls https://pulsar01:8443,pulsar02:8443,pulsar03:8443 \
--broker-service-url pulsar://pulsar01:6650,pulsar02:6650,pulsar03:6650 \
--broker-service-url-tls pulsar+ssl://pulsar01::6651,pulsar02:6651,pulsar03:6651

初始化bookkeeper集群:若出现提示输入Y/N,输入Y即可

 ./bookkeeper shell metaformat

初始化操作,仅需要执行一次即可

4.5.pulsar 启动

1、 启动bookkeeper服务(三个节点都执行启动命令)

cd /opt/module/pulsar/bin/
./pulsar-daemon start bookie

验证是否启动

./bookkeeper shell bookiesanity

提示:Bookie sanity test succeeded 则认为启动成功

2、启动Broker(三个节点都执行启动命令)

./pulsar-daemon start broker

验证是否启动:

[root@pulsar01 bin]# ./pulsar-admin brokers list pulsar-cluster
"pulsar02:8080"
"pulsar03:8080"
"pulsar01:8080"

4.6.pulsar 集群测试

在pulsar的bin目录下, 专门提供了一个pulsar-client的客户端工具, Pulsar-Clinet工具允许使用者在运行的集群中消费并发送消息到 Pulsar Topic中

模拟开启消费者监听数据:

./pulsar-client consume persistent://public/default/test -s "consumer-test"

模拟生产一条数据:

./pulsar-client produce persistent://public/default/test --messages "hello-pulsar"

5.pulsar 可视化管理工具

(1)下载安装

wget https://archive.apache.org/dist/pulsar/pulsar-manager/pulsar-manager-0.2.0/apache-pulsar-manager-0.2.0-bin.tar.gz
tar xf apache-pulsar-manager-0.2.0-bin.tar.gz 
cd pulsar-manager/
# 这里需要二次解压
tar -xvf pulsar-manager.tar 

(2)dist包复制到pulsar-manager目录下更名为ui

cp -r dist/ pulsar-manager/ui

(3)启动pulsar-manager

./bin/pulsar-manager

(4)初始化超级用户密码

CSRF_TOKEN=$(curl http://pulsar01:7750/pulsar-manager/csrf-token) 
curl \
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN;" \
-H 'Content-Type: application/json' \
-X PUT http://pulsar01:7750/pulsar-manager/users/superuser \
-d '{"name": "pulsar", "password": "pulsar", "description": "test", "email": "username@test.org"}'

(5)访问验证

http://pulsar01:7750/ui/index.html

image-20221013162437786

(6)使用

点击 new Enirconment 构建新环境,连接pulsar

image-20221013163225812

点击pulsar进入管理页面

image-20221013163325613

转载请注明:西门飞冰的博客 » Pulsar介绍和集群部署

喜欢 (2)or分享 (0)