Pulsar 集群部署

10 篇文章 2 订阅
3 篇文章 0 订阅

部署 Pulsar 集群

部署 JDK 及初始化 Zookeeper 中的元数据

cat >> ~/.bash_profile <<'EOF'
# JDK
export JAVA_HOME=/root/jdk
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
EOF
souece ~/.bash_profile

# Tips:
# Pulsar 安装包包含了搭建集群所需的各个组件库,无需单独下载 ZooKeeper 和 BookKeeper 的安装包
# 生产环境建议将Zookeeper、Pulsar、BookKeeper 分别部署到不同节点 ...
# Download: https://pulsar.apache.org/en/download/
tar -zxf apache-pulsar-2.8.0-bin.tar.gz -C ~
ln -sv apache-pulsar-2.8.0 pulsar

# 配置文件列表 ...
[root@node1 conf]# ll
# -rw-r--r-- 1 root root  2107 Jan 22  2020 bkenv.sh
# -rw-r--r-- 1 root root 30222 Jan 22  2020 bookkeeper.conf
# -rw-r--r-- 1 root root 53756 Jan 22  2020 broker.conf
# -rw-r--r-- 1 root root  2361 Jan 22  2020 client.conf
# -rw-r--r-- 1 root root  2882 Jan 22  2020 discovery.conf
# -rw-r--r-- 1 root root  1503 Jan 22  2020 filesystem_offload_core_site.xml
# -rw-r--r-- 1 root root  5178 Jan 22  2020 functions_log4j2.xml
# drwxr-xr-x 2 root root    66 Aug  5 21:50 functions-logging
# -rw-r--r-- 1 root root 13359 Jan 22  2020 functions_worker.yml
# -rw-r--r-- 1 root root  1740 Jan 22  2020 global_zookeeper.conf
# drwxr-xr-x 2 root root    23 Aug  5 21:50 log4j2-scripts
# -rw-r--r-- 1 root root  5330 Jan 22  2020 log4j2.yaml
# drwxr-xr-x 3 root root    86 Aug  5 21:50 presto
# -rw-r--r-- 1 root root  8314 Jan 22  2020 proxy.conf
# -rw-r--r-- 1 root root  2770 Jan 22  2020 pulsar_env.sh
# -rw-r--r-- 1 root root  1910 Jan 22  2020 pulsar_tools_env.sh
# -rw-r--r-- 1 root root    96 Jan 22  2020 schema_example.conf
# -rw-r--r-- 1 root root 40140 Jan 22  2020 standalone.conf
# -rw-r--r-- 1 root root  4000 Jan 22  2020 websocket.conf
# -rw-r--r-- 1 root root   499 Aug  5 22:03 zookeeper.conf

# -------------------------------------------------------------------------- Zookeeper

# 修改内置的 Zookeeper 配置文件(所有节点均使用相同的配置)
mkdir -p /data/zookeeper/{data,log}
cat > ~/pulsar/conf/zookeeper.conf <<'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
clientPort=2181
admin.enableServer=true
admin.serverPort=9990
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
forceSync=yes
sslQuorum=false
portUnification=false
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=8000
metricsProvider.exportJvmInfo=true
EOF

# 创建当前的 Zookeeper 节点 myid
echo 1 > /data/zookeeper/data/myid

# 后台启动
cd ~/pulsar/bin
./pulsar-daemon start zookeeper
# 执行zookeeper客户端连接命令进行验证
./pulsar zookeeper-shell

# 在其中一个 Zookeeper 节点的机器上初始化集群的元数据
./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
# 进入Zookeeper的控制台通过 ls / 查看所有节点,当输出有 bookies、ledgers 等节点则说明初始化成功
# ------------------------------------- 参数说明
# cluster: 集群名称
# zookeeper: ZooKeeper集群连接参数,仅提供一个节点即可
# configuration-store: Pulsar 实例的配置存储集群(ZooKeeper)
# web-service-url: 集群Web服务的URL+端口,是标准的DNS名称格式,默认端口8080,不建议修改
# web-service-url-tls: 集群Web提供TLS服务的URL+端口,默认端口8443,不建议修改
# broker-service-url: 集群brokers服务URL,其中的DNS名称和Web服务保持一致,URL使用pulsar替代http/http,默认端口6650,不建议修改
# broker-service-url-tls: 集群brokers提供TLS服务的URL,默认端口6551,不建议修改

部署 Pulsar BooKKeeper

# 在每个需要部署 bookkeeper 的节点,修改 conf/bookkeeper.conf 配置文件,部分关键配置如下:
# https://pulsar.apache.org/docs/zh-CN/reference-configuration/#bookkeeper
vim ~/pulsar/conf/bookkeeper.conf
bookiePort=3181
httpServerPort=8000
prometheusStatsHttpPort=8100
advertisedAddress=192.168.6.1
zkServers=192.168.6.1:2181,192.168.6.2:2181,192.168.6.3:2181
journalDirectories=/data/pulsar/bookkeeper/journal
ledgerDirectories=/data/pulsar/bookkeeper/ledgers

# Tips:
# advertisedAddress: 当前节点主机名或IP
# prometheusStatsHttpPort: 默认是 8000,但在 bookkeeper.conf 中的 httpServerPort 默认也是 8000,会导致端口被占用
# zkServers: 指定Zookeeper集群,用来存放 Bookkeeper 节点的元数据
# journalDirectories: 当前 bookkeeper 节点的 Journal 数据存放路径(可指定多个在不同磁盘创建的路径,实现提高写入性能)
# ledgerDirectories: 当前 bookkeeper 节点的 ledger 存放目录

mkdir -p /data/pulsar/bookkeeper/{journal,ledgers}

# 执行初始化元数据命令,若出现提示则输入 Y 继续(该步骤只需在1个bookie节点执行1次)
./bookkeeper shell metaformat

# 在所有相关节点执行如下命令在后台启动 bookie
./pulsar-daemon start bookie
# 验证是否启动成功 (出现: Bookie sanity test succeeded 则代表启动成功)
./bookkeeper shell bookiesanity

部署 Pulsar Broker


# 在每个需要部署 Broker 的节点,修改 conf/broker.conf 配置文件,部分关键配置如下:
vim ~/pulsar/conf/broker.conf
clusterName=pulsar-cluster
zookeeperServers=node1:2181,node2:2181,node3:2181
configurationStoreServers=node1:2181,node2:2181,node3:2181
advertisedAddress=node1

# Tips:
# clusterName: 指定pulsar集群名称,需要之前 Zookeeper 初始化时  --cluster 的参数值相同
# advertisedAddress: 当前节点主机名或IP
# zookeeperServers: 指定Zookeeper集群,用来存放 broker 节点的元数据
# configurationStoreServers: 多集群部署时管理多个pulsar集群元数据的Zookeeper集群地址

# 在所有相关节点执行如下命令在后台启动 broker
./pulsar-daemon start broker

# 查看集群 brokers 节点情况
./pulsar-admin brokers list pulsar-cluster

# 若集群部署正常的话会显示如下结果:
# Tips: 代表此时集群内有存活的节点: IP1、IP2、IP3,端口号都是8080。到这一步,Pulsar的部署就完成了
# "node3:8080"
# "node1:8080"
# "node2:8080"

# -------------------------------------------------------------------------- *.conf

bookkeeper.conf	    
# BookKeeper 是个复制的日志存储系统,Pulsar 使用它来持久化存储所有消息

broker.conf	        
# 负责处理来自生产者的传入消息,将消息分发给使用者,在集群之间复制数据等等

client.conf        
# pulsar-client CLI 工具可用于将消息发布到Pulsar并消费来自Pulsar主题的消息,可使用此工具代替客户端库

discovery.conf	    
# Service discovery 配置文件,连接到 Broker 的客户端需要能够使用单个URL与整个Pulsar实例进行通信,Pulsar提供了内置的服务发现机制

zookeeper.conf	    
# 为内置的 ZooKeeper 进行配置,它为 Pulsar 处理各种与配置和协调相关的基本任务

global_zookeeper.conf	
# 为 configuration store 处理配置。多集群 Pulsar 实例时需单独配置,单集群 Pulsar 实例不需要

proxy.conf	        
# Pulsar 代理配置文件

standalone.conf	    
# 单机版配置文件

websocket.conf	    
# websocket 配置文件

schema_example.conf
# ......

Helm & kubernetes

# ref:
# https://pulsar.apache.org/docs/en/helm-deploy/
# https://pulsar.apache.org/docs/en/helm-overview

Pulsar core components:
#   ZooKeeper
#   Bookies
#   Brokers
#   Function workers
#   Proxies

Control Center:
#   Pulsar Manager
#   Prometheus
#   Grafana

# -------------------------------------------------------------------------------------- Reference ...

# 添加 Pulsar Helm 仓库
helm repo add apache https://pulsar.apache.org/charts
helm repo update

# 克隆 Pulsar Helm chart 的仓库
git clone https://github.com/apache/pulsar-helm-chart
cd pulsar-helm-chart

# -------------------------------------------------- Tips

# Helm Chart 专为生产用途设计,其部署生产就绪的 Pulsar 集群,包括核心组件和监控组件
# 可通过打开/关闭单个组件来自定义要部署的组件:
vim ~/pulsar-helm-chart/charts/pulsar/values.yaml
# ......
components:
  zookeeper: true
  bookkeeper: true
  autorecovery: true
  broker: true
  functions: true
  proxy: true
  toolset: true
  pulsar_manager: true

monitoring:
  prometheus: true
  grafana: true
# ......

# -------------------------------------------------- Install-local-storage-provisioner (optional) 

# 安装本地存储适配器(不建议生产)
# 当需要要将本地持久卷用作持久存储时,需为本地持久卷安装存储供应器 ...
helm repo add streamnative https://charts.streamnative.io
helm repo update
helm install pulsar-storage-provisioner streamnative/local-storage-provisioner

# -------------------------------------------------- TLS & Authentication (optional) 

# https://pulsar.apache.org/docs/en/helm-deploy/#install-cert-manager
# Pulsar Helm chart 使用 cert-manager 自动配置和管理TLS证书,需提前安装 cert-manager
# 在启用 TLS 之前必须为所需的组件配置TLS证书

# 安装 cert-manager (其安装脚本执行前需要能够翻墙)
git clone https://github.com/apache/pulsar-helm-chart
cd pulsar-helm-chart
./scripts/cert-manager/install-cert-manager.sh 

# 成功安装后可设置 values.yaml 文件中的 certs.internal_issuer.enabled 为 true ...
# 此时 Pulsar Helm chart 可使用 cert-manager 为配置的组件生成 selfsigningTLS 证书
vim ~/pulsar-helm-chart/charts/pulsar/values.yaml
# ......
certs:
  internal_issuer:
    enabled: true
    component: internal-cert-issuer
    type: selfsigning
# ......
tls:                            # 还可通过如下字段来自定义生成的TLS证书
  common:                       # common settings for generating certs
    duration: 2160h             # 90d
    renewBefore: 360h           # 15d
    organization:
      - pulsar
    keySize: 4096
    keyAlgorithm: rsa
    keyEncoding: pkcs8
  enabled: true                 # 直接将整个群集进行TLS加密(Tips:也可以配置是否为单个组件启用TLS)
  proxy:    
    enabled: false              # 为组件单独定义是否启用 TLS ...
    cert_name: tls-proxy    
  broker:                       # broker
    enabled: false  
    cert_name: tls-broker   
  bookie:                       # bookies
    enabled: false  
    cert_name: tls-bookie   
  zookeeper:                    # zookeeper
    enabled: false  
    cert_name: tls-zookeeper    
  autorecovery:                 # recovery
    cert_name: tls-recovery 
  toolset:                      # toolset
    cert_name: tls-toolset
# ......

# Tips:
# 默认情况下身份验证处于禁用状态: https://pulsar.apache.org/docs/en/helm-deploy/#authentication
# 默认情况下授权处于禁用状态,仅当启用身份验证后才能使用
# 可在 helm 的 values.yaml 中单独定义pulsar各组件的安装版本 ...

# -------------------------------------------------- Prepare_Helm_Release

# 运行脚本来创建安装 Pulsar Helm chart 所需的密码信息
# 账号 pulsar/pulsar 可用于登录 Grafana dashboard 与 Pulsar Manager ...
./scripts/pulsar/prepare_helm_release.sh -n ${namespace:=pulsar} -k ${helm-release-name:=pulsar-mini} -c

# 它将创建下列资源:
# 用于部署 Pulsar 的 Kubernetes 命名空间
# 生成 JWT secret keys 和 tokens 用于三个超级用户: broker-admin、proxy-admin、admin
# 默认情况下会生成一个非对称密钥对,可通过 --symmetric 参数指定生成对称的密钥 ... 
# 角色 proxy-admin 用于代理与代理进行通信
# 角色 broker-admin 用于代理间通信
# 角色 admin 由管理工具使用

# --------------------------------------------------

# 将集群部署至 Kubernetes,首次安装时需指定参数: --set initialize=true
# Tips: 部署期间可通过运行 helm status pulsar 命令检查进度
helm install \
--timeout 10m \
--set initialize=true \
--set namespace=pulsar \            # 部署的 Kubernetes 命名空间
--set volumes.local_storage=true \  # 默认将创建卷声明,期望动态供应底层持久卷,若需要本地的持久卷则需启用该参数
--set volumes.persistence=true      # 在在开发环境中可设为 false,生产环境需开启,默认即开启状态 ...

# 检查所有 pod 的状态
kubectl get pods -n pulsar
# NAME                                       READY   STATUS      RESTARTS   AGE
# pulsar-mini-bookie-0                       1/1     Running     0          9m27s
# pulsar-mini-bookie-init-5gphs              0/1     Completed   0          9m27s
# pulsar-mini-broker-0                       1/1     Running     0          9m27s
# pulsar-mini-grafana-6b7bcc64c7-4tkxd       1/1     Running     0          9m27s
# pulsar-mini-prometheus-5fcfd84c-w8mgz      1/1     Running     0          9m27s
# pulsar-mini-proxy-0                        1/1     Running     0          9m27s
# pulsar-mini-pulsar-init-t7cqt              0/1     Completed   0          9m27s
# pulsar-mini-pulsar-manager-9bb4d9f-htpcs   1/1     Running     0          9m27s
# pulsar-mini-toolset-0                      1/1     Running     0          9m27s
# pulsar-mini-zookeeper-0                    1/1     Running     0          9m27s

# 检查名称空间 pulsar 下所有服务的状态
kubectl get services -n pulsar
# NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP  PORT(S)                      AGE
# pulsar-mini-bookie          ClusterIP      None            <none>       3181/TCP,8000/TCP            11m
# pulsar-mini-broker          ClusterIP      None            <none>       8080/TCP,6650/TCP            11m
# pulsar-mini-grafana         LoadBalancer   10.106.141.246  <pending>    3000:31905/TCP               11m
# pulsar-mini-prometheus      ClusterIP      None            <none>       9090/TCP                     11m
# pulsar-mini-proxy           LoadBalancer   10.97.240.109   <pending>    80:32305/TCP,6650:31816/TCP  11m
# pulsar-mini-pulsar-manager  LoadBalancer   10.103.192.175  <pending>    9527:30190/TCP               11m
# pulsar-mini-toolset         ClusterIP      None            <none>       <none>                       11m
# pulsar-mini-zookeeper       ClusterIP      None            <none>       2888/TCP,3888/TCP,2181/TCP   11m

# Tips:
# 默认将通过 LoadBalancer 将 Pulsar 集群暴露出来,查看:
kubectl get services -n pulsar | grep pulsar-mini-proxy
# 集群的二进制端口和HTTP端口均进行的代理,80:xxx是HTTP端口,而6650:xxx是二进制端口 ...

# -------------------------------------------------- Ops Tools

# 默认情况下 Pulsar Manager 作为独立的 LoadBalancer 进行暴露,其默认账号为: pulsar/pulsar
# 访问 Pulsar Manager UI: http://<pulsar-manager-ip>:9527
# 1.点击左上角的 New Environment 按钮
# 2.在弹窗中的 Environment Name 栏输入 pulsar-mini
# 3.在弹窗中的 Service URL 栏输入 http://<pulsar-broker-ip>:8080
# 4.点击弹窗的 Confirm 按钮
# 5.成功创建环境后将被重定向到新环境的租户页面,此时即可使用 Pulsar Manager 来创建租户、命名空间和主题

# 默认情况下 Grafana 作为独立的 LoadBalancer 进行暴露: http://<grafana-dashboard-ip>:3000
# 其默认账号为: pulsar/pulsar

# -------------------------------------------------- CLI ...

# 进入 pulsar 的 toolset 容器并创建租户、命名空间、主题 ...
kubectl exec -it -n pulsar pulsar-mini-toolset-0 -- /bin/bash

# 创建名为 apache 的租户并输出租户信息
./pulsar-admin tenants create apache
./pulsar-admin tenants list
# Output:
# "apache"
# "public"
# "pulsar"

# 创建名为 pulsar 的命名空间并查看该租户下的命名空间
./pulsar-admin namespaces create apache/pulsar
./pulsar-admin namespaces list apache
# Output: "apache/pulsar"

# 在命名空间 apache/pulsar 下创建包含4个分区的主题: test-topic,并列出该命名空间中的所有分区主题
./pulsar-admin topics create-partitioned-topic apache/pulsar/test-topic -p 4
./pulsar-admin topics list-partitioned-topics apache/pulsar
# Output: "persistent://apache/pulsar/test-topic"

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 环境准备 - Pulsar集群 - Java 8 - Spring Boot 2.x - Pulsar Java Client 2. 添加依赖 在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client</artifactId> <version>${pulsar.version}</version> </dependency> <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-spring-boot-starter</artifactId> <version>${pulsar.version}</version> </dependency> ``` 其中`${pulsar.version}`为Pulsar的版本号。 3. 配置Pulsar连接信息 在`application.yml`中添加以下配置: ```yaml pulsar: serviceUrl: pulsar://localhost:6650 authPluginClassName: org.apache.pulsar.client.impl.auth.AuthenticationToken authParams: token:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 其中`serviceUrl`为Pulsar集群连接地址,`authPluginClassName`和`authParams`为认证信息,可以根据实际情况进行修改。 4. 发送消息 在Spring Boot中可以使用`PulsarTemplate`来发送消息,示例代码如下: ```java import org.apache.pulsar.client.api.MessageId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.util.concurrent.ListenableFutureTaskAdapter; @Service public class PulsarProducerService { @Autowired private PulsarTemplate<String> pulsarTemplate; public void sendMessage(String topic, String message) { ListenableFutureTask<MessageId> future = new ListenableFutureTaskAdapter<>(() -> pulsarTemplate.send(topic, message)); future.addCallback(new ListenableFutureCallback<MessageId>() { @Override public void onFailure(Throwable ex) { System.out.println("Send message failed: " + ex.getMessage()); } @Override public void onSuccess(MessageId result) { System.out.println("Send message success: " + result); } }); future.run(); } } ``` 在上述代码中,`PulsarTemplate`使用泛型`<String>`,表示发送的消息为字符串类型。`sendMessage`方法接收两个参数,分别为消息的主题和内容。发送消息的过程中,使用`ListenableFuture`来处理异步回调。在回调函数中,可以根据发送结果进行相应的处理。 5. 接收消息 在Spring Boot中可以使用`PulsarConsumerFactory`来创建消费者,示例代码如下: ```java import org.apache.pulsar.client.api.Consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class PulsarConsumerService { @Autowired private PulsarConsumerFactory pulsarConsumerFactory; public void receiveMessage(String topic, ConsumerMessageHandler<String> handler) throws Exception { Consumer<String> consumer = pulsarConsumerFactory.createConsumer(topic, "my-subscription", String.class); consumer.subscribe(); while (true) { String message = consumer.receive().getValue(); handler.handle(message); consumer.acknowledgeAsync(consumer.getLastMessageId()); } } } ``` 在上述代码中,`PulsarConsumerFactory`使用泛型`<String>`,表示接收消息的类型为字符串。`receiveMessage`方法接收两个参数,分别为消息的主题和消息处理器。在接收消息的过程中,使用`while`循环不断接收消息,并交给消息处理器进行处理。处理完成后,使用`acknowledgeAsync`方法对消息进行确认。 6. 运行测试 在完成上述步骤后,可以编写测试代码来测试消息的发送和接收。示例代码如下: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class PulsarApplicationTests { @Autowired private PulsarProducerService pulsarProducerService; @Autowired private PulsarConsumerService pulsarConsumerService; @Test void sendMessage() { pulsarProducerService.sendMessage("my-topic", "Hello, Pulsar!"); } @Test void receiveMessage() throws Exception { pulsarConsumerService.receiveMessage("my-topic", message -> { System.out.println("Received message: " + message); }); } } ``` 在运行测试代码后,可以在控制台中看到消息发送和接收的相关信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值