개인용 NAS를 충분히 이용하지 못한다는 생각이 문득 들었습니다.

기본적으로 제공하는 Photos, 파일 저장소 정도만 이용하며, Docker Gitlab 서버 배포 중이긴 하지만.. 그냥 배포중 입니다.
이 정도도 충분하긴 하지만 조금 더 활용하면 좋지 않을까라는 생각을 하게 됐습니다.

문득 생각해 보니 NAS에서 Docker를 사용할 수 있다는 것은 개인적으로 운용할 수 있는 장난감 서버로 최적이지 않을까라는 생각이 들었습니다.
물론 아마도 많은 트래픽은 감당하지 못하더라도 개인적인 용도로 테스트 서버 정도는 만들 수 있지 않을까 생각됩니다.

NAS를 이용하면 기본적으로 도메인을 받을 수 있으며, DDNS 서비스를 제공하기에 조금 더 외부 접근에 대한 관리가 쉬울 것입니다.

서비스를 만들 때 AWS를 이용하면 좋긴 합니다. 관리도 쉽고 트래픽의 요청이 많으면 자동화도 할 수 있고, 탄력적이고 확장성 있게 리소스를 조정할 수 있습니다.
그렇지만 그만큼의 비용을 지불해야 합니다.

NAS를 이용하면.. 전기세만 내면 개인적인 서비스를 구축할 수 있습니다..! 이후 안정화가 되거나 될 것 같은 서비스라고 판단되면 AWS나 Azure 이것도 아니라면 개인용 서버를 이용하여 환경을 구축하면 되지 않을까 생각합니다.

NAS 소비 전력 계산

이참에 개인 양산형 NAS(DS220+)의 소비전력을 한번 계산 해보겠습니다.

NAS가 없다면 NAS 구입 비용과 매달 내는 전기세를 계산해보고, NAS를 사용하지 않고 필요할 때 Cloud를 이용하는 것도 현명한 선택이라 생각됩니다.

DS220+의 스펙 을 확인해보니 전원 소비 값은 아래와 같더군요.

image

최대값을 계산해보면 NAS: 15W, NAS용 하드디스크(4T): 4W~5W

하드디스크가 2개들어가니 총 25W를 사용한다고 가정하면 한달 전기 소비량은

25W x 24(시간) x 30(일) = 18000Wh = 18kWh 정도 되네요.

네이버 전력 계산기에서는 18kWh만 넣으니 값이 이상해서 변화가 없을 정도로 미미한가 봅니다..
한전 전기요금 계산기를 이용해 계산해보니 한달에 얼추 2천원이네요.

image

23년 12월 기준 한달에 200kWh 미만을 사용하니 누진세도 없고.. 이 정도면.. NAS를 장난감으로 쓰는 것도 좋다고 생각합니다.
사실 이러한 전기 요금에 대해 신경 쓰고 있지 않았지만, 궁금해서 계산해 봤습니다. :D..

SSH 접속과 관련하여

NAS도 SSH로 접속하여 CMD창으로도 도커 이미지 및 컨테이너를 생성할 수 있습니다.
공식 이미지가 아닌 경우는 위와 같은 방법으로 SSH 접속 포트(22는 위험하니 다른..)를 열고 방화벽(개인 접속 ip 한정으로)을 허용하여 작업할 수 도 있습니다.

한번은 NAS 설정이 제대로 안돼서 방화벽을 한 5분 정도 열어두니 어디선가 NAS로 접근 요청이 들어와서 아래와 같이 경고 메일이 온 적도 있었습니다.

image

그렇기 때문에 NAS SSH 접속 포트는 22번이 아닌 특정 값으로 하는 것이 좋으며, 공유기의 포트포워딩을 할 때에도 꼭 필요한 포트만 오픈하는 것이 안전합니다.

Docker MariaDB 설치

NAS에서는 패키지 중에 Docker Container를 제공하며, 외부 도메인을 이용할 수 있기 때문에 마음만 먹으면 개인용 웹서버 및 DB 등 다양한 서비스를 구축할 수 있습니다.

이와 관련하여 예전에 작성한 Synology NAS로 Docker GitLab 설치하기 와 유사합니다.

우선 패키지 센터에서 mariadb의 이미지를 등록합니다. SSH로 접속하여 실제 도커 허브에서도 받을 수 있고, 쉽게 레지스트리에서 이미지를 다운 받을 수도 있습니다.

정상적으로 받은 경우 아래와 같이 도커의 이미지 항목에 MariaDB가 추가됩니다. 추가로 이미지는 버전은 latest 보다는 특정 버전을 명시하는 것이 좋다 생각합니다.

image

latest로 받게 되면 최신 버전을 사용할 수 있어서 새로운 기능과 보안 업데이트를 빠르게 받을 수 있는 장점이 있습니다. 그렇지만, “latest"는 항상 최신 버전을 가리키기 때문에, 언제나 동일한 동작을 보장하지 않을 수 있습니다. 또한, 의존성이나 환경 설정이 변경될 수 있어 예기치 못한 문제가 발생할 수 있습니다.

레지스트리에서 다운로드를 받은 뒤 아래와 같이 컨테이너를 생성해줍니다.

image

Docker 내부의 포트는 기본포트로 3306을 지정하고, 외부에서 Docker로 접속하는 포트는 33306으로 지정했습니다.

볼륨 설정의 값은 Docker DB에서 설정된 값을 NAS 저장소의 위치로 매핑시켜줍니다.
데이터가 저장될 디렉터리를 생성(/docker/mariadb/data)하여 도커에 있는 /var/lib/mysql 저장 위치로 매핑하고, 마찬가지로 설정 파일이 저장될 위치도 생성(/docker/mariadb/config)한 뒤 도커에 있는 /etc/mysql/conf.d 로 저장되도록 설정합니다.

image

컨테이너 환경은 기본적인 값은 설정돼 있습니다.
아래와 같이 MYSQL_ROOT_PASSWORD 값을 지정해야 이후 컨테이너를 실행하면 root의 비밀번호로 로그인할 수 있습니다.
만약 Timezone을 변경하고 싶다면 위와 같은 식으로 Key는 TZ 값은 Asia/Seoul로 지정하면 타임존을 한국시간(UTC-9)로 설정할 수 있습니다.

image

이후 NAS를 통해 들어오는 방화벽을 허용해줍니다.

image

만약 내부에서 쓰는 경우라면 공유기 포트포워딩이 필요없지만 외부로 사용할 경우에는 공유기도 포트포워딩이 필요합니다. 포트포워딩은 공유기 마다 다르기 때문에 설정이 다를 수 있습니다. 이전에 올린 Synology NAS로 Docker GitLab 설치하기 에서 KT 공유기의 포트포워딩 방법도 함께 있으니 참고하시면 좋을 것 같습니다.

이렇게 하시면 NAS를 이용해서 DB에 접속할 수 있습니다..!

image

그런데 위와 같이 DB 설정을 마쳤지만, 간단한 데이터베이스 생성 및 테이블 생성하여 insert 테스트를 하니 생각보다 느린 현상이 있었습니다.

image

장비의 문제인지 설정의 문제인지 정확하지 않지만 제 경우는 InnoDB 플러시 매개변수에서 innodb_flush_log_at_trx_commit의 기본값을 1에서 2로 변경했습니다.

몇몇 답변으로는 innodb_buffer_pull 의 값을 변경하는 것이 좋다는 이야기도 있지만, 제 경우는 중요한 데이터를 저장하는게 아니라 위의 값을 수정하는 것으로 만족했습니다.

innodb_flush_log_at_trx_commit 이란

innodb_flush_log_at_trx_commit는 MySQL 데이터베이스의 InnoDB 스토리지 엔진에서 사용되는 설정 중 하나입니다.

이 설정은 트랜잭션 커밋 시 로그 버퍼를 디스크에 언제 플러시할지를 결정합니다. 이 설정은 MySQL의 성능과 내구성 간의 트레이드오프를 조절하는 데 사용됩니다.

innodb_flush_log_at_trx_commit에는 세 가지 옵션이 있습니다

  1. 0: 로그 버퍼는 트랜잭션 커밋 시마다 디스크에 플러시되지 않습니다. 대신 1초마다 한 번만 플러시됩니다. 이는 성능을 향상시킬 수 있지만, 시스템이 갑작스런 장애나 전원 손실로 인한 데이터 손실이 발생할 수 있습니다.

  2. 1: 로그 버퍼는 각 트랜잭션 커밋 시마다 디스크에 플러시됩니다. 이는 데이터의 내구성을 높이지만, 플러시 작업이 성능에 영향을 미칠 수 있습니다.

  3. 2: 로그 버퍼는 트랜잭션 커밋 시 디스크에 플러시되지 않습니다. 대신, 트랜잭션 데이터는 로그 파일 그룹에 쓰여질 때까지 메모리에 보관됩니다. 그 후 로그 파일 그룹은 주기적으로 디스크에 플러시됩니다. 이 옵션은 1과 0의 중간 지점으로 볼 수 있으며, 내구성을 높이면서도 일부 성능 향상을 제공할 수 있습니다.

기본적으로 이 설정은 1로 설정되어 있습니다. 이 설정을 변경하려면 MySQL 설정 파일(my.cnf 또는 my.ini)에서 innodb_flush_log_at_trx_commit 값을 조정하고, MySQL을 재시작해야 합니다.

이렇게 설정을 하면 아래와 같이 700ms -> 5ms 로 insert 속도가 향상된 것을 확인할 수 있습니다.

image

이렇게 NAS안에서 Docker를 이용해 DB Setting을 하는 방법에 대해 알아봤습니다.

참고