2015년 3월 2일 월요일

집에서 만드는 친환경 클라우드 - 하드웨어와 인프라편

작년에 AWS를 통해 IoT 클라우드 환경을 구축해보고 제가 원하는 컴퓨팅 환경에 AWS를 이용할 경우 한달에 400달러가 들어가는것을 확인했습니다. 그 후 저렴하면서 전기도 덜 먹는 환경 친화적인 컴퓨팅 환경을 고민했습니다. 그 고민의 결과로 ARM 프로세서, 비가상화, 메모리카드 기반의 인스턴스 증가등을 이용해서 컴퓨팅 환경을 디자인했습니다. 이 포스트는 그 중 하드웨어 구성과 인프라소프트웨어 셋팅을 다루고 있습니다.

클라우드 구축 결과

결과 모습을 먼저 보고 이야기를 하는것이 쉬울것 같습니다. 인터넷에 떠도는 이쁜 렉에 가지런히 장착한것들을 보다가, 제가 구축한 모습을 보셨다면 좀 실망하셨을겁니다. 운동기구 놓던 자리에 공간을 마련했습니다. 기가허브, 마이크로서버, ARM 프로세서 4대를 이용해서 컴퓨팅 환경을 구성했습니다. 가용성은 마이크로서버 N대와 ARM 프로세서 M대로 확보합니다. 마이크로 프로세서는 2개가 기본으로 운영되고 부하에 따라서 4대까지 기동됩니다. 총 비용은 90만원입니다.

전체 모습

AWS에서의 컴퓨팅 아키텍처

아키텍처는 2015년 1월에 AWS에서 사용한 아키텍처와 동일합니다. 물론 IaaS에서 제공하던 로드 밸런스나 가용성 확보를 위한 스케일 메니저는 사용할수 없으므로 만들어서 구축했습니다.


ARM 마이크로 프로세서


컴퓨팅 인스턴스 확장을 위한 메모리 카드

마이크로서버를 늘리기 위해서는 위 이미지의 USB메모리를 꼽기만하면되고, 마이크로 프로세서를 늘리기 위해서는 SD카드만 마이크로세서에 꼽고 전원을 넣으면 컴퓨팅 자원이 늘어납니다.

IoT Car

제가 이런 컴퓨팅 환경이 필요한 이유는 위와 같은 복잡한 사물 부터 온도 습도계 같은 단순한 사물까지 센서 데이터를 수집하고 분석하고 AI가 이를 바탕으로 정보를 만들기 때문입니다.

IoT 정보 시스템

이 컴퓨팅 환경에서 동작하는 AI인 Angelia는 각종 센서 데이터를 바탕으로 제목 + 이미지 + 요약 형태의 정보를 만들어서 제공합니다. 센서 데이터에는 앞서 이야기한 자동차나 온도/습도계와 제가 작성한 블로그도 하나의 센서 데이터입니다. 제가 작성한 블로그는 공개된 데이터지만 개인적인 영상이나 소리, 위치 정보까지 중앙 집중식 클라우드에 전송되는것은 Privacy에 좋은 방법이 아니라고 생각합니다. 집안에 있는 컴퓨팅할수 있는 자원들을 병렬로 묶어서 컴퓨팅하는 방법을 연구하고 있습니다. TV, 냉장고, 세탁기 등의 컴퓨팅 자원을 병렬로 묶는것입니다. 성능과 프라이버시 문제를 동시에 만족 할 수 있기 때문입니다.

센서 네트워크 + 컴퓨팅 네트워크

IoT 관련 컴퓨팅이 전에는 제 데스크탑 PC에서 돌고 있었습니다. Angelia가 일을 조금 할때는 제가 PC를 쓸수 있지만, 분석을 시작하면 전 PC를 쓸수가 없었습니다. 이 컴퓨팅을 AWS에서 운영하면 한달에 400달러가 듭니다. 운영 비용 보다는 도쿄에 있는 AWS를 쓸대 발생하는 지연속도가 가장 큰 문제였습니다. 100ms~200ms 사이로 지연속도가 바뀝니다. 중앙에서 실시간으로 분석하여 인포메이션을 만들기에는 너무 큰 지연시간입니다. AWS와 같은 IaaS의 선택은 실시간성이 중요한 서비스에는 좋지 못합니다. 한국에 센터가 생길때까지 다른 방법을 찾아야합니다.

하드웨어 선택과 구성

제가 설계한 환경은 크게 프로세싱 영역과 데이터 영역으로 나뉩니다. 이렇게 영역을 나눈 이유는 데이터를 다루는 컴퓨팅 환경과 연산을 하는 컴퓨팅 환경의 특성이 다르기 때문에 효율적으로 역할을 나눈것입니다. 자동차 공장의 외장 조립부와 내장 조립부가 나뉜것처럼 비슷한 처리를 하는 컴퓨팅 자원을 구룹으로 묶으면 해당 작업에 특화된 구성이 가능하므로 효율이 올라갑니다. 저의 하드웨어 선택도 프로세싱 영역과 데이터 영역으로 나뉩니다. 우선 프로세싱 영역에서 고민한 사항은 다음과 같습니다.

  1. 저전력 - 전기를 적게 먹을 수록 불필요한 전기 생산도 없을것이고 환경에 좋습니다.
  2. 쉽게 다를수 있다 - 소프트웨어 선택의 폭이 넓고 쉽게 수정할수 있는 요소입니다.
  3. 가격이 저렴하다 - 여러대를 운영하므로 소유 비용이 저렴해야합니다.
  4. 쉽게 늘릴수 있다 - 쉽게 겹겹이 쌓을 수 있고 각종 케이블을 쉽게 연결할 수 있어야합니다.
처음에 고려된 ATOM 기반의 울트라북 재활용


집에 있던 ATOM 기반의 울트라북을 우선 고민했습니다. LCD 케이블을 제거하면 14W정도면 돌릴수 있기 때문입니다. IT 제품에서 스크린은 전체 전력의 30% 이상을 차지합니다. 따라서 디스플레이의 전원 공급을 끊으면 전력을 더 적게 사용합니다. X86기반이라서 소프트웨어의 선택의 폭도 넓습니다. X86은 우리가 일반적으로 쓰는 컴퓨터를 말합니다. 문제는 동일한 제품을 여러게 구입해서 가용성을 늘리기 어려웠습니다. 여러게 원하는 시기에 중고로 구매하기가 어렵습니다.

그러다가 떠오른것은 마이크로 프로세서입니다. 대표적으로는 라즈베리파이와 같은 제품이 있습니다. 이런 오픈 하드웨어를 안쓰더라도 우린 이미 많은 마이크로프로세서를 사용하고 있습니다. 인터넷에 연결되는 기기들은 대부분 마이크로 프로세서를 탑제하고 있습니다. 라즈베리 B+를 사용하다가 무인자동차의 실시간 처리가 안되서 빠른 마이크로 프로세서를 찾다가 작년 6월에 선택한 제품입니다.

하드커널사의 OdroidU3

주요 스펙을 보면 전기는 라즈베리파이 B+에 비해 4배를 사용하나 연산 속도는 16배 정도 빠릅니다. 내장 메모리도 2기가나 됩니다. 처리해야할 일을 한거번에 많이 가져와서 계속 계산을 할수 있으므로 내장 메모리의 크기는 중요합니다. 왜냐하면 메모리의 속도에 비해서 네트워크나 디스크를 읽는 속도는 느리기 때문입니다.

OdroidU3
  • 1.7GHz Exynos4412 Prime Cortex-A9 Quad-core processor
  • 2Gbyte LPDDR2 880Mega Data Rate
  • XUbuntu 13.10 or Android 4.x  Operating System
  • Size : 83 x 48 mm, Weight : 48g including heat sink
  • 5V / 2A input

옆에 ESC(전자속도제어장치)가 활활 탈때에도 위험 신호와 위치 정보를 충실히 전송해준 믿음도 컸습니다. 산업용 프로세서들은 오픈하드웨어의 비해 더 가혹한 조건(저온과 고온)에서 운영되도록 설계합니다. 하지만 나름 위험한 상황에서 안정적으로 프로세싱을 한 오픈하드웨어입니다. ARM 프로세서는 인텔 계열의 저전력 프로세서와 비교하더라도 소모 전력 당 연산능력이 월등합니다. 모바일 시대에서 ARM이 주목받은 이유가 바로 이것입니다. 전 모바일 뿐만아니라 클라우드 시대에서도 중요한 프로세서로 생각합니다. 저전력에 컴퓨팅 자원을 잘게 쪼갤수록 효율이 높아지기 때문입니다. 이 프로세서를 병렬로 연결해서 분산처리하고 하나씩 늘려서 가용성을 확보합니다. 다음은 데이터 영역에 대한 고민입니다.

우선 NAS 구입을 고려했습니다. 디스크를 4대까지 연결할수 있는 나스는 50만원에서 100만원 사이로 매우 고가였습니다. 스토리지의 프로세서를 늘리는것도 필요하지만 일정 프로세서 한계까지는 디스크 용량의 확장도 필요합니다. NAS에는 여러 앱들을 통해 비디오 스트리밍도 되고 웹하드도 되는 서비스를 제공합니다. 저에게는 이런 앱보다는 디스크를 늘릴수 있는 기구와 우분투를 설치할수 있는 프로세서가 필요했습니다. 대부분의 NAS들의 운영체제는 펌웨어와 더불어 고립된 환경을 가지고 있기 때문에 마음대로 설정을 바꾸거나 소프트웨어를 설치하기가 어렵습니다. 따라서 NAS들은 클라우드의 스토리지 용으로는 부적합합니다. 그렇게 고민하던 중에 눈에 들어온것이 HP사의 마이크로 서버 시리즈입니다.

HP사의 N54L

3.5인치 디스크를 4대 꼽을수 있고 메모리를 8기가까지 확장할 수 있습니다. NAS제품들은 메모리가 2기가 넘게 메모리를 확장할 수 있는 제품이 드뭅니다. Elasticsearch와 같은 NoSQL를 사용하기 위해 최소 4G의 메모리를 달수 있는 제품이 필요했습니다. 또한 기본적으로 서버의 특성도 필요했습니다. 전원 스위치는 킬수만 있다(실수로 전원 스위치를 눌러서 꺼지는것을 막기 위한 기능), 케이스 안의 USB 슬롯(실수로 운영체제를 담당하는 USB 메모리를 제거해서 운영이 멈추는 상황을 막음) 등

N54L MicroServer
  • AMD Turion II Processor Model Neo N54L (2.20 GHz, 15W, 2MB)
  • 2x 1MB Level 2 cache
  • PC3-10600E unbuffered DDR3 ECC operating at 800MHz 
  • Embedded NC107i PCI Express Gigabit Ethernet Server Adapter
  • 4 x  3.5" SATA
허브는 IPTime의 H5008을 사용했습니다. OdroidU3가 기가 이더넷을 지원하지 못하지만 제 데스크탑과 데이터 스토리지는 기가 인더넷을 지원하고 8개 이상의 포트가 필요했습니다. 내부망만 기가비트로 운영하더라도 WAN을 담당하는 인터넷 공유기도 기가비트를 사용하셔야합니다. 속도에 영향을 줍니다. 케이블도 Cat.6 이상을 쓰셔야합니다. 랜 케이블에는 Cat.5, Cat.6이라는 글자가 써있습니다. Cat.5 100Mbps, Cat.6는 기가용입니다.

네트워크 구성도

제 데스크탑 PC도 하나의 컴퓨팅 자원으로 제가 사용하지 않을 경우 WOL(Wake On Lan)으로 깨워서 컴퓨팅 자원으로 활용합니다. 컴퓨팅 자원을 사용안하면 전기료를 줄일 수 있으나 필요한경우에 안사용하면 당연히 기회비용이 발생하기 때문에 필요한 컴퓨팅 자원은 모두 클라우드로 통합해야합니다.


가용성 확보 하기

AWS에 구축한 IoT 컴퓨팅 아키텍처

아마존과 MS의 Azure, Google App engine과 같은 IaaS를 사용하게 되면 기본적으로 부하에 대한 모니터링과 가장 기초적인 로드밸런싱 서비스를 받을수 있습니다. AWS와 같은 IaaS의 기반 없이 스스로 클라우드를 만들기 위해서는 다음고 같은 추가적인 사항의 고려가 필요했습니다.
  1. 로드 벨런스/잡 스케줄러
  2. 인스턴스 증가
1의 로드 벨런스의 경우 AWS의 단순한 로드 벨런스(부하에 따른 단순 분배) 만으로는 어짜피 한계가 있어서 재구축이 필요했고 인스턴스 증가는 좀 뼈 아픈 문제였습니다. 인스턴스의 이미지만 형상 관리를 하면 부하에 따라서 그 이미지를 기반하여 가용성을 조절해주기 때문입니다. 클라우드는 쉽게 가용성을 확보해야하기 때문에 이 부분의 고민이 많았습니다. 제가 선택한 방법은 메모리에 운영체제를 포함한 이미지를 형상 관리하고 새로운 인스턴스가 필요하면 이 이미지를 복사하여 USB 슬롯이나 메모리카드 슬롯에 끼워주는 방법입니다. 하드웨어만 있으면 이 방법을 통해 1분이면 새로운 컴퓨팅 자원이 늘어납니다. 이런한 쉽고 빠른 컴퓨팅 자원의 증가 방법이 중요한 이유는 우리가 새로 컴퓨터를 조립하고 소프트웨어를 설치하는 시간을 생각해보면 알수가 있습니다. 50년에 한대 정도 새로 컴퓨터를 장만해서 소프트웨어를 설치하는 시간은 매우 작은 비용이지만 한달에 한반을 가정하더라도 이 비용이 꽤 큰 비용이 됩니다. 또한 절차가 복잡하게 되면 실수를하게 됩니다.

스토리지의 운영체제 설치

프로세서의 운영체제 설치

슬롯에 꼽고 전원과 네트워크만 연결하면 컴퓨팅 자원이 늘어납니다. 전원이 들어와서 최초 부팅시에 로드벨런스에게 자신의 존재를 알립니다. 이 내용은 소프트웨어편에서 다루겠습니다.


1번 부터 3번까지의 컴퓨팅 자원은 평소에는 꺼져있다가 부하에 따라서 이 순서대로 전원을 공급하고 컴퓨팅 자원에 추가 됩니다. 1번 부터 3번까지의 컴퓨팅 자원들은 평소에는 할일이 없기 때문에 비용을 줄이고 일이 생기면 일을 합니다.

인프라 소프트웨어의 설치

이번 클라우드 구축의 목적은 IoT 환경 외에 모바일 오피스도 목적이 있습니다. 전세계 어디든 네트워크가 되는곳에서 자유롭게 일할수 있는 환경을 구축하는것입니다. 아래와 같은 순서로 설치했습니다. 이 소프트웨어는 전부 데이터 스토리지(N54L)에 설치했습니다. 웹 인터페스를 제공하는 소프트웨어는 서브 도메인으로 바인딩 했습니다.
  1. SSH
  2. Transmission
  3. Samba
  4. GitLab
  5. Elasticsearch
  6. PostgreSQL
SSH

시큐어 원격 쉘과 SFTP를 사용하기 위해 필요합니다. FTPbox와 같은 소프트웨어와 연결하여 자신만의 빠른 드랍박스를 운영할 수 있습니다.

Transmission

리눅스용 토렌트 프로그램입니다. 네트워크가 불안정한 지역에 일정 크기 이상의 바이너리를 배포할때 토렌트 만큼 적절한 수단이 없습니다. 웹 인터페이스를 이용해서 어디서든지 제어가 가능합니다.

Samba
컴퓨팅 인스턴스를 쉽게 늘리기 위해서는 로컬 데이터를 안만드는 구조로 가야합니다. 따라서 인스턴스가 만들어내는 SQL, NoSQL외에 일반 파일 데이터를 읽고 쓸 인터페이스가 필요합니다. Samba는 네트워크 디스크를 제공합니다.

GitLab

전 이슈트래킹과 형상관리로 Redmine과 SVN을 써왔습니다. 이참에 한번 확 바꿨습니다. GitLab의 이슈트래커에 타임 트랙킹이 안되는점을 제외하고 만족합니다. 코드에 코멘트를 남길수 있어서 코드리뷰용으로 매우 좋을것 같습니다.

Elasticsearch
NoSQL로 몽고DB를 써왔는데, 한 달 전쯤에 짧은 시간 안에 2기가 정도의 데이터를 넣으니 제대로 안들어가는 현상을 발견했습니다. 비슷한 인터페이스의 Elasticsearch로 NoSQL 솔루션을 변경했습니다. 센서 데이터의 기록용으로 사용합니다.

PostgreSQL
제 이력 중 반은 MySQL을 썼습니다. 나머지는 PostgreSQL를 사용했는데 클러스터링에 매우 강하고 MySQL 처럼 DB Connector가 GPL인 이슈가 없어서 DB Connector를 같이 배포해되기때문에 계속 PostgreSQL를 사용하고 있습니다. 분석자료의 기록용으로 사용합니다.

전력 소모

이번 구축의 목표가 친환경이기 때문에 전력의 소모도 매우중요합니다. 전력에 대한 걱정에 앞서서 개인적으로 사용할 파워 아웃랫과 클라우드가 사용할 아웃랫을 분리했습니다. 거미줄 처럼 복잡하게 전기를 연결해 쓰는것은 위험하기 때문입니다.

새로 정리한 아웃랫

위의 아웃랫은 클라우드가 사용하고 아래의 아웃랫은 개인적으로 쓰는 PC, 모니터, 가습기, 오디오, 충전기, 노트북 어뎁터등에 사용합니다.


최소 전력 소모의 시나리오는 허브, 스토리지 한대, 마이크로 프로세서 2대가 작동할때입니다. 최대 전력 소모의 시나리오는 모든 컴퓨팅 자원이 작동할때입니다. 소모 전류의 측정은 가정용 측정기인 SJPM-C16을 사용했습니다.

SJPM-C16

물론 테스터기가 있다면 테스터를 이용해서 전류와 전압을 곱해도 됩니다. 최소와 최대 전류 사용량은 다음과 같습니다.



전기 소모대 처리량은 소프트웨어편에서 다루겠습니다. 데스크탑이 사용 전력이 90W이기 때문에 이번에 구성한 친환경 클라우드의 2배의 전력을 소모합니다. 따라서 제가 데스크탑PC로 컴퓨팅을 지속적으로 했다면 더 낮은 처리량에 전력을 2배 사용하게 됩니다. 안쓰는 PC를 서버로 재활용하는 방법은 쓰래기를 줄일수는 있지만 전류 소모량 측면에서는 안좋은 선택입니다.

전원 제어에 사용된 8 Relay 모듈

우리가 전기 요금을 줄일수 있는 방법은 저전력 제품을 구매하고 안쓸때는 코드를 뽑는것입니다. OdroidU3는 WOL(Wake On Lan - 네트워크 신호로 원격에서 컴퓨터를 킬수 있습니다.)기능이 없기 때문에 물리적인 스위치로 전원 제어가 필요했습니다. 부하가 발생하면 로드밸런스가 이 스위치를 이용해서 마이크로 프로세서에 전원을 공급합니다. 반대로 부하가 줄어들면 전원을 차단합니다. 쉽게 말해서 이 모듈을 이용해서 컴퓨터의 전기 플러그를 꼽거나 뺍니다. 이 방법이 대기 소모 전력도 없고 좋지만, 메인 파워(벽에 있는 콘센트에서 나오는 전기)를 스위칭 하는것은 대단히 위험한 방법입니다. 깔끔하게 하우징을 못한상태에서 습기나 분진이 들어가면 화재가 발생할 수 있기 때문입니다. 제가 권하는 방법은 메인 파워 부분의 스위치가 아니라 어뎁터 이후의 스위칭입니다.


여러 디스크의 설치도 추가 소비 전력을 필요로 합니다. 가용성 확보를 위해 3TB 디스크 4대를 준비했으나 사용하지 않는 디스크는 전력 소모량만 늘리므로 스토리지에 하나만 꼽은 상태입니다. 사용량의 70%를 넘길때마다 하나씩 설치할 예정입니다. PC에 안쓰는 장치들을 뽑아두면 전력 소모를 줄일수 있습니다. 대표적으로 CD-ROM 드라이브가 있습니다. 파워로 부터 전원 케이블만 빼놔도 소모 전력을 줄일 수 있습니다.

다음에는 클라우드 소프트웨어 편을 다루겠습니다.

참조/관련글

저자에 대해서





10년 동안 소프트웨어 엔지니어/아키텍트로 일해온 허원진입니다.
소프트웨어는 가상머신 개발과 같은 코어 부터 앱 개발까지 넓은 스팩트럼을 유지하여 명품 소프트웨어를 만들기 위해 노력하고 있습니다.
저와 같이 인류의 삶을 변화시킬 IoT 파트너를 찾고 있습니다. baramnemse@gmail.com으로 연락 주십시오.
감사합니다.