有时需要创建一个测试环境,通过人工引发负载来观察负载管理器(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
命令,如下所示:
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
命令,参考如下:
pulsar-perf simulation-controller --cluster <cluster to simulate on> --client-port <listen port for clients>
--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_group
和 stop_group
来修改和停止组。 所有 ZooKeeper 参数都来自于 zookeeper_host:port
列表。
复制(Copy)、模拟(Simulate)和流(Stream)之间的区别
命令 copy
,simulate
和 stream
看起来相似,但其实有很大的差异。 当模拟静态、外部的 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
命令:
pulsar-perf monitor-brokers --connect-string <zookeeper host:port>
控制台将不停的打印加载的数据,直到中断为止。