본문 바로가기

개발노트

(111)
OOM 맞고 나서 알아본 apache poi xlsx 레거시 코드에서 csv 를 생성해주는 코드(csv 다운로드 기능)가 여러 이유로 아직도 쓰이고 있다. 로직은 xlsx 를 생성하고 이 xlsx 로부터 데이터를 읽으며 csv 를 쓰는 로직이었다. 오래된 코드(무려 2013년!)이고, 다 퇴사를 해버린데다 히스토리 관리가 잘 안 돼있어서 왜 xlsx 를 먼저 생성하는지 정확한 이유를 찾진 못했지만, 이미 xlsx 다운로드 기능을 먼저 만들어놔서 그것을 활용하는 게 더 낫다고 판단이 됐었나 보다. 그러던 중, 어제 약 23,000 rows 에 대한 csv 다운로드 요청이 OOM 을 유발하며 서버가 죽는 현상이 발견되었다. (컬럼수도 493개였음) xlsx 를 생성할 때 Workbook 의 인스턴스 타입을 XSSFWorkbook 으로 되어있었는데, 해당 인스턴..
Mysql GTID-based Replication 오류 Skip 하기 뚜렷이 어떤 SQL 에러가 발생한 지 확인 가능하고, 그걸 Skip 해도 된다는 확신이 있으면 이 방법이 가장 쉽고 빠르다. 1. 문제가 된 gtid 트랜잭션 번호 찾기 2. 문제가 된 gtid 트랜잭션 건너 띄도록 빈(empty) 트랜잭션 주입 mysql> SET GTID_NEXT="c85b621b-8fd3-11e8-862c-020051680009:66194695"; Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.01 sec) mysql> SET GTID_NEXT="AUTOMATIC"; Query OK, 0 rows..
Apache poi 이용하여 excel 에 아주 많은 이미지 넣을 때 급격히 느려지는 현상 우회하는 야매 방법 5000개 가량의 이미지가 apache poi 로 생성되는 엑셀 파일에 삽입되어야 하는 needs 가 있었는데, apache poi 라이브러리에서 병목 구간이 있어 이를 찾아내고 우회하는 방법을 정리해두면 나중에 급할 때 이런식으로라도 문제를 해결할 수 있음을 확인하기 위해 정리해본다. 몇시간을 날려먹었는지... 옛날 프로젝트라 apache poi 3.15 버전이 dependency 로 import 되어있었다. 프로젝트 빌드 툴은 maven 기반이었다. 디버깅으로 각 메소드 호출이 느려지는 부분을 찾아 들어가보니 `POIXMLDocumentPart` 의 `addRelation` 메소드에서 `findExistingRelation()` 메소드를 호출하는 것이 병목 구간임을 알 수 있었다. private Pa..
CompletableFuture, parallelStream, ExecutorService 사용 시 주의점 좀 자세히 정리를 하고 싶지만, 코드 리뷰 중 오갔던 대화 내용 정도만 정리하기로... This comment has been minimized. Show comment Hide comment Copy link Quote reply Edit Unhide Delete leewin12 3 hours ago 여기선 default forkJoinPool이 사용될 것 같은데, 맞을까요? CustomForkJoinPool과 default ForkJoinPool이 섞여 있는 것 같습니다. Write Preview Select a reply ctrl . The content you are editing has changed. Please try again. 여기선 default forkJoinPool이 사용될 것 같은..
Spring Eureka 관련 정리 On-premise IDC 환경에서 운영중인 서버들을 Cloud 환경으로 이전하기 위해 부딪힌 몇가지 문제가 있었다. 이 문제들을 해결하기 위해 알아본 자료들을 정리해두면 후에 도움이 많이 될 것 같아 정리를 해 봄. 상황 1. 기존에는 VPN 을 통하였기 때문에 내부간 트래픽은 http 로 해도 안전하다고 여겨지고 있었음 2. Loadbalancer 트래픽 마저 VPN 의 트래픽을 점유하고 있었으므로 불필요한 성능 저하 유발 3. Cloud 환경에서는 가능한 VPN 을 타지 않고 `외부 트래픽 + 같은 서브넷 트래픽` 으로만 구성하는 것이 목표 4. Loadbalancer 에서 앱 서버(서비스)에 접근하기 위해서는 plain http 보다 https 로 전송해야 여러 공격으로부터의 최소한의 보안 레벨을..
Openvpn 운영하며 생긴 이슈 정리 1. 한 번 접속 후 잘 작동하던 vpn 서버에서 갑자기 AUTH_FAILED 오류를 뱉으며 클라이언트의 접속이 끊김 - vpn config 에 verb level 이 너무 높아 로그 파일이 급격히 커졌고, 로그 파일이 몇시간 만에 약 2.14GB 정도가 되었다. 그 이후로 로그에 더 이상 로그가 쌓이지 않았고, 클라이언트에서 접속을 시도하여도 AUTH_FAILED 오류가 나면서 접속이 되지 않았다. - SSH 로 vpn server 접속 후 로그 파일을 truncate 하고 접속 테스트를 하면 잘 됐음 - verb level 을 조정하고, 근본적인 처방으로 logrotate 를 설정하였음 2. site to site 연결을 openvpn 터널을 자체 구축하였는데 udp 로 할 경우, 안정적으로 운영되다..
aws cloudfront 에서 query string 기반 cache 우회 aws cloudfront 로 제공하는 음성, 동영상 리소스가 있는데, 최근 인코딩을 잘못하여 모바일에서 버퍼링을 불러 일으키는 동영상이 있었는데, 인코딩을 최적화하여 다시 s3 로 업로드 하였으나 cdn 에서 문제가 있는 파일을 캐싱하고 있어서 여전히 버퍼링이 생겼고, 이를 해결하기 위해 aws 콘솔에서 별도의 invalidate 로 해결을 했었는데, 직접 invalidate 하지 않고 하는 방법을 찾아보고 아래와 같이 해결을 했다. 아래의 매뉴얼을 보고 그대로 하면 되는데, aws 콘솔 화면에서 cloudfront query string whitelist 를 어디서 설정할 수 있는지 좀 헤매서 정리함. https://docs.aws.amazon.com/AmazonCloudFront/latest/Dev..
[pt-online-schema-change] 아주 큰 테이블(1billion rows) ALTER troubleshoot 및 후기 데이터로 먹고 사는 회사답게(?) 약 10억건이 넘는 rows 를 가진 테이블이 하나 존재한다. (그냥 샤딩, 파티셔닝 같은 걸 안 한거에요 ㅋㅋ)서비스가 시간이 지나갈수록 초기 설계 당시에는 고려가 되지 않은 사항들로 인해 변화된 요구사항에 의해 테이블도 그에 맞게 ALTER 가 필요했다.사실, 작년에도 on-premise (IDC)에 있던 데이터베이스를 클라우드 환경으로 이전할 때만 해도 이 테이블의 rows 는 약 5억~6억건 사이였던 것으로 기억한다.여튼, 그 때도 pt-online-schema-change 의 도움으로 무사히 ALTER 는 성공을 했었고, 별 이슈가 없었기에 사내에만 간단히 문서화한 게 전부였는데, 이번에는 뭔가 잘 안 되서 5번만에 성공을 하였는데 사실 정확하게 5번째에도 왜 ..

반응형