본문 바로가기

소프트웨어 이야기/데이터 저장소 + 시각화

(PostgreSQL)Idle in transaction 프로세스 자동으로 죽이기 문제 상황postgresql에서 transaction이 잡혀있지만, 아무것도 하지 않으면, 세션의 상태는 idle in transaction이 된다. 그런데 얘가 connection은 쥐고 있지만, 아무것도 안한다면 서버 자원을 잘 활용하지 못하게 된다. ( 참고 - (Django)PostgreSQL의 Idle In Transaction Connection )그러면 connection이 무한대로 늘어난다거나, connection이 필요한애가 DB를 제대로 활용하지 못하게 될 수 있다. 해결 방법postgresql에는 Idle in transaction이 일정 기간동안 유지되면 자동으로 이 transaction을 죽여주는 기능이 있다. idle_in_transaction_session_timeout 옵션을..
(PostgreSQL)PostgreSQL의 Idle In Transaction Connection PostgreSQL의 Idle in Transaction 상태란? PostgreSQL에 붙는 Connection은 열려있지만, 아무런 쿼리를 보내지 않는 상태를 의미한다. 세션에 idle in Transaction이 많은 경우 시스템 리소스를 많이 쓰게 된다. 그리고 pgpool, pgbouncer 같은 connection pooler가 transaction pooling mode로 실행되는 경우, 이 설정을 사용하는 의미가 없어질 수도 있다.커넥션 풀링에는 3가지 종류가 있는데, session pooling / transaction pooling / statement pooling이 있다. 여기서 transaction pooling은 클라이언트가 커넥션을 맺자마자 커넥션을 할당해주는게 아니라, tran..
(PostgreSQL) OOM Killer PostgreSQL 서버에 Out Of Memory가 발생하는 경우, PostgreSQL 자체를 재부팅해야지만 복구할 수 있다. 메모리가 부족해지고, Swap 영역이 증가하게 되면 Linux Kernel의 OOM Killer가 프로세스를 죽이게 된다. 그러면서 부족해진 메모리를 늘리고, Swap 영역을 줄인다. 이러면, 서버에 접속할 수 없는 수준으로 서버가 고장나는 일은 막을 수 있다. 그러나 OOM Killer가 Session을 죽이면서, DB Connection이 제 멋대로 끊길거다. PostgreSQL: SSL SYSCALL error: EOF detected 그러면 PostgreSQL에서 이런 에러가 내뱉어지면서, PostgreSQL을 사용하는 앱에서는 에러가 마구 날거다. 이 경우, Postg..
(PostgreSQL) work_mem 메모리 설정 postgresql의 work_mem이란? 이 값은 정렬 / 해시 / 조인 등의 동작에 사용될 수 있는 메모리 사용량을 의미한다. 이 메모리는 임시 디스크에 데이터를 쓰기 전에 사용된다. 기본값은 4MB으로 설정된다. 그런데 어떤 아티클에서는 일반적으로 64MB 정도가 적합한 수치라고 한다. 만약 PostgreSQL이 temporary file을 사용하고 있다면, work_mem을 늘리면 좋다. work_mem은 한 쿼리에서 사용되는 메모리 양을 의미하는게 아니다. 정렬 / 해시 / 조인 작업이 한 쿼리에서 동시에 일어날 수 있기 때문에, 각각의 동작에서 사용할 수 있는 메모리 수치를 의미한다. 만약 10GB짜리 데이터베이스를 쓴다고 가정해보자. 기본적으로 10MB씩 사용하는 커넥션이 100개가 있다고 ..
(데이터 시각화)Redash란? Redash는 데이터 조회 / 시각화를 편하게 해주는 툴입니다. (이런 느낌? ) 특징 - SQL문을 날리면, 반환된 값으로 그래프를 만들 수 있습니다. - 당연히, CSV 다운로드 기능도 있습니다. - RDB / ElasticSearch / NoSQL / Athena / BigQuery 등의 여러 데이터 소스를 연결해서 사용할 수 있습니다. API를 호출해서 얻은 JSON 결과값, CSV, 구글스프레드 시트, JIRA도 지원합니다. - 여러 데이터 소스에서 얻은 쿼리 결과를 JOIN해서 사용할 수 있습니다. 예를 들면, ElaticSearch에서 나온 결과값과 Postgre SQL에서 나온 결과값을 JOIN 할 수 있습니다. Redash에는 하나의 Query로 여러 데이터 소스를 JOIN하는 기능은 없..
[Redis]Redis에서 LRU Cache를 사용하는 방법 Using Redis as an LRU cache Redis에서는 새로운 값이 추가되었을 때, 자동으로 오래된 데이터를 지워주는 기능이 있다. Memcached 시스템이서도 이러한 기능이 있기 때문에, 개발자들 사이에서는 익숙한 기능이다. 이 포스트에서는 메모리 사용량 제한을 위해서 사용하는 값인 maxmemory, 메모리 관리 정책인 eviction policy, 원조 LRU와 REDIS LRU의 차이에 대해서 이야기할거다. Maxmemroy 설정하기 maxmemory 값은 redis.conf 파일이나 config set 커맨드 명령문으로 설정할 수 있다.maxmemory 100mbmaxmemory를 설정해주지 않으면, 64bit 시스템에서는 초기값이 0으로 설정된다. 32bit 시스템에서는 3GB으로..
[Redis]라이브 환경에서 설정 변경하기 config set 명령문을 사용하면, 레디스 서버를 재가동하지 않아도, 환경 변수 값을 변경할 수 있다. redis.conf 파일에서 사용할 수 있는 모든 환경변수들을 config set 명령문으로 변경할 수 있다. 그래서 maxmemory, memory 관리 정책 등을 변경해줘야할 때, 이 명령문을 사용하면 redis를 재가동하지 않아도 된다. 예시 CONFIG SET MAXMEMORY 100000 참고 자료 https://redis.io/commands/config-set
[Redis]메모리 관리 방식 조사 배경TTL이 만기된 캐시키들이 삭제(evicted)되지 않는 현상을 발견하면서, 레디스에서 메모리를 관리하는 방법이 궁금해졌다 알게된 것* 레디스는 아래의 세가지 상황 때, 메모리를 정리한다. A. 만료된 키를 가져올 때 B. 샘플링한 데이터 중에 만료된 키가 있는 경우 C. 메모리 관리 정책을 설정했을 때, 논리적인 데이터 사용량이 maxmemory를 초과한 경우 => 실제 사용량으로 잡히는 rss를 기준으로 메모리를 정리하지 않는다. * 레디스는 jemalloc을 쓴다. * 용량이 큰 데이터를 자주 썼다가, 지우면 파편화가 발생하기 쉽다. 그리고 데이터의 크기 편차가 크면, 파편화가 생기기 쉽다. 실제 사용량보다 rss가 높게 나온다는 거다. 이 경우를 해결하려면, 장비를 이전하는게 낫다. 데뷰..