개발
-
[Kube] Node, Node Pool, Taint, Label개발 2024. 11. 27. 21:46
ACK Serverless 를 사용하는 경우에는 클라우드에서 제공하는 노드를 자동으로 사용하게 된다. 그런데 GPU나 ARM 처럼 특정한 장비를 운용하고 싶은 경우에는 Node 와 Node Pool 이라는 개념을 공부하게 된다.NodeACK 에서 애플리케이션을 실행하는 유닛이다. 물리 장비일수도 있고 VM 일수도 있다. 애플리케이션 실행에 필요한 CPU, 메모리, 네트워크 리소스를 제공한다. Node 에는 kubelet, kube-proxy 같은 쿠버네테스 컴포넌트가 설치되어 있어 일반 컴퓨터처럼 노드 위에 여러개의 컨테이너를 실행할 수 있다. Node Pool동일한 스펙을 가진 노드를 묶어서 관리할 수 있는 툴이다. 클라우드 환경에서 노드를 생성하고 관리하는데 이용되며 일반적으로 클러스터에는 한개 이..
-
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 (..