Simulation tools

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

模拟客户端

模拟客户端(simulation client)是一个程序,它可以创建和订阅消息速率和大小可配的 topic。 有时需要使用多个客户端来模拟大负载,此时用户不需要直接与客户端交互,而是将请求委托给模拟控制器(simulation controller),然后模拟控制器将向客户端发送信号以开启负载。 客户端实现位于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 上的负载等类似任务。 它是在 org.apache.pulsar.testclient.LoadSimulationController 类中实现的,通过向用户提供一个 shell 作为用于发送命令的接口。

用法

要启动模拟控制器,使用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 监控

要在这些模拟中观察负载管理器的行为,可以使用 Broker 监控工具(broker monitor),他在org.apache.pulsar.testclient.BrokerMonitor中实现。 Broker 监视器在通过 watchers 获得更新后,将向控制台打印载入数据的表。

用法

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

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

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