使用iControl获取F5负载均衡配置信息(二)
(2011-12-07 10:05:22)
标签:
杂谈 |
作者:杨洋
在"第一版"中, 由于SOAP请求次数过多, 导致获取配置信息的耗时较长, 获取一台有400组配置信息的设备耗时在5分钟左右.
后来经过研究, 在调用iControl API的时候, 传入List就可以通过一次SOAP请求, 批量获取数据. 流程如下:
1.调用LocalLB.VirtualServer下的get_list方法, 获取当前F5的VirtualServerList.
2.通过VirtualServerList调用LocalLB.VirtualServer下的get_destination方法, 取出结果中的Address和Port, 与VirtualServerList组成key/value格式的VirtualAddressList.
3.通过VirtualServerList调用LocalLB.VirtualServer下的get_object_status方法, 取出结果中的Status, 与VirtualServerList组成key/value格式的VirtualServerStatusList.
4.通过VirtualServerList调用LocalLB.VirtualServer下的get_default_pool_name方法, 取出结果中的PoolName, 与VirtualServerList组成key/value格式的DefaultPoolList.
5.通过VirtualServerList调用LocalLB.VirtualServer下的get_rule方法, 取出结果中的RuleName, 与VirtualServerList组成key/value格式的RuleList.
6.通过RuleList调用LocalLB.Rule下的query_rule方法, 取出结果中的RuleDefinition, 与RuleList组成key/value格式的DefinitionList.
7.循环遍历DefinitionList, 取出每一个Definition中的所有PoolName, 排重后组成RulePoolList.
8.将DefaultPoolList与RulePoolList合并, 排重后组成PoolList.
9.通过PoolList调用LocalLB.PoolMember下的get_ratio方法, 取出结果中的Address、Port和Ratio(同HAProxy的Weight), 与PoolList组成key/value格式的PoolMemberList.
10.通过PoolList调用LocalLB.Pool下的get_object_status方法, 取出结果中的Status, 与PoolList组成key/value格式的PoolStatusList.
11.经过以上10个步骤, 取出了所需要的配置信息, 循环遍历VirtualServerList, 通过VirtualServer为key, 可以取出VirtualAddress, RuleName, DefaultPool, VirtualServerStatus. 通过RuleName为key, 可以取出Definition. 通过PoolName为key, 可以取出PoolMember,和PoolStatus. 最终将每次的循环结果存放到对应的数据类型内.
该版本的获取流程只通过8次SOAP请求就取出了相关的配置信息, 只需要把这些配置信息组合成我们想要的格式即可.
使用该版本获取一台有400组配置信息的设备耗时在20秒内, 与上一版相比, 耗时缩短了N倍.
最终得到一个结论, 更多的去使用CPU和内存, 以减少网络请求的次数, 从而达到更高的性能.