전체 글
-
citus - 스키마 정리하고 분산테이블 만들기개발/기술 2024. 9. 5. 22:30
아래와 같은 스키마를 가진 database 가 있다고 해보자content 테이블은 board 테이블을 참조하며 게시판 정보를 포함한다.content_feed 은 board 테이블을 참조하면서 게시판별 피드 정보를 나타내는데 사용된다.content_like 테이블은 user 와 content 정보를 참조하면서 유저의 컨텐츠 좋아요 정보를 저장한다.일반 SNS 에서 흔히 볼 수 있는 스키마다. 운영중에 content 테이블에 데이터가 많이 쌓여서 citus 를 이용해서 분산하고자 한다. 분산 칼럼은 id 필드로 선정했다select from create_distributed_table('content', 'id', shard_count := 4); 하지만 아래와 같은 에러가 발생한다.ERROR: refere..
-
카프카 - URP, Under Min ISR개발/기술 2024. 8. 30. 17:52
URP (Under Replicated Partition)카프카를 운영하다보면 URP 장애가 종종 발생한다. URP 장애는 다양한 이유로 발생하는데 원인을 알기 위해선 먼저 URP 가 먼지 알아야 한다. 카프카에는 파티션이라는 개념이 있고 파티션은 리더와 팔로워 파티션으로 나눠진다. 파티션은 토픽의 데이터가 저장되는 스토리지로 보면 되는데 리더 파티션은 프로튜서와 컨슈머로부터 토픽을 주고 받는 부분이고 팔로워 파티션은 리더 파티션의 내용을 복제한다. 스토리지에서 볼 수 있는 RAID 처럼 카프카도 내용을 복제해서 고가용성과 내구성을 확보하는 방식으로 동작한다. 카프카 운영자는 replicas.factor 옵션으로 복제본의 개수를 설정할 수 있는데 주로 3개 정도 둔다. URP 는 리더 파티션과 동기화되지..
-
Sentry 에서 Clickhouse 를 택한 이유개발 2024. 8. 20. 21:38
Sentry 에서 Snuba 라는 검색 인프라를 도입한 이유를 설명한 아티클인데 이벤트 데이터베이스를 Postgres 에서 Clickhouse 로 넘어간 이유를 중점적으로 다루고 있어 Clickhouse 또는 OLAP 에 관심 있는 개발자라면 참고할 만하다. Sentry 는 모바일이나 서버에서 보내는 에러를 실시간으로 수집하고 사용자에게 알럿을 보내주는 오픈소스 모니터링 툴이다. 하루에도 수백만개의 에러가 들어오곤하니 대용량 데이터의 실시간 처리가 무엇보다 중요한 서비스다. Sentry 에선 원래 이벤트 데이터를 Postgres 에 넣어두고 비정규화 방식을 적용하면서 관리했다. 예를 들어 Time Seen 처럼 누적 통계 데이터 값을 읽어오는 경우 매번 count 쿼리를 치는게 아니라 Time Seen ..
-
Zookeeper 사용 목적과 사례 중심으로 정리개발/기술 2024. 8. 16. 18:56
분산시스템을 무조건 만나게 되는 주키퍼. 이번 포스트에선 주키퍼를 사용하는 이유와 사례를 중점적으로 살펴보자. Why Zookeepr?카프카나 하둡, 클릭하우스 같은 분산 시스템 서비스는 여러개의 서버가 동시에 동작하는 시스템이다. 서버들이 유기적 협력하기 위해선 서로가 어떤 상태인지, 어떤 책임을 맡고 있고 무엇을 할 수 있는지 모니터링 할 수 있는 환경이 필요하다. 예를 들어 특정 서버가 죽어 버리면 다른 서버에서 장애를 발견하고 복구 작업이 진행할 수 있어야 하고 서버 마다 갖고 있는 테이블을 어딘가에 공유할 수 있어야 한다. 시스템마다 서버끼리 상태를 공유할 수 있는 환경을 독자적으로 만들 수도 있겠지만 매 시스템마다 만들기는 버겁다. 감사하게도 아파치에서 분산시스템에서 범용적으로 사용할 수 있..
-
[Python] Decorator개발 2024. 5. 17. 10:45
파이썬에선 함수위에 데코레이터를 둬서 함수의 실행전후에 특정한 작업을 주입할 수 있다. 아래 코드에선 foo 함수에 logging 이란 데코레이터를 추가했고 실행 전에 before 실행 후엔 after 를 출력하도록 했다. def logging(func): def wrapper(*args, **kwargs): print("before") ret = func(*args, **kwargs) print("after") return ret return wrapper@loggingdef foo(): print("foo")foo() 실행 결과 의도했던 대로 출력된다. 로깅이나 실행 전후에 처리하고 싶은 로직을 넣어야하는 경우 유용하게 사용할 수 ..
-
[파이썬] 파이썬은 모든것이 객체다개발 2024. 5. 9. 11:52
파이썬은 모든것이 객체다 파이썬에선 모든것이 객체라는 말이 있다. 이게 무슨 말인지 모르더라도 파이썬을 사용하는데 큰 문제는 없다. 하지만 좀더 깊게 들어가고 싶다면 한번쯤 공부해보고 가는 것이 좋다. 우선 아래 코드를 실행하면class A: passa = A()print(type(a)) # class A 라고 출력된다. 변수 a 는 A 라는 클래스의 객체이기 때문이다. 그런데 배열과 정수, 문자열에 대해서도 동일하게 출력해보면, 타입 정보와 함께 앞에 class 가 붙여서 나온다.print(type([1,2,3,4])) # print(type(5)) # print(type("1234")) # 심지어 추가한 함수와 len 처럼 빌트인 함수도 클래스의 일종이다.def foo(): passpr..
-
[python] __all__ 을 이용해 전체 임포트 막기개발 2024. 5. 8. 10:27
메타클래스 __all__ 을 활용하면 패키지 전체 임포트시 특정 클래스나 메소드만 임포트 되도록 제한할 수 있다. transporation.py 에서 Bus, Taxi, Subway 클래스를 선언하고 __all__ 에는 Bus와 Taxi 만 추가했다# transporation.pyclass Bus: passclass Taxi: passclass Subway: pass__all__ = ["Bus", "Taxi"] main.py 에서 transporation.py 파일 내부 클래스를 전체 임포트하고 사용하면from transporation import *sb = Subway() Subway 를 찾을 수 없다고 나온다.➜ clean-python python3 main.pyTraceback (..
-
__init__.py 를 이용한 모듈 관리개발 2024. 5. 8. 10:17
파이썬 3.3 이전에는 __init__.py 는 디렉토리가 파이썬 패키지임을 명시할 때 필요했었다면 이제는 __init__.py 가 없어도 없어도 자동으로 디렉토리를 패키지로 인식한다. 대신에 __init__.py 를 사용하면 패키지 내부에 있는 클래스 선언을 하나로 모아줄 수 있는 장점이 있다. 이런 프로젝트 구조를 가지고 있고├── main.py└── phone ├── galaxy.py └── iphone.py galaxy.py 와 iphone.py 에서 각각 클래스를 선언했다면# galaxy.pyclass Galaxy: def __init__(self) -> None: pass# iphone.pyclass Iphone: def __init__(self) -> No..