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이 필요하다.
또는 클라이언트의 쿠키 정보를 통해 세션을 저장하는 세션 스토어에서 WAS가 세션 데이터를 가져오는 방식으로도 해결할 수 있다.
우리는 세션 문제를 해결하기 Redis를 사용해 세션을 따로 저장시켜 불러오자.
Redis DB
Redis는 오픈 소스 인메모리 NoSQL 데이터 저장소이다. 주로 애플리케이션 캐시나 빠른 응답 속도를 가진 데이터베이스로 사용된다.
Redis는 다양한 인 메모리 데이터 구조 집합을 제공하므로 1밀리초 미만의 응답 시간을 구현합니다.
데이터베이스지만, 컴퓨팅 자원의 RAM에 데이터를 올려 두는 만큼 많은 데이터를 유지하긴 힘들어서 주로 캐싱과 세션 스토어 등의 목적으로 사용된다.
DB 서버에 Redis 설치
sudo apt-get update
sudo apt-get install redis-server
(다운이 안되면 nameserver를 8.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 #key의 value 불러오기
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"
예제로 사용할 모든 소스 코드의 경로를 설정해주자.
우리의 코드는 php의 header loaction으로 바로 redirection을 주고 있다.
따라서 redirction에 대한 경로도 proxypass에 설정해 주어야 정상적으로 redirection이 was 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 값으로 들어가게 된다.
'개발 > 네트워크 & Ubuntu' 카테고리의 다른 글
[GNS3] 라우팅 경로 이중화 (AD, Metric, FTP, NTP) (0) | 2024.02.12 |
---|---|
[GNS3] 라우터 간의 IPSec VPN & Tunneling 적용하기 (1) | 2024.02.12 |
[On-premise] 내부망에서 Ubuntu server로 DNS와 DHCP 동작 시키기 (1) | 2024.02.02 |
[On-premise] Ubuntu server로 구성하는 Web 3Tier 아키텍처 (0) | 2024.02.02 |
[Ubuntu server] 배스천 호스트로 DB server 접속하기 (0) | 2024.01.31 |