Mobius(NodeJS) 내 DB Connection Issue

SEUNGHWANLEE·2022년 1월 16일
0

Mobius Guideline

목록 보기
11/11

서론

20년 12월부터 21년 2월까지 교내에서 진행했던 프로젝트가 있었는데, 최근 들어 프로젝트 관련 문의가 들어와서 정리해두고자 포스팅하게 되었다.

IoTKETI 란 곳에서 배포한 IoT 오픈소스 프레임워크인 Mobius는 내가 작업한 프로젝트는 JavaScript로 되어있다. 당시 프로젝트를 진행할 때도 개발을 시작한지 얼마 되지않아 부족한 점이 많고 설계도 지금보면 부족한 점이 많지만, 프로젝트가 가이드라인으로 학교에서 사용되고 있는 것 처럼 보인다…(조금 창피하지만)

프로젝트를 처음 시작할 때 가장 흔하게 겪을 수 있는 문제, 아직도 Github 내 Issue 자리잡고 있는 문제인 데이터베이스 환경문제에 대해 다루어보고자 한다.

Mobius란?

우선 Mobius는 MySQL를 사용해 IoT기기와 클라우드를 연동해 사용한다. 모든 데이터는 Mobius로 전해져 저장되고 관리가 되며, 중간 역할인 nCube-thyme 그리고 각자 원하는 센서나 장비를 사용해 엔드포인트를 만들어 사용하면되는 프레임워크이다.

교내에서 쉽게 테스트를 진행할 수 있게 우선은 로컬호스트 환경에서 다룰 수 있도록 프로젝트를 구성하였었고, socket 서버를 처음 다뤄보게 돼서 많이 부족한 점이 없지않아 있다.

그럼 서론이 길었고 본론으로 들어가 보도록 하자.


본론

DB 와 nodeJS가 연동이 안되는 경우에는 많은 이유가 있을 수 있겠지만 해당 프로젝트를 다루면서 발생할 수 있는 경우의 수를 추려봤다.

  1. MySQL 서버가 정상 작동하고 있는지? 해당 프로젝트는 로컬호스트 환경
  2. (macOS 유저만 해당) homebrew와 MySQL, 데몬과 서버를 혼동해서 사용하고 있는지?
  3. 사용하는 유저 계정의 plugin 상태가 mysql_native_password로 되어있는지?
  4. conf.json 파일이 올바르게 작성되어있는지?

이와 같이 4개의 항목을 확인해본다면 크게 문제생길 일은 없을 것이다.

MySQL 서버 정상작동 및 port 확인하기

기본적이면서 가장 중요한 부분, MySQL이 작동하고 있다면 현재 Running 중인 Port 번호를 확인해보고 mobius 내부 코드와 일치하는지 알아보자.
운영체제마다 명령어는 다르겠지만 네트워크를 확인할 때 netstat를 많이 사용하니 검색하기에도 용이할 것이다. 작업 환경이 macOS라서 macOS 기준으로 포스팅을 진행하겠다.

nestat -anv | grep LISTEN

현재 LISTEN 상태, "서버의 데몬이 떠 있어서 클라이언트의 접속 요청을 기다리고 있는 상태"인 tcp 연결들을 pid 번호까지 조회하기 위해서 -anv 3가지 옵션을 준다.

💡  항상 MySQL 서버 데몬이 켜져있는지 확인

Homebrew vs. mysql.server

macOS 사용자라면 homebrew를 편리하게 사용하고 있을 수 있다. 겪었던 문제가 있다면 이중으로 서버가 열려있거나 각자 같은 포트번호로 설정되어있어서 conflict가 발생하는 것처럼 보인다.

예를 들어서 MySQL 서버를 새롭게 열려고 할 때, 명령어 종류와는 상관없이 netstat으로 조회를 해본다면 열려야한다. 하지만 겪었던 문제는 mysql.server start를 하게되면 netstat으로 조회했을 때 열려있는 것으로 확인이 되지만, brew service는 그렇지 않다.

netstat 조회결과

brew services list 조회결과

MySQL WorkBench 애플리케이션으로 연동 시도를 해본 결과, homebrew가 stopped로 되어있는 상태에서 database 연동에 성공하였다. 반면에 mysql.server stop으로 기존에 실행 중이던 서버를 종료하고 brew services start mysql를 실행해 연동을 시도했을 때도 성공하였다. 여러 번 시도를 하면서 차이점을 찾아보려했지만 하나의 명령어로 Running이, Stop이 두 개 모두 적용되지는 않았다는 점이다.

plugin 상태 확인하기

plugin을 확인하는 방법은 예전에 프로젝트도 그렇고 오늘 새로운 환경에서 시도해봤을 때도 문제를 해결해줬던 방법이다. 실제로 IoTKETI 에 이슈로 등록되어 있고, 많은 이들이 해결했던 방법이다.

MySQL에 접속해 (mysql -u root -p) USER table에 접근해보면 plugin 상태가 caching_sha2_password로 되어있을 수 있다. 이때 mobius와 MySQL에서 동시에 사용할 계정의 plugin 상태를 mysql_native_password로 변경해주어야한다. 이유는 conf.json에서 입력된 string 이 내부코드를 확인해보면 그 어떤 절차를 거쳐 필터링 된다거나 암호화되는 과정이 존재하지 않는다. (이런 단계는 추후 개발단계에서 추가해 사용해 Production 단계로 넘기면 될 거 같아요 😄)

확인하는 방법은 아래처럼 실행해주면 손쉽게 확인할 수 있다.

  1. 먼저 mysql 데이터베이스를 사용 (무시하고 넘어가 테이블 수정할 때 언급해줘도 됩니다)
USE mysql;
  1. 현재 저장되어 있는 상태를 확인, root 가 기본으로 설정되어있어 이것으로 진행
SELECT User, Host, plugin FROM USER;
예상 결과화면)
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
  1. 상태 저장정보변경 후 변경사항 저장
UPDATE USER SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;

예외상황 발생

만약에 여기서 mysql 로그아웃을 하고 다시 접속을 하려고 할 때 아래와 같은 오류가 발생할 수도 있다. (제가 겪었던 문제)

Access denied for user 'root'@'localhost' (using password: YES)

비밀번호를 재설정해주는 것이 가장 빠르고 현명한 방법이라고 생각합니다.

  1. MySQL 서버 종료하기
mysql.server stop
  1. 로그인없이 접속할 수 있는 서버 열기
mysqld_safe --skip-grant-tables &
  1. MySQL 서버 접속하기 (로그인X)
mysql -u root
  1. 기존에 존재하던 정보 null로 만들기
UPDATE USER SET authentication_string=null WHERE User='root';
FLUSH PRIVILEGES;
exit;
  1. 사용할 비밀번호로 재설정해주기
mysql -u root
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEW_PASSWORD!';

conf.json과 같은 비밀번호로 설정해줍니다.

conf.json 확인하기

내부코드를 확인해보면 dppass, dbhost와 같은 변수들이 global 로도 선언되어있지만 parameter 형식으로 빈번하게 전달되고 있다. 호스팅할 서버 주소를 꼭 확인하고 user 정보가 일치하는지도 확인해야한다.

  • dbhost
  • dbpass
  • dbname
    간혹 db를 mobiusdb가 아닌 다른 이름이나 생성을 하지 않은 채로 실행시켜 오류를 접했다는 이슈를 많이 봤는데 주의해야한다
  • 사용할 proxy 포트번호

결론

항상 말썽이 많은 MySQL 환경문제, 그만큼 모른다는 것인데 해당 이슈는 mobius에서 MySQL Connection Pool를 생성하려고 시도했을 때 실패한 경우 확인해보면 좋은 체크리스트이다. Mobius를 사용할 때는 센서나 말단 기기 관련된 소프트웨어를 직접 만들어 데이터를 Mobius를 통해서 쉽게 관리할 수 있다는 장점이 있다. 그리고 내부코드를 보면 클라이언트 관련 타임아웃이나 Pool 관련 콜백도 적절하게 이루어져있으니 센서 부분 구현이 중요해보인다. 최근 Github 내 Issue들이 Closed 되지 않는 것을 보니 유지보수를 지속적으로 해주는 것으로는 보이지 않으나, 이를 활용해 새로운 솔루션도 제안해볼 수 있을 듯 하다.

profile
잡동사니 😁

0개의 댓글