반응형
  • 저희 회사에서 가장 많이 사용하는 구성이라 기존에 직접 설치 메뉴얼 만든 것을 바탕으로 재 구성 해 보았습니다.
  • 현재 대부분 3.4 버전을 많이 사용하고 있으며, 현재 구성하는 것들은 4.2 버전을 사용하고 있습니다.
  • 로그성 DB 위주로 사용하다 보니, 변경을 하더라도 문제 없이 동작을 하였기에 4.2 로 올리고 있는 중입니다.'
    1. Replica Set 이란?
      • 2초마다 Heartbeat하여  Primary와 Secondary 서로 서버 상태를 체크
      • Primary
      • Secondary
        • Readonly - Read 에 대한 분산
        • Primary Server의 데이터를 복제하며, HA 용도
      • Primary 선출 방식
        • 남은 Secondary 노드 들이 vote 투표를 통해 Primary 선출을 진행
        • 선출 방식 중 우선 순위에 의한 선출 방식의 경우 데이터의 동기화 수준 상관없이 우선 순위(priority)에 의해서 선출되는 방식
          • priority 값이 높을 수록 Primary 로 선출이 된다.
        • Arbiter 선출 방식은 데이터를 가지고 있지 않지만, 투표에 참여가 가능한 Arbiter를 이용하여, 선출 시에만 사용되는 서버 (비용 절감 효과)
          • DBA 관리 측면에서 어떤 서버가 Primary가 되는지 알기 쉬움
          • 실제로 구성 시  rs.initiate 명령어(하단 구성에서 찾을 수 있음) 에서 각 node 들에 대해 우선 순위-가중치-priority 에 값을 적용
      • Oplog복제 방식
        • DML 내용들은 모두 OpLog에 가장 먼저 작성
        • Primary 에 먼저 데이터를 적용 후 Oplog에 저장
        • Secondary (각 member들) 에서는 Oplog를 가져와 자신의 DB에 저장
        • oplogSizeMB 옵션으로 크기를 지정할 수 있으며, 복제 중에는 replSetResizeOplog 명령(재시작 필요 없음)을 사용하여 크기를 변경 가능
        • 기존 oplog 구성된 최대 크기에 도달했을 경우 생성이 되지만, v4.4 이후 부터는 시간을 지정 가능하여, 구성 시간이 오래되었을 경우 별도 파일로 생성 가능
        • Slow Oplog  Application
          • v4.2 (4.0.6) 부터 Replica 에서 Oplog를 적용하는 시간이 slow log 시간(slowOpSampleRate) 보다 큰 경우 oplog 항목을 기록 가능
    2. 구성
      • AWS EC2를 사용하기 때문에 그에 맞춰져 있습니다.
      • 구성은 P-S-A 로 진행 하였습니다. (맨 하단에 위치)
      • 인증은 내부 인증을 사용하기 위해, key 파일을 생성하여 진행 하였습니다. (Update Replica Set to Keyfile Authentication 참고)
    3. 레플리카 셋 배포
      1. 추가
        • rs.add({host:"아비터host:port", priority:1, arbiterOnly:true})
        • rs.add({host:"192.168.0.2:27017", priority:1, arbiterOnly:true})
      2. Secondary 추가
        • rs.add({host:"SecondaryHost:port", priority:1})
        • rs.add({host:"192.168.0.2:27017", priority:1})
      3. 확인하는 방법
        • rs.conf()
        • rs.status()
      4. 하나의 서버에 여러개 아비터 띄우는 방법
        1. 아비터 서버에 해당 port / data /log 만 바꿔서 하나씩 mongodb 띄우기
        2. Primary에서 위의 add 명령어 사용해서 추가
        3. 확인

 

 

 


P-S-A 구성하는 방법

  1. Download 및 기본 셋팅  (Primary, Secondary 모두 동일하게 구성)
#mongodb 를 다운 및 압축 풀고 지정 경로에 저장
#필요 시 OS 유저 생성 (user add mongod)
$sudo groupadd mongod
$sudo useradd -g mongod mongod

$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon2-4.2.6.tgz
$ tar -xvf mongodb-linux-x86_64-amazon2-4.2.6.tgz
$ mkdir /usr/local/mongodb
$ mv ./mongodb-linux-x86_64-amazon2-4.2.6/* /usr/local/mongodb
$ chown -R mongod:mongod /usr/local/mongodb

# data & log path 생성
$ mkdir -p /data/mongo/data
$ mkdir -p /data/mongo/log
$ chown -R mongod:mongod /data

#mongod 유저로 변경해서 아래내용 모두 진행
# add path
$ vi ~/.bash_profile

    # .bash_profile 
    # path에 아래 내용 추가 수정 진행, 저장

    mongodb=/usr/local/mongodb/bin
    PATH=$PATH:$HOME/.local/bin:$HOME/bin:$mongodb
 
# profile 적용
$  . ~/.bash_profile

# 존재 한다면 config 파일 백업
$ cp /etc/mongod.conf ~/mongod.conf.bak

 

  1. 공통 config 파일 설정 및 key 파일 생성 (Primary, Secondary 모두 동일하게 구성)
#Primary 내용

#key 파일 생성 (mongodb 간 접속을 진행 할 때 필요)

# 해당 key파일은 Secondary에 복사



$ sudo openssl rand -base64 756 > /usr/local/mongodb/mongo_repl.key

$ sudo chown mongod.mongod /usr/local/mongodb/mongo_repl.key

$ sudo chmod 600 /usr/local/mongodb/mongo_repl.key



# 아래 내용 복사

$ cat /usr/local/mongodb/mongo_repl.key

$ chmod 400 /usr/local/mongodb/mongo_repl.key
# Secondary DB 에서 위의 Primary DB에서 생성한 mongo_repl.key 의 내용을 복사 해서 동일한 위치에 붙여 넣고 저장 진행

# Secondary OS

# 복사한 Primary의 key 내용을 붙여 넣기 후 저장

$ vi /usr/local/mongodb/mongo_repl.key

$ chmod 400 /usr/local/mongodb/mongo_repl.key

 

  • Config 설정
# /etc/mongod.conf 수정 

$ sudo touch /etc/mongod.conf

$ sudo chown mongod.mongod /etc/mongod.conf

$ vi /etc/mongod.conf



#기존 내용 삭제 및 해당 내용으로 대체



systemLog:

   destination: file

   path: /data/mongo/log/mongo.log

   logAppend: true

   logRotate: rename



storage:

   engine: wiredTiger

   directoryPerDB: true

   wiredTiger:

      engineConfig:

         journalCompressor: snappy

      collectionConfig:

         blockCompressor: snappy

      indexConfig:

         prefixCompression: true

   dbPath: /data/mongo/data

   journal:

      enabled: true



processManagement:

   fork: true



#replication:

#   replSetName: "replSet"

  

net:

   bindIp: 0.0.0.0

   port: 27017



#아래 내용은 replica 구성이 완료 되면 아래 주석을 풀어주도록 하자

#replication:

#   replSetName: "replSet"

#security:

#  authorization: enabled

#  keyFile: /usr/local/mongodb/mongo_repl.key

 참고로 systemlog 의 quiet 는 권장하지 않는다.

문제 발생 시 에러 내역 트랙킹 하기 힘들기 때문. 

 

systemLog.quiet

Type: boolean

Run mongos or mongod in a quiet mode that attempts to limit the amount of output.

systemLog.quiet is not recommended for production systems as it may make tracking problems during particular connections much more difficult.

 

failIndexKeyTooLong : Index Key중 너무 큰게 있으면 저장되는 것을 fail 시켜라고 하는 파라미터

 

옵션 정리

http://blog.naver.com/PostView.nhn?blogId=theswice&logNo=220763046938&redirect=Dlog&widgetTypeCall=true

 

  1. Primary, Secondary  DB Startup 진행 & User 생성
#Primary, Secondary  모두 진행

#서비스 등록

$ sudo vi /etc/systemd/system/mongodb.service



[Service]

User=mongod

ExecStart=/usr/local/mongodb/bin/mongod --config /etc/mongod.conf



# sudo에 mongod 유저 등록

$ visudo -f /etc/sudoers



#아래 내용 찾아 하단에 추가

## Allow root to run any commands anywhere

root    ALL=(ALL)       ALL

mongod  ALL=(ALL)       ALL

 

  • MongoDB Startup
# Primary, Secondary , Arbiter 모두 진행

# Arbiter의 경우 이미 실행되어 있을 수 있으므로 mongodb가 Start가 되어있는지만 확인

# MongoDB 시작

$ sudo systemctl start mongodb



# MongoDB 상태 확인

$ ps -ef | grep mongod

 

  • MongoDB User 생성
# User 생성

# Primary에서만 진행 



$ mongo



// 인증 DB가 admin

// root 계정 생성 및 게임서버 유저, bi 등에서 생성되는 유저 생성 진행

mongo> use admin

mongo> db.createUser(

    {    

        user: "LKadmin",

        pwd: "test!23",

        roles:[

            { role: "root", db: "admin" }

        ]

    }

)

 

 

  • Replica DB 구성
# Primary 에서만 진행

# ------------------------------------------------------------------------------------------------------

replica 설정 초기화, IP 및 Port 확인 필요!!

# ------------------------------------------------------------------------------------------------------

# replica 설정 초기화



> rs.initiate(

   {

      _id: "replSet",

      version: 1,

      members: [

         { _id: 0, host : "10.95.171.77:27017", priority:3 },

         { _id: 1, host : "10.95.171.78:27017", priority:2 },

         { _id: 2, host : "10.95.171.79:27017", priority:1, arbiterOnly:true }

      ]

   }

)

> rs.status() # stateStr 값이 primary 여야 함

> rs.conf()

> exit

# Primary, Secondary Config 에서 아래 주석내용 풀어준 후 리스타트 진행

# vi /etc/mongod.conf



replication:

   replSetName: "replSet"



security:

  authorization: enabled

  keyFile: /usr/local/mongodb/mongo_repl.key



$  sudo systemctl restart mongodb



# Primary 접속하여 아래와 같이 나오는지 체크

# Primary 접속하여 아래와 같이 나오지 않는다면, replica 설정 초기화를 다시 진행해도 된다.(굳이 mongodb 리스타트 또는 config 주석을 변경 하지 않아도 된다.)



$ mongo admin -u LKadmin -p  

replSet:PRIMARY>



# secondary 접속 테스트

$ mongo admin -u LKadmin -p  



#아래와 같이 나오는지 체크

replSet:SECONDARY>

replSet:SECONDARY> rs.slaveOk()

replSet:SECONDARY> rs.status()

{

        "set" : "replSet",

        "date" : ISODate("2020-05-27T06:05:42.413Z"),

        "myState" : 2,

        "term" : NumberLong(1),

        "syncingTo" : "10.95.171.77:27017",

        "syncSourceHost" : "10.95.171.77:27017",

        "syncSourceId" : 0,

        "heartbeatIntervalMillis" : NumberLong(2000),

        "majorityVoteCount" : 2,

        "writeMajorityCount" : 2,

        "optimes" : {

                "lastCommittedOpTime" : {

                        "ts" : Timestamp(1590559533, 1),

                        "t" : NumberLong(1)

                },

                "lastCommittedWallTime" : ISODate("2020-05-27T06:05:33.008Z"),

                "readConcernMajorityOpTime" : {

                        "ts" : Timestamp(1590559533, 1),

                        "t" : NumberLong(1)

                },

                "readConcernMajorityWallTime" : ISODate("2020-05-27T06:05:33.008Z"),

                "appliedOpTime" : {

                        "ts" : Timestamp(1590559533, 1),

                        "t" : NumberLong(1)

                },

                "durableOpTime" : {

                        "ts" : Timestamp(1590559533, 1),

                        "t" : NumberLong(1)

                },

                "lastAppliedWallTime" : ISODate("2020-05-27T06:05:33.008Z"),

                "lastDurableWallTime" : ISODate("2020-05-27T06:05:33.008Z")

        },

        "lastStableRecoveryTimestamp" : Timestamp(1590559493, 1),

        "lastStableCheckpointTimestamp" : Timestamp(1590559493, 1),

        "members" : [

                {

                        "_id" : 0,

                        "name" : "10.95.171.77:27017",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 16200,

                        "optime" : {

                                "ts" : Timestamp(1590559533, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDurable" : {

                                "ts" : Timestamp(1590559533, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2020-05-27T06:05:33Z"),

                        "optimeDurableDate" : ISODate("2020-05-27T06:05:33Z"),

                        "lastHeartbeat" : ISODate("2020-05-27T06:05:41.267Z"),

                        "lastHeartbeatRecv" : ISODate("2020-05-27T06:05:40.496Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "",

                        "syncSourceHost" : "",

                        "syncSourceId" : -1,

                        "infoMessage" : "",

                        "electionTime" : Timestamp(1590543352, 1),

                        "electionDate" : ISODate("2020-05-27T01:35:52Z"),

                        "configVersion" : 1

                },

                {

                        "_id" : 1,

                        "name" : "10.95.171.78:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 17820,

                        "optime" : {

                                "ts" : Timestamp(1590559533, 1),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2020-05-27T06:05:33Z"),

                        "syncingTo" : "10.95.171.77:27017",

                        "syncSourceHost" : "10.95.171.77:27017",

                        "syncSourceId" : 0,

                        "infoMessage" : "",

                        "configVersion" : 1,

                        "self" : true,

                        "lastHeartbeatMessage" : ""

                },

                {

                        "_id" : 2,

                        "name" : "10.95.171.79:27017",

                        "health" : 1,

                        "state" : 7,

                        "stateStr" : "ARBITER",

                        "uptime" : 16200,

                        "lastHeartbeat" : ISODate("2020-05-27T06:05:41.266Z"),

                        "lastHeartbeatRecv" : ISODate("2020-05-27T06:05:42.157Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "",

                        "syncSourceHost" : "",

                        "syncSourceId" : -1,

                        "infoMessage" : "",

                        "configVersion" : 1

                }

        ],

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1590559533, 1),

                "signature" : {

                        "hash" : BinData(0,"W5JmQNO1ECoqd0kldQ26bHHzspk="),

                        "keyId" : NumberLong("6831331679710216195")

                }

        },

        "operationTime" : Timestamp(1590559533, 1)

}

 

 

완료 한 번씩 로그 체크는 진행

반응형
반응형

[MongoDB] 웨비나 - mongodb 에 대한 8가지 오해

  1. 작년 10월 에  MongoDB 웨비나에서 소개된 자료를 정리한 것이 있어서 직접 다시 집중적으로 정리하였습니다.
  • 소개

https://www.mongodb.com/presentations/korea-top-misunderstanding-of-mongodb

  • 비디오

https://vimeo.com/468475015

  • PPT

https://view.highspot.com/viewer/5f882ff5a2e3a96b5627dc39

 

[ WiredTiger Engine ]

 

  • 2014 년 Wired Tiger 업체를 인수
  • 3.0 에서 MMAPv1 -> WT 으로 변경 진행 (MMAPv1 4.0 이하에서는 사용 가능 / 4.2에서는 제거)\
  • 본질적으로 Transaction Storage Engine 이며, Read & Write 에 우수(MMAPv1 은 Insert 에 최적화된 Engine)
  • 4.0 에서 부터는 분산 Multi Transaction 을 지원
  • 특징
    • WiredTiger에서 압축은 기본 옵션
    • v4.2 부터 총 3개의 압축 옵션을 제공 (snappy, zlib, zstd)
      • 호환성 성능상 아직 이슈가 있어서 snappy 이용
      • 압축률은 zstd(zlib와 대등) 가 더 좋으나, 성능은 snappy 와 zlib 사이로 판단
    • 인덱스는 prefix 압축을 사용
      • 데이터는 WT의 Cache 상태에서는 non 압축 상태 즉, 데이터를 저장 시 Document로 bson 형태로 저장되는데, bson 은 non압축상태로 WT cache 에 존재하며 Disk 와 os file cache 에는 압축 상태로 저장.
      • 만약 find 하는 경우 먼저 cache 의 non 압축 상태에서 먼저 확인 후, Disk 의 압축 상태에서 찾아봐 압축을 해제하며 cache 에 적재
      • prefix 압축이란?
      • 그런데 Index 는 메모리 상 뿐만 아니라 디스크에도 prefix 압축된 상태로 사용(메모리의 효율성을 증대 가능)
    • 삭제된 공간을 재활용 못하기 때문에 Disk size가 무한대로 증가하는 과거 버전과 달리, 현재는 재활용 가능
    • 그래서, collection 에서 사용되지 않는 공간을 확인 가능하며, WT 에서 수동으로 compaction 을 할 수 있음
    • DDL 작업을 제외하고는 4.4 부터 온라인 Compaction 할 수 있음
      • 기존에는 Database level lock 을 잡는것과 달리, 4.4 부터는 CRUD 작업에 대해서는 Lock을 잡지 않음.
      • 그래서 운영간 Primary에서도 가능
    • 초기 버전에는 Global -> Database -> collection Level Lock 을 잡았음 (몇 백개의 Collection이 존재하는 과거 운영)
    • 현재는 Document Level Locking
    • Write no longer block all other writes
    • More CPU cores, instead of faster CPU speeds (하드웨어의 자원을 최대로 사용 가능 - 성능 향상 가능 - 고 사양 서버를 사용 가능하며 유리)
    • Avoid need to "micro-shard"
    • WT에서는 메모리 Cache size , Check point Interval time 등을 조정 가능 (파라메터 튜닝 가능)
    1. 압축
    2. 온라인 Compaction
    3. 향상된 Concurrency
    4. 최신 하드웨어 활용
    5.  조정 가능한 설정 파라메터
  • MMAPv1 와 비교한 레퍼런스 (amadeus , book my show, FaceIT 등의 글로벌 업체)
    • 스토리지 공간을 80% 절감
    • 최대 5~10 배 향상된 성능

[암호화]

  • 3.6 부터 Binding 을 Localhost 가 Default 로 되어 있어서, 설치 시 Localhost 에서만 접속 가능
  • 아래 내역들에 대해 Community 와 Enterprise 등 모두 사용 가능

 

[Check Point]

  • 스토리지 상의 일관된 데이터 페이지 셋으로, 내구성 / 원자성을 지닌 디스크의 데이터 스냅 샷이라고 정의
  • 쉽게 말하면, 데이터를 DML 하는 가운데 메모리 Page상으로 존재하는데, 매 1분 또는 메모리 Dirty 영역이 일정 임계치 이상이 되는 경우 해당 Page들을 Disk로 저장

 

[Journaling]

  • 체크 포인트 간의 발생하는 모든 데이터 수정 사항을 신속하게 유지할 수 있는 write-ahead 로그 (journal)
    • write-ahead 로그 : 디스크에 쓰기 전에 한번 더 별도의 공간에 저장 (파일시스템 내에 저널파일이-100mb 단위/ 존재하며 체크 포인트 발생하면 모두 삭제 됨)
    • 데이터 뿐만 아니라 인덱스 에서 발생하는 로그들 모두 기록
  • 저널링 버퍼가 존재하는데, 저널링 버퍼에서 저널링 파일로 저장되는 시간이 1oms  (10ms 의 유실 가능성 존재)
  • 체크 포인트 간에 장애가 발생하면 저널을 사용하여 마지막 체크 포인트 이후 수정 된 모든 데이터를 적용

* Journaling 없이도 MongoDB는 손실 없이 마지막 체크 포인트로 복구 가능하나, 마지막 체크 포인트 이후의 변경 사항을 복구하려면 저널링을 활성화해야 가능

 

[Write Concerns]

  • Write 작업을 위해 MongoDB cluster에서 Client Application Ack 요청을 제어
  • Write 작업을 할때 Primary 에 적용 하고 응답을 받고 Session 을 종료 할 것인지, Secondary 까지 적용이 완료 된 후 응답을 받아 종료를 할것인지, Primary 에서 조차도 응답을 안받고 작업을 종료 할 것인지에 대한 Level 제어
  • 또한 wtimeout 을 적용하여 해당 시간 보다 오래 소요되는 경우 Error return (단위 ms)
  • Write Concern Option
    • 1 : Written to Primary - Default
    • 2 : written to Primary and at least one Secondary
    • majority : Written to majority of nodes
  • ex) 과반수 노드가 write 된 후에 ack 를 달라고 하는데, 단 5초 이상 소요 시 error return
  • db.products.insert({name : "Louis.Kim"}, {writeConcern:{w:"majority", wtimeout:5000}})

[Multi-Document Distributed ACID Transactions]

  • Single/ Multi Document, Shard  등 Transaction 지원
  • RDBMS와 동일한 형태
    • Transaction Default Timeout 60초
    • 다중 구문, 유사한 문법
    • 어플리케이션에 쉽게 추가 가능
    • 여러 컬렉션에 대한 다중 구문 트랜잭션
  • ACID 보장
    • All or nothing execution
    • Snaphost isolaction ( Serializable Snapshot Isolaction의 공동 발명자인 Michael Cahill 포함한 Wired Tiger 회사 인수-와 연관 )

Causal Consistency

반응형
반응형

몽고DB란?

  • 크로스 플랫폼 Document 지향 DBMS
  • 빠른 속도와 확장성
    • NoSQL (비관계) DBMS
      • 기존 R(관계)DBMS의 규칙을 포기하는 대신, 뛰어난 확장성이나 성능을 발전시키는 방향
    • 대표적인 NoSQL DBMS

종류

관련 언어

Key-Value Store

Redis, Dynamo

Column 지향 언어

HBase, Cassandra

Document 지향 언어

MongoDB

Graph Database

Neo4J

  • 친숙함
    • JSON과 유사항 형태로 저장하는 방식
    • Javascript를 활용할 수 있음
    • Document 지향 스토어 (Schemaless)
    • 다양한 인덱스를 지원

 

  • 쉽고 빠른 분산 컴퓨팅 환경 구성 (신뢰성-Reliability / 확장성-Scalability)
    • Replication(HA) , Sharding(분산 저장) 제공하여 쉽게 구성이 가능

신뢰성(Reliability)

  • 서버 장애에도 서비스는 계속 동작
    • Primary 와 Secondry로 구성된 ReplicaSet 구조로 고가용성을 지원

확장성(Scalability)

  • 데이터와 트래픽 증가에 따라 수평확장(scale-out) 가능
    • 데이터를 샤딩하여 수평확장(scale-out) 할 수 있음

유연성(Flexibility)

  • 여러가지 형태의 데이터를 손쉽게 저장
    • 서비스 요구사항에 맞춰 다양한 종류의 데이터가 추가되어도 스키마 변경 과정 없이 필요한 데이터를 바로 저장하고 읽을 수 있음

Index 지원
(Index Support)

  • 다양한 조건으로 빠른 데이터 검색
    • 다양한 인덱스 지원 다양한 용도로 사용이 가능

MongoDB 구조

  • MongoDB에 여러 개의 Database 가 존재
    • create 문이 존재 하지 않으며, 원하는 DB명을 생성이 아닌 선택 후 document를 insert하면 생성 됨
  • 하나의 Database 내에 여러 개의 Collection 이 존재
    • DB와 동일하게 별도의 create 문이 존재 하지 않으며, document를 생성하면 자동으로 collection이 생성
  • 하나의 Collection에는 여러 Document가 존재
    • 실질적인 데이터
  • BSON
    • Binary JSON 구조
    • 필드 뒤에 값이 오는 형태
    • 필드와 필드는 쉼표로 구분
    • Document 하나는 중괄호로 감싸져 존재
    • 필드에는 문자열만 들어가며, 값에는 배열, 숫자, 3차원 위치 좌표, 또 다른 필드와 값을 가진 오프젝트도 값으로 가질 수 있음 (유연성-Flexibility)
    • 그 외 다른 정보를 모두 표현할 수 있도록 다양한 값의 형식을 지원
      • 그 중 중요한 ObjectID 만 정리
      • ObjectID
        • Document 생성 시 PK로 "_id" 필드가 자동으로 생성
        • _id 는 서로 겹치지 않는 ObjectID 타입으로 값을 할당
        • 동시에 생성되어도 서로 다른 값이 생성되어 유일 값
        • ObjectID 값은 "유닉스시간+기기id+프로세스id+카운터" 로 구성
          • 앞에 4byte는 유닉스 시간
          • 다음 3byte는 기기의 id 값
          • 다음 2byte는 프로세스 id 값
          • 마지막 3byte는 랜덤 값부터 시작하는 카운터로 구성
        • ObjectId.getTimestamp() 하면 생성된 시점을 알아낼 수 있음. (ObjectID를 이용하면 시간 range 로 검색이 가능)
> ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()
ISODate("2012-10-15T21:26:17Z")

use database1            // database 선택
db.collection1.insert({              // collection.명령어 document
    "name" : "Rouis.Kim"   // field : value
    , "age" : 37           // field : integer value
    , "role" : "DBA"       // field : string value
    , "exp" : [{"Dev" : 5, "DBA" : 6}, {"Game": 3, "Ecommercail":2, "Enginner":3,"etc":3}]  // field : Object value
    , "loc" : [37.504997827623406, 127.02381255144938] // field : geomentry
    , "etc" : ["2 daughters","프로이직러"] // field : array value
})
// document가 생성되지만, collection 이 존재하지 않으면 collection, database가 존재 하지않으면 database 까지 생성 됨
// schemaless (스키마 유연성)

언제 어떻게 써야 할까?

  • Schema가 자주 바뀌는 환경
    • Document 지향 스토어 방식
      • 스키마의 변경이 자유로운 편
      • 추가될 기능이 확실하지 않고 상황에 다라 App에 저장될 자료가 지속적으로 달라지는 환경(개발 방법론으로 개발 하는 곳)
      • 애자일 개발 방법론 / 나선형 모델에 최적 (미주 추가)
  • 분산 컴퓨팅 환경
    • 샤딩과 복제를 지원하기 때문에 여러 대의 컴퓨터에 구성이 용이하기 때문에 빠른 분산 컴퓨팅 환경이 구축 필요한 경우

 

RDBMS

NoSQL

Schema

  • 명확한 데이터 구조 (Join 등으로 복잡성 증가, 스키마 수정 시  비용 발생)
  • 데이터 무결성 보장
  • 수평적 확장이 힘듦(수직적 확장)

Schemaless

  • 자유롭게 데이터를 관리(중복 데이터 저장 가능하여 데이터 관리 필요)
  • Data에 대한 규격화된 결과 얻기가 힘듦
  • Join이라는 개념이 없으며, Join 가능은 하나 힘ㄷ름
  • 수평적 확장이 쉬움

ACID / BASE 관련 좋은 글

https://embian.wordpress.com/2013/06/27/nosql-2/

https://velog.io/@qoik11/MongoDB-3rk4z5de3r

 

버전 관리

  • MongoDB는 두 번째 자리 숫자가 짝수인 버전이 안정화 버전이며, 홀수인 버전이 개발 중인 버전
  • 서비스를 하는 것이라면 두 번째 자리가 짝수인 버전을 사용하는 것 추천
  • Postgresql 도 비슷한 것으로...

 


애자일 개발 방법론

  • 신속한 반복 작업을 통해 실제 작동 가능한 소프트웨어를 개발하여 지속적으로 제공하기 위한 소프트웨어 개발 방식
  • 지속적으로 요구 사항을 반영하며, 의사소통이 많으며 지속적인 테스트 가 특징
  • 명세화 부족하며 잦은 변경으로 테스트 증가. 개발자 위주라 사업 관리 부분 미흡(유지보수 비용 증가)

나선형 모델

  • 시스템 개발 시 위험을 최소화 하기 위해 점진적으로 완벽한 시스템으로 개발해 나가는 나선형 모델로 ,계속 목표설정-위험분석-개발검증-고객평가를 계속하며 점진적으로 개발
  • 리스크를 최소화 하기 위하여 "위험 분석 단계"를 추가하여 위험 부담이 큰 대형 시스템 구축에 적합.
  • 프로젝트 기간이 길며, 관리가 어려움. 위험 관리에서는 해당 전문가가 필요
반응형
반응형

올해 1월부터 진행 한 MongoDB Study에 대해서 정리해 봅니다.

함께하는 멤버들의 블로그 입니다.

 

루이스(본인) : hyunki1019.tistory.com/

라라님 : rastalion.me/

닷닷님 : 닷닷이의 DB공간 : 네이버 블로그 (naver.com)

재혁님 : marsettler.com/

 

그 외 분들은 다른 자료로 공유를 하시기 때문에 그 분들의 내용은 추후에 업로드 해보도록 하겠습니다.

주로 4.x (최신 버전) 으로 진행 하고 있습니다.

반응형

+ Recent posts