rm -rf swu_stresstest_example # 혹시 기존에 클론뜬 폴더가 존재한다면 삭제
git clone https://github.com/dev-library/swu_stresstest_example.git # 클론하기
cd swu_stresstest_example # 작업 폴더를 받아온 폴더로 이동
chmod 544 ./gradlew # gradlew의 권한을 바꿔서 실행가능하게 변경
./gradlew clean build # 클린 및 빌드를 통해 jar파일 생성
java -jar ./build/libs/spring_rest-0.0.1-SNAPSHOT.jar # 생성된 jar파일로 서버 실행
이와 같이 터미널창에서 빌드할 때 사용할 구문을 적어주면 된다.
빌드를 해보면 클론까지는 성공했으니 java가 없다는 오류를 볼 수 있다.
# apt install openjdk-17-jdk -y
# java -version
위 명령을 통해 자바를 설치할 수 있다.
젠킨스에서 다시 빌드해보면 빌드가 잘 되고, 위와 같이 잘 접속되는 것을 확인해볼 수 있다.
※ 돌고 있던 스프링부트 어플리케이션 종료는 ps -ef나 kill 등의 명령어로 종료시킬 수 있다.
해당 구문을 스크립트 파이프라인 상단에 배치하면 새로운 배포 시작 전에 무조건 프로세스를 종료시키면서 시작할 수 있다.
- 로그 파일은 시간이 지남에 따라 매우 커질 수 있기 때문에 로그파일을 주기적으로 교체해줄 필요가 있다.
2) 로그로테이션
① 로그 파일 설정
② 로그로테이션 설정
③ logrotate 설정 파일 작성
④ 로그로테이션 주기 설정
⑤ 로그 파일 압축 및 백업
⑥ 새로운 빈 로그 파일 생성
⑦ 로그 파일 삭제
☆ 로그로테이션은 시스템 관리에서 중요한 작업 중 하나이며 로그 파일의 크기를 관리하고 시스템 성능을 최적화하는 데 도움이 된다.
2. logrotate 패키지를 사용해 상세한 로그 파일 관리방침 설정하기
1) 패키지 설치
$ sudo apt-get install logrotate
2) logrotate 서비스 동작 원리
$ cat /etc/cron.daily/logrotate
logrotate 설치 시 cron에서 매일 자정에 수행하는 작업을 모아두는 /etc/cron.daily 경로 아래에 logrotate 파일이 생성된다.
즉, logrotate는 cron 서비스에 의해 daily job으로 실행되고, 매일 자정에 rotate 조건을 검사하고 실행한다.
3) logrotate.conf에 등록된 기본 경로에 스크립트 등록
$ cat /etc/logrotate.conf
logrotate.conf에서 rotate 스크립트를 등록할 기본 경로 확인
위와 같이 /etc/logrotate.d 경로에 등록된 스크립트를 감지하도록 되어 있다.
include </your/additional/logrotate/path> 구문으로 기본 경로로 삼을 디렉토리를 추가할 수 있다.
→ 기본 경로에 등록된 rotate 스크립트는 매일 자정에 조건 검사 및 수행
4) logrotate 설정 파일 예시
# 로그 파일을 저장할 경로 및 설정 시작
/var/log/syslog {
rotate 7 # 최대 7개의 백업 파일을 유지합니다.
size 30 # 30k 초과시 순환합니다.
daily # 매일 로그를 로테이션합니다.
create 0600 root root # rotation된 로그파일 생성
missingok # 로그 파일이 없는 경우 경고 없이 진행합니다.
notifempty # 로그 파일이 비어 있는 경우 로테이션을 스킵합니다.
delaycompress # 이전 로그 파일을 압축하기 전에 1회 로그를 더 남깁니다.
compress # 이전 로그 파일을 압축합니다.
postrotate # 로테이션 후에 실행할 스크립트의 시작입니다.
/usr/bin/killall -HUP syslog-ng # syslog-ng 프로세스에 HUP 신호를 보냅니다.
endscript # postrotate 스크립트의 끝입니다.
}
# 로그 파일 경로 및 설정 끝
/var/log/syslog 파일을 매일 로그로테이션하며, 최대 7개의 백업 파일을 유지한다.
missingok, notifempty, delaycompress, compress는 다양한 옵션을 설정하는 데 사용되고, postrotate와 endscript 사이의 부분은 로그로테이션 이후에 실행할 스크립트를 지정한다.
3. 일 단위보다 더 자주 logrotate를 실행하는 방법
임의의 커스텀 경로에 logrotate 스크립트를 등록하고 crontab에 등록해서 실행
→ cronjob의 실행 주기인 1분마다 rotate 수행 가능
# cron 주기에 따라 logrotate -vf <로테이트 파일명> 으로 커스텀 파일을 강제로 즉시 실행
*/10 * * * * deploy /usr/sbin/logrotate -s /home/username/logrotate/status -vf /your/custom/logrotate/file/path >> /your/custom/logrotate/path/logrotate_exec_log.log 2>&1
위와 같이 -s 옵션을 통해 logrotate 수행 status를 관리하는 파일 경로를 수동으로 지정해야 한다.
4. 실습하기
- 로그로테이트 : 기존의 로그 파일을 썰어주는 역할
- 먼저, 원본 로그파일이 저장된 경로를 적고 { }를 추가로 적어주어야 함
- su 유저명 그룹명 형식으로 하나 더 적어주어야 함
<log file> {
# 주기
[daily, weekly, monthly, yearly <cycle of rotates>]
# 로테이트 횟수
[rotate <number of rotates>]
# 로테이트 실행 후 비어있는 로그 파일 생성
[create <permission value> <owner> <own group>]
# 로그 파일 크기가 설정 값 보다 크고 지정한 주기가 됐을때 로테이트 수행
[minsize <1M, 100k>]
# 로그 파일 크기가 설정 값 보다 크거나 지정한 주기가 지났을때 로테이트 수행
[maxsize <1M, 100k>]
# 주기에 관계 없이 로테이트를 수행하는 로그 파일 크기
[size <1M, 100k>]
# 로테이트를 통해 새로 생성되는 파일에 날짜를 덧붙혀서 생성하는지 여부
[dateext]
# 로테이트를 통해 생성되는 파일을 압축하는지 여부
[compress]
# 설정을 참고할 로그로테이트 파일 위치
[include /etc/logrotate.d]
# 로그 파일이 존재하지 않는 경우 메시지 출력 (기본 값)
[nomissingok]
# 로그 파일이 존재하지 않아도 오류로 처리하지 않음
[missingok]
# 로테이트 시 기존 로그 파일 복사 후 제거 후 빈 파일로 생성
[copytruncate]
# 로그 썰기 전후 처리작업
[prerotate]
# prerotate 로직 작성
[endscript]
[postrotate]
# postrotate 로직 작성
[endscript]
}
※ 위와 같이 다양한 옵션이 있다.
이제 위 두 파일을 생성해준다.
rotate_result.log는 로그로테이트 시 pre, post script에 의해 콘솔에 찍힐 값을 담을 파일이다.
logrotate_status는 프로세스 상태를 저장해주는 파일로 데몬에 의해 관리하지 않는 경우 필요하다.
# 로그로테이트를 logrotate 데몬 프로세스가 관리하는 기본 경로가 아닌 곳에서 실행할 경우
# s 옵션으로 프로세스 스테이터스 경로를 별도로 지정해야 함
# f 옵션은 rotate 강제 실행, -v 옵션은 verbose 로 실행 내용을 콘솔에 출력
/usr/sbin/logrotate -s /home/username/logrotate/status -vf /your/logrotate/file/path > /your/rotate/job/checking/file.log 2>&1
실행해보면 위와 같이 lock이 걸려 있어서 로그로테이트를 할 수 없다고 나온다.
이를 해결하기 위해서 추가적인 조작이 필요하다.
logrotate_status 파일의 권한을 600으로 만들어 현재 로그인 중인 유저만 참조할 수 있게 해야 한다.
위와 같이 로그를 썰어주는 것을 확인할 수 있고, 원래 로그 파일 뒤에 .1이라는 확장자가 붙는다.
하나는 수납용 서버, 이제 우리가 수업에 활용한 서버 + 방금 생성한 서버가 로그를 발송하는 서버가 됩니다.
양 서버에서 크론탭에서 어플리케이션 및 서버 자원에 대해 주기적으로 로그를 찍어주는 크론잡을 등록해주세요.
예를들어 로그를 분마다 찍는다면 n시간에 1번 그간 쌓인 로그파일의 이름을 전송하는 시점.log로 변경한 다음, 로그 수납 서버로 전송하고, 원본 서버에 있던 로그는 지우는 크론잡을 작성해주세요. 이 때, 발송서버가 2개이므로, 각 발송된 로그파일은 어떤 서버에서 발송했는지 확인할 수 있도록 해 주세요.
위 과정을 완성하셨다면 해당 작업에 대해 노션이나 블로그 포스팅을 남겨주세요.
위 과정이 완료되었다면 어떤 도메인의 인프라를 활용할지도 설계하고 운영 시나리오를 작성해주세요.
네트워크 설정
$ docker network 대역폭 설정
$ docker run 할 때 고정ip 지정해서 실행하기
먼저, 위와 같이 172.30 대역을 사용하는 lognet이라는 네트워크
로그 파일을 수집해주는 savelog와 서버 자원을 주기적으로 찍어주는 로그 파일을 전송할 서버 2개를 생성해주었다.