STF高可用部署终极指南:构建永不宕机的Android测试环境
【免费下载链接】stfControl and manage Android devices from your browser.项目地址: https://gitcode.com/gh_mirrors/st/stf
STF(Smartphone Test Farm)是一款强大的开源工具,允许开发者从浏览器远程控制和管理Android设备。本指南将详细介绍如何构建一个高可用的STF部署环境,确保你的Android测试基础设施稳定可靠,满足持续集成和自动化测试的需求。
为什么需要高可用的STF部署?
在移动应用开发过程中,设备测试是至关重要的一环。传统的本地设备管理方式存在诸多痛点:设备资源利用率低、跨团队协作困难、测试环境不一致等。STF通过将设备集中管理并提供Web访问接口,完美解决了这些问题。
然而,随着团队规模扩大和测试需求增长,单一STF实例可能成为瓶颈。高可用部署不仅能提高系统可靠性,还能实现负载均衡,支持更多并发用户和设备,确保测试工作不间断进行。
STF设备管理界面展示了如何从浏览器轻松管理和控制多台Android设备
STF架构解析:理解高可用的基础
STF采用分布式架构,由多个独立组件构成,这些组件通过ZeroMQ和Protocol Buffers进行通信。了解这些组件的功能和交互方式,是构建高可用部署的基础。
核心组件及其作用
- Provider:连接物理设备,负责设备的发现、状态监控和命令执行
- Processor:作为设备和应用之间的桥梁,处理大部分通信逻辑
- App:提供Web界面,服务静态资源
- Websocket:实现客户端与服务器的实时通信
- Triproxy:通信代理,负责消息路由和负载均衡
- Database:使用RethinkDB存储设备状态、用户信息等数据
高可用架构拓扑
STF的分布式设计天然支持高可用部署。通过在多台服务器上部署关键组件,并配置负载均衡,可以实现整个系统的无单点故障。
STF核心拓扑结构展示了各组件之间的通信方式和数据流向
环境准备:构建高可用STF的前提条件
在开始部署前,确保你的环境满足以下要求:
硬件要求
- 应用服务器:至少2台,推荐4核8GB配置,用于部署App、Websocket、Processor等组件
- 设备服务器:根据设备数量确定,每台可连接约20-30台Android设备,需足够的USB端口和电源
- 数据库服务器:至少1台,推荐8核16GB配置,用于RethinkDB数据库
- 负载均衡器:1台,用于分发流量到多个应用服务器
软件要求
- 操作系统:Linux(推荐Ubuntu 16.04+或CoreOS)
- Docker:用于容器化部署STF组件
- Docker Compose:用于编排多个容器
- Systemd:用于服务管理
- Nginx:作为反向代理和负载均衡器
- RethinkDB:STF的主数据库
网络要求
- 所有服务器之间网络互通
- 设备服务器需能访问互联网(用于下载应用和系统更新)
- 外部访问需通过HTTPS,确保数据安全
部署步骤:从零开始构建高可用STF集群
1. 准备工作
首先,克隆STF代码仓库:
git clone https://gitcode.com/gh_mirrors/st/stf cd stf2. 数据库部署
RethinkDB是STF的核心数据库,建议部署为集群以确保数据可靠性:
# /etc/systemd/system/rethinkdb.service [Unit] Description=RethinkDB After=docker.service Requires=docker.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull rethinkdb:2.3 ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm %p ExecStartPre=/bin/mkdir -p /srv/rethinkdb ExecStart=/usr/bin/docker run --rm \ --name %p \ -v /srv/rethinkdb:/data \ -e "AUTHKEY=YOUR_RETHINKDB_AUTH_KEY_HERE" \ --net host \ rethinkdb:2.3 \ rethinkdb --bind all \ --cache-size 8192 \ --no-update-check ExecStop=-/usr/bin/docker stop -t 10 %p启动RethinkDB服务:
sudo systemctl daemon-reload sudo systemctl start rethinkdb sudo systemctl enable rethinkdb3. 核心组件部署
Triproxy部署
Triproxy是STF的通信枢纽,负责消息路由:
# /etc/systemd/system/stf-triproxy-app.service [Unit] Description=STF app triproxy After=docker.service Requires=docker.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm %p ExecStart=/usr/bin/docker run --rm \ --name %p \ --net host \ openstf/stf:latest \ stf triproxy app \ --bind-pub "tcp://*:7150" \ --bind-dealer "tcp://*:7160" \ --bind-pull "tcp://*:7170" ExecStop=-/usr/bin/docker stop -t 10 %p同样部署dev triproxy:
# /etc/systemd/system/stf-triproxy-dev.service [Unit] Description=STF dev triproxy After=docker.service Requires=docker.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm %p ExecStart=/usr/bin/docker run --rm \ --name %p \ --net host \ openstf/stf:latest \ stf triproxy dev \ --bind-pub "tcp://*:7250" \ --bind-dealer "tcp://*:7260" \ --bind-pull "tcp://*:7270" ExecStop=-/usr/bin/docker stop -t 10 %pProcessor部署
Processor是STF的工作horse,处理大部分业务逻辑:
# /etc/systemd/system/stf-processor@.service [Unit] Description=STF processor After=rethinkdb-proxy-28015.service BindsTo=rethinkdb-proxy-28015.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p-%i ExecStartPre=-/usr/bin/docker rm %p-%i ExecStart=/usr/bin/docker run --rm \ --name %p-%i \ --link rethinkdb-proxy-28015:rethinkdb \ openstf/stf:latest \ stf processor %p-%i \ --connect-app-dealer tcp://appside.stf.example.org:7160 \ --connect-dev-dealer tcp://devside.stf.example.org:7260 ExecStop=-/usr/bin/docker stop -t 10 %p-%i启动多个processor实例以实现负载均衡:
sudo systemctl start stf-processor@1 sudo systemctl start stf-processor@24. 设备管理部署
在每台设备服务器上部署ADB服务和Provider:
ADBD服务
# /etc/systemd/system/adbd.service [Unit] Description=ADB daemon After=docker.service Requires=docker.service [Service] TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull sorccu/adb:latest ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm %p ExecStart=/usr/bin/docker run --rm \ --name %p \ --privileged \ -v /dev/bus/usb:/dev/bus/usb \ --net host \ sorccu/adb:latest ExecStop=/usr/bin/docker exec %p adb kill-serverProvider服务
# /etc/systemd/system/stf-provider@.service [Unit] Description=STF provider After=adbd.service BindsTo=adbd.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p-%i ExecStartPre=-/usr/bin/docker rm %p-%i ExecStart=/usr/bin/docker run --rm \ --name %p-%i \ --net host \ openstf/stf:latest \ stf provider \ --name "%H/%i" \ --connect-sub tcp://devside.stf.example.org:7250 \ --connect-push tcp://devside.stf.example.org:7270 \ --storage-url https://stf.example.org/ \ --public-ip ${COREOS_PRIVATE_IPV4} \ --min-port=15000 \ --max-port=25000 \ --heartbeat-interval 10000 \ --screen-ws-url-pattern "wss://stf.example.org/d/%i/<%= serial %>/<%= publicPort %>/" ExecStop=-/usr/bin/docker stop -t 10 %p-%iSTF设备架展示了如何物理排列和连接多台Android设备
5. Web应用部署
部署App和Websocket组件,提供Web访问界面:
App服务
# /etc/systemd/system/stf-app@.service [Unit] Description=STF app After=rethinkdb-proxy-28015.service BindsTo=rethinkdb-proxy-28015.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p-%i ExecStartPre=-/usr/bin/docker rm %p-%i ExecStart=/usr/bin/docker run --rm \ --name %p-%i \ --link rethinkdb-proxy-28015:rethinkdb \ -e "SECRET=YOUR_SESSION_SECRET_HERE" \ -p %i:3000 \ openstf/stf:latest \ stf app --port 3000 \ --auth-url https://stf.example.org/auth/mock/ \ --websocket-url wss://stf.example.org/ ExecStop=-/usr/bin/docker stop -t 10 %p-%iWebsocket服务
# /etc/systemd/system/stf-websocket@.service [Unit] Description=STF websocket After=rethinkdb-proxy-28015.service BindsTo=rethinkdb-proxy-28015.service [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull openstf/stf:latest ExecStartPre=-/usr/bin/docker kill %p-%i ExecStartPre=-/usr/bin/docker rm %p-%i ExecStart=/usr/bin/docker run --rm \ --name %p-%i \ --link rethinkdb-proxy-28015:rethinkdb \ -e "SECRET=YOUR_SESSION_SECRET_HERE" \ -p %i:3000 \ openstf/stf:latest \ stf websocket --port 3000 \ --storage-url https://stf.example.org/ \ --connect-sub tcp://appside.stf.example.org:7150 \ --connect-push tcp://appside.stf.example.org:7170 ExecStop=/usr/bin/docker stop -t 10 %p-%i6. 负载均衡配置
使用Nginx作为反向代理和负载均衡器,分发流量到多个App实例:
# /etc/nginx/conf.d/stf.conf upstream stf_app { server 192.168.255.100:3100 max_fails=0; server 192.168.255.101:3100 max_fails=0; } upstream stf_websocket { server 192.168.255.100:3600 max_fails=0; server 192.168.255.101:3600 max_fails=0; } server { listen 443 ssl; server_name stf.example.org; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key; location / { proxy_pass http://stf_app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /socket.io/ { proxy_pass http://stf_websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } }高可用策略:确保系统稳定运行
1. 组件冗余
- Processor:部署多个实例,分担负载
- App/Websocket:多实例部署,通过负载均衡器分发流量
- Triproxy:关键通信节点,建议至少部署2个实例
- Database:RethinkDB集群,至少3个节点确保数据安全
2. 自动故障转移
- 使用Systemd的Restart=always确保服务自动重启
- 配置Nginx的max_fails和fail_timeout参数,自动剔除故障节点
- RethinkDB自动处理主从切换,确保数据服务不中断
3. 监控与告警
- 部署Prometheus和Grafana监控系统关键指标
- 监控设备连接状态、系统资源使用率、API响应时间
- 设置关键指标告警,及时发现并解决问题
4. 数据备份
- 定期备份RethinkDB数据
- 配置数据备份策略,确保数据可恢复
- 测试数据恢复流程,确保备份有效
性能优化:提升STF系统响应速度
1. 设备连接优化
- 使用高质量USB集线器和线缆,减少连接问题
- 为每台设备服务器配置足够的电源,避免供电不足
- 定期清理设备缓存和日志,保持设备性能
2. 网络优化
- 使用低延迟网络连接设备服务器和应用服务器
- 配置适当的网络缓冲区,优化实时数据流传输
- 考虑使用WebSocket压缩,减少网络带宽占用
3. 资源分配
- 根据设备数量合理分配Processor资源
- 为RethinkDB配置足够的内存,提高查询性能
- 优化Docker容器资源限制,避免资源竞争
4. 屏幕传输优化
STF支持多种屏幕传输方式,可根据网络情况选择:
- JPEG流:适合低带宽环境,牺牲部分画质
- WebP流:提供更好的压缩率和画质
- 原始流:最高画质,适合本地网络
STF屏幕控制界面展示了远程控制Android设备的实时画面
常见问题解决:高可用部署排障指南
1. 设备连接不稳定
- 检查USB连接和供电情况
- 重启ADBD服务:
sudo systemctl restart adbd - 检查Provider日志:
journalctl -u stf-provider@<id>
2. 系统响应缓慢
- 检查系统资源使用情况:
top或htop - 增加Processor实例数量
- 优化数据库查询性能
3. 数据同步问题
- 检查RethinkDB集群状态
- 确保所有节点网络通畅
- 查看数据库日志,排查同步问题
4. 负载均衡不均
- 检查Nginx配置,确保权重设置合理
- 监控各节点负载情况,调整负载均衡策略
- 考虑使用会话亲和性,提高用户体验
总结:构建企业级Android测试平台
通过本文介绍的方法,你可以构建一个高可用、高性能的STF部署环境,为团队提供稳定可靠的Android设备测试平台。关键要点包括:
- 理解STF架构,合理规划组件部署
- 实现核心组件冗余,消除单点故障
- 配置负载均衡,提高系统并发能力
- 建立完善的监控和告警机制
- 定期优化系统性能,确保稳定运行
随着移动应用开发的不断发展,STF将继续发挥重要作用,帮助团队提高测试效率,加速产品迭代。通过高可用部署,你可以充分发挥STF的潜力,为企业移动应用质量保驾护航。
官方部署文档可参考:doc/DEPLOYMENT.md,其中包含更详细的配置选项和高级部署策略。
【免费下载链接】stfControl and manage Android devices from your browser.项目地址: https://gitcode.com/gh_mirrors/st/stf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考