MongoDB 3.x - CentOS7환경에서 설치부터 auto-shard 구성까지

Posted by Everyharu
2016. 7. 12. 17:53 IT/Mongodb
MongoDB 3.x - CentOS7환경에서 설치부터 auto-shard 구성까지
mongodb를 사용하는 이유가 기존의 RDB처럼 스키마가 없어서 사용하기편해서?
라고 생각하는 사람들은 이젠 거의 없지 않을까 생각한다.
막상 사용을 해보면 스키마가 없는게 때론 독이되고 RDB의 JOIN이 이렇게 편리한거였구나를 세삼 느끼게 해준다.
그럼에도 불구하고 우리가 mongodb같은 nosql을 사용하려는 이유가 뭘까?
너무 당연하게도 scale-up 구성을 scale-out 구성으로 사용하기 위해서이다.
RDB로 scale-out 구성을 하려면 코드단에서부터 활용로직을 설계하지 않고는어렵다.
반면 mongodb와 같은 nosql들은 이러한 부분에서 강점을 가진다. chunk 단위의 데이터 관리로 인해 분산데이터 저장에 알맞다.
JOIN의 장점을 잃어버린 대신 분산저장의 장점을 가져왔다. 때문에 당장 MongoDB로 개발하려는 사람들은 이후의 확장성을 미리 염두해야한다.
아래글은 서버 2대를 예시로 했지만 단 한대의 서버로 하더라도 아래의 shard 구성으로 만들어라.
그래야 이후에 확장이 가능하다. 만약 한대로 할경우 아래 예시의 1번서버만 구성하면된다.
그리고 나중에 확장이 필요할 때 2번서버를 만들어서 붙여라.



mongodb에서의  auto-sharding을 위한 구성요소는 크게 3가지다.
mongos, shard server, config server

 mongos

샤딩된 mongodb의 서버들을 중앙에서 통제하여 클라이언트들과 통신하도록 도와주는 아답터와같은 존재이다.
여러개가 존재할 수 있기때문에 여러개를 두면 한두개가 뻗어도 다른 아답터들이 동작할 수 있다.

 shard server

일반적으로 mongodb를 단독으로 사용할 때는 mongod라는 단독 데몬으로 사용하지만
shard로 사용하게 되면 파일이 분산되어 저장된다.
chunk라는 단위로 파일이 쪼개어지고 이 쪼개어진 파일이 여러개의 shard로 등록된 서버에 분산저장된다.
때문에 scale-out 한 서버구성이 가능해진다.

 config server

shard server를 구성할 때 꼭 필요한 존재로
실제로 shard server들이 어떻게 파일이 분산되어있는지에 대한 메타데이터를 가지고 있는 서버이다.
무조건 1개 또는 3개로 구성된다.
shard server들의 리스트와 어떻게 분산될지에 대한 정보만 가지고 있기때문에 리소스가 그렇게 크지않다.





지금부터 구성하는 서버는 2대로 하는 auto-sharding 구성이다. mongos는 각 서버당 한개씩 구동되게하다.

mongos
27017
mongod(shardsvr)
30000
configsvr
30100



config server의 경우 1대 또는 3대를 지원하지만 여기서는 1대만 진행하도록 한다.

아래있는 예시서버의 IP는 다음과 같다. 아래 스크립트를 보면서 혼동이 있다면 참고하자.

1번
192.168.5.166
2번
192.168.5.167


mongo가 설치된 이후 기본  mongo세팅으로 사용할 경우 이래저래 문제가 많다. user등록을 해주고 사용하자.
우선 mongod 를 systemctl 에서 관리되는걸 내리자(아래있는 모든 스크립트는 별도표기가 없는이상 두서버 모두 실행한다.)
systemctl disable mongod

root로 접속하여
useradd mongo
passwd mongo
mkdir /data
mkdir /data/mongo
chown -R mongo. /data/mongo

semanage port -a -t mongod_port_t -p tcp 27017
semanage port -a -t mongod_port_t -p tcp 30000
semanage port -a -t mongod_port_t -p tcp 30100
firewall-cmd --permanent --zone=public --add-port=27017/tcp
firewall-cmd --permanent --zone=public --add-port=30000/tcp
firewall-cmd --permanent --zone=public --add-port=30100/tcp
firewall-cmd --reload
firewall-cmd --list-all

su - mongo

mongo 계정으로
mkdir /data/mongo/db
mkdir /data/mongo/arbiter
mkdir /data/mongo/configsvr
mkdir /data/mongo/shardsvr
mkdir /data/mongo/log
mkdir /data/mongo/pid

vim /data/mongo/shardsvr.conf
# shardsvr.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /data/mongo/log/shardsvr.log

# Where and how to store data.
storage:
  dbPath: /data/mongo/shardsvr
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /data/mongo/pid/shardsvr.pid  # location of pidfile

# network interfaces
net:
  port: 30000
#  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.


#security:

#operationProfiling:

#replication:
#  replSetName: rs0

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

vim /data/mongo/mongos.conf
# mongos.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /data/mongo/log/mongos.log

# Where and how to store data.
#storage:
#  dbPath: /data/mongo/mongos
#  journal:
#    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /data/mongo/pid/mongos.pid  # location of pidfile

# network interfaces
net:
  port: 27017
#  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.


#security:

#operationProfiling:

#replication:
#  replSetName: rs0

sharding:
  autoSplit: true
  configDB: 192.168.5.166:30100
  chunkSize: 64

## Enterprise-Only Options

#auditLog:

#snmp:


vim /data/mongo/configsvr.conf
# configsvr.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /data/mongo/log/configsvr.log

# Where and how to store data.
storage:
  dbPath: /data/mongo/configsvr
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /data/mongo/pid/configsvr.pid  # location of pidfile

# network interfaces
net:
  port: 30100
#  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.


#security:

#operationProfiling:

#replication:
#  replSetName: rs0

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

설정파일이 모두 만들어졌으면 이를 이용하여 서버를 구동한다.(기존에 mongo가 실행중이면 안된다.)
shard -> config -> mongos 의 순서로 기동한다.
***여기서 mongod --configsvr -f /data/mongo/configsvr.conf 부분은 1번서버에서만 실행한다. config서버는 1개 또는 3개로 동작해야한다.***

mongod --shardsvr -f /data/mongo/shardsvr.conf
mongod --configsvr -f /data/mongo/configsvr.conf
mongos -f /data/mongo/mongos.conf



모두 정상 기동되었다면 첫번째 두번째 서버가 모두 구성됬는지 다시확인하자. config서버는 첫번째 서버에서만 구동하기때문에 두번째서버에서는 스크립트도 작성하지 않아도 되긴한다.
확인이 끝나면 첫번째 서버에서 mongo로 접속한다.

$ mongo
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"192.168.5.166:30000"})
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"192.168.5.167:30000"})
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos>

첫번째 서버에서 설정한 내용은 어차피 첫번째 서버의 config서버에 설정되어있고,
두번째 서버에서는 첫번째 서버에 있는 config서버를 바라보고 있기에 한군대서 설정해 놓았다면 두군대를 모두 설정된걸로 보면된다.

샤딩이 제대로 되있는지 확인하고 싶다면

sh.status()

로서 확인이 가능하다. 이후에 물리는 추가 shard 서버들은 모두 이렇게 추가해주면된다.
그야말로 서버의 추가가 간편하게 이루어진다.


이제 서버가 구동되었을때 db가 구동되도록 해야하는데 chkconfig에 넣을 스크립트를 짜긴 귀찮으니 crontab을 사용하도록 하자.
1번서버에서
mongo 유저로 crontab -e 에 접속하자.

@reboot /bin/mongod --shardsvr -f /data/mongo/shardsvr.conf
@reboot /bin/mongod --configsvr -f /data/mongo/configsvr.conf
@reboot /bin/mongos -f /data/mongo/mongos.conf

2번서버에서
mongo 유저로 crontab -e 에 접속하자.

@reboot /bin/mongod --shardsvr -f /data/mongo/shardsvr.conf
@reboot /bin/mongos -f /data/mongo/mongos.conf

여기까지 했으면 shard에 대한 구성은 완료이다. 추가적으로 샤드서버를 붙이고 싶다면 2번서버를 계속 만들어서

db.runCommand({addshard:"192.168.5.167:30000"})  라고 했던 부분처럼 추가하기만하면된다.