- 해당 서비스는 여러개의 Server를 한번에 관리 할 수 있게 해주는 서비스이다. 서비스에 등록된 각 서버의 현재 CPU 사용량, Power 사용량등을 확인할 수 있게 하고 Wake on LAN기능을 통해 불필요한 서버 사용량을 줄일 수 있게 해준다
서다찬 | 김민수 | 홍예지 | 전예빈 |
- npm
- mysql
- pm2
- express
-
sudo apt-get install npm
-
npm install pm2 -g
-
npm install mysql -S
-
npm install
-
apt-get install mysql-server
-
sudo apt-get install python3-pip
-
pip install flask
-
pip install shedule
-
pip install pymysql
-
pip install pycryptodomex
-
sudo apt-get powertop
- apt-get install powertop
- Server Computer
cd Python_data
# 백그라운드 실행
nohup python3 -u serverCom.py &
# [1] 21836 => 해당 Process ID를 출력하여 준다.
# 로그 기록 보기
tail -f nohup.out
# pid 로 백그라운드 실행 멈추기
sudo kill -9 21836
- Client Computer
# 백그라운드 실행
nohup python3 -u clientCom.py &
- 서버는 기본적으로 2개의 프로그램이 실행되고 있다.
- npm: npm은 기본 nodejs 웹 서비스를 가동시켜주는 프로그램으로써 사용자들에게 웹 페이지를 출력해주는 역할을 해준다.
- flask: flask는 python을 사용해서 각각의 서버 PC들에게 들어오는 입력 값들을 DB에 저장시켜주는 역할을 해준다.
- 두개의 기능을 분리시킨 이유는 서버PC들의 정보를 저장하면서 웹 서버측에서는 각각의 서버PC들이 현재 상태가 OFF인지 ON인지를 확인하기 위해서 계속해서 while문을 통해 확인을 해야하지만 웹 서버 특성상 주기적으로 이것을 확인하는 것이 불가능하다고 판단했다. 그렇기에 별도로 python 프로그램으로 분리시키고 서버 PC들의 상태를 확인하는 작업을 하고 이후 wake-on-lan을 사용할 때 신호를 보낼 수 있도록 했다.
- Web Service
- Web Service는 기본적으로 NodeJS 프레임워크를 통해 생성했다.
- Main화면에서는 기본적으로 각각의 Server의 Data를 Block형식으로 나타내주고 현재 CPU사용량을 Circle Progress bar를 통해 나타냈다. 해당 Server의 Block을 클릭 할 경우 각각의 Server의 History를 확인 할 수 있고 Menu에 있는 Add Server를 통해 새로운 Server를 추가할 수 있다.
- Main 화면 하단에는 각각의 Server의 가장 최신 정보들을 확인 할 수 있고 어떤 Server가 존재하는지 List 형식으로 확인이 가능하다. 그리고 필요가 없어진 Server의 경우에는 Delete 버튼을 통해 DB에 저장된 Key 값을 삭제 할 수 있다.
- 각각의 Server는 특정 Key value를 부여받게 되며 해당 Key value를 통해서 Client program이 Server Program에게 Data를 보내게 된다. Key value는 Random하게 생성이되고 모두 고유한 값을 가지게 된다.
- Server의 이름은 자유롭게 지정이 가능하다.
- History Page는 총 3가지로 나눠진다.
- CPU Usage
- CPU 사용량을 최근 30개 Data들을 출력해준다. 출력해주는 Data는 Chart형태로 출력이 되고 마우스를 가져다 대거나 화면을 터치하면 자세한 정보(시간, %)를 확인 할 수 있다.
- Power Usage
- Power의 경우 단위는 W단위로 Data가 저장이되고 해당 Data의 최근 30개를 출력해준다. 출력되는 형식은 CPU와 동일하게 Chart형태로 출력이 된다.
- History List
- History는 Table 형식으로 출력이되며 현재 Server로 들어온 Client의 Data들을 모두 출력해준다.
- Python script [Client Data Insert to DB]
- Web Server측에 각각의 Client Data들을 Insert하기 위해서 서버에서는 특정 Port를 사용해서 Data를 전송받도록 실행을 시켜 놓아야 한다. 이때 Data를 받기 위해서 Python web framework인 Flask를 사용했다.
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
req_data = request.args
# print(req_data.get('time'))
clientID = req_data.get('id')
sendTime = req_data.get('time')
cpu_usage = req_data.get('cpu_usage')
power_usage = req_data.get('power_usage')
user_num = req_data.get('user_num')
previousSendingTime[clientID] = sendTime
cur = conn.cursor()
sql_register = 'UPDATE server_list SET state=%s WHERE id like %s'
cur2 = conn.cursor()
sql_insert = 'insert ignore into history (id, time, cpu_usage, power_usage, user_num) values (%s, %s, %s, %s, %s)'
cur.execute(sql_register, ('ON', clientID)) # 처음 보낼 때 등록, OFF 되었다가 다시 전송되면 ON
if cpu_usage != None and user_num != None:
cur2.execute(sql_insert, (clientID, sendTime, cpu_usage, power_usage, user_num))
conn.commit() # 확실하게 저장
print('Done db insert')
return 'Success!'
- 보이는 것과 같이 Server측에서 실행되는 Python Script의 경우에는 특정 Port로 들어온 Request (Client의 History)를 받고 해당 Data를 Parsing해서 DB에 저장시키는 역할을 한다.
- Python script [ Send Data about Client Server ]
-
컴퓨터의 정보를 얻기 위해 파이썬으로 linux 명령어를 실행시킨 다음 출력되는 내용을 Parsing을 한 뒤, json 형태로 servmon.cafe24.com 5000번 flask 포트로 전송한다.
-
위 동작은 8초마다 실행한다.
- 작동 방식
- DB는 총 2가지의 Table로 구성이 되어 있다. DB를 사용하는 언어는 MYSQL을 사용했고 각각의 Attribute는 아래와 같다
- server_list => 등록한 서버의 리스트를 저장하는 table
- history => history를 저장하는 table