/*
* ubuntu 18.04 - 서버 3개 & 클라이언트
* HA-Proxy version : 1.8.40
*/
총 서버는 3개를 준비했다.
하나의 클라이언트에서 HAProxy 서버에 접속하면 HAProxy 서버가 연결된 2개의 서버에 로드밸런싱을 해준다.
roundrobbin 방식을 사용함!
1. HAProxy 설치
sudo add-apt-repository ppa:vbernat/haproxy-1.8
sudo apt-get update
sudo apt-get install haproxy
2. HAProxy Load Balancing 설정
sudo vi /etc/haproxy/haproxy.cfg
40 : Local_Server의 bind에는 HAProxy IP를 적어준다. 이 IP를 통해서 51줄과 52줄의 server에 접속하게 되는 것이다.
41 : 소켓통신이므로 mode는 tcp로 설정한다. 만약 web으로 하고 싶다면 http로 바꾸면 된다
52, 53 : 접속할 server의 IP 주소와 포트를 적어주면 된다.
3. 서버 설정
나는 AWS의 EC2 서버를 2개 할당받아서 사용했다.
1달 무료라서! 그리고 외부 접속이 가능해서 사용했다. 따로 서버호스팅 사이트를 써도 무관하다.
클라이언트에는 다음과 같은 코드를 만들고 실행파일을 만들어준다.
sudo vi client.c
/* client.c */
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char* argv[])
{
int my_sock;
struct sockaddr_in serv_addr;
int str_len;
if(argc != 3)
{
printf("%s <IP> <PORT>\n", argv[0]);
exit(1);
}
my_sock = socket(PF_INET,SOCK_STREAM,0); //1번
if(my_sock == -1)
printf("socket error \n");
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons(atoi(argv[2]));
if(connect(my_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) //2번
printf("connect error\n");
char message[15];
str_len = read(my_sock,message,sizeof(message)-1); //3번
if(str_len==-1)
printf("read error\n");
printf("서버에서 : %s \n", message);
close(my_sock); //4번
return 0;
}
gcc client.c -o client
HAProxy를 통해 접근될 서버 2개에 다음과 같은 코드를 넣어준 뒤 실행파일을 만들어준다.
sudo vi server.c
/* server.c */
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char* argv[])
{
int serv_sock;
int clint_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clint_addr;
socklen_t clnt_addr_size;
if(argc != 2)
{
printf("%s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM,0);
if(serv_sock == -1)
printf("socket error\n");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if(bind(serv_sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
printf("bind error\n");
if(listen(serv_sock,5)==-1)
printf("listen error\n");
clnt_addr_size = sizeof(clint_addr);
clint_sock = accept(serv_sock,(struct sockaddr*)&clint_addr,&clnt_addr_size);
if(clint_sock == -1)
printf("accept error\n");
char message[] = "hello client (server 1)"; //또는 server 2
write(clint_sock, message, sizeof(message));
close(serv_sock); //6번
close(clint_sock);
return 0;
}
gcc server.c -o server
4. HAProxy 실행
HAProxy 서버에서 HAProxy를 실행해준 뒤 상태를 확인한다. 아래 사진처럼 나오면 성공
systemctl start haproxy.service
netstat -nltp|grep 9999
systemctl status haproxy
5. 실행
우선 서버 2개를 실행시켜준다. 꼭 서버 먼저!
./server 9999
그다음 client를 실행시켜주는데 이때 IP와 포트는 2번에서 설정해준대로 설정한다.
./client 127.0.0.1 9999
같은 IP로 접속했는데도 다른 결과가 출력되는 모습을 볼 수 있다.
+ 참고 블로그
// socket 통신
https://m.blog.naver.com/cy2003k/222060153639
// HAProxy
https://kimtaekhan.tistory.com/4
https://tecadmin.net/how-to-setup-haproxy-load-balancing-on-ubuntu-linuxmint/
'프로젝트 > 21후반기 광운대 바람 작품' 카테고리의 다른 글
[2021 후반기 작품 완성] 분산 처리 서버 (0) | 2021.11.23 |
---|---|
[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 |