部署 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"