配置文件设计好了,下面我们来写我们的Python脚本了(这里仅仅给出一些主要代码,大致明白意思可以了)


1.import subprocess

2.from mako.template import Template

3.import yaml

4.

5.# 运行一个测试任务

6.def runTask(config, task):

7.    runAbench(config, task)

8.

9.def runAbench(config, task):

10.     # 得到完成的abench运行命令

11.     command = Template(config["abenchCommand"]).render(

12.         abenchPath=config["abenchPath"],

13.         parallelNum=task["parallelNum"],

14.         seconds=task["seconds"],

15.         targetHost=task["targetHost"],

16.         targetPort=task["targetPort"],

17.         queryFilePath=task["queryFilePath"],

18.         )

19.     pipe = subprocess.Popen(command,

20.         stdin=subprocess.PIPE,

21.         stdout=subprocess.PIPE,

22.         stderr=subprocess.PIPE,

23.         shell=True

24.         )

25.     # 读取abench的运行结果,因为可能得保存下来吧

26.     result = pipe.stdout.read()

27.     # 下面可能是保存结果什么的

28.

29.if __name__ == "__main__":

30.    config = yaml.load(file(configFile))

31.    for task in config["tasks"]:

32.       runTask(config, task)
 


  自动更新测试环境

  在我实际测试过程中,因为要更新的环境其实相当复杂,多的时侯需要去10几台机器上做更新环境、停止/启动进程的操作。但我这里主要介绍思路,多一些机器和进程其实都一样。

  接着刚才的配置文件,我们只是在每一个task中设计了加压任务,但在加压前需要更新哪些环境没有涉及,按照阿里巴巴的ISearch架构,我启动一个一行两列的Searcher环境,2列Searcher上有一个Merger,然后再有一个clustermap来监控。


1.abenchPath: /opt/usr/bin/abench  # abench在哪儿?

2.abenchCommand: "${abenchPath} -p ${parallelNum} -s ${seconds} -k --http -o /dev/null ${targetHost} ${targetPort} ${queryFilePath}"

3.# 关于Searcher的一些通用配置

4.searcher:

5.    templateConfigFile: /home/admin/access-log/searcher_server.cfg  # 因为启动时的监听端口等信息需要从下面的运行任务中读取,因此这个也设计成一个模版文件

6.    templateLogConfigFile: /home/admin/access-log/searcher_log.cfg

7.    # 在Search机器上操作的命令

8.    commands:

9.        - "${searchRoot}/bin/is_searcher_server -c ${configFile} -l ${logConfigFile} -k stop > /dev/null 2>&1"

10.        - "${searchRoot}/bin/is_searcher_server -c ${configFile} -l ${logConfigFile} -k start -d > /dev/null 2>&1"

11.# 关于Merger的一些通用配置,和Searcher差不多,不写了

12.

13.tasks:

14.  # 第一个测试用例,我可能需要测试单线程的情况

15.  -

16.    id: 1 # ID的作用是你在脚本中可以拿id作为结果存放的目录

17.    parallelNum: 1 # 并发数

18.    seconds: 1800 # 压半个小时

19.    targetHost: 10.20.137.22  # 目标主机

20.    targetPort: 9999

21.    queryFilePath: /home/admin/access-log/add-600w.query  # 请求放在这儿

22.

23.    # 两台Search机器,定义一个List

24.    searchers:

25.       -

26.         host: 10.20.150.61

27.         port: 6322 # 监听的端口

28.         username: test # 因为需要通过ssh协议登录上去操作,因此需要用户名密码。如果你已经把机器ssh都打通了,那不需要了

29.         password: 12345

30.         configFile: "${searchRoot}/scripts/conf/searcher_server.cfg" # 启动时运行的配置文件

31.         logConfigFile: "${searchRoot}/scripts/conf/searcher_log.cfg" # 启动时运行的日志文件

32.       -

33.         host: 10.20.150.60

34.         port: 6322

35.         username: test

36.         password: 12345

37.         configFile: "${searchRoot}/scripts/conf/searcher_server.cfg"

38.         logConfigFile: "${searchRoot}/scripts/conf/searcher_log.cfg"

39.

40.    # 我这边只有一台merger,如果merger也是有多台的话,也可以把这个设计成一个List

41.    merger:

42.       host: 10.20.137.22

43.       port: 6088

44.       username: test

45.       password: 12345

46.       configFile: "${searchRoot}/scripts/conf/merger_server.cfg"