一、集群搭建要求
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 虚拟机。
虚拟机节点调配如下:
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 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
注:
- 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 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
注:
- 下面的 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 的分布式集群搭建胜利!
四、测试
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,而后查看集群,三个节点的信息全副都失常。