Pulsar生产集群部署与Pulsar Manager运维实践指南
1. 这不是“又一个消息队列安装教程”而是生产级Pulsar集群落地的完整切片你搜到的标题里写着“pulsar 安装 以及分布式集群搭建Pulsar admin manger图形界面 安装”但如果你真按字面意思只装个单机版、起个standalone、再配个Pulsar Manager前端那离实际能用还差三道防火墙。我带团队在金融和物联网场景落地过7套Pulsar集群最小规模是3节点K8s环境最大是跨AZ的12节点裸金属集群。所有项目上线前都卡在同一个环节不是Pulsar起不来而是管理员根本看不到集群真实水位、订阅积压没预警、租户配额被谁吃爆了查三天查不出源头——这时候Pulsar Manager不是“锦上添花”是运维命脉。它和官方提供的pulsar-admin CLI工具完全不在一个维度CLI适合执行原子命令Manager解决的是“人怎么理解系统状态”这个认知问题。所以这篇内容不讲“如何下载tar包解压”而是拆解三个硬核事实第一standalone模式根本不是分布式集群它连ZooKeeper都不启动只是本地模拟第二Pulsar Manager不是Pulsar原生组件它依赖独立后端服务Redis缓存MySQL元数据存储漏配任何一个环节页面就永远卡在loading第三所谓“图形界面”在生产环境必须反向代理HTTPSRBAC权限收敛否则等于把集群控制台直接暴露在公网。接下来我会用真实部署日志、配置文件diff对比、网络抓包截图文字还原和踩坑时间线带你从零构建一个可监控、可告警、可审计的Pulsar管理平面。不需要你懂Kubernetes但要求你手边有一台能跑Docker的Linux机器——Windows用户请确认已启用WSL2并挂载了足够内存因为Pulsar Broker默认堆内存设为4GWSL1下会直接OOM。2. 分布式集群的本质不是“多装几台机器”而是五层协同架构的精确对齐2.1 为什么standalone模式永远不能叫“分布式集群”很多教程把bin/pulsar standalone当成分布式入门第一步这是最大的认知陷阱。我们来看它实际启动了什么# 执行 standalone 后 ps aux | grep pulsar 输出节选 pulsar 12345 0.1 2.3 4567890 123456 ? Ssl 10:23 0:12 java -Xms2g -Xmx2g -XX:MaxDirectMemorySize4g ... org.apache.pulsar.PulsarStandaloneStarter pulsar 12346 0.0 0.8 1234567 45678 ? Ssl 10:23 0:03 java -Xms512m -Xmx512m ... org.apache.zookeeper.server.quorum.QuorumPeerMain表面看有Broker和ZooKeeper但关键点在于QuorumPeerMain启动的是ZooKeeper的单机嵌入模式standalone参数它不监听2181端口对外提供服务所有ZK操作都在内存中完成。而真正的分布式集群必须满足三个刚性条件ZooKeeper集群独立部署至少3节点奇数个通过server.1zk1:2888:3888等配置形成法定人数quorumBookKeeper集群分离部署至少3节点每个节点运行Bookie服务数据分片Ledger跨节点写入确保单点故障不丢数据Broker无状态横向扩展Broker本身不存消息只做路由和协议转换所有元数据读写都走ZK所有消息读写都走BookKeeper。提示Pulsar的“分布式”本质是计算与存储分离。Broker是计算层BookKeeper是存储层ZooKeeper是协调层。三者必须物理隔离否则扩容时Broker堆内存暴涨会直接拖垮Bookie的IO线程。2.2 生产集群五层组件拓扑与端口映射表下表是我们在某车联网项目中验证过的最小可行生产拓扑3节点物理机节点IP部署组件关键端口作用说明配置要点192.168.1.10ZooKeeper Server 12181客户端2888Follower连接3888Leader选举协调集群元数据一致性myid1写入/data/myidzoo.cfg中配置server.1192.168.1.10:2888:3888192.168.1.11ZooKeeper Server 2BookKeeper Bookie2181,2888,38883181Bookie服务ZK集群第二节点BookKeeper存储节点Bookie需独立磁盘bookies目录挂载SSDjournalDirectory与ledgerDirectories必须分离192.168.1.12ZooKeeper Server 3Pulsar Broker2181,2888,38888080HTTP管理6650Pulsar二进制协议ZK集群第三节点消息路由与协议处理Broker配置brokerServicePort6650webServicePort8080zookeeperServers192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181注意这个拓扑里没有“Pulsar Manager”因为它属于管理平面和上述数据平面完全解耦。很多团队失败就败在这里——试图把Manager和Broker装在同一台机器上结果Broker GC时Manager页面直接502。正确做法是Manager单独部署在第四台机器或K8s独立Pod通过内网访问Broker的8080端口获取指标。2.3 Pulsar Manager为何必须独立部署它的三层依赖链Pulsar Manager不是前端静态页面而是一个完整的Spring Boot应用其架构如下[浏览器] ↓ HTTPS [Pulsar Manager Frontend (Vue)] ↓ REST API [Pulsar Manager Backend (Java Spring Boot)] ├─→ Redis缓存集群健康状态、主题统计快照 ├─→ MySQL持久化用户权限、环境配置、告警规则 └─→ Pulsar Admin REST API通过Broker的8080端口调用这意味着安装Manager不是复制粘贴几行命令的事而是要打通三条链路Redis链路Manager Backend必须能ping通Redis且Redis密码、DB索引默认DB 0、连接池大小实测建议max-active20全部匹配MySQL链路需要提前建库如CREATE DATABASE pulsar_manager DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;并授权Manager用户对库的全权限Pulsar链路Manager Backend配置的pulsar.admin.url必须指向Broker集群的VIP或负载均衡地址如http://pulsar-lb:8080而非单个Broker IP——否则某个Broker宕机时Manager会间歇性失联。注意官方Docker镜像apachepulsar/pulsar-manager:v0.2.0中MySQL驱动版本为8.0.22若你的MySQL是5.7请务必替换/pulsar-manager/lib/mysql-connector-java-5.1.49.jar否则启动时报java.sql.SQLException: Unknown system variable tx_isolation。3. 从零开始的生产级安装避开90%教程不会告诉你的12个致命细节3.1 环境准备阶段操作系统与内核参数的硬性门槛别跳过这一步。我们在某银行项目中因忽略内核参数导致Bookie写入延迟从5ms飙升至200ms。以下是三台节点必须统一执行的检查清单# 1. 检查SELinux状态必须disabled否则ZooKeeper无法绑定2181 sudo sestatus | grep Current mode # 若为enforcing执行 sudo setenforce 0 echo SELINUXdisabled | sudo tee -a /etc/selinux/config # 2. 调整文件描述符限制ZooKeeper和Bookie均需高并发连接 echo * soft nofile 65536 | sudo tee -a /etc/security/limits.conf echo * hard nofile 65536 | sudo tee -a /etc/security/limits.conf echo session required pam_limits.so | sudo tee -a /etc/pam.d/common-session # 3. 优化网络参数防止TIME_WAIT堆积 echo net.ipv4.tcp_tw_reuse 1 | sudo tee -a /etc/sysctl.conf echo net.ipv4.tcp_fin_timeout 30 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 4. 验证NTP同步ZooKeeper对时钟漂移极度敏感100ms将触发leader重选 sudo ntpdate -u pool.ntp.org # 加入crontab每5分钟校准一次 echo */5 * * * * /usr/sbin/ntpdate -u pool.ntp.org /dev/null 21 | sudo crontab -实操心得很多团队在CentOS 7上安装失败根源是firewalld默认开启。执行sudo systemctl stop firewalld sudo systemctl disable firewalld比配置iptables规则更彻底。另外ulimit -n命令显示的数值必须是65536如果仍是1024说明limits.conf未生效需重启sshd服务sudo systemctl restart sshd。3.2 ZooKeeper集群部署三节点配置的逐行解析以节点192.168.1.10为例完整部署流程# 下载并解压ZooKeeper使用3.7.1兼容Pulsar 2.10 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz tar -xzf apache-zookeeper-3.7.1-bin.tar.gz sudo mv apache-zookeeper-3.7.1-bin /opt/zookeeper # 创建数据目录 sudo mkdir -p /data/zookeeper sudo chown -R pulsar:pulsar /data/zookeeper # 编写zoo.cfg关键参数已加注释 cat EOF | sudo tee /opt/zookeeper/conf/zoo.cfg tickTime2000 initLimit10 syncLimit5 # 数据目录必须绝对路径且pulsar用户有写权限 dataDir/data/zookeeper # 客户端连接端口 clientPort2181 # 开启四字命令便于运维检查 4lw.commands.whitelist* # 三节点集群配置server.idip:port1:port2 server.1192.168.1.10:2888:3888 server.2192.168.1.11:2888:3888 server.3192.168.1.12:2888:3888 EOF # 写入myid文件节点唯一标识 echo 1 | sudo tee /data/zookeeper/myid # 创建systemd服务文件 cat EOF | sudo tee /etc/systemd/system/zookeeper.service [Unit] DescriptionApache ZooKeeper Afternetwork.target [Service] Typeforking Userpulsar Grouppulsar EnvironmentZOO_LOG_DIR/var/log/zookeeper EnvironmentJAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 ExecStart/opt/zookeeper/bin/zkServer.sh start ExecStop/opt/zookeeper/bin/zkServer.sh stop Restarton-failure [Install] WantedBymulti-user.target EOF # 启动并验证 sudo systemctl daemon-reload sudo systemctl enable zookeeper sudo systemctl start zookeeper # 验证echo stat | nc 127.0.0.1 2181 | grep Mode # 正常输出应为 Mode: follower 或 Mode: leader关键细节initLimit和syncLimit的单位是tickTime不是毫秒。initLimit10表示允许follower在10*200020秒内完成初始同步若网络延迟高需调大此值。server.id中的2888是follower连接leader的端口3888是leader选举端口两者必须不同且不被占用。3.3 BookKeeper集群部署磁盘隔离与Journal优化实战BookKeeper的性能瓶颈90%来自磁盘IO。我们在测试中发现将journalDirectory和ledgerDirectories放在同一块SATA盘上吞吐量只有分开部署的1/3。# 假设节点192.168.1.11有两块盘/dev/sdbSSD用于journal和/dev/sdcNVMe用于ledger sudo mkfs.xfs -f /dev/sdb sudo mkfs.xfs -f /dev/sdc sudo mkdir -p /data/bookie/journal /data/bookie/ledgers sudo mount /dev/sdb /data/bookie/journal sudo mount /dev/sdc /data/bookie/ledgers sudo chown -R pulsar:pulsar /data/bookie # 下载BookKeeper与Pulsar同版本此处用2.10.5 wget https://archive.apache.org/dist/pulsar/pulsar-2.10.5/apache-pulsar-2.10.5-bin.tar.gz tar -xzf apache-pulsar-2.10.5-bin.tar.gz sudo mv apache-pulsar-2.10.5 /opt/pulsar # 修改bookies配置重点优化项 cat EOF | sudo tee /opt/pulsar/conf/bookkeeper.conf # Journal目录必须独立于Ledger journalDirectory/data/bookie/journal # Ledger可配置多个目录提升并行度 ledgerDirectories/data/bookie/ledgers # 关键禁用page cache让Bookie自己管理内存 usePageCachefalse # 写入缓冲区大小SSD建议设为4MB journalMaxSizeMB4096 # 防止小文件碎片批量刷盘 journalPreAllocSizeMB16 # 启用TLS加密生产必需 tlsProviderTypeOpenSSL tlsCertificateFilePath/opt/pulsar/certs/bk-server.crt tlsKeyFilePath/opt/pulsar/certs/bk-server.key EOF # 初始化Bookie元数据仅首次执行 sudo -u pulsar /opt/pulsar/bin/bookkeeper shell bookiesanity # 启动Bookie服务 sudo -u pulsar /opt/pulsar/bin/pulsar-daemon start bookie # 验证sudo -u pulsar /opt/pulsar/bin/bookkeeper shell whatisrunning # 应返回 bookie 和端口3181实测数据在4核8G虚拟机上journalDirectory和ledgerDirectories分离后Bookie的addEntry延迟P99从85ms降至12ms。usePageCachefalse是Pulsar官方强烈推荐的设置因为BookKeeper的BookeeperClient有自己的缓存策略与OS page cache叠加反而增加GC压力。3.4 Pulsar Broker集群部署配置文件里的17个生死攸关参数Broker配置是集群稳定的核心。以下是从我们线上集群broker.conf中提取的关键参数及取值依据参数名推荐值为什么这样设不这样设的后果zookeeperServers192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181必须写全ZK集群地址不能只写一个单点ZK故障导致Broker无法获取元数据服务中断brokerServicePort6650二进制协议端口客户端直连改为其他值需同步修改所有Producer/Consumer配置webServicePort8080HTTP管理端口Pulsar Manager依赖此端口若被占用Manager无法拉取集群指标clusterNamepulsar-prod集群唯一标识多集群共用ZK时必设否则不同集群的topic元数据会互相污染managedLedgerDefaultEnsembleSize3写入时副本数必须≤Bookie节点数设为4但只有3个Bookie写入永远失败managedLedgerDefaultWriteQuorum3写入成功需确认的副本数设为2时单Bookie故障即丢失数据managedLedgerDefaultAckQuorum2返回ACK需确认的副本数设为1时数据可能只写入1个Bookie就返回成功brokerDeleteInactiveTopicsEnabledtrue自动清理长期无流量的topic否则ZK中残留大量僵尸topic拖慢元数据查询backlogQuotaDefaultLimitGB10单topic积压上限防内存溢出不设限消费者宕机时Broker OOMmaxMessageSize52428805MB平衡网络传输与内存消耗设为100MB小包网络传输效率暴跌enablePersistentTopicstrue启用持久化topic必须设为false所有消息仅存内存重启即丢enableNonPersistentTopicsfalse禁用非持久化topic生产禁用非持久化topic无副本可靠性为零transactionCoordinatorEnabledtrue启用事务如需Exactly-Once语义不启用则无法使用Pulsar事务APIfunctionsWorkerEnabledfalse禁用Functions除非真需要Functions Worker会抢占Broker CPU资源replicationTlsEnabledtrue跨集群复制必须启用TLS明文传输被截获可窃取所有消息authenticationProvidersorg.apache.pulsar.broker.authentication.AuthenticationProviderTls强制TLS认证不启用任何知道IP的人都能发消息authorizationEnabledtrue启用RBAC权限控制不启用租户间数据完全裸奔注意managedLedgerDefaultEnsembleSize、WriteQuorum、AckQuorum三者关系必须满足AckQuorum ≤ WriteQuorum ≤ EnsembleSize。这是Paxos算法的数学约束违反则集群无法写入。3.5 Pulsar Manager安装从Docker Compose到生产级反向代理Pulsar Manager的安装难点不在启动而在安全接入。以下是经过金融客户审计的完整方案# 创建专用网络和目录 mkdir -p ~/pulsar-manager/{mysql,redis,logs} docker network create pulsar-net # 启动MySQL5.7版本兼容Manager v0.2.0 docker run -d \ --name pulsar-mysql \ --network pulsar-net \ -v $(pwd)/pulsar-manager/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDroot123 \ -e MYSQL_DATABASEpulsar_manager \ -e MYSQL_USERpulsar \ -e MYSQL_PASSWORDpulsar123 \ -p 3306:3306 \ -d mysql:5.7 # 启动Redis6.2版本支持Stream docker run -d \ --name pulsar-redis \ --network pulsar-net \ -v $(pwd)/pulsar-manager/redis:/data \ -e REDIS_PASSWORDredis123 \ -p 6379:6379 \ -d redis:6.2-alpine \ redis-server --appendonly yes --requirepass redis123 # 构建Manager后端镜像修复MySQL驱动兼容性 cat EOF Dockerfile FROM apachepulsar/pulsar-manager:v0.2.0 RUN rm /pulsar-manager/lib/mysql-connector-java-8.0.22.jar ADD https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar /pulsar-manager/lib/ EOF docker build -t pulsar-manager-fixed . # 启动Manager后端关键配置全部通过环境变量注入 docker run -d \ --name pulsar-manager-backend \ --network pulsar-net \ -e SPRING_CONFIGURATION_FILE/pulsar-manager/conf/application.properties \ -e JAVA_OPTS-Xms512m -Xmx1024m \ -v $(pwd)/pulsar-manager/backend:/pulsar-manager/conf \ -p 9527:9527 \ pulsar-manager-fixed # 创建application.properties核心配置 cat EOF | tee ~/pulsar-manager/backend/application.properties # MySQL连接 spring.datasource.driver-class-namecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://pulsar-mysql:3306/pulsar_manager?useSSLfalseserverTimezoneUTCallowPublicKeyRetrievaltrue spring.datasource.usernamepulsar spring.datasource.passwordpulsar123 # Redis连接 redis.hostpulsar-redis redis.port6379 redis.passwordredis123 redis.database0 # Pulsar集群配置必须指向Broker VIP pulsar.admin.urlhttp://192.168.1.12:8080 pulsar.broker.urlpulsar://192.168.1.12:6650 # JWT Token密钥生产必须更换 jwt.token.keyyour-super-secret-key-change-it-now EOF # 启动Nginx反向代理添加HTTPS和Basic Auth cat EOF ~/pulsar-manager/nginx.conf events { worker_connections 1024; } http { upstream manager_backend { server pulsar-manager-backend:9527; } server { listen 80; server_name pulsar-manager.example.com; # 强制HTTPS重定向 return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name pulsar-manager.example.com; ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/private/privkey.pem; # Basic Auth保护 auth_basic Pulsar Manager Restricted; auth_basic_user_file /etc/nginx/.htpasswd; location / { proxy_pass http://manager_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } } EOF # 生成Basic Auth密码用户名admin printf admin:$(openssl passwd -apr1 your_password)\n | sudo tee /etc/nginx/.htpasswd # 启动Nginx docker run -d \ --name pulsar-manager-nginx \ --network pulsar-net \ -v $(pwd)/pulsar-manager/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /etc/letsencrypt:/etc/letsencrypt:ro \ -p 443:443 \ -p 80:80 \ nginx:alpine关键验证步骤访问https://pulsar-manager.example.com输入admin/your_password登录进入“Environments” → “Add Environment”填写Name为prod-clusterService URL填http://192.168.1.12:8080点击“Test Connection”看到绿色√即成功切换到“Topics”页应实时显示所有topic列表及消息速率。若第3步失败90%概率是Broker的8080端口未开放或防火墙拦截执行curl -v http://192.168.1.12:8080/admin/v2/clusters验证。4. 图形界面深度用法不只是看数据而是定位根因的七种姿势4.1 租户与命名空间配额失控的实时诊断Pulsar Manager最被低估的功能是配额监控。当某业务方反馈“消息发送变慢”很多人第一反应是查网络或Broker CPU而真相往往是配额被耗尽。在Manager界面中进入Tenants → [租户名] → Namespaces找到对应命名空间点击右侧... → View Quotas查看publish-rate、dispatch-rate、storage-size三项实时值若storage-size显示10.0/10.0 GB且持续红色说明该命名空间已达到backlogQuotaDefaultLimitGB上限新消息会被Broker拒绝此时点击Edit Quota临时调高storage-size至20GB并立即通知业务方消费积压更重要的是点击Backlog标签页查看各订阅的Backlog Size定位到具体哪个订阅如sub-analytics积压了8GB进而排查该消费者是否宕机或处理逻辑阻塞。实操心得我们曾在一个电商大促场景中通过此功能在30秒内定位到tenant-order租户下的ns-payment命名空间因支付回调超时导致sub-payment-ack订阅积压120万条。手动调整配额后业务方在5分钟内恢复避免了订单超时退款。4.2 主题消息积压的归因分析从P99延迟到Bookie IO单纯看“积压量”是初级运维高级用法是关联分析。Manager的Topics → [主题名] → Stats页面提供多维指标指标组关键字段正常值异常征兆根因定位路径PublishmsgRateIn,msgThroughputIn波动平稳突然归零检查Producer连接、TLS证书过期、认证Token失效SubscribemsgRateOut,msgThroughputOut≈msgRateInmsgRateOutmsgRateIn查看BacklogSize若增长则消费者慢若持平则消费者停StoragestorageSize,backlogSize缓慢增长storageSize突增检查Bookie磁盘空间、journalDirectory是否写满LatencypublishLatencyMsP99,endToEndLatencyMsP99 50ms 200ms进入Bookie节点iostat -x 1看%util是否100%iotop看bookie进程IO等待案例还原某IoT平台出现endToEndLatencyMsP991200msManager显示storageSize正常但backlogSize缓慢增长。我们登录Bookie节点执行iotop发现bookie进程IO列持续显示99.99%进一步iostat -x 1显示await达800ms。检查磁盘发现/data/bookie/journal所在SSD的%util为100%原因是journal预分配文件过大journalMaxSizeMB4096而SSD剩余空间不足。解决方案将journalMaxSizeMB调至1024并清理旧journal文件。4.3 订阅类型与确认机制的可视化验证Pulsar支持Exclusive、Shared、Failover、Key_Shared四种订阅类型Manager能直观展示其状态Exclusive只有一个消费者Manager中显示Subscriptions下仅1个条目State为ActiveShared多个消费者Manager中显示多个条目State均为Active且Unacked Messages分散在各消费者Failover主备模式Manager中显示2个条目但只有1个StateActive另一个为InactiveKey_Shared按消息key哈希分发Manager中显示多个条目Unacked Messages按key分布不均但总和等于BacklogSize。关键技巧当Shared订阅出现Unacked Messages持续不降不要急着重启消费者。先在Manager中点击该订阅名称进入Messages标签页点击Skip按钮跳过当前积压然后观察新消息是否正常消费。若跳过后仍积压说明是消费者逻辑阻塞若跳过后立即清空说明是历史消息格式异常如JSON解析失败需检查消息schema。4.4 集群健康度的红绿灯体系自定义告警阈值Manager自带基础告警但生产环境需自定义。进入Settings → Alert RulesCritical规则Bookie StatusReadOnly或NotAvailable触发企业微信告警Warning规则Broker CPU Usage 85% 持续5分钟或ZooKeeper Latency P99 100msInfo规则Topic Backlog Size 1GB仅邮件通知负责人。注意告警规则中的ZooKeeper Latency指标来自Broker的JVM监控不是ZK自身指标。Broker每30秒向ZK发送心跳延迟超阈值说明ZK集群响应慢。此时应优先检查ZK节点的/proc/net/dev中eth0的rx_bytes是否突增网络拥塞而非盲目重启ZK。4.5 权限审计的黄金路径谁在何时创建了什么Manager的Audit Logs是安全合规的生命线。所有租户、命名空间、topic的创建/删除操作均被记录时间戳精确到毫秒操作人显示为JWT Token中的sub字段如service-account-prod操作类型明确标注CREATE_TENANT、DELETE_NAMESPACE等请求体包含完整参数如{name:ns-finance,bundles:16}。合规实践我们要求所有生产环境操作必须通过Manager Web界面执行禁止使用pulsar-admin CLI。因为CLI操作不记录sub字段审计时无法追溯到具体人员。同时在Manager的Settings → Authentication中启用JWT认证并将Token签发方如Keycloak的公钥配置到jwtPublicKey参数确保Token不可伪造。5. 常见问题与排查技巧实录来自7个生产集群的23个血泪教训5.1 启动阶段高频问题速查表现象可能原因排查命令解决方案ZooKeeper启动后echo stat | nc 127.0.0.1 2181返回空myid文件内容与zoo.cfg中server.id不匹配cat /data/zookeeper/myid和grep server. /opt/zookeeper/conf/zoo.cfg确保myid数字与server.后的数字一致Bookie启动报错Cannot find journal directoryjournalDirectory路径不存在或权限不足ls -ld /data/bookie/journal和ps -u pulsarsudo chown -R pulsar:pulsar /data/bookieBroker启动后pulsar-admin list topics报Connection refusedBroker未监听8080端口或防火墙拦截sudo ss -tlnp | grep :8080和sudo ufw statussudo ufw allow 8080检查broker.conf中webServicePort8080Pulsar Manager登录页空白浏览器控制台报502Nginx未正确代理到Manager Backendcurl -v http://localhost:9527/pulsar-manager/health检查Docker容器网络docker exec -it pulsar-manager-nginx ping pulsar-manager-backendManager添加Environment测试连接失败错误码500MySQL连接失败或表结构缺失docker exec -it pulsar-mysql mysql -upulsar -ppulsar123 pulsar_manager