전체 글 252

PostgreSQL Vacuum 관련 쿼리 간단 모음

PostgreSQL를 사용하는 프로젝트에서 DevOps 업무를 맡았을 때 자주 사용했던 쿼리들을 간단히 정리해보았다. -- t_product 테이블의 Auto VACUUM 설정을 비활성화 ALTER TABLE public.t_product SET (autovacuum_enabled = false); -- 가장 오래된 20개의 테이블들의 목록 조회 SELECT c.oid::regclass AS table_name, greatest(age(c.relfrozenxid), age(t.relfrozenxid)) AS age, pg_size_pretty(pg_table_size(c.oid)) AS table_size FROM pg_class c LEFT JOIN pg_class t ON c.reltoastrelid..

DB/PostgreSQL 2024.02.07

[MySQL 8.0] 중복된 인덱스 및 거의 사용되지 않는 인덱스 조회하기

데이터베이스 성능 향상을 위해 모든 엔지니어가 가장 먼저 고려하는 것이 바로 인덱스의 적용이다. 적절한 인덱스를 추가하는 것만으로 왠만하면 성능이 개선되기 때문에 인덱스 추가는 DB 성능 관련해서는 빠질수가 없는 솔루션이다. 인덱스는 성능에 있어 필요하지만 때때로 엔지니어들은 너무 과도하게 인덱스를 사용하는 경우가 있다. 이러한 경우, 중복 인덱스가 발생해서 오히려 전체 성능이 크게 저하되기 마련이다. 인덱스가 많아지게 되면 각 인덱스에 필요한 용량이 늘어나기 때문에 역설적으로 각 인덱스가 사용할 수 있는 가용 메모리의 크기가 줄어들게 된다. 또한, INSERT 등의 write 요청에 대해 고려해야 하는 인덱스의 수가 늘어나게 되면 해당 쿼리의 성능이 점점 떨어지게 된다. MySQL 5.x에서는 중복 인..

DB/MySQL 2024.02.07

파이썬에서 더 빠른 JSON serialization 사용하기

보통 파이썬에서 JSON을 string으로 직렬화(serialization)하거나 직렬화된 데이터로부터 JSON 객체(dict 타입)를 로딩하는 방법은 아래와 같이 json 표준 모듈을 사용하는 것이다. import json data = {'a': 'a', 'b': 'b'} data_str = json.dumps(data) new_data = json.load(data_str) 그러나, 이 표준 라이브러리는 파이썬으로 구현되어 있기 때문에 C/C++이나 Rust로 구현된 구현체들보다 더 느리다. 보통 빠른 JSON 직렬화 및 역직렬화를 위해서는 ujson과 orjson이 사용된다. ujson은 C로 작성된 JSON 모듈의 파이썬 바인딩이다. 해당 라이브러리는 파이썬 3.7부터 지원되고 있다. orjson..

Python 2024.01.22

MySQL where문에서 boolean 체크 관련 성능 튜닝

MySQL에서 boolean 타입의 플래그를 추가하기 위해 보통 BOOLEAN 타입을 사용하게 된다. 이 boolean 타입은 사실 tinyint(1)과 유의하다고 볼 수 있다. MySQL에서 제공해주는 false나 true와 같은 상수를 사용해서 where문에 조건을 추가해 줄 수가 있게 된다. 이 불린 값 체크를 위해서 아래와 같이 많은 방법이 있을 수 있다: -- is문 사용 SELECT * FROM TABLE WHERE flag is true; -- boolean값 자체를 조건문으로 사용 SELECT * FROM TABLE WHERE flag; -- '='을 사용해서 값을 비교 SELECT * FROM TABLE WHERE flag = true; 논리적인 관점에서 위의 3가지 타입의 쿼리는 모두 ..

DB/MySQL 2024.01.17

python psutil을 사용해서 간단한 모니터링 스크립트 구축하기

Bash 스크립트에서 ps를 사용하면 프로세스 정보를 알 수 있듯이, 파이썬에서는 psutil 라이브러리를 사용하면 프로세스 상태를 가져올 수 있는 API를 사용할 수가 있게 된다. https://pypi.org/project/psutil/ 아래는 psutil을 사용해서 작성한 간단한 프로세스 상태 모니터링 스크립트이다. import psutil from datetime import datetime import pandas as pd import time import os def get_size(bytes): """ Returns size of bytes in a nice format """ for unit in ['', 'K', 'M', 'G', 'T', 'P']: if bytes < 1024: ret..

Python 2024.01.02

sqlalchemy로 MySQL 연결 시 필요한 라이브러리

알다시피, sqlalchemy의 기본 데이터베이스는 PostgreSQL이다. 따라서, psycopg나 asyncpg와 같은 PostgreSQL용 드라이버 및 라이브러리는 자동으로 함께 설치가 되나, MySQL을 사용하는 사람들은 필요한 라이브러리를 일일히 추가해주어야 한다. pip install mysqlclient pip install mysql-connector pip install mysql-connector-python 위와 같이 "mysqlclient"와 "mysql-connector", 그리고 "mysql-connector-python"까지 설치를 해주어야 한다. 처음 시도할 때에는 "mysqlclient"와 "mysql-connector"만 설치하고 에러 메시지를 정독하면서 왜 안되는지 열심..

Python/sqlalchemy 2024.01.02

sqlalchemy logging 옵션 끄기

sqlalchemy를 처음 사용할 때에는 계속 나오는 로그들을 어떻게 없앨 수 있을지에 대해서 이리저리 구글링을 많이 해보게 된다. 스택오버플로우를 봐도 잘못된 답변들도 보이고, 결국 30분간 이리저리 삽질을 하다가 나름의 답을 찾아냈다. 아래 코드와 같이 4개의 토픽에 대해서 로그레벨을 ERROR로 설정해놓으면 데이터베이스 에러로 인한 상황을 제외하고는 모든 디버깅 로그나 info 로그가 다 필터링되게 된다. import logging from typing import Any, Generator # from sqlalchemy.sql import text from sqlalchemy import Column, Integer, MetaData, Table, Text, select from sqlmodel..

Python/sqlalchemy 2024.01.02

쿠버네티스에서는 스왑이 기본적으로 비활성화 된다?

알다시피, 운영체제는 더 많은 프로세스들이 메모리를 더 안정적으로 사용할 수 있도록 하기 위해 덜 사용되는 데이터를 메모리에서 디스크로 옮기는 스왑(swap)을 지원한다. 이를 통해 서버는 더 안정적으로 메모리를 관리할 수 있게 되는 것이다. 그런데, 쿠버네티스의 경우 기본 정책 상 swap을 비활성화시키도록 정책이 설정되어 있다. 물론 23년 8월 경에 알파 릴리스의 형태로 swap이 활성화된 형태로 파드를 생성할 수 있게 하는 설정이 추가되긴 했으나 아직은 프로덕션 환경에서 사용하기에는 시기상조로 보인다. 쿠버네티스에서 스왑 비활성화를 더 선호하는 이유는 "보안"이 가장 큰 이유로 볼 수 있다. 별도의 네임스페이스를 만들어서 마운트시킨 쿠버네티스 환경에서 굳이 격리된 데이터를 디스크로 스왑하는 작업은..

pod가 초기화 상태에서 멈춰서 시작을 못하는 경우

쿠버네티스의 파드는 여러 개의 컨테이너를 가질 수 있다. 이 중, "init containers"라고 불리는 컨테이너들이 있는데, 이 컨테이너들은 파드의 초기화를 담당한다. 파드가 생성되고 시스템적 격리가 이루어지는 초기단계에 수행되어야 할 작업들을 명시하기 위해 사용된다. Init container들이 모두 정상적으로 끝나야 초기화가 완료되고 main container 들이 실행되게 된다. 만약 init container가 실패 상태로 종료되고 restart 정책이 Never로 설정되어있다면 파드 자체의 초기화 실패로 단정하고 파드의 상태를 Failed로 바꾸게 된다. 또한, init container가 어떠한 이유로 인해 종료되지 않거나 restart 정책이 꼬여서 무한 재시작을 하고 있는 상태라면 ..

Shell에서 return문이 일반 언어에서의 return문과 다른 점

DevOps 등의 목적으로 shell로 함수등을 만드는 경우가 많이 생기게 된다. 이렇게 함수로 코드를 짜게 된다면 "return"문을 사용하는 경우 역시 발생하게 된다. 사실 shell의 return은 일반 프로그래밍 언어에서 사용되는 return문과 근본적인 차이가 있는데, 바로 숫자 타입만 반환이 가능하다는 것이다. 예를 들어, 셸 스크립트로 문자열을 반환하는 함수를 짜게 되면 return문으로는 문제를 해결할 수가 없다. 반환할 문자열의 종류가 미리 정해져 있다면 프로그래밍 언어에서의 enum을 사용하는 것처럼 각 문자열을 미리 숫자 코드로 디자인해두고, 적절한 숫자값을 리턴하는 함수를 구현하면 된다. 만약, 이러한 방법론이 아니라 순수하게 문자열 자체를 반환해야 한다면 return이 아니라 ec..

Shell script 2023.12.30