0%

tomoon | 多节点部署

这里讲述了,我如何在多节点服务器上开启和关闭 tomoon 量化程序。

由于,各种原因,所以,多节点部署肯定会不断的升级,这里我将同时讲述采用该方案的背景已经可以实现的效果。


版本一


由于预算很小,所以,没有采用 jenkins 等自动化部署方式,而是通过 shell 进行连接远程服务器部署。

由于,跑程序的服务器「目前是一核一G」部署在香港、东京、新加坡等,所以,国内连接的时候不是很通畅,即便是科学之后也是如此。

所以,购买了一个一核0.5G的香港机器作为跳板机。

首先,跳板机必须和远程服务机进行 ssh 无密码登陆,本地也要和跳板机进行无密码登陆,因为,只有无密码登陆才能执行远程服务器指令。

整个过程是,我本地对跳板机发送指令,然后,跳板机对远程服务器发送指令。

指令主要有

  • 上传程序 「tar 包」
  • 解压程序包
  • 开始程序
  • 停止程序

上传程序

本地

文件 release_all.sh

内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

rm -rf ./logs/*
rm nohup.out
rm -rf ./quantify.tar.gz

tar zcvf quantify.tar.gz ./*

scp ./quantify.tar.gz root@跳板机IP:~
rm -rf ./quantify.tar.gz

sleep 1s

ssh root@跳板机IP "cd /root/ ; sh release.sh"

这里讲一下

ssh root@跳板机IP "cd /root/ ; sh release.sh"

这句话是连接跳板机,并在跳板机中执行

cd /root/
sh release.sh

跳板机

文件 release.sh

1
2
3
4
5
6
scp ./quantify.tar.gz  root@服务器IP:~/quantify
scp -P 8444 ./quantify.tar.gz root@服务器IP:~/quantify
scp ./quantify.tar.gz root@服务器IP:~/quantify
scp ./quantify.tar.gz root@服务器IP:~/quantify
scp ./quantify.tar.gz root@服务器IP:~/quantify
rm -rf ./quantify.tar.gz

这样就将程序上传到了远程服务器上。

解压程序包

在上面上传这一章节我们还遗留了一个问题

  • 如何证明你的新程序已经上传到了服务器上,而不会因为网络原因导致失败?

这就是,解压程序包所要解决的事情。

本地

文件 ready_all.sh

1
ssh root@跳板机IP "cd /root/ ; sh ready.sh"

执行跳板机上的 ready.sh

跳板机

文件 ready.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
echo 服务器IP
ssh root@服务器IP "cd /root/quantify ; sh ready.sh"
echo 服务器IP
ssh -p 8444 root@服务器IP "cd /root/quantify ; sh ready.sh"
echo 服务器IP
ssh root@服务器IP "cd /root/quantify ; sh ready.sh"
echo 服务器IP
ssh root@服务器IP "cd /root/quantify ; sh ready.sh"
echo 服务器IP
ssh root@服务器IP "cd /root/quantify ; sh ready.sh"
echo "\n"
echo 服务器IP
echo "\n"
ssh 服务器IP "cat /root/quantify/update.txt"
echo "\n"
echo 服务器IP
echo "\n"
ssh -p 8444 root@服务器IP "cat /root/quantify/update.txt"
echo "\n"
echo 服务器IP
echo "\n"
ssh root@服务器IP "cat /root/quantify/update.txt"
echo "\n"
echo 服务器IP
echo "\n"
ssh root@服务器IP "cat /root/quantify/update.txt"
echo "\n"
echo 服务器IP
echo "\n"
ssh root@服务器IP "cat /root/quantify/update.txt"

首先,跳板机会执行远程服务器上的 ready.sh 文件,内容如下

1
2
3
4
# 远程服务器上的 ready.sh 内容

tar zxvf quantify.tar.gz
sleep 1s

然后,输出

ssh root@服务器IP "cat /root/quantify/update.txt"

我每次上传都会更新 update.txt 里面的内容,如何,我正常上传,并且正常解压后,我本地展示的远程内容,应该是我更新后的内容。

这样,比照,就会发现是否成功执行。

开始程序

本地

文件 start_all.sh

1
ssh root@跳板机IP "cd /root/ ; sh start.sh"

跳板机

文件 start.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 香港
echo 服务器IP
ssh root@服务器IP "sh quantify.sh" # 完成
# 香港
echo 服务器IP
ssh -p 8444 root@服务器IP "sh quantify.sh" # 完成
# 香港
echo 服务器IP
ssh root@服务器IP "sh quantify.sh" # 完成
# 东京
echo 服务器IP
ssh root@服务器IP "sh quantify.sh" # 完成
# 新加坡
echo 服务器IP
ssh root@服务器IP "sh quantify.sh" #完成

远程服务器

文件 quantify.sh

1
2
3
rm -rf logs
rm nohup.out
nohup python3.7 /root/quantify/quantify.py --account 0 --ip *** >/dev/null 2>&1 &

本地和跳板机都没啥好说的,这里说一下远程服务器上的指令。

首先,我的程序是有 log 输出的,所以,我并不希望输入到 nohup.out 所以,在后面加了

>/dev/null 2

如果不加这个,必须要按一下 ctrl + c 这个是非常不友好的,说的比较抽象,可以在本地试一下。

另外,关于是否成功开始,我使用的是钉钉通知。

停止程序

这里我们必须解决,本地执行脚本的时候,检测服务器是否真的停止了程序。

本地

文件 stop_all.sh

1
ssh root@跳板机IP "cd /root/ ; sh stop.sh"

跳板机

文件 stop.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ssh root@服务器IP "cd ~/quantify ; sh stop.sh"
ssh -p 8444 root@服务器IP "cd ~/quantify ; sh stop.sh"
ssh root@服务器IP "cd ~/quantify ; sh stop.sh"
ssh root@服务器IP "cd ~/quantify ; sh stop.sh"
ssh root@服务器IP "cd ~/quantify ; sh stop.sh"

sleep 3s
echo 服务器IP
echo `ssh root@服务器IP "ps aux | grep python | grep quantify"`
sleep 1s
echo 服务器IP
echo `ssh -p 8444 root@服务器IP "ps aux | grep python | grep quantify"`
sleep 1s
echo 服务器IP
echo `ssh root@服务器IP "ps aux | grep python | grep quantify"`
sleep 1s
echo 服务器IP
echo `ssh root@服务器IP "ps aux | grep python | grep quantify"`
sleep 1s
echo 服务器IP
echo `ssh root@服务器IP "ps aux | grep python | grep quantify"`

服务器

文件 stop.sh

1
ps -ef | grep quantify | grep -v "color" | awk -F " " '{print $2}' | xargs kill -9

上面主要说一下跳板机的内容。

首先运行服务器上的 stop.sh 然后,输出服务器上的相关程序的状态。如果没有停止,则会输出相关的程序。

请我喝杯咖啡吧~