1个不稳定版本
0.1.0 | 2023年1月31日 |
---|
#259 在 模拟
36KB
829 行
网络分区模拟器
用例
- 在不稳定(但可控)的网络条件下测试分布式协议的操作。
- 在不可靠的网络条件下测试Web服务的表现。(例如:禁用/启用服务器网络连接)。
架构
单个 节点
作为docker容器运行,形成一个测试节点集群。它们在准备好服务请求时将其地址和端口注册到 Consul
。节点还向Consul注册一个http健康检查,以便可以定期监控它们。
supervisor
节点是协调节点,它调整整个测试集群的 iptables
规则。supervisor通过查询Consul加载数据库集群的状态。一旦supervisor通过(通过 /api/v1/load_cluster
)加载了测试集群,supervisor就准备好服务分区API。
supervisor理解以下与网络相关的突变和查询
Partition
-POST api/v1/partition/<source_id>/<target_id>
:给定源节点和目标节点的ID,配置目标节点的防火墙,以便丢弃来自源节点的所有数据包。Heal
-POST api/v1/heal/<source_id>/<target_id>
:给定源节点和目标节点的ID,配置目标节点的防火墙,以便接受来自源节点的所有数据包。Restore
-POST api/v1/restore
:清除集群中的所有防火墙规则,以便所有节点可以相互通信。规则
-GET api/v1/rules/<target_id>
:给定目标节点的ID,列出在目标节点上当前配置的所有INPUT
规则。
用法
将系统Docker化成一个单进程,该进程在必要时与其他Docker容器进行通信。确保系统接受位于/health
的http
健康检查。
请以docker/test-node.Dockerfile
作为参考来构建您的Dockerfile。
FROM rust:1.66 AS build
WORKDIR /app
RUN apt-get update -y && apt-get upgrade -y
RUN apt-get install curl python3-venv openssh-client openssh-server iptables sudo -y
COPY register_service.py /register_service.py
RUN chmod +x /register_service.py
RUN python3 -m venv /var/venv/node
RUN /var/venv/node/bin/python -m pip install requests
RUN mkdir -p /etc/ssh
COPY docker/sshd_config /etc/ssh/sshd_config
# Application related config.
...
# Make sure the `register_service.py` script gets called before your applications boots up.
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
usermod --password $(echo "root" | openssl passwd -1 -stdin) root
service ssh restart
/var/venv/node/bin/python3 /register_service.py --name "test-node" --port 9000
# Now start your long running application that uses port 9000 to communicate with its peers.
...
直接使用docker/test-supervisor.Dockerfile
。一旦节点的Dockerfile设置完成,开始启动docker-compose
部署。
docker-compose up -d
test-supervisor
容器在端口3000
上暴露了一个HTTP API,可以用来控制测试集群中的网络分区。consul容器仅用于服务发现,但如果您有兴趣,可以通过consul
容器的端口8500
访问其UI。
依赖项
~13–29MB
~393K SLoC