ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라즈베리파이4 온습도 모니터링 - 3. DB 설치, 측정값 입력 스크립트 작성(Golang) 및 서비스 등록
    지름신강림/생활,잡화 2022. 10. 10. 11:00
    하단 광고는 티스토리가 임의 삽입하여 노출되고 있습니다
    728x90

    -------------------------------------------------------------------

    라즈베리파이4 온습도 모니터링 - 1. 필요부품 및 악세서리 구입

    라즈베리파이4 온습도 모니터링 - 2. 라즈베리파이 셋팅 및 센서 연결

    라즈베리파이4 온습도 모니터링 - 3. DB 설치, 측정값 입력 스크립트 작성(Golang) 및 서비스 등록 <--- 이번 이야기

    -------------------------------------------------------------------

     

    부품 받고 한달 반이 지나려고 하고 있네요.

     

    이번 설정이 나름대로 익숙한 것들은 아니었습니다.

    mariaDB는 써본적은 있었지만 이번엔 복제(Replication) 설정에 Docker 까지 썼고, 입력 스크립트 작성에 사용한 Golang은 실무에선 써본적이 없고 학습 사이트에서 기본 문법만 익힌 상태였고.

    그래도 시간은 걸렸지만 이렇게 나름 원하는 결과물은 나와서 다행이라 생각합니다.

     

    이번 글에서는 가장 마지막 단계에 제가 어떤 작업을 했는지 정리했습니다.

    아무래도 내용이 내용인지라, 리눅스, SQL 에 대해서 기초적인 부분을 알고 계신다는 전제로 작성하였습니다(아주 기초적인건 설명하지 않습니다)

     

    참고하시고, 길어져서 덮어둡니다.

     

    더보기

     

     

    -- 목  차 --

    누르시면 바로 이동합니다.

     

    1. DB설치(Docker 사용)

    2. DB설치(Docker 미사용)

    3. DB 초기작업(테이블 생성 등)

    4. Go 로 측정값 입력 스크립트 작성

    5. 서비스 등록(Debian 계열)

     

     

    1. DB설치(Docker 사용)

    '굳이..?' 라고 생각하실지도 모르겠지만, Host OS가 업데이트 등으로 바뀔 때 가장 영향을 덜 받을 방법이 아닐까 생각합니다.

    일단 Docker 를 통한 설치를 언급한 뒤, Docker 를 안쓰는 방법도 (일단) 언급은 해두겠습니다.

    이게 사실 제가 Docker 안쓰고 설치했다가 결국 Docker 를 쓰게 되서 그렇습니다(....)

     

    아, 물론 사용중이신 라즈베리파이의 RAM을 고려해서 결정하시긴 해야 합니다.

    최소 사양은 512MB라고 합니다만, 제 경우는 4GB RAM 모델을 골라서 비교적 선택지가 넓었네요.

    사실 애초에 이런걸 감안해서 RAM 4GB 모델로 골랐습니다만.

     

    그럼 가보겠습니다.

     

    우선 Docker를 설치해야 하는데, 이건 Docker 공식 문서에 설치 안내가 있습니다.

    라즈베리파이 공식OS인 Raspbian Bullseye 11 도 대상에 있구요.

     

    Install Docker Engine on Debian From docker docs

     

    여기서 [Install using the repository] 를 참고해서, hello-world docker 이미지를 실행하는 부분까지 진행하시면 됩니다.

    기본적으론 설치되어도 Docker 서비스가 자동 실행되지 않으니, 그 부분을 포함해 아래 스크립트에서도 참고하실 점이 있구요.

     

     

    먼저도 언급했지만 기본적으로 설치 후 Docker 서비스가 자동 실행되지 않습니다.

    위 명령어는 Docker 가 실행중인지 체크한 뒤, 초록색 Active 상태가 아니면 서비스를 시작하는 명령어입니다.

    그리고 enable 을 사용하여 라즈베리파이가 꺼졌다 켜진 후에도 자동으로 Docker 가 실행되도록 해 둡니다.

    이거 안해두면 매번 라즈베리파이 켜진 뒤 SSH 접속해서 켜야 합니다.

     

     

    그럼 이제 측정값을 입력할 데이터베이스를 셋팅해 보겠습니다.

    제가 고른건 이전에 그나마 써본적이 있는 mariaDB 인데, 이 부분은 사실 전혀 제약이 없습니다.

    어차피 Golang 에서 다 연결 가능한 드라이버를 제공할 것이기에. [지원 드라이버 보기]

     

    일단 여기서의 설명은 mariaDB의 것이 되지만, 원하는 데이터베이스가 있다면 그쪽 공식 홈페이지에 설치 가이드가 있을 겁니다.

     

     

    제가 사용한건 공식 mariaDB-Docker 이미지.

    Docker Hub와 Github 각각 README 가 있습니다만, 일단 Docker Hub쪽을 보고 필요한 내용만 추가로 Github 쪽을 참고했습니다.

     

    각 페이지는 아래에서 접근 가능합니다.

     

    https://hub.docker.com/_/mariadb/

    https://github.com/MariaDB/mariadb-docker

     

    작업 버전은 10.6 으로 고정했습니다.

    여러 이유가 있지만 현 시점(2022.10) 에서는 Support 기간이 제일 긴(2026년) LTS 버전이라서. [안내페이지]

    다른 버전들을 설치하시면 2023년에는 다른 버전으로 업그레이드를 하셔야 합니다. (Support 종료)

     

     

    본격적인 작업에 앞서, 작업용 폴더를 생성하겠습니다. 여기에 설정, 로그, 데이터 등의 파일을 위치시킬 겁니다.

    이러면 혹여나 Docker 머신이 잘못되어도(그리고 혹시나 컨테이너를 다시 만들더라도) 데이터나 설정이 망가질 일은 없을 겁니다.

     

     

    여기다 몇가지 파일을 만들겠습니다. 일단 설정.

     

     

    내용이 별로 없긴 합니다만, 에러 로그를 따로 파일에 기록되도록 설정했습니다.

    이러면 인증 등의 각종 오류시 내용 확인하기가 좀 더 편하더군요.

     

     

    다음은 초기 계정 입력용 초기화 SQL 스크립트입니다.

     

     

    이런 파일을 만들어두면, 컨테이너 구동시 자동으로 작업에 필요한 계정을 생성해줘서 편합니다.

    여기서 anotherone 은 root 계정을 대신하는 관리자 계정입니다. mariaDB가 root 를 localhost 에서만 접속할 수 있게 되어있기도 하고 말이죠.

    그 아래의 logger 계정은 이번 애플리케이션에서 사용할, INSERT, UPDATE 정도 권한만 줄 계정입니다.

     

    이제 컨테이너를 만들겠습니다.

     

     

    위 명령어들은,

     

    --name=mariadb : 컨테이너 이름을 mariadb 로 설정

    --restart unless-stopped : 시스템 재시작 후 컨테이너 자동 재시작

    -e TZ=Asia/Seoul : 컨테이너 머신 시간대를 한국 시간으로

    -p 3306:3306/tcp : 기본 포트인 3306 대신 다른 포트를 쓰고 싶으시면 여기서 왼쪽 포트를 바꿔주세요

    -v /workspace/mariadb/backup:/mariabackup : 컨테이너 내로 들어가 백업/복원 작업을 하게 될 경우 사용(당장은 쓸일이 없지만 앞으로를 위해)

    -v /workspace/mariadb/conf:/etc/mysql/conf.d : mariaDB의 변경하고 싶은 설정 저장파일이 위치하는 경로

    -v /workspace/mariadb/data:/var/lib/mysql : mariaDB의 데이터베이스 파일

    -v /workspace/mariadb/logs:/logs/mariadb : 추가한 설정에 따라 로그파일이 생길 경로

    -v /workspace/mariadb/init:/docker-entrypoint-initdb.d : mariaDB 초기화 SQL파일 로드 경로

    mariadb:10.6.9 : 컨테이너를 만드는데 사용하는 mariaDB 이미지 버전(latest는 최신, 사용 가능한 버전 리스트)

     

    ..의 의미를 가집니다.

    참고해서 조정하시고, 잘 생성되었으면 mariadb/data 와 mariadb/logs 에 파일이 생깁니다.

     

    뭔가 아무것도 안생겨있다거나 하면 sudo docker logs mariadb 로 컨테이너 내부의 로그를 볼 수 있구요.

     

    2023.5.25 A.M 5:36분경 추가.

    위 -v 옵션 중 backup 경로의 마운트 옵션을 추가했습니다.

    최근 한번 겪어보니 미리 연결해두는게 나중을 위해서라도 좋더군요.

    ///

     

    여기까지 따라오셨으면 일단 성공인데, 본격적인 작업을 하기 전에 다른 케이스를 하나 더 보겠습니다.

     

     

    2. DB설치(Docker 미사용)

    사실 제가 먼저 이 방법으로 설치했다가 1번의 Docker 쓰는 버전으로 갔었습니다.

    아무래도 시도하다 잘 안되고 하면 데이터를 날리고 초기상태로 하거나 했어야 됐는데(Replication 설정 등으로) 이쪽 버전은 그러기가 너무 안좋았습니다.

    이런 이유 말고도, 앞으로도 계속 OS 업데이트는 진행할텐데 아무래도 Docker 에 올리는것보다는 영향을 받게 되겠고.

     

    일단 제가 먼저 작업했던 내용들도 여기에 정리는 해두겠습니다.

     

     

    우선, 1번에도 언급했듯 버전은 10.6 을 사용합니다.

    이 버전이 2026년까지 Support 가능한 LTS 이기도 하고(다른 버전은 2023년까지)[안내페이지]

     

    여기서는 Debian Repository 에 MariaDB 10.6 Repository를 설치하고 apt-get 명령으로 mariadb를 설치할 겁니다.

    그 설명이 이 페이지에 정리되어 있고, 아래 내용과 동일합니다 [Download MariaDB Server - MariaDB Foundation]

    다만 페이지 접속 후, Mirror 에서 좀 더 빠른 다운로드가 가능할 것으로 예상되는 타 국가로 다운로드 서버를 변경할 수는 있습니다.

    (타 국가로 변경하신다면, 제가 아래에 정리한 정보 대신 위 페이지의 하단에 뜨는 정보로 작업해 주세요)

     

    그럼 보시겠습니다.

     

     

    명령이 잘 끝났다면 mariaDB가 설치되었습니다.

     

     

    이제 설정을 조정하겠습니다.

     

     

    여기까지 되었다면 접속용 계정(USER)을 생성하겠습니다.

     

     

    mariaDB는 root 계정이 있지만 보안상의 이유로 사용을 권장하지 않습니다.

    앞으로의 작업은 위에서 생성한 anotherone 계정으로 접속해 진행하겠습니다.

    이후 측정값 입력 스크립트에서는 logger 계정을 사용하고(여기에는 INSERT, UPDATE 등 일부 권한만 부여 예정)

     

    여기까지 됐으면 이제 데이터베이스와 테이블을 생성하면 됩니다.

    이렇게 적었지만 전 Docker로의 설정을 권장드립니다.

     

     

    3. DB 초기작업(테이블 생성 등)

    이제 제가 만들었던 데이터베이스와 테이블을 생성하겠습니다.

    데이터베이스 및 테이블 생성 스크립트는 mariaDB 기준으로 작성되었습니다.

     

    우선, HeidiSQL 등의 클라이언트 프로그램[바로가기]을 사용해 anotherone 혹은 그와 동급의 관리자 계정으로 접속합니다.

    접속 후 아래 문장을 차례대로 실행해 주시면 되겠습니다.

     

     

    테이블의 경우는 원하시는 바에 따라 만들면 되는데, 제 경우는 초기 관찰시 BME280 센서의 습도 오차가 상당했습니다.

    그래서 입력시 보정을 하게 될 경우를 감안해서 원래 값(raw_) 과 측정값(보정 후) 컬럼을 나눴는데,

    필요 없으면 이 컬럼은 생성 전 제외하셔도 됩니다.

     

    다만 그러면 아래 4번 경로에서 INSERT 문장, ExecContext 파라메터 셋팅 부분을 지워주셔야 합니다.

     

    자, 그러면 이제 스크립트를 써서 데이터를 입력해 보겠습니다.

     

     

    4. Go 로 측정값 입력 스크립트 작성

    사실 이번에 공부겸 Golang을 쓰려고 한거라 나름 생소할줄 알았는데, 예시들을 많이 보니 그래도 감이 오네요.

    아래 결과물은 사실 몇가지 예시의 맞춤입니다(자랑아님)

     

    여담이지만, 사용중인 syntaxhighlighter 가 좀 오래됐는지 Golang 지원이 없어 C++로 설정되었습니다.

    Github Repository에 가면 좀 더 편하게 보실 수 있습니다. [바로가기]

     

     

    동작 자체는 단순한 편입니다.

    설정한 주기(위 소스에서는 5분) 마다 센서에서 온도, 습도, 기압 값을 읽어서 테이블에 입력합니다.

     

    만약 다음번 센서 읽기 전 데이터베이스 연결상태를 체크했을 때 정상이 아니면 재연결을 시도하며,

    데이터베이스 연결, 테이블 입력, 센서 값 조회 등 몇가지 주요 동작이 실패하면 Line notify로 알림을 발송하구요.

     

    개인적으론 Golang 처음인데, 프로그램이 간단해서 그런가 굉장히 인상이 좋았습니다.

    아마 직업상 실무에서 쓸 일은 없을것 같은데, 이것저것 더 해볼일이 늘었으면 싶기도 했구요.

     

    자 이제 한가지만 더 하면 이 일련의 작업도 끝입니다.

     

     

    5. 서비스 등록(Debian 계열)

    이 프로그램은 일단 한번 실행하면 제가 의도를 갖고 종료하기 전까지는 계속 작동해줘야 합니다.

    하지만 저 스크립트 자체도 하루 정도만에 만들었고, 제가 실무에서 계속 Golang 을 써본것도 아니라 예외는 항상 존재할 겁니다.

    그래서 이 프로그램을 실행파일로 빌드한 뒤, systemd 서비스에 등록해서 관리되도록 해 보겠습니다.

     

     

    마지막 부분까지 실행하시면 정상 구동중인 상태가 보이실 겁니다.

     

    이런식으로 정상 구동중인 상태표시와 스크립트의 로그(맨 아랫줄) 가 보이면 잘 된 겁니다.

     

     

    이번 글은 여기까지.

     

    관심 있는 분들은 도움 되셨는지 모르겠습니다.

     

    개인적으론 이번 시도로 mariaDB 를 좀 더 깊게 다뤄보기도 했고(글에는 없는데 Replication 설정을 했었습니다) 안써본 Golang 도 써보고 나름대로는 재밌었습니다.

    그래도 돌아보면 부품 구입하고 실제 측정까지 들어가는데 한달 넘게 걸린건 살짝 아쉬운 부분.

    이제 날도 추워져가니 에어컨 컨트롤러(switchbot + 온습도 센서) 가 박스로 들어갈 시기인데,

    그래도 이것들이 박스 들어가기 전에는 어찌어찌 센서 데이터를 기록하기 시작하네요. 역시 제 게으름은 제가 제일 잘 알죠.

     

    그럼 다음 글은 연휴 끝나고 주중에 들고 오겠습니다. 쉬는 분들은 남은 휴일 즐겁게 보내시고, 추위 조심하시길.

    곧 다음 글에서 뵙겠습니다.

    댓글

Designed by Tistory.