목표
목표.
이번 작품의 목표는 다량의 데이터가 들어왔을 때 두 개의 서버에서 나누어서 처리하는 분산 처리 서버 구현이었다.
원래 계획했던 작품은 웹페이지로 클라이언트에게 이미지 파일이 압축된 zip 파일을 받고, 메인 서버에서 zip 파일을 압축 해제하며 파일을 byte로 서브 서버에게 전송한다. 그러면 서브 서버가 ocr을 진행한 후 DB에 저장하는 작품이었다.
문제점
문제점 1.
web으로 클라이언트의 요청을 받으려했는데 그러면 MAIN server를 spring을 이용해 web server로 구현해야 했었다. spring을 사용하기 때문에 java를 사용했다. 근데 sub server는 C로 구현해서 통신이.... 너무 어려웠다.
이미지 하나의 전송까지는 성공했지만 2개부터 잘 되지 않았다..ㅠㅠ
문제점 2.
sub server는 AWS에서 무료로 제공하는 서비스를 이용했다. 근데 AWS에서 무료로 제공하는 서버의 성능이 너무 좋지 않았다. 어느 정도였냐면 tesseract를 사용하기 위해서는 opencv를 설치해야했는데 opencv의 컴파일이 되지 않았다. tesseract 진행 후 DB 구현하는 걸 구현은 해두었는데 서버에 올릴 수 없었다.
결과
결과.
그래서 결과적으로는 3개의 서버를 모두 C 서버로 구현해서 소켓통신을 했다.
결과물로는 클라이언트와 로드밸런싱과 DB 저장 정도? 계획했던 작품에 비해서는 결과가 제대로 나오지는 않았지만 load balancing과 socket 통신을 구현해볼 수 있는 기회였다.
설명.
AWS에서 2개의 서버를 대여한 후 아래의 "server.c" 코드(데이터 수신 및 DB 저장)를 각각 서버에 넣어주고 실행파일을 만든 후 서버를 실행시켜준다.
main server의 9999 port를 이용해서 로드밸런서를 구현했으므로 client는 main server의 9999 포트에 접속해서 이미지를 전송한다. 이때 파일 전송은 스레드로 구현해서 속도를 향상시켰다.
클라이언트는 같은 주소로 파일을 전송하지만 서버 두 개가 데이터를 번갈아서 받는 모습을 볼 수 있다. round robbin으로 로드밸런싱을 구현했기 때문에 순차적으로 데이터를 전송받는 것이다.
전송이 끝나면 이미지들이 DB에 저장된다.
코드
최종 코드.
https://github.com/ekgus2222/multiserver
GitHub - ekgus2222/multiserver: testset
testset. Contribute to ekgus2222/multiserver development by creating an account on GitHub.
github.com
결과 코드는 여기서!
[HAProxy] TCP 로드밸런싱
https://hyunisland.tistory.com/71
[HAProxy] TCP 로드밸런싱
/* * ubuntu 18.04 - 서버 3개 & 클라이언트 * HA-Proxy version : 1.8.40 */ 총 서버는 3개를 준비했다. 하나의 클라이언트에서 HAProxy 서버에 접속하면 HAProxy 서버가 연결된 2개의 서버에 로드밸런싱을 해준..
hyunisland.tistory.com
TCP 로드밸런싱은 여기서!
추가 코드.
[socket 통신] java client & c server 간 이미지 전송
https://hyunisland.tistory.com/68
[Tesseract + DB]
#include<string>
#include<tesseract/baseapi.h>
#include<leptonica/allheaders.h>
#include<opencv4/opencv2/opencv.hpp>
#include "/usr/include/mysql/mysql.h"
#include <string.h>
#include <stdio.h>
void main(int argc, char *argv[])
{
char* impath = argv[1]; // path 설정
string outText, imPath = impath;
Mat im = cv::imread(imPath, IMREAD_COLOR);
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY);
api->SetPageSegMode(tesseract::PSM_AUTO);
api->SetImage(im.data, im.cols, im.rows, 3, im.step);
outText = string(api->GetUTF8Text());
cout<<outText;
api->End();
MYSQL *connection=NULL, conn;
MYSQL_RES *sql_result;
MYSQL_ROW sql_row;
int query_stat;
char text[20];
strcpy(text, outText.c_str());
char time[80] = "230";
char query[255];
mysql_init(&conn);
connection = mysql_real_connect(&conn, DB_HOST,
DB_USER, DB_PASS,
DB_NAME, 3306,
(char *)NULL, 0);
if (connection == NULL)
{
fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
return;
}
// query_stat = mysql_query(connection, "select * from text");
// if (query_stat != 0)
// {
// fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
// return 1;
// }
// sql_result = mysql_store_result(connection);
// printf("%-11s %-11s %-11s\n", "id", "텍스트", "시간");
// while ( (sql_row = mysql_fetch_row(sql_result)) != NULL )
// {
// printf("%-11s %-11s %-11s\n", sql_row[0], sql_row[1], sql_row[2]);
// }
mysql_free_result(sql_result);
printf("input text : %s\n", text);
//fgets(text, 12, stdin);
CHOP(text);
printf("input time : %s\n", time);
//fgets(time, 80, stdin);
CHOP(time);
printf("\n");
sprintf(query, "insert into text(text,time) values ('%s', '%s')",
text, time);
query_stat = mysql_query(connection, query);
if (query_stat != 0)
{
fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
return;
}
else {
printf("insert ok\n");
}
mysql_close(connection);
}
'프로젝트 > 21후반기 광운대 바람 작품' 카테고리의 다른 글
[HAProxy] TCP 로드밸런싱 (0) | 2021.11.17 |
---|---|
[socket통신] java client & c server 간 이미지 파일 전송 (0) | 2021.11.14 |
[AWS EC2] EC2 인스턴트 생성 및 GUI 설치 (0) | 2021.11.02 |
[SpringBoot] 파일 업로드 서버 구축 - 10/6, 11/3 (0) | 2021.10.06 |
제안서-분산 처리 서버 구축 (0) | 2021.09.18 |