stdio


Random ramblings of a anonymous software engineer. Contains occasional profanity. Personal opinions, not related to employer.


FreeBSD 에 PowerDNS + MySQL 백엔드 설치, 그리고 오픈소스의 힘과 문제점

전편에 이어. FreeBSD를 사용하는 서버의 궁극적인 목적은 내부 DNS 및 내부 DHCP를 위한것이었다.

  • Master 와 Slave가 있어 두개가 같은 설정으로 유지되었으면 했다.
  • DNS의 내장 기능을 이용해도 되겠지만, MySQL의 master-slave replication을 이용하여 한개 노드가 실패할 경우 바로 master로 사용할 수 있게 하고 싶었다.
  • DHCP는 그냥 pkg에서 설치하면 되는 문제여서 큰 난관이 없었다.

여기서 문제가 하나 발생하게 되는데, FreeBSD pkg repository에 있는 powerdns 패키지에는 MySQL 백엔드가 아닌 Postgres 백엔드만 포함되어 있다는 것이었다.

일반적으로 Postgres를 사용할 줄 아는 경우라면 큰 문제가 되지 않는데, 공교롭게도 사내에서 Postgres를 다뤄본 경험이 있는 사람이 1명 밖에 없어 single point of failure의 위험성이 있었다. 그리하여, MySQL 백엔드를 포함하여 새로 빌드하기로.

설치에 앞서, 의존성이 최근에 추가된게 하나 있어 해당 의존성을 위해 pandoc이라는 문서 프리프로세서의 설치가 필요하다. (이전에 패키지 명칭이 pandoc 이었으니 만약에 아래 명령으로 설치가 안된다면 pandoc 으로 바꿔보면 될 수도 있다.)

pkg install hs-pandoc

컴파일 방법은 공식 문서에 있는 그대로 따라했고, 추가한건 MySQL 백엔드를 활성화 시켜준 것 밖에 없다. 명령은 아래와 같다.

./configure --with-modules="bind gmysql"

우분투의 build-essential에 해당하는것을 설치하고 (이와 관련해서는 이전 글에 설명 되어있으니 참고하면 된다.) 빌드를 진행하는데, 괴상한 컴파일 오류를 경험하게 되었다. (내가 겪었던 컴파일 에러는 터미널 스크롤백의 신들에게 재물로 바쳐졌기 때문에 더 이상 없다. 굳이 해당 refspec을 찾아가서 재현해보기는 귀찮으나, 궁극적으로는 같은 에러이다.)

이 오류의 원인은 대부분의 청중에게 의미가 없을 듯 하여, 이 글에서는 설명하지 않겠다. (명시적으로 생성된 std::string과 묵시적으로 생성된 std::string의 수명과 reference tuple 안에 rvalue를 담을 수 있는가 없는가에 대해 표준의 과도한 해석을 clang에서 하고 있는 문제인데, 더 이야기를 하자면 복잡하니 생략. 내용이 궁금하면 PR을 보면 된다.)

불행 중 다행은 나 말고 이 문제를 겪은 사람이 있다는 것이었고, 적어도 우리 환경에 한정된 문제가 아니었다는 것이다.

추가 (45879fae66a5fbc37d1edf32b2b9337383140d2f 기준): FreeBSD 빌드가 또 망가져버려서, PR#5067의 패치가 필요하고, export CXXFLAGS=-std=c++11을 추가해주어야 한다.

오픈소스의 문제점

여기서 문제는 깃헙에 버그 리포트가 들어간 날짜는 3월 11이었다는 것이고, 내가 이 문제를 겪은것은 10월 3일이었다는 것이다. 1줄 짜리 컴파일 에러 하나를 수정하는데 7달 동안 아무도 손을 대지 않았다는 것이다.

오픈소스의 문제점은 생산을 하는 사람이 소비를 하는 사람보다 월등하게 적다는 것이다. 특히나 난이도 높은 근본 라이브러리일수록 (특히, C/C++일 경우 이 문제가 심각하다) 사람들이 기여를 안하고 쓰기만 한다는 것이다. 문제는 기여를 하는 사람들이 적고, 요구사항을 외치는 유저들만 너무 많아 대응이 안되는 시점에 기여를 하던 사람들도 결국에는 하나씩 번아웃을 하여 오픈소스에 기여하는 것을 포기한다는 것이다.

한 줄짜리 패치 보내면서 생색 내는것 같지만, 이렇게라도 하는 사람이 너무 없는게 현실이다. 다행히도, PowerDNS 커미터들이 내 패치를 빠르게 (하루 걸렸던것으로 기억된다) PR을 반영해주었고, BSD + clang 환경 호환성 문제가 어렵지 않게 해결되었다.

오픈소스를 갖다 쓰지만 말고, 문제가 있으면 문제가 있다고 보고만 하던가 그냥 쉽게 동작하는 다른 라이브러리를 택하는 경우가 많은데 만약에 해결을 할 수 있는 문제면 해결을 해서 기여도 했으면 하는 바램이다.

삭제된 내용

원래 글에는 PowerDNS 설정 관련된 내용도 있었으나, 회사 내에서 PowerDNS를 사용하는 목적이 내부 DNS 및 비표준 내부 TLD를 지원 하기 위한 목적이어서 설정 공유를 하면 혼란만 있을 것 같아 (해당 설정을 그대로 복제하였을 경우 정상적인 DNS 환경이 아닌 특수한 환경으로 설정되어 버리기 때문에), 처음 작성한 내용에서 삭제하였다.

추가된 내용

2017.2.22: Pandoc 의존성 관련 내용 추가.