7/10/2017

틀리지 않는 법 — 수학적 사고의 힘

그래, 표지에 꽂혔다. “세상을 더 깊게, 더 올바르게, 더 의미 있게 이해하는 법!”이라는 글귀에 현혹이 되었다. 책을 펼치기 전에 이 책에 대한 나의 기대를 몇 자 적는다.
나는 수학을 잘 못한다. 학교때 정규 과정으로 배웠고, 학부에서도 전공을 하긴 했지만 잘 모른다. 이 책을 펼치기전에 문득 학부때 교수님이 하신 말씀이 떠올랐다. “여러분은 수학을 계산하는 것으로 알고 있지만, 그렇지 않아요. 수학은 이성적으로 사고하는 방식을 배우는 거에요.” 교수님의 말씀을 이해한 친구들이 있었을까? 그 당시의 나는 이해하지 못했다.
이제 나의 아이가 초등학생이 되었고 수학을 배우고 있다. 덧셈, 뺄셈을 배우면서 책에서 알려주는 규칙을 배우고 있다. 이미 이 규칙들은 선대에 의해 증명되었고 규칙화 되었다. 이런 규칙들을 알려주는 책은 아니겠지?
교수님이 말했던 “수학적 사고방식” 즉, 더 나은 사고를 하도록 알려주는 책이길 바란다.

7/09/2017

NGINX based vod packager 소개


  • Working modes:
  • Local: serve locally accessible files (local disk/NFS mounted)
  • Remote: serve files accessible via HTTP using range requests
  • Mapped: serve files according to a specification encoded in JSON format. The JSON can pulled from a remote server, or read from a local file
  • Adaptive bitrate support
  • Playlist support — mapped mode only
  • Simulated live support (generating live stream from MP4 files) — mapped mode only
  • Fallback support for file not found in local/mapped modes (useful in multi-datacenter environments)
  • Video codecs: H264, H265 (DASH/HLS), VP9 (DASH)
  • Audio codecs: AAC, MP3 (HLS/HDS/MSS), AC-3 (DASH/HLS), E-AC-3 (DASH/HLS), OPUS (DASH)
  • Playback rate change — 0.5x up to 2x (requires libelcodec and libavfilter)
  • Support for variable segment lengths — enabling the player to select the optimal bitrate fast, without the overhead of short segments for the whole duration of the video
  • Clipping of MP4 files for progressive download playback
  • Thumbnail capture (requires libavcodec)
  • Decryption of CENC-encrypted MP4 files (it is possible to create such files with MP4Box)
  • DASH: common encryption (CENC) support
  • MSS: PlayReady encryption support
  • HLS: Generation of I-frames playlist (EXT-X-I-FRAMES-ONLY)
  • HLS: support for AES-128 / SAMPLE-AES encryption
  • I-frames playlist generation is not supported when encryption is enabled
  • Tested on Linux only

7/04/2017

HashiCorp사의 Consul, Consul Template 소개

HashiCorp에서 제공하는 Consul은 Service Discovery, Failure Detection, Multi Datacenter, KV Storage 기능을 제공합니다. HAproxy 혹은 Nginx와 같은 Software 기반의 Load Balancer를 Cloud 상에 구축한다고 가정해보면, 고려해야 할 사항은 아래와 같습니다.
  • 부하량에 따라 LB가 Scale In/Out이 되어야 한다.
  • 로드 밸런싱 대상이 되는 Backend 서비스가 Scale In/Out이 되면 LB의 Configuration이 실시간으로 변경되어야 하며, 각 LB에게 동기화가 되어야 한다.
  • LB의 Health check가 수행되어야 한다.
이 정도로만 간추려봐도 LB하나를 도입하기 위해 해야할 일이 많아지게 됩니다. 분산 환경에서의 이러한 일을 처리하기 위해 예전에는 Apache Zookeeper를 이용하여 개발을 했었지만 이번에는 Consul을 이용해보기로 했습니다.
Apache Zookeeper와 HashiCorp의 Consul의 차이점은 아래와 같습니다.
#Apache Zookeeper
  • Written in Java
  • Strongly consistent (CP)
  • Zab protocol (Paxos like)
  • Ensemble of servers
  • Quorum needed (majority)
  • Dataset must fit in memory
Zookeeper는 현재 많은 곳에서 활용되고 있지만, 몇가지 문제점을 지니고 있습니다.
#Zookeeper : Problems
  • Latency-dependent
  • No multi datacenters support (very slow write)
  • Client number limit (out of sockets)
  • Designed to store data on the order of KB in size
  • Possibly lost changes while reenabling watch
  • TCP connection != service healthy (proxy)
  • Change zk server is a problem
이러한 문제점들을 보완해서 나온 제품이 Consul입니다. Consul의 특징을 보시죠.
#HashiCorp Consul
  • Written in Go
  • Service discovery
  • Health checking
  • Key / Value Store
  • Multi datacenter support
  • Agent / Server Concept
  • Gossip protocol for all the nodes (discovery)
  • Consensus protocol (Raft-based) for servers
  • 3 consistency modes
  • Access Control List (ACL)
Consul에서 제공하는 기능을 HAProxy에 적용을 해봤고 결과는 만족스럽습니다.
HAProxy는 GSLB or DNS RR로 상위 Client에서 접속을 시도하게 되게되고 이 경우 HAProxy를 HA구성(Active-Standby)을 해야 합니다.
HAProxy가 설치된 VM에 consul agent를 등록하고 별도의 config 파일을 만들어 HAProxy에 대해서 Health checking을 수행 합니다. LB 매커니즘이 Round Robin일 경우 HTTP로 health check를 하게되면 LB가 문제가 될 소지가 많기에, 저의 경우에는 별도의 script를 만들어서 health checking을 수행했습니다.
haproxy.cfg 파일을 중앙에서 관리하기 위해 haproxy.cfg.ctmpl 파일을 만들어 consul-template daemon을 구동합니다. haproxy.cfg.ctmpl내에 별도의 key를 만들어 이 정보를 Consul의 K/V store에서 관리 및 변경시 모든 node에 즉시 동기화가 됩니다.
이렇게 함으로써 HAProxy를 도입할때의 고려사항 중 일부가 해소가 되었습니다.
앞으로 남은 부분은 consul-ui에서 확인할 수 있는 alarm 및 기타 정보를 push 형태로 IaaS Management 쪽에 전달하는 부분만 보완하면 될 것 같습니다. consul-ui는 어디까지나 확인 용도이고 IaaS management tool과 Integration이 되어야 하기 때문입니다.
그동안 Zookeeper를 쓰면서 client number limit, TCP connection, store data design 부분에 대해서 고민이 있었는데, consul을 활용하면서 이런 부분이 어느정도 해소가 될 것으로 보여집니다.
관련하여 좋은 Tip이 있으면 같이 공유했으면 합니다.