从零构建高性能消息系统:Apache Pulsar裸机二进制部署全攻略

#作者:闫乾苓

1前置准备

1.1 服务器列表

每个node都部署zookeeper,bookeeper,broker
192.168.61.71 node1
192.168.61.72 node2
192.168.61.73 node3

1.2 安装部署jdk

根据官方文档要求,需要安装合适的 64 位 JRE/JDK 版本。请参考Pulsar Runtime Java 版本建议。
Openjdk17下载地址:
https://adoptium.net/zh-CN/temurin/releases/?variant=openjdk17

# 解压下载的安装包
[root@pulsar ~]# tar xf OpenJDK17U-jdk_x64_linux_hotspot_17.0.14_7.tar.gz -C /opt

# 配置软连接
[root@pulsar ~]# ln -s /opt/jdk-17.0.14+7/ /opt/openjdk-17

# 配置PATH环境
[root@pulsar ~]# cat >> /etc/profile << EOF
export JAVA_HOME=/opt/openjdk-17
export PATH=\$JAVA_HOME/bin:\$PATH
EOF

# 使PATH环境生效
[root@pulsar ~]# source /etc/profile

部署完成后使用java -version测试,可以输出java版本信息为部署正常。

[root@node1 ~]# java -version
openjdk version "17.0.14" 2025-01-21
OpenJDK Runtime Environment Temurin-17.0.14+7 (build 17.0.14+7)
OpenJDK 64-Bit Server VM Temurin-17.0.14+7 (build 17.0.14+7, mixed mode, sharing)

2 部署配置apache pulsar

Pulsar安装包包含了zookeeper、broker、bookie三个组件

2.1 下载pular安装包及解压到指定目录

下载地址:https://pulsar.apache.org/download/
wget https://archive.apache.org/dist/pulsar/pulsar-2.10.2/apache-pulsar-2.10.2-bin.tar.gz

解压二进制安装包到指定目录并做软连接
tar xf apache-pulsar-2.10.2-bin.tar.gz -C /opt
ln -s /opt/apache-pulsar-2.10.2 /opt/pulsar

2.2 部署zookeeper集群

Zookeeper 在 Pulsar 集群中的主要作用是提供分布式协调、元数据存储和集群管理的能力,具体功能如下:

  • 元数据存储:存储 Topic、Namespace 和 BookKeeper 的元数据。
  • 集群协调:协调 Broker和BookKeeper 的状态,支持 Leader 选举和动态分配。
  • 动态配置管理:支持动态更新配置,并通知相关节点。
  • 故障检测与恢复:通过心跳机制检测节点状态,并触发快速故障转移。
  • 分布式事务支持:协调事务性消息的状态。
  • 集群拓扑管理:存储和管理集群的拓扑结构,支持负载均衡。

本文使用pulsar自带zookeeper,修改配置文件,追加如下三行到文件末尾:

cat >> /opt/pulsar/conf/zookeeper.conf << EOF
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
EOF

各节点配置zookeeper节点id,注意每个zookeeper节点id号不能相同

node1:
mkdir -p /opt/pulsar/data/zookeeper
echo 2 > /opt/pulsar/data/zookeeper/myid
node2:
mkdir -p /opt/pulsar/data/zookeeper
echo 2 > /opt/pulsar/data/zookeeper/myid
node3:
mkdir -p /opt/pulsar/data/zookeeper
echo 3 > /opt/pulsar/data/zookeeper/myid

所有节点启动zookeeper服务

cd /opt/pulsar/
bin/pulsar-daemon start zookeeper
doing start zookeeper ...
starting zookeeper, logging to /opt/apache-pulsar-2.10.2/logs/pulsar-zookeeper-node1.log
Note: Set immediateFlush to true in conf/log4j2.yaml will guarantee the logging event is flushing to disk immediately. The default behavior is switched off due to performance considerations.

提示可以通过修改 conf/log4j2.yaml 文件中的 immediateFlush 参数来控制日志的即时刷新行为。

  • 默认情况下,immediateFlush被设置为false,这意味着日志事件不会立即写入磁盘,而是会先缓存在内存中,减少频繁的磁盘 I/O 操作,以提高性能。
  • immediateFlush 设置为 true,每次日志事件都会立即写入磁盘。这种配置虽然可以保证日志的实时性(例如在调试或排查问题时非常有用),但会增加磁盘 I/O 的开销,可能导致性能下降。

关闭服务命令

bin/pulsar-daemon stop zookeeper

启动后检查以下端口

端口作用使用场景
2181客户端连接端口客户端与 Zookeeper 通信
9990管理接口端口管理员查看和管理 Zookeeper 状态
8000监控指标暴露端口外部监控系统获取运行指标
2888节点间数据同步端口follower 和 leader 数据传输
3888节点间选举通信端口leader 选举过程中的通信

通过日志可以查看zookeeper集群专题是否正常,比如通过过滤changed关键字,正常状态下只有1各节点为leader,其他节点为follwer.

grep changed logs/pulsar-zookeeper-node1.log
2025-04-18T10:28:52,801+0800 [QuorumPeer[myid=1](plain=0.0.0.0:2181)(secure=disabled)] INFO  org.apache.zookeeper.server.quorum.QuorumPeer - Peer state changed: following

grep changed logs/pulsar-zookeeper-node2.log
2025-04-18T11:12:46,696+0800 [QuorumPeer[myid=2](plain=0.0.0.0:2181)(secure=disabled)] INFO  org.apache.zookeeper.server.quorum.QuorumPeer - Peer state changed: following

grep change logs/pulsar-zookeeper-node3.log
2025-04-18T10:28:52,805+0800 [QuorumPeer[myid=3](plain=0.0.0.0:2181)(secure=disabled)] INFO  org.apache.zookeeper.server.quorum.QuorumPeer - Peer state changed: leading

元数据初始化(只需再一个节点上执行)

bin/pulsar initialize-cluster-metadata \
--cluster pulsar-cluster \
--zookeeper node1:2181 \
--configuration-store node1:2181 \
--web-service-url http://node1:8080,node2:8080,node3:8080 \
--web-service-url-tls https://node1:8443,node2:8443,node3:8443 \
--broker-service-url pulsar://node1:6650,node2:6650,node3:6650 \
--broker-service-url-tls pulsar+ssl://node1:6651,node2:6651,node3:6651

参数说明

参数说明
cluster默认集群名称
zookeeper本地集群使用的zk地址
configuration-store多个集群全局的zk集群地址,各个集群之间同步数据,单机群地址同上面参数zookeeper即可
web-service-urlBroker的管理流地址,例如创建删除主题等
web-service-url-tlsBroker开启TLS,管理流则使用该地址
broker-service-urlBroker数据流地址,发送接受消息等

所有节点查看初始化结果,有bookies, ledgers, pulsar, stream等信息输出为正常初始化完成。

./pulsar zookeeper-shell
[zk: localhost:2181(CONNECTED) 0] ls /
[admin, bookies, ledgers, pulsar, stream, zookeeper]

zookeeper jvm内存 默认为2G,可以通过conf/pulsar_env.sh文件修改,比如修改为1G:
# Extra options to be passed to the jvm
PULSAR_MEM=${PULSAR_MEM:-"-Xms1g -Xmx1g -XX:MaxDirectMemorySize=2g"}

2.3 部署bookeeper集群

BookKeeper负责处理 Pulsar 中的所有持久数据存储,按照以下步骤部署一个3个 Bookie 的 BookKeeper 集群。

修改bookeeper的配置文件

zkServers=node1:2181,node2:2181,node3:2181
# Default port for Prometheus metrics exporter
prometheusStatsHttpPort=8001

# The flag enables/disables starting the admin http server. Default value is 'false'.
httpServerEnabled=true

# The http server port to listen on. Default value is 8080.
# Use `8000` as the port to keep it consistent with prometheus stats provider
httpServerPort=8001
httpServerPort默认关闭,如果设置为true将其开启,需要和prometheusStatsHttpPort端口保持一致。

所有节点启动服务

bin/pulsar-daemon start bookie
doing start bookie ...
starting bookie, logging to /opt/apache-pulsar-2.10.2/logs/pulsar-bookie-node1.log
Note: Set immediateFlush to true in conf/log4j2.yaml will guarantee the logging event is flushing to disk immediately. The default behavior is switched off due to performance considerations.

关闭服务命令
bin/pulsar-daemon stop bookie
通过simpletest命令向bookie集群写入测试数据,完成测试后会自动删除。
该命令的作用是使用以下配置运行一个简单的 BookKeeper 测试:

  • 每个 Ledger 的数据存储在 3 个 Bookie 节点 上(–ensemble 3)。
  • 每次写入需要成功写入 3 个 Bookie 节点(–writeQuorum 3)。
  • 客户端需要从 3 个 Bookie 节点 收到写入成功的确认(–ackQuorum 3)。
  • 写入 1000 条数据条目(–numEntries 1000)。
[root@node1 pulsar]# bin/bookkeeper shell simpletest --ensemble 3 --writeQuorum 3 --ackQuorum 3 --numEntries 1000
…
2025-04-18T16:50:46,133+0800 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.SimpleTestCommand - 257 entries written
2025-04-18T16:50:48,138+0800 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.SimpleTestCommand - 627 entries written
2025-04-18T16:50:50,084+0800 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.SimpleTestCommand - 1000 entries written to ledger 6
…

2.4 部署broker集群

Broker负责处理 Pulsar 消息并提供 Pulsar 的管理界面。

修改conf/broker.conf 
advertisedAddress=node1		# 不同的节点配置不同的IP或者hostname
clusterName=pulsar-cluster
brokerServicePort=6650
webServicePort=8080
zookeeperServers=node1:2181,node2:2181,node3:2181
configurationStoreServers=node1:2181,node2:2181,node3:2181
managedLedgerDefaultEnsembleSize=2 	# 参与存储数据的bookies数量
managedLedgerDefaultWriteQuorum=2	# 每条消息需要存储的副本数
managedLedgerDefaultAckQuorum=2		# 在写操作被认为完成之前需要等待确认的副本数量
functionsWorkerEnabled=true			# 是否启用 Pulsar 函数

所有节点后台启动broker
bin/pulsar-daemon start broker

可以使用如下命令关闭后台启动的broker
bin/pulsar-daemon stop broker

2.5 使用pulsar-client测试集群

Pulsar 集群启动并运行后,可以使用自带的 Pulsar 客户端进行测试,该pulsar-client工具可以向 Pulsar 主题发布消息,也可以从主题消费消息,从而提供一种简单的方法来确保集群正常运行。

修改conf/client.conf配置文件

clusterName=pulsar-cluster
webServiceUrl=http://node1:8080,node2:8080,node3:8080
brokerServiceUrl=pulsar://node1:6650,node2:6650,node3:6650

发布消息之前,执行以下命令订阅 Pulsar 主题

bin/pulsar-client consume \
  persistent://public/default/test \
  -n 100 \
  -s "consumer-test" \
  -t "Exclusive"

在另外一个终端,向 Pulsar 主题发布消息

bin/pulsar-client produce \
  persistent://public/default/test \
  -n 1 \
  -m "Hello Pulsar"

一旦成功将上述消息发布到主题,可以在标准输出中看到如下信息:

----- got message -----
key:[null], properties:[], content:Hello Pulsar

2.6 测试运行函数

在conf/broker.conf 配置文件中设置 functionsWorkerEnabled=true 启用Pulsar 函数功能。

创建一个 ExclamationFunction “exclamation”

bin/pulsar-admin functions create \
  --jar examples/api-examples.jar \
  --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
  --inputs persistent://public/default/exclamation-input \
  --output persistent://public/default/exclamation-output \
  --tenant public \
  --namespace default \
  --name exclamation

通过触发函数来检查函数是否按预期运行,如何给运行正常,输入的内容后面会被pulsar函数处理完后增加感叹号“!”.

[root@node1 pulsar]# bin/pulsar-admin functions trigger --name exclamation --trigger-value "hello world"
hello world!
[root@node1 pulsar]# bin/pulsar-admin functions trigger --name exclamation --trigger-value "abc "
abc !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值