聊聊 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 虚拟机。

虚拟机节点分配如下:

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

二、准备工作

  • 配置三台主机的/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

集群元数据说明:

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

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

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

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


也可以通过./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则代表启动成功。

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


如果需要关闭 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”

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


代表此时集群内有存活的节点: pulsarCluster7、pulsarCluster8、pulsarCluster9,端口号都是8080。
到此,Pulsar 的分布式集群搭建成功!

四、测试

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

pulsarCluster8 节点模拟消费者

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

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

pulsarCluster9 节点模拟生产者

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

4.3 消费者成功接收消息

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

五、遇到的问题

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 内存不足

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


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

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

默认情况下,Pulsar 为启动分配 2G JVM 堆内存。可以在 PULSAR_MEM 下的 conf/pulsar_env.sh 文件中修改。这是传递给 JVM 的额外选项。
但是修改这个之后发现还是报这个错误,所以可能这个必须要给 2G 以上的内存才可以。

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


Java

本篇文章来源于微信公众号: 老周聊架构

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10964.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!