001 Pulsar 新一代消息队列,如何用单机搭建一个测试集群?

0 缘起

  1. Pulsar 是一个支持多租户的、高性能的消息中间件。
  2. 2018年11月中旬开始初步生产环境使用。
  3. Pulsar 官网,部署教程文档还不是很详细,网络上的教程基本都是官网的翻译版,对于一个没有丰富经验的开发者还是会踩一些坑,本文详细记录了如何利用一台服务器搭建一个简单测试集群的过程。

1 准备资源

  1. 一台主机(本文以 MacOS 为例)
  2. JDK8 运行环境(默认已准备好)

2 搭建集群的组成

  1. ZooKeeper 集群(3个 ZooKeeper 节点组成)
  2. bookie 集群(3个 BookKeeper 节点组成)
  3. broker 集群(3个 Pulsar 节点组成)

3 zookeeper 集群-搭建

(本文以 ZooKeeper 版本 3.4.12 为例;可以从链接下载最新的版本)
使用一台机器,在该机器上运行多个 ZooKeeper 服务进程,搭建 ZooKeeper 集群。

(1)下载 ZooKeeper,解压。
# Zookeeper官网下载地址
https://archive.apache.org/dist/zookeeper/
# 以 3.4.12 版本为例 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/
(2)将解压好的 zookeeper-3.4.12 复制到新建文件zookeepers 目录下,重名为 server1。用 server1 复制出server2 和 server3,目录结构如图所示。

在这里插入图片描述

(3)对 server1 进行配置(先对 ZooKeeper 的一个节点进行配置)。

1) 在 server1 目录下,新建 data 和 dataLog 两个文件夹,目录结构如下。

在这里插入图片描述


2)将 conf 目录下的 zoo_sample.cfg 文件重命名为zoo.cfg。如图所示。

在这里插入图片描述


3)修改 zoo.cfg 文件内容,主要修改以下5个配置参数,并添加集群节点信息。
# 修改以下5个参数,修改端口号是为了避免在一台服务器上造成端口号冲突
dataDir
dataLogDir
clientPort
admin.enableServer
admin.serverPort

# 添加如下集群节点信息
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

我的 server1 的 zoo.cfg 文件内容如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=10
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/Users/bilahepan/Softwares/zookeepers/server1/data
dataLogDir=/Users/bilahepan/Softwares/zookeepers/server1/dataLog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
admin.enableServer=true
admin.serverPort=9181
#
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1


对zoo.cfg 配置参数解释:

tickTime:ZooKeeper 中使用的基本时间单位, 毫秒值,默认2000ms。
initLimit:用来配置 ZooKeeper 服务器集群中Follower服务器初始化连接 Leader 服务器时最长能忍受多少个 tickTime。这里设置为10表示最长容忍时间为10s。
syncLimit:用来配置 Leader 与 Follower 之间发送消息、请求和应答时间最长能忍受多少个 tickTime。这里设置为4表示最长容忍时间为4s。
dataDir:数据文件目录。
dataLogDir:日志文件目录。
clientPort:监听client连接的端口号。
server.{myid}={ip}:{leader服务器交换信息的端口}:{当leader服务器挂了后, 选举leader的端口}
maxClientCnxns:对于一个客户端的连接数限制,默认是60。
admin.enableServer:是否启用 ZooKeeper 管理后台。
admin.serverPort:管理后台端口号。

zoo.cfg 文件在另外两个节点的配置说明:

在一台服务器上,部署多个实例,需要指定不同的端口号。
[1]clientPort: 3个 ZooKeeper 节点中分别配置为:2181,2182,2183
[2]admin.enableServer: 3个 ZooKeeper 节点中都配置为 true
[3]admin.serverPort: 3个 ZooKeeper 节点中分别配置为:9181,9182,9183
[4]集群节点信息3个 ZooKeeper 节点中都配置为:
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
4)在 server1/data/ 目录下创建名字为 myid 文件,并写入内容 1
向 myid 文件中写入内容 1
每一个 ZooKeeper 节点的 myid 文件内容都不能一样,它是不同节点的唯一标识。
3个 ZooKeeper 节点中 myid 文件内容分别为1,2,3

在这里插入图片描述

5) server1 配置完毕,对 server2,server3 按照以上所述做对应配置。
6)启动 ZooKeeper 集群,在终端分别用命令启动ZooKeeper 节点。
# 启动命令(zkServer.sh start)
./bin/zkServer.sh start
7)使用命令查看节点状态。
# 状态查看命令(zkServer.sh status)
./bin/zkServer.sh status

在这里插入图片描述

8)对 zookeeper 操作的其他命令。
# 连接 zookeeper 客户端
./bin/zkCli.sh -timeout 5000 -server 127.0.0.1:2181

# 查看 zookeeper 节点内容
ls /

4 bookie 集群-搭建

(bookie 是 BookKeeper 的别称。本文以 4.7.2 版本为例)。
使用一台机器,在该机器上运行多个 bookie 服务进程,搭建 bookie 集群。
(1)下载 bookkeeper,解压。
# BookKeeper 官网下载地址(本文以 4.7.2 版本为例))
https://bookkeeper.apache.org/releases/
(2)将解压好的 bookkeeper-server-4.7.2 复制到新建文件bookkeepers 目录下,重名为 bookie1。用 bookie1 复制出bookie2 和 bookie3,目录结构如图所示。

在这里插入图片描述

(3)对 bookie1 进行配置(先对 BookKeeper 的一个节点进行配置)。

1)修改 bk_server.conf 文件内容,主要修改以下3个端口号,避免在一台主机上造成端口号冲突,以及添加 ZooKeeper 集群节点信息,并指定两个文件目录地址。
# 修改如下3个参数
bookiePort
httpServerPort
storageserver.grpc.port

# 添加如下ZooKeeper 集群节点信息
zkServers=localhost:2181,localhost:2182,localhost:2183

# 指定两个文件目录地址
journalDirectories=/Users/bilahepan/Softwares/bookkeepers/bookie1/tmp/bk-txn
ledgerDirectories=/Users/bilahepan/Softwares/bookkeepers/bookie1/tmp/bk-data

在这里插入图片描述


bk_server.conf 文件在另外两个节点的配置说明:

在一台服务器上,部署多个实例,需要指定不同的端口号。
[1]bookiePort: 3个 bookie 节点中分别配置为:3181,3182,3183
[2]httpServerPort: 3个 bookie 节点中都配置为:8050,8060,8070
[3]storageserver.grpc.port: 3个 bookie 节点中都配置为: 4181,4182,4183
[4]zk集群节点信息: 3个 bookie 中都配置为:
zkServers=localhost:2181,localhost:2182,localhost:2183


2) bookie1 配置完毕,对 bookie2 ,bookie3 按照以上所述做对应配置。

3)执行初始化集群元数据命令(在一个 bookie 上执行即可),命令如下。
./bin/bookkeeper shell metaformat

在这里插入图片描述

4)启动 bookie 集群,在终端分别用命令启动 bookie节点。
./bin/bookkeeper bookie
5)检查 bookie 启动状态,集群启动成功会有 “Bookie sanity test succeeded” 日志输出。在一个 bookie 实例下执行如下命令。
./bin/bookkeeper shell bookiesanity

在这里插入图片描述


5 broker集群-搭建

broker 是 Pulsar 实例别称。(本文以 2.2.0 版本为例)。
使用一台机器,在该机器上运行多个 broker 服务进程,搭建 broker 集群。
(1)下载pulsar,解压。
# 本文以2.2.0 版本为例,建议下载最新版本
# Pulsar官网下载地址(apache-pulsar-2.2.0-bin-tar.gz)
http://pulsar.apache.org/zh-CN/download/
(2)将解压好的 apache-pulsar-2.2.0 复制到新建文件brokers 目录下,重名为 broker1。用 broker1 复制出broker2 和 broker3 ,目录结构如图所示。

在这里插入图片描述

(3)对 broker1 进行配置(先对 broker 的一个节点进行配置)。

1)修改 broker.conf 文件内容,主要修改以下4个端口号,避免在一台主机上造成端口号冲突,以及添加 ZooKeeper 集群节点信息,指定集群名。
# 修改如下4个参数
brokerServicePort
brokerServicePortTls
webServicePort
webServicePortTls

# 添加如下 ZooKeeper 集群节点信息
zookeeperServers=localhost:2181,localhost:2182,localhost:2183
configurationStoreServers=localhost:2181,localhost:2182,localhost:2183

# 指定集群名
clusterName=pulsar-cluster

在这里插入图片描述


broker.conf 文件在另外两个节点的配置说明:

在一台服务器上,部署多个实例,需要指定不同的端口号。
[1]brokerServicePort: 3个 broker 节点中分别配置为:6650,6660,6670
[2]brokerServicePortTls: 3个 broker 节点中分别配置为:6651,6661,6671
[3]webServicePort: 3个 broker 节点中分别配置为:8080,8081,8082
[4]webServicePortTls: 3个 broker 节点中分别配置为:8443,8444,8445
[5]zk集群节点信息: 3个 broker 中都配置为:
zookeeperServers=localhost:2181,localhost:2182,localhost:2183
configurationStoreServers=localhost:2181,localhost:2182,localhost:2183

2) broker1 配置完毕,对 broker2 ,broker3 按照以上所述做对应配置。
3)初始化集群元数据,在 broker1 中执行以下命令。
  bin/pulsar initialize-cluster-metadata \
  --cluster pulsar-cluster \
  --zookeeper 127.0.0.1:2181 \
  --configuration-store 127.0.0.1:2181 \
  --web-service-url http://pulsar.cluster.com:8080 \
  --web-service-url-tls https://pulsar.cluster.com:8443 \
  --broker-service-url pulsar://pulsar.cluster.com:6650 \
  --broker-service-url-tls pulsar+ssl://pulsar.cluster.com:6651

对集群元数据的解释:

--cluster
集群名称

--zookeeper
ZooKeeper集群连接参数,仅需要包含集群中的一个节点即可

--configuration-store
Pulsar实例的配置存储集群(ZooKeeper),和--zookeeper参数一样只需要包含集群中的一个节点即可

--web-service-url
集群Web服务的URL+端口,URL必须是一个标准的DNS名称,默认端口8080,不建议修改。

--web-service-url-tls
集群Web提供TLS服务的URL+端口,端口默认8443,不建议修改。

--broker-service-url
集群brokers服务URL,URL中DNS的名称和Web服务保持一致,URL使用pulsar替代http/http,端口默认6650,不建议修改。

--broker-service-url-tls
集群brokers提供TLS服务的URL,默认端口6551,不建议修改。


4)启动 broker 集群,在终端分别用命令启动 broker节点。启动成功后会有日志 “PulsarService started” 输出,命令如下。
./bin/pulsar broker

在这里插入图片描述


6 Pulsar 集群启动完毕,现用命令创建集群名、租户名、命名空间、topic并行给出测试demo。


(1)依次创建集群、租户、命名空间、分区topic、并为命名空间指定集群。
# 创建集群(集群名:pulsar-cluster)
./bin/pulsar-admin clusters create --url http://pulsar.cluster.com:8080  pulsar-cluster
# 创建租户(租户名:my-tenant)
./bin/pulsar-admin tenants create my-tenant
# 创建命名空间(命名空间名,指定了租户my-tenant:my-tenant/my-namespace)
./bin/pulsar-admin namespaces create my-tenant/my-namespace
# 创建持久性分区topic(topic全名:persistent://my-tenant/my-namespace/my-topic)
./bin/pulsar-admin topics create-partitioned-topic persistent://my-tenant/my-namespace/my-topic -p 3
# 更新命名空间为其指定集群
./bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace --clusters pulsar-cluster
(2)生产者,消费者测试demo。

1)maven依赖
 <dependency>
            <groupId>org.apache.pulsar</groupId>
            <artifactId>pulsar-client</artifactId>
            <!-- 指定你的版本 -->
            <version>2.2.0</version>
 </dependency>

2)生产者
public class PulsarProducerDemo {
    private static String localClusterUrl = "pulsar://localhost:6650";

    public static void main(String[] args) {
        try {
            Producer<byte[]> producer = getProducer();
            String msg = "hello world pulsar!";

            Long start = System.currentTimeMillis();
            MessageId msgId = producer.send(msg.getBytes());
            System.out.println("spend=" + (System.currentTimeMillis() - start) + ";send a message msgId = " + msgId.toString());
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public static Producer<byte[]> getProducer() throws Exception {
        PulsarClient client;
        client = PulsarClient.builder().serviceUrl(localClusterUrl).build();
        Producer<byte[]> producer = client.newProducer().topic("persistent://my-tenant/my-namespace/my-topic").producerName("producerName").create();
        return producer;
    }
}

3)消费者
public class PulsarConsumerDemo {
    private static String localClusterUrl = "pulsar://localhost:6650";
    public static void main(String[] args) {
        try {
            //将订阅消费者指定的主题和订阅
            Consumer<byte[]> consumer = getClient().newConsumer()
                    .topic("persistent://my-tenant/my-namespace/my-topic")
                    .subscriptionName("my-subscription")
                    .subscribe();
            while (true) {
                Message msg = consumer.receive();
                System.out.printf("consumer-Message received: %s. \n", new String(msg.getData()));
                // 确认消息,以便broker删除消息
                consumer.acknowledge(msg);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static PulsarClient getClient() throws Exception {
        PulsarClient client;
        client = PulsarClient.builder().serviceUrl(localClusterUrl).build();
        return client;
    }
}

「不甩锅的码农」原创,转载请注明来源,未经授权禁止商业用途!同名 GZH 请关注!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值