#作者:闫乾苓
文章目录
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-url | Broker的管理流地址,例如创建删除主题等 |
web-service-url-tls | Broker开启TLS,管理流则使用该地址 |
broker-service-url | Broker数据流地址,发送接受消息等 |
所有节点查看初始化结果,有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 !