CentOS 7 에 MongoDB 3.4.20 설치, 기본 명령어, 동기화(복제구성 & Replica set) - 동기화부분 작성중

리눅스/MongoDB|2019. 4. 16. 10:21
반응형

CentOS 8 버전 MongoDB 4.4.1 설치하는 방법은 아래 URL 을 참고하세요~

https://www.howtoforge.com/tutorial/centos-mongodb/

 

 

1. 설치 및 구동

 

MongoDB 는 CentOS 7 의 기본 리포지토리에 등록되어 있지 않기 때문에

별도의 리포지토리 등록 후 설치를 진행해야 합니다.

 

# vi /etc/yum.repos.d/mongodb-org.repo

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

 

# yum -y install mongodb-org

 

# systemctl enable mongod

 

# systemctl start mongod

 

* 설정 파일 : /etc/mongod.conf

* 로그 파일 : /var/log/mongodb/mongod.log

 

 

2. 기본 명령어

 

MongoDB 로그인

# mongo

 

========================

 

관리자 계정 생성

> use admin

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles:["root"]})

// 계정명 sysdocu 를 관리자로 등록 (보통은 root 나 admin 를 많이 사용합니다)

// root 라는 roles 은 MongoDB 상 최고의 권한이다.

// (roles 종류 : https://docs.mongodb.com/manual/reference/built-in-roles/)

 

이제 최고 권한 계정으로 작업을 한다.

> exit

 

# mongo admin -u sysdocu -p

 

일반 계정 생성 및 DB 접근 설정

> use test    // access 하려는 DB를 선택 후 계정을 생성해야 한다. ★

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles: [{ role: "readWrite", db: "test" }] })
// 계정명 : sysdocu, 패스워드 : 12345678, 권한 : 읽고 쓰기, 접근 DB : test

 

계정 리스트 보기 (DB 를 선택 한 상태에서)

> show users

 

계정 삭제

> db.dropUser("sysdocu")

 

로컬 접속
# mongo admin -u sysdocu -p '12345678'    // admin DB를 선택하며 로그인 (제외시 로그인 안됨)

// ! 느낌표가 들어간 패스워드일 경우엔 " 말고 ' 를 사용 해야 함

 

원격 접속

# mongo -u sysdocu -p 12345678 10.2.0.5/admin    // 10.2.0.5 번 서버의 admin 디비에 접근

 

========================

 

데이터베이스 생성

> use test    // 생성할 데이터베이스명 입력 (여기까지만 하면 생성이 되지 않음)

> db.createCollection("members")    // members 컬렉션을 옵션없이 생성. 컬렉션이 생성되면 이때 데이터베이스도 같이 생성됨

 

* 테이블을 MongoDB 에서는 컬렉션으로 부릅니다.

* 레코드를 MongoDB 에서는 도큐멘트라고 부릅니다.

 

컬렉션이 없는 상태에서 도큐멘트를 insert 하면 컬렉션이 자동으로 생성되기도 합니다.

> db.members.insert({"name": "sysdocu"})

> db.members.insert({"name": "superman"})

 

도큐멘트 삭제

db.members.remove({"name": "superman"})

 

데이터베이스 리스트 확인

> show dbs

 

컬렉션 (테이블) 리스트 확인

> show collections

 

컬렉션 내용 확인

> db.members.find()

 

도큐멘트 개수 확인

db.members.count()

 

도큐멘트 모두 삭제

> db.members.remove({})

 

컬렉션 (테이블) 삭제

> db.members.drop()

 

데이터베이스 삭제 (use 라는 명령으로 데이터베이스가 선택 된 상태에서)

> db.dropDatabase()

 

데이터베이스 복사

> db.copyDatabase('test', 'testTWO')

 

 

3. 백업 및 복구

 

* MongoDB 외부 접근 허용

# vi /etc/mongod.conf

bindIp: 0.0.0.0    // 기존 127.0.0.1 를 0.0.0.0 으로 수정

 

(백업 서버에서 작업할 경우)

 

1) 원본 MongoDB 서버의 특정 데이터베이스를 복사해오는 방법

> db.copyDatabase("test", "test", "49.247.131.228")    // 원격지 서버의 test DB를 복제

 

2) 원본 MongoDB 서버의 모든 데이터베이스를 복사해오는 방법

> db.cloneDatabase("49.247.131.228")    // 원격지 서버의 모든 DB를 복제

 

(원본 서버에서 작업할 경우)

 

1) 모든 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p계정비번

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

2) 특정 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p비번 --db test

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

3) 데이터베이스 복구

# mongorestore -u 계정명 -p 비번 --drop --db test ./backup/test/

// --drop 은 기존 데이터 지우고 복구 하라는 뜻

 

* 간단하게 하려면 (전체 백업, 복구)

# mongodump --host 127.0.0.1

// 실행 시 dump 라는 디렉토리가 생기고 jon 형태로 데이터가 추출된것이 확인 됩니다.

 

# mongorestore -h 127.0.0.1 ~/dump/

 

 

4. 동기화 (복제 설정 & replica set) 설정

 

복제 방식에는 두 가지가 있습니다.

쉘 명령을 통한 복제 설정과 replica set 이 있는데,

복제 구성은 설정이 간편한 장점이 있으나, 5초 단위로 데이터가 동기화 됩니다.

replica set 은 마스터 포함 최대 6대 까지 실시간 동기화가 가능하나, 몇가지 설정 작업이 필요합니다.

두가지 방식 모두는 단방향 통신이기 때문에 마스터 서버는 읽고 쓰기, 슬레이브 서버에서는 읽기만 됩니다.

 

 

1) replica set 설정

 

MongoDB 를 한 번만 재시작 하기 위해 MongoDB 키 파일을 먼저 생성해줍니다.

 

(마스터 서버에서)

# openssl rand -base64 741 > /etc/mongod.key

# chmod 600 /etc/mongod.key

 

슬레이브 서버로 key 파일을 복사해줍니다.

# scp /etc/mongod.key root@49.247.232.10:/etc/

 

(모든 서버에서)

# vi /etc/mongod.conf

security:
  keyFile: /etc/mongod.key

replication:

  replSetName: "ABC"    // 그룹명은 아무거나 입력

 

# systemctl restart mongod

 

(마스터 서버에서)

# mongo

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" },
      { _id: 1, host: "49.247.132.10:27017" }
   ]
})

 

* 위와 같이 실행했을때 아래와 같은 에러 메세지가 출력된다면, 한 번에 명령을 실행하지 말고 나누어 실행하면 됩니다.

"errmsg" : "'49.247.132.10:27017' has data already, cannot initiate set."

 

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" }
   ]
})

> rs.add("49.247.132.10:27017")

 

동기화 테스트를 해봅니다.

 

2) 복제 구성

 

(마스터 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -master &    // 실제 데이터 디렉토리 (데이터가 초기화 됨)

 

(슬레이브 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -slave -source 49.247.131.228:27017 &    // 실제 데이터 디렉토리와 마스터 서버 정보

 

# mongo

> rs.slaveOk()    // 동기화 시작

 

>>> 잘 안됨

 

5. 복제 도구

https://github.com/sheharyarn/mongo-sync

mongo-sync.zip
0.00MB

명령을 실행할 한 쪽 서버에서만 다운로드 받으면 됩니다.

파일압축을 풀면 3개의 파일이 나옵니다.

 

1) config.yml 파일을 열어 설정을 마친 뒤 아래와 같이 동기화 합니다.
2) ./mongo-sync push  // 상대 서버로 밀어내기

     ./mongo-sync pull    // 명령을 내리는 서버로 가져오기

3) 명령행 뒤에 -y 를 주게 되면 확인 메세지 건너뜀

 

<동기화 조건>

- DB 및 접근 계정을 미리 생성해 놔야 함

- 테이블은 있으나 없으나 상관없음. 새로 덮어 씌우기가 됨

 

★ log 데이터베이스를 당겨 올때..
/tmp 에 덤프파일이 생성 되므로 해당 파티션에 용량이 부족하다면 아래와 같이 링크를 미리 생성해놓고
용량이 큰쪽에 생성 될 수 있도록 합니다.
덤프 받는 중에는 원하는 파티션으로 데이터가 생성되는지 확인 해야 합니다.

# mkdir /log1/mirror_tmp
# ln -s /log1/mirror_tmp /tmp/log    // 임시 파일 디렉토리에 작업 DB명이 생성됩니다.

 

반응형

댓글()