전체 글 88

MySQL 업그레이드 주의사항

In-Place Upgrade : MySql 서버의 데이터 파일을 그대로 두고 업그레이드 Logical Upgrade : mysqldump 도구 등을 이용해 mysql 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후, 새로 업그레이드 된 버전의 MySQL 서버에서 덤프된 데이터를 적재함 제약 사항 같은 메이저 버전에서 마이너 버전 간 업그레이드는 여러 버전 건너 뛰기 가능 (8.0.16 → 8.0.21) 메이저 버전 간 업그레이드는 반드시 한 단계씩 업그레이드를 해야함 (하위호환성이 한단계까지만 유지됨) 5.5 →8.0으로 메이저 업그레이드를 하려면 5.5→5.6→5.7→8.0으로 한단계씩 업그레이드를 해야한다. 만약 이 과정이 번거로우면 Logical Upgrade를 고려할 수 있다. In-P..

DB/MySQL 2024.01.28

MySQL 실행 및 종료 (+ PID file not found 해결 방법)

mysql 실행 및 종료 기본적으로는 아래의 명령어로 실행 및 종료할 수 있다 sudo /usr/local/mysql/support-files/mysql.server start sudo /usr/local/mysql/support-files/mysql.server stop zshrc에 등록해두면 편하다 // ~/.zshrc # mysql alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start' alias mysqlstop='sudo /usr/local/mysql/support-files/mysql.server stop' export PATH="/usr/local/mysql/bin:$PATH" 그런데 아래의 에러가 발생하는 경우가 ..

DB/MySQL 2024.01.28

jevn 설정 (JDK 버전 변경하기)

1. jenv 설치 brew install jenv 2. jdk 설치 brew tap AdoptOpenJDK/openjdk brew install --cask adoptopenjdk8 brew install --cask adoptopenjdk11 아래와 같은 에러가 발생하는 경우에는 hwanseok@hwanseoks-MacBook-Pro ~ % brew install --cask adoptopenjdk8 Error: Cask adoptopenjdk8 exists in multiple taps: homebrew/cask-versions/adoptopenjdk8 adoptopenjdk/openjdk/adoptopenjdk8 아래의untap을 해준 뒤 다시 install을 하면 된다 brew untap ado..

DEV/JAVA 2024.01.26

로그 모니터링 개발 기록 04. 검색엔진의 트러블슈팅

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하고 있습니다. 검색 엔진의 저장 구조, 조회 구조, 성능 최적화 그 다음으로 트러블슈팅을 다루고 있습니다. 트러블 슈팅 사례는 워낙 많았는데, 굵직 굵직한 선에서 정리해보겠습니다. DFS에서의 시간 정렬 문제 이전 포스팅에서 DFS에 대한 설명을 간략히 언급한 적이 있습니다. 필요한 부분만 다시 요약하면, DFS Client가 검색 요청을 받아서 DFS Server로 실제 검색을 위임합니다. 그리고 각각의 DFS Server에서 검색된 내용을 DFS Client가 취합합니다. 그런데 이 과정에서 DFS Server는 각각 자신의 서버에 저장된 데이터 안에서만 시간을 기준으로 정렬된 상태입니..

로그 모니터링 개발 기록 03. 검색엔진의 성능 최적화

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하고 있습니다. 검색 엔진의 저장 구조, 조회 구조 다음으로 성능 최적화를 다루고 있습니다. 이번 글에서는 가장 아쉬움이 많이 남는 기능인 동시에, 가장 성능 개선이 많이 진행된 기능인 ‘임의의 문자열로 검색하기’에 대해서 이야기를 해보겠습니다. 들어가며 엄청나게 많은 문서 속에서 임의의 문자열이 등장하는 단 하나의 문서를 찾으려면 어떻게 해야할까요? 첫 번째 방법은 모든 키워드에 대해서 색인을 생성하는 것입니다. 검색엔진의 저장 구조 이해하기를 읽어주신 분이라면 ‘색인’은 특정 단어로 직접 이동할 수 있는 자료구조라는 것과 Inverted Index, SSTable을 사용해서 개념적으로 어..

로그 모니터링 개발 기록 02. 검색엔진의 조회 구조 이해하기

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하려고 합니다. 전체적인 흐름을 어떻게 구조를 잡을까 고민해보다가 Lucene In Action에서 Lucene에 대해서 설명하고 있는 구조를 그대로 차용하겠습니다. 검색 엔진의 조회 구조 이전 글에서 Inverted Index와 SSTable의 구조에 대해서 설명었습니다. 이 두가지 자료구조에 대한 설명을 전제로 시작해보겠습니다. 검색 엔진에서 제공하는 검색 기능에는 크게 3가지 종류의 이론적이 모델이 있습니다. 순수 불리언 모델 벡터 공간 모델 순수 불리언 모델 질의에 매칭되는 문서가 있는지 없는지를 판단합니다. 각각의 Token에 대한 가중치 또는 검색 결과에 대한 점수 계산은 존재하지..

로그 모니터링 개발 기록 01. 검색엔진의 저장 구조 이해하기

2021년 11월부터 현재(24년 1월)까지 약 2년동안 와탭 로그 모니터링을 개발하면서 배우고 느꼈던 것들을 정리하려고 합니다. 전체적인 흐름을 어떻게 구조를 잡을까 고민해보다가 Lucene In Action에서 Lucene에 대해서 설명하고 있는 구조를 그대로 차용하겠습니다. 와탭 로그 모니터링 훑어보기 먼저 와탭 로그 모니터링의 화면을 가볍게 훑어보면서 어떤 종류의 서비스인지 느낌을 알아보겠습니다. 아래의 사진은 ‘로그 트렌드’ 라는 페이지입니다. 왼쪽 사이드바에서 Key-Value 쌍을 선택하면 지정된 시간 범위에서 ‘1분당 수집된 로그 수’를 알 수 있고, 해당 1분 구간에 수집된 로그를 확인할 수 있습니다. 아래의 예시는 문제가 발생한 13:00 ~ 13:10 시간에 문제가 된 서버 이름(on..

Java OutOfMemory 분석 방법 (heapdump, HeapAnalyzer)

분석 방법 IBM HeapAnalyzer 다운로드 https://www.ibm.com/support/pages/ibm-heapanalyzer IBM HeapAnalyzer www.ibm.com heapDump 옵션 추가 heapDump를 생성하고 싶은 jar에 아래 옵션 추가해서 서비스 재시작 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/{YOUR_DIRECTORY}/heapdump.hprof -XX:+CrashOnOutOfMemoryError HeapAnalyzer 실행 HeapAnalyzer 실행 및 생성된 heapdump 로딩 (heapdump 사이즈가 클 수록 로딩 시간 오래 걸림) java -Xmx2g -jar {HeapAnalyzer}.jar 분석 ..

PessimisticLockException 원인 파악하고 해결하기

현상 점심을 먹고 가볍게 산책을 하고 있는데.. RDB와 연결된 서버에서 헤비 트래잭션이 발생했다. */userBehavior API는 사용자 행위를 추적하는 기능으로 "어떤 사용자가 어떤 행위를 했다"의 정보를 저장하는 단순한 기능이다. 그런데 이렇게 간단한 기능이 50초 이상 여러 번 수행된 흔적이 보였다. 게다가 Select도 아닌 insert query에서 발생했다. 원인 원인 분석 우선 트랜잭션 히트맵을 확인했다. 문제가 발생한 13:00 ~ 13:10 구간으로 조회했더니 헤비 트랜잭션이 조회되긴하지만 별다른 근거를 찾지 못했다. 다음으로 로그를 확인했다. 로그 트렌드 페이지는 선택한 Key-Value 쌍으로 로그를 검색해서 "분 당 로그 수"의 추이를 확인하고 원본 로그까지 확인할 수 있는 페..