本文目录

  • 1、Apache Pulsar 介绍
  • 2、Pulsar搭建过程
  • 2.1 pulsar集群组成
  • 2.1 准备工作
  • 安装方式1
  • 安装方式2
  • 安装方式3
  • 3、部署流程
  • 3.1 zookeeper安装
  • 3.2 bookkeeper部署
  • 3.3 Broker集群部署
  • 4、遇到的问题
  • 4.1 端口被占用
  • 4.2 内存不足
  • 4.3 zookeeper版本问题


1、Apache Pulsar 介绍

Pulsar 是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。
Pulsar 的关键特性如下:
1、Pulsar 的单个实例原生支持多个集群,可跨机房在集群间无缝地完成消息复制。

2、极低的发布延迟和端到端延迟。

3、可无缝扩展到超过一百万个 topic。

4、简单的客户端 API,支持 Java、Go、Python 和 C++。

5、主题的多种订阅类型(独占、共享和故障转移)。
Multiple subscription types (exclusive, shared, and failover) for topics.

6、通过 Apache BookKeeper 提供的持久化消息存储机制保证消息传递。
由轻量级的 serverless 计算框架 Pulsar Functions 实现流原生的数据处理。
基于 Pulsar Functions 的 serverless connector 框架 Pulsar IO 使得数据更易移入、移出 Apache Pulsar。
分层式存储可在数据陈旧时,将数据从热存储卸载到冷/长期存储(如S3、GCS)中。

如果你的公司目前使用kafka遇到一些扩展瓶颈。可以考虑一下kafka和pulsar的对比
kafka和pulsar全方位对比

2、Pulsar搭建过程

2.1 pulsar集群组成

1、搭建 Pulsar 集群至少需要 3 个组件:ZooKeeper 集群、BookKeeper 集群和 broker 集群(Broker 是 Pulsar 的自身实例)。这三个集群组件如下:
ZooKeeper 集群(多 个 ZooKeeper 节点组成)
bookie 集群(也称为 BookKeeper 集群,多个 BookKeeper 节点组成)
broker 集群(多 个 Pulsar 节点组成)
Pulsar 的安装包已包含了搭建集群所需的各个组件库。无需单独下载 ZooKeeper 安装包和 BookKeeper 安装包。

2、我的集群为三个虚拟机,虚拟机的分配内存是:4G,4G,4G
主要是官网文档显示最少要2G内存分配给JVM,这里我给了4G。官网要求图如下:

apache pulsar 可以兼容哪些消息队列 apache pulsar缺点_kafka

三个节点分别都安装了zookeeper,bookeeper,broker,组成ZooKeeper(3个zookeeper) 集群、BookKeeper (3个bookie)集群和 broker (3个broker)集群,组成pulsar集群

2.1 准备工作

  • 必须条件
  • 在所需服务器上安装JDK(要求版本不低于 JDK 8),安装略过
  • 将pulsar安装包上传至所需服务器,目前安装包可以在https://pulsar.apache.org/en/download/中下载
    解压安装包,以/home/kafka路径为例
tar -zxvf apache-pulsar-2.6.1-bin.tar.gz -C /home/kafka/
安装方式1
  • 官方建议需要6台机器:
  • 3 台用于运行ZooKeeper 集群,建议使用性能较弱的机器,Pulsar仅将ZooKeeper用于与协调有关的定期任务和与配置有关的任务,而不用于基本操作。
  • 3 用于运行bookie 集群和broker 集群,建议使用性能强劲的机器。
安装方式2

但是也可以在一台机器上同时部署ZooKeeper,bookie ,broker ,也就是最少需要三台机器就可以部署一个Pulsar 集群。

安装方式3

其实也还可以在3台机器上部署ZooKeeper 集群,另外3台机器部署bookie 集群,另3台机器部署broker 集群,也就是共需要消耗9台机器。

这里我是本地搭建测试pulsar,正好只有三台机器,就选择了第二种安装方式。

下文将以3台机器为例介绍部署方法,三台机器IP地址分别为:

hadoop01local
 hadoop02local
 hadoop03local

3、部署流程

3.1 zookeeper安装

Pulsar安装包内包含了zookeeper,也可以自建zookeeper,自建zookeeper的方式略。安装Pulsar安装包内的zookeeper方法如下:
通过cd /home/kafka/apache-pulsar-2.6.1-bin进入到Pulsar根目录
通过vim ./conf/zookeeper.conf修改配置文件(三个节点上都需执行此操作),新增或修改如下关键配置项:

dataDir是修改,其他都是新增

dataDir=/home/kafka/data/zookeeper/data
 dataLogDir=/home/kafka/data/zookeeper/log
 server.1=hadoop01local:2888:3888
 server.2=hadoop02local:2888:3888
 server.3=hadoop03local:2888:3888

参数说明:
dataDir:当前zookeeper节点的数据存放目录
dataLogDir:当前zookeeper节点的日志存放目录
server.1~3:为zookeeper集群的各节点指定编号

在每个zookeeper节点的机器上,新建如下文件目录:
data:ZooKeeper使用的数据存储目录
mkdir -pv /home/kafka/data/zookeeper/data log:ZooKeeper使用的日志存储目录
mkdir -pv /home/kafka/data/zookeeper/log 为每个zookeeper节点新建myid,分别在指定的sever上写入配置文件中指定的编号:
在server.1服务器上执行bash命令:
echo 1 > /home/kafka/data/zookeeper/data/myid

在server.2服务器上执行bash命令:
echo 2 > /home/kafka/data/zookeeper/data/myid

在server.3服务器上执行bash命令:
echo 3 > /home/kafka/data/zookeeper/data/myid

执行后台运行命令,这个命令是启动zookeeper:
bin/pulsar-daemon start zookeeper

执行zookeeper客户端连接命令:
bin/pulsar zookeeper-shell

客户端正常连接,就算zookeeper启动好了

在另外两台服务器上也执行bin/pulsar-daemon start zookeeper启动zookeeper之后,在其中一个zookeeper节点的机器上,初始化集群元数据(总共只需执行一次):
例如在hadoop01local上:

bin/pulsar initialize-cluster-metadata \
    --cluster pulsar-cluster-zk \
    --zookeeper hadoop01local:2181 \
    --configuration-store hadoop01local:2181 \
    --web-service-url http://hadoop01local:8080,hadoop02local:8080,hadoop03local:8080 \
    --web-service-url-tls https://hadoop01local:8443,hadoop02local:8443,hadoop03local:8443 \
    --broker-service-url pulsar://hadoop01local:6650,hadoop02local:6650,hadoop03local:6650 \
    --broker-service-url-tls pulsar+ssl://hadoop01local:6651,hadoop02local:6651,hadoop03local:6651

集群元数据说明

  • cluster
    集群名称
  • zookeeper
    ZooKeeper集群连接参数,仅需要包含ZooKeeper集群中的一个节点即可,在哪个机器初始化,就写那个集群的zookeeper地址,我这里在hadoop01local初始化的元数据。
  • configuration-store
    Pulsar实例的配置存储集群(ZooKeeper),多集群部署时才会发挥作用,需要另外部署ZooKeeper集群,但是单集群部署时可以和–zookeeper参数设置一样,只需要包含ZooKeeper集群中的一个节点即可
  • web-service-url
    集群Web服务的URL+端口,URL是一个标准的DNS名称,默认端口8080,不建议修改。
  • web-service-url-tls
    集群Web提供TLS服务的URL+端口,端口默认8443,不建议修改。
  • broker-service-url
    集群brokers服务URL,URL中DNS的名称和Web服务保持一致,URL使用pulsar替代http/http,端口默认6650,不建议修改。
  • broker-service-url-tls
    集群brokers提供TLS服务的URL,默认端口6551,不建议修改。

ps:如果没有DNS服务器,也可以使用多主机(multi-host)格式的service-url设置web-service-url,web-service-url-tls,broker-service-url,broker-service-url-tls
bin/pulsar zookeeper-shell进入zk控制台,通过ls /查看所有zk节点。能看到bookies,ledgers等节点,则说明初始化成功了。

如果需要关闭zookeeper,可使用命令
bin/pulsar-daemon stop zookeeper

3.2 bookkeeper部署

在每个部署bookkeeper的机器上,通过vim conf/bookkeeper.conf来编辑bookkeeper配置文件,修改如下关键配置项:

advertisedAddress=hadoop01local
zkServers=hadoop01local:2181,hadoop02local:2181,hadoop03local:2181 
journalDirectories=/home/kafka/data/bookkeeper/journal 
ledgerDirectories=/home/kafka/data/bookkeeper/ledgers 
prometheusStatsHttpPort=8100

注意:

  1. prometheusStatsHttpPort默认是8000,但实际上在bookkeeper.conf中,httpServerPort默认也是8000,会导致端口被占用。
  2. 上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个
    参数说明:
    advertisedAddress:指定当前节点的主机名或IP地址
    zkServers:指定zookeeper集群,用来将bookkeeper节点的元数据存放在zookeeper集群
    journalDirectories:当前bookkeeper节点的journal数据存放目录。 如果需要提高磁盘写入性能,可以指定多个目录用来存放journal数据,关键是每一个目录必须在不同的磁盘,不然反而会影响写入性能
    ledgerDirectories:当前bookkeeper节点的ledger存放目录

在每个部署bookkeeper的机器上,创建bookie所需要目录:
mkdir -pv /home/kafka/data/bookkeeper/mkdir -pv /home/kafka/data/bookkeeper/journalmkdir -pv /home/kafka/data/bookkeeper/ledgers 执行初始化元数据命令,若出现提示,输入Y继续(该步骤只需在一个bookie节点执行一次,总共只需执行一次):
bin/bookkeeper shell metaformat

在三台机器上,分别输入以下命令来以后台进程启动bookie:
bin/pulsar-daemon start bookie

验证是否启动成功:
bin/bookkeeper shell bookiesanity

出现Bookie sanity test succeeded则代表启动成功。

如果需要关闭bookkeeper,可使用命令

bin/pulsar-daemon stop bookie

3.3 Broker集群部署

在每个部署Broker的机器上,通过vim conf/broker.conf来编辑Broker配置文件,修改如下关键配置项:

zookeeperServers=hadoop01local:2181,hadoop02local:2181,hadoop03local:2181 configurationStoreServers=hadoop01local:2181,hadoop02local:2181,hadoop03local:2181
advertisedAddress=hadoop01local
#clusterName与前面zookeeper初始化的cluster一致
clusterName=pulsar-cluster-zk

注意:
上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个
参数说明:
zookeeperServers:指定zookeeper集群,用来将broker节点的元数据存放在zookeeper集群
configurationStoreServers:多集群部署时管理多个pulsar集群元数据的zookeeper集群地址,单集群部署时可以和zookeeperServers设置一样
advertisedAddress:指定当前节点的主机名或IP地址
clusterName:指定pulsar集群名称

在每个部署Broker的机器上,以后台进程启动broker
bin/pulsar-daemon start broker 如果需要关闭broker,可使用命令

bin/pulsar-daemon stop broker

查看集群 brokers 节点情况
bin/pulsar-admin brokers list pulsar-cluster 我们的示例部署正常的话,这一步会显示如下结果;
hadoop01local:8080
hadoop02local:8080
hadoop03local:8080
代表此时集群内有存活的节点: hadoop01local、hadoop02local、hadoop03local,端口号都是8080。到这一步,Pulsar的部署就完成了。

4、遇到的问题

4.1 端口被占用

在第一个步骤,安装内置的zookeeper的过程中,就遇到了错误,

错误信息如下:
Unable to read additional data from server sessionid 0x0, likely server has closed socket
无法从服务器sessionid 0x0读取额外数据,可能服务器已关闭套接字

查看日志发现可能是端口被占用导致的

cd /home/kafka/apache-pulsar-2.8.1/logs
 tail -1000f pulsar-zookeeper-hadoop01local.log

然后查看端口占用情况,发现2181端口被占用,杀掉之后,并连续启动三台虚拟机的zookeeper之后,正常。

4.2 内存不足

There is insufficient memory for the Java Runtime Environment to continue内存不足,Java运行时环境无法继续

这是由于另外两台机器的内存不足导致的,官网要求,jvm内存需要在2G,而我的虚拟机只有1g的内存,导致broker创建失败。

这里需要关掉虚拟机增加内存。或者更改参数来调整分配的大小

默认情况下,Pulsar为启动分配2G JVM堆内存。可以在PULSAR_MEM下的conf/pulsar_env.sh文件中修改。这是传递给JVM的额外选项。
但是修改这个之后发现还是报这个错误,所以可能这个必须要给2G以上的内存才可以。

重新分配内存之后,重新按照步骤,启动两外两台节点的zookeeper、bookeeper、broker,然后查看集群,三个节点的信息全部都正常。

4.3 zookeeper版本问题

如果你自用你自己搭建的zookeepeer,你的zookeeper版本在3.5.x ,这个版本的zookeeper会自动占用8080端口,这会和后边的端口有冲突,建议你提前修改,可以参考下面博主写的修改方法:
端口修改方法