有时需要创建一个测试环境,通过人工引发负载来观察负载管理器(load managers)是如何处理负载的。 负载模拟控制器(simulation controller)、负载模拟客户机(simulation client)和 Broker 监视器(broker monitor)将使得负载创建和观察负载对管理器的影响变得容易。

模拟客户端

模拟客户端(simulation client)是一个程序,它可以创建和订阅消息速率和大小可配的 topic。 有时需要使用多个客户端来模拟大负载,此时用户不需要直接与客户端交互,而是将请求委托给模拟控制器(simulation controller),然后模拟控制器将向客户端发送信号以开启负载。 The client implementation is in the class org.apache.pulsar.testclient.LoadSimulationClient.

用法

要启动模拟客户端,请使用 pulsar-perf 脚本并结合 simulation-client 命令,如下所示:

  1. pulsar-perf simulation-client --port <listen port> --service-url <pulsar service url>

然后模拟客户端就可以接收模拟控制器的命令了。

模拟控制器

模拟控制器(simulation controller)向模拟客户端发送信号,要求他们执行创建新的 topic,停止旧的 topic,改变 topic 上的负载等类似任务。 It is implemented in the class org.apache.pulsar.testclient.LoadSimulationController and presents a shell to the user as an interface to send command with.

用法

要启动模拟控制器,使用pulsar-perf 脚本并结合simulation-controller 命令,参考如下:

  1. pulsar-perf simulation-controller --cluster <cluster to simulate on> --client-port <listen port for clients>
  2. --clients <comma-separated list of client host names>

在控制器启动之前需要先启动客户端。 启动后将有一段简单的提示,之后就可以在交互环境里向模拟客户端发出指令。 参数通常包括租户、命名空间和 topic。 在所有情况下,都使用租户、命名空间和 topic 的 BASE 名称。 例如,对于 topic persistent://my_tenant/my_cluster/my_namespace/my_topic,租户名称是 my_tenant,命名空间名称是 my_namespace,topic 的名称是 my_topic。 控制器可以执行以下操作:

  • 创建一个 topic (包含一个 producer 和一个 consumer)
    • trade <tenant> <namespace> <topic> [--rate <message rate per second>] [--rand-rate <lower bound>,<upper bound>] [--size <message size in bytes>]
  • 创建一组 topic (都包含一个 producer 和一个 consumer)
    • trade_group <tenant> <group> <num_namespaces> [--rate <message rate per second>] [--rand-rate <lower bound>,<upper bound>] [--separation <separation between creating topics in ms>] [--size <message size in bytes>] [--topics-per-namespace <number of topics to create per namespace>]
  • 更改现有 topic 的配置
    • change <tenant> <namespace> <topic> [--rate <message rate per second>] [--rand-rate <lower bound>,<upper bound>] [--size <message size in bytes>]
  • 更改一个 topic 组的配置
    • change_group <tenant> <group> [--rate <message rate per second>] [--rand-rate <lower bound>,<upper bound>] [--size <message size in bytes>] [--topics-per-namespace <number of topics to create per namespace>]
  • 关闭先前创建的 topic
    • stop <tenant> <namespace> <topic>
  • 关闭以前创建的 topic 组
    • stop_group <tenant> <group>
  • 将历史数据从一个 ZooKeeper 复制到另一个 ZooKeeper,并基于该段历史中的消息速率和大小进行模拟
    • copy <tenant> <source zookeeper> <target zookeeper> [--rate-multiplier value]
  • 在当前的 ZooKeeper 上使用历史数据的做负载模拟(应该是正在模拟的同一个 ZooKeeper)
    • simulate <tenant> <zookeeper> [--rate-multiplier value]
  • 从给定的活动 ZooKeeper 中传输最新数据,以模拟该 ZooKeeper 的实时负载
    • stream <tenant> <zookeeper> [--rate-multiplier value]

这些命令中的 “group” 参数允许用户同时创建或影响多个 topic。 通过调用 trade_group 命令创建组,随后可使用 chang_groupstop_group 来修改和停止组。 所有 ZooKeeper 参数都来自于 zookeeper_host:port 列表。

复制(Copy)、模拟(Simulate)和流(Stream)之间的区别

命令 copysimulatestream 看起来相似,但其实有很大的差异。 当模拟静态、外部的 ZooKeeper 负载时,可以使用 copy。 因此,source zookeeper 应该是你想要复制的 Zookeeper, target zookeeper 应该是你正在模拟的 Zookeeper,然后两个负载管理器将充分利用历史数据进行模拟。 而 simulate 是只接受一个 ZooKeeper 的,就是您正在模拟的那个。 它假设您在一个拥有历史数据能给 SimpleLoadManagerImpl 使用和能为 ModularLoadManagerImpl 创建等效的历史数据的 ZooKeeper 上进行模拟。 然后,客户端根据历史数据进行负载模拟。 最后,流(stream) 是从一个 Zookeeper(不同于正在模拟的 ZooKeeper)中流式加载数据并在当前 Zookeeper 中模拟实时加载。 在所有情况下,可选的rate-multiplier 参数允许用户更改负载比例。 如,使用--rate-multiplier 0.05 将导致消息的发送速率仅为模拟负载速率的 5%

Broker 监控

To observe the behavior of the load manager in these simulations, one may utilize the broker monitor, which is implemented in org.apache.pulsar.testclient.BrokerMonitor. Broker 监视器在通过 watchers 获得更新后,将向控制台打印载入数据的表。

用法

要启动 broker 监视器,请使用 pulsar-perf 脚本中的 monitor-brokers 命令:

  1. pulsar-perf monitor-brokers --connect-string <zookeeper host:port>

控制台将不停的打印加载的数据,直到中断为止。