수요일, 5월 23, 2018

[B급 프로그래머] 5월 3주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: 볼때마다 감탄하고 바로 까먹는다 via @hotel_gecko)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
보너스: 구글 I/O 2018 키노트
EOB

월요일, 5월 07, 2018

[독서광] 카프카, 데이터 플랫폼의 최강자

오늘은 간만에 기술서적 관련 독후감을 올려드리겠다. 오늘의 주인공은 검토를 위해 출간에 앞서 미리 읽기는 했지만, 그래도 다시 한 번 시간을 투자해 정독한 <카프카, 데이터 플랫폼의 최강자 - 실시간 비동기 스트리밍 솔루션 Kafka의 기본부터 확장 응용까지>라는 책이다. 카프카는 방대한 데이터를 다뤄야하는 기업 환경에서 중추적인 역할을 맡은 고가용성/고성능/실시간 데이터 버스를 구축하기 위해 사용하는 오픈소스 소프트웨어로서 데이터 수집, 처리, 분석 파이프라인을 단순하게 만들어주는 일등 공신이다.

일반적인 엔터프라이즈 환경에서는 관계형 데이터베이스를 중심으로 데이터 파이프라인이 구축되었다. 여러 가지 다양한 경로로 들어온 데이터는 일단 관계형 데이터베이스에 저장한 다음에 상호대화식 질의(SQL) 실행이나 분석을 위한 배치 작업(stored procedure) 실행 방식으로 비즈니스 논리를 구현했다. 실시간 처리가 필요하면 데이터베이스에 다소 부담을 주는 트리거를 걸거나 폴링 방식으로 특정 기간 윈도우 내의 데이터를 조건에 맞춰 뽑아내는 방식을 사용했고, 별도의 전문 검색 엔진으로 데이터베이스 레코드를 피딩한 다음에 비정형 검색을 수행하기도 했다. 하지만 이러다보니까 점점 데이터베이스에 부담이 늘어나게 되었고 뭔가 새로운 기능을 추가할 때마다 주먹구구식으로 연결해야 하는 어려움이 생겼다. 하지만 최근에는 데이터 버스를 구축해 들어오는/생성되는 방대한 데이터를 흘리고, 필요할 때마다 데이터 버스에서 가져와서 처리하는 방식으로 아키텍처가 바뀌고 있다. 처음부터 데이터 파이프라인을 잘 구축해놓으면 수평 확장 방식으로 성능을 높이는 동시에 기능이 추가될 때마다 얼기설기 위태위태 저글링을 하는 대신에 데이터 버스에서 선을 하나 끌어오면 끝난다. 처리한 데이터 역시 다시 데이터 버스로 흘리면 다른 곳에서 사용이 가능해지므로 표준화된 데이터의 고속도로를 구축할 수 있다.

아파치 카프카는 위에서 설명한 멋진 아키텍처 설계가 가능하도록 도와주는 훌륭한 도구지만, 일반적인 큐와는 달리 성능과 확장성이라는 두 마리 토끼를 모두 잡으려다 보니 개념을 잡기도 어려울 뿐더러 설치하고 설정하기는 더욱 복잡한 문제가 있다. <카프카, 데이터 플랫폼의 최강자>는 바로 이런 어려움을 해소하기 위해 카프카 기초 개념과 설치 방법부터 시작해 카프카의 설계 원칙과 프로듀서/컨슈머 예제에 이어 운영에 필요한 기초적인 지침을 제공한다. 그리고 실제 데이터 버스를 구축하고 나서 응용하기 위한 몇 가지 방안을 제시한다. ELK 스택을 사용해 카프카로부터 받은 데이터를 검색하고 시각화하는 방법을 시작으로, 최근 뜨고 있는 스트리밍 처리를 위한 카프카 스트림즈 프로그래밍 방식에 이어 카파 아키텍처를 위한 KSQL 예제를 소개한다. 마지막으로 클라우드(GCP, AWS) 환경에서 제공하는 카프카와 유사한 서비스인 펍/섭과 키네시스를 비교하면서 카프카와 비교한 장단점을 일목요연하게 정리하고 있다.

이 책을 읽고 나면 처음부터 새롭게 설계하는 시스템에만 카프카를 적용할 수 있는지 아니면 현재 운영 중인 시스템에도 카프카를 도입해서 고도화가 가능한지 궁금해질 것이다. 물론 새로 아키텍처를 설계하면서 카프카를 도입하는 방식이 효율성과 확장성을 높일 수 있지만, 기존 레거시 시스템의 아키텍처를 데이터 파이프라인 방식으로 변경할 경우에도 카프카는 아주 멋진 해법을 제시한다. 일단 들어오는 데이터를 OLTP 방식으로 직접 관계형 데이터베이스에 INSERT하는 대신 카프카에 밀어넣고 나서 커넥터를 사용해 관계형 데이터베이스로 넣는 방법을 생각해보자. 검색 기능이 필요하면 관계형 데이터베이스가 아니라 카프카에서 커넥터를 연결해 검색 엔진으로 넣으면 되고, 빅데이터 분석이 필요하면 커넥터를 연결해 하둡으로 보내면 된다. 이런 식으로 하나둘씩 관계형 데이터베이스를 중심으로 연결된 구조를 데이터 버스를 중심으로 분리된 파이프라인 구조로 변경해나가면 어느 순간 고도화가 완료된 전체 시스템을 목격할 수 있을 것이다. Confluent와 협력사, 오픈소스 공동체들이 만든 다양한 Kafka Connect 목록을 보면 카프카를 활용해 만들 수 있는 엔터프라이즈 아키텍처가 머리 속에 그려지지 않을까?

결론: 데이터를 중심으로 돌아가는 아키텍처를 구축하기 위해 노력하는 아키텍트와 개발자라면 이 책을 읽어보면 속이 시원해질 것이다.

보너스: 카프카에 대해 잘 정리된 자료 두 가지를 소개한다.

EOB

토요일, 5월 05, 2018

[B급 프로그래머] 5월 1주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: version control via @bleroy)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
(보너스: i feel *extremely* seen via @hatwell)
EOB

토요일, 4월 28, 2018

[B급 프로그래머] 4월 4주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: Evolution of the English Alphabet via @usefulcharts)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
(보너스: 현대인의 3대 영양소 via @minase_u_tchi)
EOB

[B급 프로그래머] (Quora) 구글 또는 아마존에 다니는 경력 개발자들이 가장 유용하다고 생각하는 자료 구조는?

(그림은 (MIT) 6.851: Advanced Data Structures에서...)

Can anyone at Google or Amazon share what algorithms you find most useful over the years of your career?(구글 또는 아마존에 다니는 경력 개발자들이 가장 유용하다고 생각하는 자료 구조는?)라는 흥미로운 질문과 대답을 읽다가 독자 여러분들이 생각나서 간략하게 정리해본다. (참고로 답변을 다신 분은 마이크로소프트, 구글, 페북에 근무한 경력 소유자다)

  • set/map: 코딩 과정에서 가장 중요한 자료 구조로 빠르게 값을 찾고, 값의 존재 유무를 확인할 수 있다. 물론 자세한 내부 구조는 몰라도 되지만 코드를 명확하고 효율적으로 작성하기 위해서는 언제 어떻게 사용할지 알고 있어야 한다. (본인 생각 추가: 키-쌍 NoSQL 데이터베이스를 다룰 때도 map 개념은 상당히 유용하다)
  • tree: 디렉터리에 있는 파일을 재귀적으로 순회하거나, JSON 객체나 XML 문서, 아니면 산술 연산이나 표현식을 다룰 때도 상당히 중요하다. RB(Red-Black) 트리 구현 방법은 몰라도 되지만 정렬된 set이나 map이 필요한 상황에서 문제를 풀기 위한 수단으로 사용법은 잘 알고 있어야 한다. (본인 생각 추가: DOM(Document Object Model)을 이해하고 탐색하는 과정에서도 tree가 한 몫을 담당한다)
  • graph: 엔티티 사이의 관계를 파악해야 하는 문제가 있을 경우 만능 해법이다. 소셜 네트워크, 컴퓨터 네트워크, 짝 짓기와 경매 시스템에 광범위하게 적용할 수 있다. 그래프는 특정 영역에 국한된 문제의 표현 방식을 일반적인 해법을 적용할 수 있는 일반화된 프레임워크로 전환할 수 있기에 강력한 위력을 발휘한다. 최단 비행 경로, 최단 도로 경로, 네트워크에서 최단 라우팅 경로는 실제로 최단 거리 계산이라는 동일한 알고리즘으로 표현할 수 있다. (본인 생각 추가: 요즘 뜨는 암호화폐의 부정 거래를 추적하는 과정에서도 그래프가 강력한 위력을 발휘한다)
  • 이진 탐색: 이진 탐색은 (정렬된 트리나 벡터에서) 어떤 값이 너무 적거나 많지 않은지를 기준으로 빠르게 정확한 값을 찾는 효과적인 수단이다. 이진 트리 탐색에 연결시킬 경우 효과적으로 트리의 특정 원을 탐색할 수 있게 된다.

독자 여러분들께서도 평상시에 많이 사용하는 자료 구조가 있는지? 데이터베이스를 많이 사용하는 분이라면 SQL등을 효과적으로 작성하고 수행하기 위해 관계형 모델도 잘 숙지하고 있으면 큰 도움이 되리라는 생각이다.

보너스: 10 Common Data Structures Explained with Videos + Exercises를 읽어보면 자주 사용하는 자료 구조에 대한 기억을 되살릴 수 있을 것이다.

EOB

토요일, 4월 21, 2018

[B급 프로그래머] 4월 3주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: memory allocation via @b0rk)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
(보너스: shared library via @b0rk)
EOB

토요일, 4월 14, 2018

[B급 프로그래머] 4월 2주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: The Palmer Principle: no matter the consensus mechanism, in practice, 51% of stake/mining power will be owned by at most 3 entities. via @nic__carter)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
(보너스: This is what may have happened in the recent Tesla Autopilot Crash)
EOB

토요일, 4월 07, 2018

[B급 프로그래머] dqlite - Go 애플리케이션을 위한 분산 SQLite

오늘은 정말 간만에 기술적인 글을 하나 쓰려고 한다. 최근 블록체인이 관심을 끌면서 더불어 분산 데이터베이스에 대한 관심도 늘어나고 있다. 분산 데이터베이스를 위해 덩치크고 무거운 데이터베이스 엔진에서 출발하는 방법과 경량 임베디드 데이터베이스 엔진에서 출발하는 방법이 있는데, 설치/구성/운영 관점에서 경량 임베디드 데이터베이스에서 출발하는 방법이 여러 가지 유리한 점이 많다.

블록체인에서는 주로 구글이 만든 NoSQL 계열의 LevelDB를 기반 엔진으로 많이 사용하고 있는데 일반적인 애플리케이션을 만들 경우에는 SQL 계열이 적합할 경우가 많기 때문에 다른 대안을 찾아야 한다. 오늘은 SQLite를 기반으로 만들어진 dqlite를 소개하겠다.

dqlite가 나오기 전에 이미 rqlite라는 소프트웨어가 나와 있었다. SQLite 데이터베이스를 여러 노드에서 구동한 다음에 발생하는 모든 변경 내역이 SQLite 데이터베이스의 쿼럼에 반영되거나 반영되지 않게(딱 두 가지 상태) 만들기 위해 모든 개별 SQLite 데이터베이스 인스턴스 사이에 합의가 필요하다. rqlite에서는 r이 의미하는 Raft 합의 알고리즘을 사용해 결함 포용 분산 시스템 구현에서 부딪히는 여러 가지 골칫거리를 해결하고 있다. Raft는 이론만 나와 있지 않고 이미 자바, C/C++, Go, 파이썬 등 다양한 프로그래밍 언어로 구현되어 있으므로 손쉽게 적용할 수 있다.

rqlite는 손쉽게 배포가 가능하며, SQL 데이터베이스를 사용 가능하며, 손쉬운 HTTP(S) API로 여러 서비스를 제공하며, 핫백업도 지원하지만, 몇 가지 단점이 존재한다. 완벽한 트랜잭션을 지원하지 않고, SQL 구문이 결정적이어야 하며(예: time이나 random 등을 사용하지 못한다), 복제 과정에서 성능이 떨어진다. 이런 단점을 보완하기 위해 만든 소프트웨어가 바로 dqlite이다. dqlite는 Go 라이브러리 형태이므로 그냥 SQLite처럼 프로그램에서 사용하면 되며, Hashicorp에서 만든 Go Raft 패키지를 사용해 모든 노드에서 동작하는 SQLite의 WAL(Write-Ahead-Log) 프레임을 충돌없이 복제한다.

SQLite를 멀티프로세스 뿐만 아니라 분산 환경에 적용하고 싶은 분들에게 적절한 해법이라는 생각이다. 복잡한 합의가 필요하지 않으며 데이터 무결성을 완벽하게 보증할 필요가 없는 경우라면 이런 유형의 소프트웨어를 고려하는 편이 훨씬 유리할 것이다.

EOB

목요일, 4월 05, 2018

[B급 프로그래머] 4월 1주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: Compile vs Runtime Error via @JoBoccara)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
EOB

토요일, 3월 31, 2018

[독서광] 신경끄기의 기술

워낙 빠르게 돌아가는 세상에서 남들의 보조에 맞춰 바쁘게 살아가다보면 내가 도대체 왜 이런 난리를 치고 있는지 의심이 들 때가 있다. 살아오면서 체득한 여러 가지 비법을 동원해(예: 맥주, 해외여행, 친구 만나기 등) 난관에서 벗어나려 하지만 쉽지는 않다. 오늘 소개하는 <신경 끄기의 기술>은 비록 완벽과는 거리가 멀긴하지만 어느 정도 괴로움을 완화하는 해법을 제시하고 있다.

이 책의 주제는 욕심을 버리고 내려놓기다. 더 나은 삶으로 가기 위한 다섯 가지 가치관(내 삶에서 일어나는 모든 일에 책임을 질 것, 내가 옳다는 확신을 버리고 틀릴 가능성을 받아들일 것, 실패를 두려워하지 않을 것, 거절하는 기술을 익힐 것, 내가 언젠가는 죽는다는 사실을 숙고할 것)을 중심으로 저자가 겪은 여러 가지 경험을 어떤 때는 진지하게 어떤 때는 자기를 망가뜨리며 풀어낸다. 어떻게 보면 상당히 심각한 주제인데 유머러스한 내용과 서술 방식으로 긴장을 누그러뜨리고 있다.

본문 중에서 중요하게 생각하고 넘어갈 부분을 하나 정리해본다.

우리는 항상 ‘경험’을 책임지며 살아간다. 그것이 ‘내 잘못’으로 생긴 일이 아니라 할지라도, 이것은 삶의 일부다. 당신의 상황에 책임이 있는 건 다른 누구도 아닌 당신 자신이다. 당신의 불행을 다른 사람 탓으로 돌릴 수도 있겠지만, 불행을 책임질 사람은 오로지 당신뿐이다. 왜냐면 살면서 맞닥뜨리는 사건을 어떻게 바라보고, 어떻게 대응하고, 어떻게 평가할 것인지를 선택하는 건 언제나 당신이기 때문이다. 경험을 평가할 기준을 선택하는 건 언제나 당신이다.

결론: 자신이 불행하다고 느끼거나 만사에 의욕이 없다고 느낄 때 가볍게 읽고 정신차리면 좋은 책

EOB

목요일, 3월 29, 2018

[B급 프로그래머] 3월 4주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: Sprezzatura 스프레차투라: 어려운 일을 쉬워 보이게 함으로써 우아함을 얻는 태연함 via @zittersweet99)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
(보너스: Unbreakable Crypto | Infinite Series)
EOB