프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

WAS는 중간에서 Web server와 DB server 중간에서 내부 로직 처리로 인해 부하가 심하다.

따라서 WAS를 단 한개 쓰기 보다는 여러개를 같이 사용하고 로드 밸런서가 트래픽을 각각의  WAS로 전달해준다.

 

이전 글에 이어서  Webserver의 Apache에 로드 밸런서를 적용하여 WAS1과 WAS2에 트래픽이 분산되도록 만들어 주자.

[On-premise] Ubuntu server 망에서 DNS와 DHCP 동작 시키기

 

 

환경

 

 

 

 

Apahce 로드밸런서 세팅

로드밸런싱 활성화

a2enmod proxy_balancer

a2enmod lbmethod_byrequests

 

sudo nano /etc/apache2/sites-available/000-default.conf

세팅을 진행한다.

 

 

        <Proxy "balancer://mycluster">	# 밸런서 그룹
                BalancerMember http://was.renegades.com/team_data.php		
                BalancerMember http://was2.renegades.com/team_data.php		
                #load balancer로 전달될 주소를 DNS 주소로 넣어주었다.
                #DNS 가 없다면 서버 IP로 세팅
                ProxySet stickysession=ROUTEID
        </Proxy>
        ProxyPass /team1 "balancer://mycluster/"		#/team1 접근시 로드 밸런싱
        ProxyPassReverse /team1 "balancer://mycluster/"

 

service apache2 restart 로 재시작

 

 

 

/team1으로 접근시 WAS로 프록시 전달.

이제 다시 로드 할때마다 다른 WAS서버에서 데이터를 받아온다.

 

 

 

별도의 세팅이 없다면 라운드 로빈 방식으로 분산시키기 때문에, 접근할 때마다 다른 WAS로 접속된다.

 

 

 

Load Balancer의 세션 문제

Load Balancer는 유저를 기존 세션과 다른 WAS로 연결해줄 수 있다.

만약 WAS1에서  로그인 후에 WAS2로 넘어가진다면 로그인 데이터가 모두 손실되어 다시 로그인을 해야한다.

 

따라서 세션으로 연결한 WAS에 지속적으로 접속시켜주는 Sticky Session이 필요하다.

https://aws.plainenglish.io/what-are-sticky-sessions-5a20f7031eb4

 

 

또는 클라이언트의 쿠키 정보를 통해 세션을 저장하는 세션 스토어에서 WAS가 세션 데이터를 가져오는 방식으로도 해결할 수 있다.

우리는 세션 문제를 해결하기  Redis를 사용해 세션을 따로 저장시켜 불러오자.

 

 

 

 

Redis DB

Redis는 오픈 소스 인메모리 NoSQL 데이터 저장소이다. 주로 애플리케이션 캐시나 빠른 응답 속도를 가진 데이터베이스로 사용된다.

Redis는 다양한 인 메모리 데이터 구조 집합을 제공하므로 1밀리초 미만의 응답 시간을 구현합니다.

데이터베이스지만, 컴퓨팅 자원의 RAM에 데이터를 올려 두는 만큼 많은 데이터를 유지하긴 힘들어서 주로 캐싱과 세션 스토어 등의 목적으로 사용된다.

 

 

 

 

 

 

DB 서버에 Redis 설치

 

sudo apt-get update

sudo apt-get install redis-server

(다운이 안되면 nameserver8.8.8.8로 변경 혹은 보조 서버로 추가)

 

외부 접속 허용 설정

sudo nano /etc/redis/redis.conf

bind 0.0.0.0

 

 

필요하다면 패스워드 설정. 주석처리 시에 비번이 없음.

 

 

백그라운드 실행은 이미 yes 상태

 

 

 

 

 

레디스 동작확인

레디스는 6379 포트 사용

netstat -nlpt | grep 6379

 

 

 

간단히 사용해보기

Redis-cli -a <PassWord>           # redis 접근

 

Set key value     # key: value로 데이터 저장

Get key             #keyvalue 불러오기

 

 

Keys *              #전체 key 조회

 

 

 

 

 

 

 

Web server 로드밸런싱 설정

 

로드밸런싱 활성화

sudo a2enmod proxy_balancer

sudo a2enmod lbmethod_byrequests

 

로드 밸런서 설정

sudo nano /etc/apache2/sites-available/000-default.conf

 

 

사용할 모든 파일의 경로를 넣어주자.

 

		<Proxy "balancer://mycluster">	
                BalancerMember http://was.renegades.com:80 route=1	
                BalancerMember http://was2.renegades.com:80 route=2	
				ProxySet stickysession=ROUTEID		# 고정 세션 적용으로 사용하는 was에 계속 접속하도록 만들어줌
        	</Proxy>
        	ProxyPass /test.php "balancer://mycluster/test.php"		
		ProxyPassReverse /test.php "balancer://mycluster/test.php"
		ProxyPass /create_session.php "balancer://mycluster/create_session.php"		
		ProxyPassReverse /create_session.php "balancer://mycluster//create_session.php"
		ProxyPass /delete_session.php "balancer://mycluster/delete_session.php"		
		ProxyPassReverse /delete_session.php "balancer://mycluster/delete_session.php"

 

예제로 사용할 모든 소스 코드의 경로를 설정해주자.

우리의 코드는 phpheader loaction으로 바로 redirection을 주고 있다.

따라서 redirction에 대한 경로도 proxypass에 설정해 주어야 정상적으로 redirectionwas server로 된다.

 

 

 

 

 

 

 

WAS에 php-redis 연동 패키지 세팅

 

sudo apt-get install php8.1-redis   #설치

 

아래의 세팅 파일에 session 정보를 Redis db로 옮겨 사용하도록 설정한다.

sudo nano /etc/php/8.1/apache2/php.ini

session.save_handler = redis

session.save_path = "tcp://db.renegades.com:6379?auth=root"          #auth는 비번

 

 

설정 후

sudo service php-fpm restart  또는

sudo systemctl restart apache2

 

 

 

 

 

WAS에 PHP 파일 업로드

 

WAS들에 코드를 옮겨주자.

 

session_start로 php session이 만들어 지고

간단히 $_SESSION['username'] = 'exampleuser'; php 세션 데이터 삽입가능하다.

 

 

 

 

접속 세션 확인 결과

DNS 주소로 접속해서 세션을 생성하면 create_session.php로 만들어진 정보가 표시가 된다.

 

 

 

 

여기서 Server1에서는 server2의 세션 정보가 출력되고, server2에서는 server1의 정보가 출력된다.

이 이유는 로드 밸런서가 라운드 로빈 방식으로 동작하기 때문에, server1에서 세션 생성을 누르면 server2의 세션 생성 코드( create_session.php)로 요청이 전달되고 다시 WAS1 test.php로 돌아온다. 그 반대도 마찬가지다.

 

 

 

 

 

Redis 데이터 확인

 

 

 

시간이 지나면 세션 메모리는 사라지게 설정되어 있다.

 

 

여기서 생성되는 key 값은 php로 생성한 session id이다

 

 

 

redis에서도 key 값이 동일한 것을 확인할 수 있다.

 

창을 닫고 다시 열어보면 PHP session id가 변경되어 있다.

 

 

 

여기서 다시 세션 생성을 누르면 새로운 key 값으로 들어가게 된다.

 

 

 

 

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함