聊聊 Pulsar: Pulsar 分布式集群搭建

本文涉及的产品
云防火墙,500元 1000GB
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 聊聊 Pulsar: Pulsar 分布式集群搭建

一、集群搭建要求

1.1 搭建设计

搭建 Pulsar 集群至少需要 3 个组件:ZooKeeper 集群、Bookkeeper 集群和 Broker 集群(Broker 是 Pulsar 的自身实例)。这三个集群组件如下:

  • ZooKeeper 集群(3 个 ZooKeeper 节点组成)
  • Broker 集群(3 个 Pulsar 节点组成)
  • Bookkeeper 集群(也称为 Bookie 集群,3 个 BookKeeper 节点组成)

Pulsar 的安装包已包含了搭建集群所需的各个组件库。无需单独下载 ZooKeeper 安装包和 BookKeeper 安装包。(在实际生产环境中,ZooKeeper 我们并不仅仅应用在 Pulsar 上,包括 HBase 等其他的组件也需要依赖,所以生产环境 ZooKeeper 最好使用外置 ZooKeeper 集群环境)

注:如果是在内网测试环境搭建集群,为了避免防火墙造成端口开启繁琐,可以关闭服务器防火墙。

1.2 几种搭建方式

1.2.1 方式 1

  • 官方建议需要 6 台机器
  • 3 台用于运行 ZooKeeper 集群,建议使用性能较弱的机器,Pulsar 仅将 ZooKeeper 用于与协调有关的定期任务和与配置有关的任务,而不用于基本操作。
  • 3 台用于运行 Bookkeeper 集群和 Broker 集群,建议使用性能强劲的机器。

1.2.2 方式 2

但是也可以在一台机器上同时部署 ZooKeeper,Bookkeeper ,Broker ,也就是最少需要三台机器就可以部署一个 Pulsar 集群。

1.2.3 方式 3

其实也还可以在 3 台机器上部署 ZooKeeper 集群,另外 3 台机器部署 Bookkeeper 集群,另 3 台机器部署 Broker 集群,也就是共需要消耗 9 台机器。

1.3 系统要求

当前,Pulsar 可运行在 64 位 macOS、Linux 和 Windows 上。要想运行 Pulsar,你需要安装 64 位 JRE/JDK 8 或更新版本。

老周这里采用的是 Pulsar 2.9.1 版本。

安装包下载:apache-pulsar-2.9.1-bin.tar.gz

1.4 架构介绍

老周这里本来是采用方式 1 来搭建的,踩了坑,Pulsar 2.9.1 版本中 PulsarZooKeeperClient 依赖的 ZooKeeper 是 3.6.3 版本,和我的 zookeeper 版本不兼容,我又不想换掉。所以还是用 Pulsar 内置的 ZooKeeper 吧,故采用方式 2 来搭建。

这里老周是 Mac 系统,所以采用 Parallels Desktop 虚拟机来模拟 3 台机器出来,如果你是 Windows 系统,可以采用 VMware 虚拟机。

虚拟机节点分配如下:

二、准备工作

  • 配置三台主机的/etc/hostname文件,配置主机名称。
    各个主机分别修改主机名称,比如 10.211.55.7 这台主机的主机名称修改成 pulsarCluster7。
  • 配置/etc/hosts,配置主机名和 ip 地址的映射关系。
10.211.55.7 pulsarCluster710.211.55.8 pulsarCluster810.211.55.9 pulsarCluster9
  • 如果主机名显示还未生效
    执行如下命令,让修改的主机名和 ip 地址的映射关系立即生效。
hostname $(cat /etc/hostname)
  • 上传安装包
    把 Pulsar 的安装包分别上传到 pulsarCluster7、pulsarCluster8、pulsarCluster9 主机上去
  • 解压至 /opt 目录
tar -zxf apache-pulsar-2.9.1-bin.tar.gz -C /opt

三、Pulsar 集群搭建

3.1 ZooKeeper 集群搭建

cd /opt/apache-pulsar-2.9.1/conf
vim zookeeper.conf

tickTime、dataDir 是修改,其他都是新增。

tickTime=10000
dataDir=/var/riemann/zookeeper/data
dataLogDir=/var/riemann/zookeeper/log
server.1=pulsarCluster7:2888:3888
server.2=pulsarCluster8:2888:3888
server.3=pulsarCluster9:2888:3888

参数说明:

tickTime:服务器之间或客户端与服务器之间维持心跳的时间间隔

dataDir:当前zookeeper节点的数据存放目录

dataLogDir:当前zookeeper节点的日志存放目录

server.1~3:为zookeeper集群的各节点指定编号

# pulsarCluster7、pulsarCluster8、pulsarCluster9都要操作
mkdir -p /var/riemann/zookeeper/data
mkdir -p /var/riemann/zookeeper/log
# pulsarCluster7节点操作
echo 1 > /var/riemann/zookeeper/data/myid
# pulsarCluster8节点操作
echo 2 > /var/riemann/zookeeper/data/myid
# pulsarCluster9节点操作
echo 3 > /var/riemann/zookeeper/data/myid

执行后台运行命令,这个命令是启动 zookeeper:

cd /opt/apache-pulsar-2.9.1/bin
./pulsar-daemon start zookeeper

执行 zookeeper 客户端连接命令:

cd /opt/apache-pulsar-2.9.1/bin
./pulsar zookeeper-shell

客户端正常连接,就算 zookeeper 启动好了。

在另外两台服务器上也执行 ./pulsar-daemon start zookeeper,启动 zookeeper 之后,在其中一个 zookeeper 节点的机器上,初始化集群元数据(总共只需执行一次):

例如在 pulsarCluster7 上:

./pulsar initialize-cluster-metadata \
--cluster pulsar-cluster \
--zookeeper pulsarCluster7:2181 \
--configuration-store pulsarCluster7:2181 \
--web-service-url http://pulsarCluster7:8080,pulsarCluster8:8080,pulsarCluster9:8080 \
--web-service-url-tls https://pulsarCluster7:8443,pulsarCluster8:8443,pulsarCluster9:8443 \
--broker-service-url pulsar://pulsarCluster7:6650,pulsarCluster8:6650,pulsarCluster9:6650 \
--broker-service-url-tls pulsar+ssl://pulsarCluster7:6651,pulsarCluster8:6651,pulsarCluster9:6651

集群元数据说明:

注:如果没有DNS服务器,也可以使用多主机(multi-host)格式的service-url设置web-service-url,web-service-url-tls,broker-service-url,broker-service-url-tls。

看到这个日志的话,说明初始化 Broker 集群元数据成功了。

也可以通过./pulsar zookeeper-shell 进入 zk 控制台,通过 ls / 查看所有 zk 节点。如果能看到 bookies,ledgers 等节点,则说明初始化成功了。

如果需要关闭 zookeeper,可使用命令:

cd /opt/apache-pulsar-2.9.1/bin
./pulsar-daemon stop zookeeper

3.2 BookKeeper 集群搭建

在每个部署 bookkeeper 的机器上,修改如下关键配置项:

mkdir -p /var/riemann/pulsar/data/journal
mkdir -p /var/riemann/pulsar/data/ledgers
cd /opt/apache-pulsar-2.9.1/conf
vim bookkeeper.conf
# 修改其第56行,修改本地ip地址。
advertisedAddress=pulsarCluster7
# 修改其第39行
journalDirectory=/var/riemann/pulsar/data/journal
# 修改其第400行
ledgerDirectories=/var/riemann/pulsar/data/ledgers
# 修改其第628行
zkServers=pulsarCluster7:2181,pulsarCluster8:2181,pulsarCluster9:2181
# 修改其第570行
prometheusStatsHttpPort=8100

注:

  1. prometheusStatsHttpPort默认是8000,但实际上在bookkeeper.conf中,httpServerPort默认也是8000,会导致端口被占用。
  2. 上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个,其它两个机器同理设置成pulsarCluster8、pulsarCluster9。
  3. 参数说明:
    advertisedAddress:指定当前节点的主机名或IP地址
    zkServers:指定zookeeper集群,用来将bookkeeper节点的元数据存放在zookeeper集群
    journalDirectories:当前bookkeeper节点的journal数据存放目录。如果需要提高磁盘写入性能,可以指定多个目录用来存放journal数据,关键是每一个目录必须在不同的磁盘,不然反而会影响写入性能。
    ledgerDirectories:当前bookkeeper节点的ledger存放目录

执行初始化元数据命令,若出现提示,输入Y继续(该步骤只需在一个bookie节点执行一次,总共只需执行一次):

./bookkeeper shell metaformat

在三台机器上,分别输入以下命令来以后台进程启动 bookie:

./pulsar-daemon start bookie

验证是否启动成功:

./bookkeeper shell bookiesanity

出现Bookie sanity test succeeded则代表启动成功。

如果需要关闭 bookkeeper,可使用命令:

./pulsar-daemon stop bookie

3.3 Broker 集群搭建

在每个部署 Broker 的机器上,通过编辑 Broker 配置文件,修改如下关键配置项:

cd /opt/apache-pulsar-2.9.1/conf
vim broker.conf
# 修改其第101行,修改集群的名称。
# clusterName与前面zookeeper初始化的cluster一致
clusterName=pulsar-cluster
# 修改其第23行,配置zk集群的地址。
zookeeperServers=pulsarCluster7:2181,pulsarCluster8:2181,pulsarCluster9:2181
# 修改其第26行,配置zk集群的地址。
configurationStoreServers=pulsarCluster7:2181,pulsarCluster8:2181,pulsarCluster9:2181
# 修改其第47行,更改为本地主机名。
advertisedAddress=pulsarCluster7

注:

  1. 上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个,其它两个机器同理设置成pulsarCluster8、pulsarCluster9。
  2. 参数说明:
    zookeeperServers:指定zookeeper集群,用来将broker节点的元数据存放在zookeeper集群
    configurationStoreServers:多集群部署时管理多个pulsar集群元数据的zookeeper集群地址,单集群部署时可以和zookeeperServers设置一样。
    advertisedAddress:指定当前节点的主机名或IP地址
    clusterName:指定pulsar集群名称

在每个部署 Broker 的机器上,以后台进程启动 Broker。

cd /opt/apache-pulsar-2.9.1/bin
./pulsar-daemon start broker
# 注:pulsarCluster7、pulsarCluster8、pulsarCluster9 三个节点依次启动

如果需要关闭 broker,可使用命令:

./pulsar-daemon stop broker

查看集群 brokers 节点是否启动成功

./pulsar-admin brokers list pulsar-cluster

我们部署正常的话,这一步会显示如下结果;

"pulsarCluster7:8080"

"pulsarCluster9:8080"

"pulsarCluster8:8080"

代表此时集群内有存活的节点: pulsarCluster7、pulsarCluster8、pulsarCluster9,端口号都是8080。

到此,Pulsar 的分布式集群搭建成功!

四、测试

4.1 模拟开启消费者监听数据

pulsarCluster8 节点模拟消费者

4.2 模拟开启生产者生产数据

pulsarCluster9 节点模拟生产者

4.3 消费者成功接收消息

五、遇到的问题

5.1 zookeeper 配置 tickTime 参数小了

安装内置的 zookeeper 的过程中,遇到了错误。

Unable to read additional data from server sessionid 0x0, likely server has closed socket

把 tickTime 参数调成 10000 就好了。

也有可能是其它原因导致的:

  • zookeeper 集群未成功启动
    zookeeper 你配置的是集群,但你只启动了一个节点,,zookeeper 就会认为服务处于不可用状态。zookeeper 有个选举算法,当整个集群超过半数机器宕机,zookeeper 会认为集群处于不可用状态。所以,3 台机器只启动一台无法连接,如果启动 2 台及以上就可以连接了。
  • 防火墙未关闭
    显示防火墙状态
    systemctl status firewalld
    关闭防火墙
    systemctl stop firewalld

5.2 内存不足

官网要求,jvm 内存需要在 2g,而我的虚拟机只有 1g 的内存,导致 broke r创建失败。

这里需要关掉虚拟机增加内存。或者更改参数来调整分配的大小。

默认情况下,Pulsar 为启动分配 2G JVM 堆内存。可以在 PULSAR_MEM 下的 conf/pulsar_env.sh 文件中修改。这是传递给 JVM 的额外选项。

但是修改这个之后发现还是报这个错误,所以可能这个必须要给 2G 以上的内存才可以。

重新分配内存之后,重新按照步骤依次启动 zookeeper、bookeeper、broker,然后查看集群,三个节点的信息全部都正常。


Java案。

相关文章
|
2月前
|
算法 调度
电动汽车集群并网的分布式鲁棒优化调度matlab
电动汽车集群并网的分布式鲁棒优化调度matlab
|
2天前
|
消息中间件 缓存 监控
如何设计一个秒杀系统,(高并发高可用分布式集群)
【7月更文挑战第4天】设计一个高并发、高可用的分布式秒杀系统是一个非常具有挑战性的任务,需要从架构、数据库、缓存、并发控制、降级限流等多个维度进行考虑。
12 1
|
3天前
|
关系型数据库 分布式数据库 PolarDB
**PolarDB开源指南:构建分布式数据库集群**踏上PolarDB开源之旅,了解如何从零开始搭建分布式集群
【7月更文挑战第3天】**PolarDB开源指南:构建分布式数据库集群**踏上PolarDB开源之旅,了解如何从零开始搭建分布式集群。采用存储计算分离架构,适用于大规模OLTP和OLAP。先准备硬件和软件环境,包括Linux、Docker和Git。然后,克隆源码,构建Docker镜像,部署控制节点和计算节点。使用PDCli验证集群状态,开始探索PolarDB的高性能与高可用性。在实践中深化学习,贡献于数据库技术创新。记得在安全环境下测试。
10 1
|
12天前
|
Prometheus 运维 监控
解锁分布式云多集群统一监控的云上最佳实践
为应对分布式云多集群监控的挑战,阿里云可观测监控 Prometheus 版结合 ACK One,凭借高效纳管与全局监控方案有效破解了用户在该场景的监控运维痛点,为日益增长的业务需求提供了一站式、高效、统一的监控解决方案,实现成本与运维效率的双重优化。助力企业的数字化转型与业务快速增长,在复杂多变的云原生时代中航行,提供了一个强有力的罗盘与风帆。
55271 9
|
12天前
|
SQL 关系型数据库 MySQL
MySQL高可用架构设计:从主从复制到分布式集群
MySQL高可用性涉及主从复制、半同步复制和Group/InnoDB Cluster。主从复制通过二进制日志同步数据,保证故障时可切换。半同步复制确保事务在至少一个从服务器确认后才提交。Group Replication是多主复制,支持自动故障切换。InnoDB Cluster是8.0的集成解决方案,简化集群管理。使用这些技术能提升数据库的稳定性和可靠性。
205 2
|
25天前
|
分布式计算 负载均衡 并行计算
Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索
该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。
134 4
|
1月前
|
负载均衡 运维 监控
负载均衡与容错性:集群模式在分布式系统中的应用
本文由小米分享,解释了分布式系统中的集群模式。集群模式是通过组合多个服务器节点,共同提供服务,实现高可用性、负载均衡和扩展性。文章介绍了主控节点的角色及其高可用性策略,如主备模式和选举机制,并以Zookeeper为例详细阐述了其工作机制。集群模式的优势在于高可用性、负载均衡、扩展性和数据一致性,但也面临节点通信、数据一致性、故障检测和管理等挑战。最后,作者鼓励读者讨论和交流相关技术问题。
236 5
|
15天前
|
Java 网络安全
分布式系统详解--框架(Zookeeper-简介和集群搭建)
分布式系统详解--框架(Zookeeper-简介和集群搭建)
109 0
|
15天前
|
分布式计算 资源调度 监控
分布式系统详解--框架(Hadoop-集群搭建)
分布式系统详解--框架(Hadoop-集群搭建)
88 0
|
2月前
|
Java 大数据 流计算
使用Docker快速部署Flink分布式集群
使用Docker快速部署Flink分布式集群
191 0

热门文章

最新文章