搭建 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 虚拟机。
虚拟机节点分配如下:
| ip地址 | 节点名称 | ZooKeeper | Bookkeeper | Broker |
|---|---|---|---|---|
| 10.211.55.7 | pulsarCluster7 | QuorumPeerMain | Main | PulsarBrokerStarter |
| 10.211.55.8 | pulsarCluster8 | QuorumPeerMain | Main | PulsarBrokerStarter |
| 10.211.55.9 | pulsarCluster9 | QuorumPeerMain | Main | PulsarBrokerStarter |
配置三台主机的/etc/hostname文件,配置主机名称。
各个主机分别修改主机名称,比如 10.211.55.7 这台主机的主机名称修改成 pulsarCluster7。
配置/etc/hosts,配置主机名和 ip 地址的映射关系。
10.211.55.7 pulsarCluster7 10.211.55.8 pulsarCluster8 10.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
集群元数据说明:
| 标记 | 说明 |
|---|---|
| –cluster | 集群名称 |
| –zookeeper | ZooKeeper集群的“本地”连接字符串。 该连接字符串只需包含ZooKeeper集群任一台机器。 |
| –configuration-store | 整个集群实例的配置存储连接字符串。 和–zookeeper标记一样,该连接字符串只需包含ZooKeeper集群中的任一台机器即可。 |
| –web-service-url | 集群 web 服务的URL以及端口,这个URL应该是标准的DNS名称,默认的端口是8080(我们不建议使用其他端口) |
| –web-service-url-tls | 如果使用TLS,你必须为集群指定一个 TLS web 服务URL。默认端口是8443(我们不建议使用其他端口) |
| –broker-service-url | Broker服务的URL,用于与集群中的brokers进行交互。 这个 URL 不应该使用和 web 服务 URL 同样的 DNS名称,而应该是用pulsar方案。 默认端口是6650(我们不建议使用其他端口)。 |
| –broker-service-url-tls | 如果使用TLS,你必须为集群指定一个 TLS web 服务URL,以及用于集群中 broker TLS 服务的URL。 默认端口是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 zookeeper3.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
注:
prometheusStatsHttpPort默认是8000,但实际上在bookkeeper.conf中,httpServerPort默认也是8000,会导致端口被占用。上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个,其它两个机器同理设置成pulsarCluster8、pulsarCluster9。参数说明:
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 bookie3.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
注:
上面的advertisedAddress需要设置为对应机器的ip,而不是全设置为同一个,其它两个机器同理设置成pulsarCluster8、pulsarCluster9。参数说明:
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 的分布式集群搭建成功!
pulsarCluster8 节点模拟消费者
pulsarCluster9 节点模拟生产者
安装内置的 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,然后查看集群,三个节点的信息全部都正常。



