mongodb 3.4 on Armbian

2018-06-22 내용 정리, User auth 링크
{:.right-history}

이 문서는 MongoDB Community Edition 3.4 버전을 64bit OSAmd64, Arm64 지원 OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행했다.

여기서는 Arm을 사용하는 SBC[^2] 컴퓨터에 mongodb 3.4 버전을, Hardkernel Odroid C2를 사용해서 설치를 진행했다.

  • Odroid C2 for 64bit
  • Armbian Ubuntu Xeniel

MongoDB Community edition

테스트한 Arm64 기반의 Odroic C2 에서는 MongoDB Community Edition을 설치한 후에 systemd 관련 스크립트와 설정 파일등이 적절히 설치되지 않아서, 이 부분에 대한 언급을 추가했다.

사전준비

여기서는 Odroid C2 를 사용하고 Armbian 배포본에서 Ubuntu Xeniel 버전을 사용했다.

  • Armbian 배포본 Debian Jessie 에는 아직 mongodb 64bit 를 제공하지 않고 있다.

레포지토리 등록

아래 같이 키 서버를 등록하고 apt source list에 mongodb 를 등록한다.

여러분 시스템이 적용되는 지는 [^1]에 잘 설명되어 있다.

키서버 등록

1
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

Mongodb 3.4 는 /etc/apt/sources.list.d/mongodb-org-3.4.list 파일 생성하고 아래 같이 해당 리눅스 버전에 맞는 소스 목록을 추가한다.

Ubuntu 16.04

1
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Ubuntu 14.04

1
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

remove key & ppa

설치 후 필요 없어서 키 서버, 저장소 목록을 지우려면,

삭제할 키 해시 코드 확인: 다음 같이 8자리 코드로 나오거나

1
2
3
4
sudo apt-key list

pub 4096R/A15703C6 2016-01-11 [expires: 2018-01-10]
uid MongoDB 3.4 Release Signing Key <packaging@mongodb.com>

다음 같이 긴 해시 코드로 나온다.

1
2
3
4
5
6
--------------------
pub rsa4096 2016-01-11 [SC] [expires: 2018-01-10]
0C49 F373 0359 A145 1858 5931 BC71 1F9B A157 03C6
uid [ unknown] MongoDB 3.4 Release Signing Key <packaging@mongodb.com>

/etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg```

이 키를

1
sudo apt-key del A15703C6

설치

그리고 apt 명령으로 소스 캐시를 갱신하고 mongodb-org 커뮤니티 버전의 mongodb를 설치한다.

1
2
sudo apt update
sudo apt install mongodb-org

설치전 mongodb 3.x 버전은 데이터 저장 파일 시스템으로 xfs 를 권장하고 있다.



create systemd / service entry

mongodb-org 설치후 systemctl 스크립트가 /etc/init.d에 복사되지 않았다.

여기서는 odroid-c2 armbian 설치 상태, 일반 리눅스 배포본은 잘 된다.

아래 명령을 실행해 mongodb.service 가 없으면 새로 생성해야 한다.

1
$ sudo systemctl list-unit-files --type=service |grep mongodb

만약 mongodb.service 가 없다면, /lib/systemd/system/mongod.service 파일을 다음 같이 활성화 시켜준다.

1
2
$ cd /lib/systemd/system
$ sudo systemctl enable mongodb.service

mongodb.service 가 있고,

1
2
$ sudo systemctl list-unit-files --type=service |grep mongodb
mongodb.service disabled

disable 상태면 systemctl 명령으로 enable 시킨다.

1
$ sudo systemctl enable mongodb.service

그리고 서비스를 시작한다.

1
2
3
4
5
6
7
8
9
10
11
$ sudo systemctl start mongod.service
$ sudo systemctl status mongod.service
● mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2017-07-18 09:17:53 UTC; 1s ago
Docs: https://docs.mongodb.org/manual
Main PID: 7234 (mongod)
CGroup: /system.slice/mongod.service
└─7234 /usr/bin/mongod --config /etc/mongod.conf

Jul 18 09:17:53 odroidc2 systemd[1]: Started High-performance, schema-free document-oriented database.

mongod 서비스가 제대로 실행됐으면 mongo 클라이언트로 테스트해 볼 수 있으면 접속해 볼 수 있다.



Mongo Database 설정

  • mongodb 사용자와 디렉토리 퍼미션 확인
  • mongod.conf 설정
  • mongo client 접속 테스트
  • mongodb 인증

mongodb 사용자 확인

mongodb-org 설치하면 사용자 mongodb가 만들어 지지만, 혹시 생성되지 않았으면 시스템에 사용자 mongodb 가 없으면 새로 만든다.

1
$ sudo adduser --disabled-password --gecos "" --no-create-home --disabled-password --disabled-login mongodb

로그 디렉토리 /var/log/mongo 그리고 데이터 디렉토리 /data/mongodata 라면 해당 디렉토리에 몽고디비 사용자가 쓸 수 있는 퍼미션을 준다.

1
2
$ sudo chown mongo.daemon /var/log/mongodb
$ sudo chown mongodb.mongodb /data/mongodata

mongod.conf 설정

MongoDB의 systemd 서비스는 데이터베이스 구성 파일 /etc/mongod.conf 을 참조한다.

/etc/mongod.conf 파일에 인증을 제외한 데이터 디렉토리, bindIp, 로그 부분만 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
storage:
dbPath: /data/mongodata/
journal:
enabled: true

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

processManagement:
fork: true

net:
port: 27017
bindIp: 127.0.0.1,192.168.0.2
  • dbPath : 데이터베이스 스토리지 위치
  • bindIp: 서버 외에서 mongo 클라이언트가 접근하려면 IP 를 입력한다.

현재는 mongo.conf 설정 파일에 접근 제어가 없는 상태에서 mongo 클라이언트로 접속한다

Admin 사용자

mongo 클라이언트로 접속에 성공하면 > 프롬프트가 나온다. admin 데이터베이스로 전환한다.

1
2
3
4
5
$mongo
>
> use admin
switched to db admin
>

admin 데이터베이스에서 관리자 role을 가진 사용자를 추가하고, 사용할 데이터베이스의 사용자와 접근 제어를 추가해서 사용하기 위해서 작업한다.

user administrator

userAdmin role 혹은 userAdminAnyDatabase role을 가진 사용자 만든다. 다음은 admin 데이터베이스에서 사용자를 관리하는 admin 계정을 생성하고 있다.

1
2
3
4
5
6
7
8
9
10
>db.createUser(
{
user:'admin',
pwd:'****',
roles:['userAdminAnyDatabase']
}
)
Successfully added user: { "user" : "admin", "roles" : [ "userAdminAnyDatabase" ] }
>
> db.getUsers()

admin 사용자 패스워드 변경

1
> db.changeUserPassword("accountUser", "SOh3TbYhx8ypJPxmt1oOfL")

사용자의 role 을 변경,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> db.grantRolesToUser( 'admin', [{role: 'userAdmin', db:'admin'}])
> db.getUsers()
[
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdmin",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
]

혹은 updateUser 를 사용할 수 있다:

1
db.updateUser( "appClient01", ...

security.authorization

mongodb.conf 파일에 security.authorization 을 활성화 한다

1
2
security:
authorization: enabled

systemd 로 서비스를 재시작 한다.

1
2
$ sudo systemctl restart mongod.service
$ sudo systemctl status mongod.service

이제 인증 모드에서 데이터베이스에 접속해야 한다.

인증모드로 접속

데이터베이스 시스템에 접근제어가 활성화 되면 mongo 클라이언트 접속시 -u <username>, -p <password>--authenticationDatabase <database> 를 지정해 주어야 한다.

1
2
3
4
5
$ mongo --port 27017 -u "admin" -p "****" --authenticationDatabase "admin"
MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
>

### `mongod` 명령 사용

명령 mongod 로 MongoDB를 시작해 설정 파일 등이 제대로 동작하는지 확인할 수 있다.

비인증 모드 시작

다음 같이 mongod 를 시작해 동작을 확인한다.

1
2
3
$ sudo mongod --port 27017 --dbpath /data/mongodata
...
>

인증 모드 시작

앞서 시작한 명령행 mongodb를 종료하고 명령라인에서 재시작 --auth 옵션을 붙여 시작한다.

1
$ mongod --auth --port 27017 --dbpath /data/mongodata

접근제어 --auth 옵션으로 데이터베이스를 시작하면 로그인시 -u <username>, -p <password>--authenticationDatabase <database> 를 지정해 주어야 한다.

1
2
3
4
5
$ mongo --port 27017 -u "admin" -p "****" --authenticationDatabase "admin"
MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
>

명령행으로 시작한 mongod 는 종료하고 설정 파일에 인증을 넣자.

데이터베이스 생성과 인증

새 데이터베이스에 컬렉션을 생성하고 데이터베이스 사용자를 접근제어할 수 있는 내용은 MongoDB User Authentication 에서 다루고 있다.



### 기타

WiredTiger library panic

ext4 파일시스템에서 wiredTiger engine으로 실행중 아래 같은 에러가 발생, 여기[^10] 에서 --repair 로 재구성한 후 사용하도록 권장한다.

1
2
3
4
5
2017-07-21T23:26:57.991+0900 E STORAGE  [conn31] WiredTiger error (-31804) [1500647217:991504][803:0x7f
5794fc20], file:collection-0--8962566541221692692.wt, WT_CURSOR.next: the process must exit and restart
: WT_PANIC: WiredTiger library panic
2017-07-21T23:26:57.992+0900 I - [conn31] Fatal Assertion 28558 at src/mongo/db/storage/wiredtig
er/wiredtiger_util.cpp 361

--repair 로 재구성

1
$ sudo mongod --storageEngine wiredTiger --repair --dbpath /data/dbdata/

repaire를 sudo로 진행해서 /data/dbdata 안의 index 파일들이 root 소유권으로 바뀐다. 그래서 /data/dbdata 저장소를 chown으로 mongodb 사용자로 다시 설정

1
$ sudo chown -R mongodb.mongodb /data/dbdata

이제 재시작 하면 된다.

XFS warning

1
I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strong$y recommended with the WiredTiger storage engine

USB Memory 디스크 사용시

Odroid C2에 64GB USB Memory를 외부 저장장치로 구성할 때 아래 같이 에러를 발생하며 diagnostic.data 폴더 에러, mongodb 가 다운된다. 아마 ext3 파일 시스템을 사용해서 그런 것 같다.

1
2
3
4
5
6
FTDC     [ftdc] Uncaught exception in 'FileNotOpen: Failed to open interim file /data/mongodata/diagnostic.data/metrics.interim.temp' in full-time diagnostic data capture subsys
tem. Shutting down the full-time diagnostic data capture subsystem.
2017-04-03T15:00:01.659+0900 E STORAGE [WTJournalFlusher] WiredTiger error (30) [1491199201:659123][877:0x7f7ccfec90], WT_SESSION.log_flush: /data/mongodata/journal/WiredTigerLog.0000000048: handle-write: pw
rite: failed to write 128 bytes at offset 19456: Read-only file system
2017-04-03T15:00:01.662+0900 E STORAGE [WTJournalFlusher] WiredTiger error (30) [1491199201:662709][877:0x7f7ccfec90], WT_SESSION.log_flush: journal/WiredTigerLog.0000000048: fatal log failure: Read-only fil
e system

stackoverflow 에 diagnostic-data 폴더를 지우고 다시 시작하도록 제시되고 있다:

1
$ sudo rm -f  /var/lib/mongo/diagnostic.data/*

그리고 /etc/mongod.conf에 full time diagnostic을 비활성화 했다.

1
2
setParameter:
diagnosticDataCollectionEnabled: false


## MongoDB 관련 글

MongoDB Community Edition Installations 시리즈:ㅇ

  1. MongoDB Community Edition 4.2 설치 - ARM64 Ubuntu/Debian Armbian
  2. MongoDB 구성 설정 과 사용자 인증 사용

MongoDB Tutorials 시리즈:

  1. MongoDB Tutorials: collections
  2. MongoDB Tutorial

MongoDB와 Middleware Platform:

  1. NodeJS Mongoose
  2. Mongodb mongoose-middleware

이전 버전과 기타 자료:

  1. MongoDB User Authentication
  2. MongoDB Community Edition 3.6 on Ubuntu(ARM64)
  3. Mongodb 3.4 install on Armv8
  4. Raspberry Pi 3 64bit OS openSUSE: Build MongoDB 3.4

참고

[^1]: Install mongodb on Ubuntu
[^2]: SBC Sigle Board Computer. Raspberry Pi, Odroid 등등…
[^3]: mongodb installation on Debian
[^10]: UnsupportedFormat fatal assertion in wiredTiger following

Author

Gangtai Goh

Posted on

2017-04-11

Updated on

2023-05-12

Licensed under

댓글