MongoDB Replication & Replica Set

Replication

기존에 shard cluster만 운영된 경우에 대해서는 master node가 정상적으로 동작하지 않는 경우, slave server가 master을 대체했을 때 데이터의 유실이 발생할 수 있는데, 이를 해결하기 위해 replication 개념이 요구된다.

  • 고성능 미러링 기능
  • 성능/가용성
  • 데이터의 일관성
  • 읽기 요청에 대한 분산 처리
  • 백업을 통해 가용성 확보

MongoDB Replication

  • 쓰기 연산은 오로지 master node에서만 담당하게 된다. slave에 직접적으로 쓰기 연산을 실행하게 되면 에러가 발생한다.
  • 쓰기 연산을 실행하게 되면 데이터 저장소와 Oplog 영역에 저장하게 된다.
  • Oplog에는 연산 수행과 관련된 명령어와 타임스탬프를 같이 저장한다.
  • slave는 주기적으로 자신의 optime보다 큰 oplog을 요청하면, 5초 안에 마스터에서 쓰기 연산이 발생하게 되면 데이터가 응답되고, 그렇지 않으면 데이터가 존재하지 않는 다는 응답을 보내게 된다.
  • slave는 oplog을 받아서, 데이터가 존재하면 자신의 oplog에 데이터를 저장하고, 다시 master에 oplog을 요청한다.

mongodb_replication

  1. slave는 master에 oplog을 요청한다.
  2. master에서 쓰기 연산이 동작하였다면 oplog에는 명령어를 datastore에는 명령어 실행에 대한 데이터를 저장한다.
  3. master에서 slave로 oplog을 전달한다.
  4. slave에서 oplog를 받아서, 명령어를 실행하여 master와 같은 데이터 구조를 가지도록 한다.

MongoDB 4.0 버전 이후로는 Master/Slave Replication 구성이 deprecated(제거)되었고, 이를 대체하기 위해 Replica Set을 활용하여 고가용성 서버를 구성한다.

Replica Set

primary, secondary 서버를 구성하여, primary 서버에서 요청에 대한 처리를 수행하게 되며, primary 서버가 다운됐을 때 secondary 서버가 대체한다.

replica_set

  • replica set은 보통 1개의 primary 와 2개의 secondary로 구성한다.
  • primary server는 secondary 서버에서 대해 2초마다 heartbeat을 확인해서 secondary 서버가 정상적으로 구동하는 확인한다.
  • secondary 서버가 다운되더라도 primary 서버는 계속해서 어플리케이션에 대한 요청을 처리한다. secondary 서버가 복구되고 나면, 그 동안 쌓인 oplog을 받아서 데이터를 동기화한다.
  • primary 서버에서 문제가 발생하게 되면 secondary 서버가 primary 서버를 대체한다.
  • primary 서버에서 replica set을 구성하는 노드 집합의 과반수 이상을 가지고 있지 않으면 secondary 서버로 전환되며, 새로운 primary 서버 선정을 위해 투표를 진행한다.

replica set의 한계

  • replication set을 구성하는 노드의 최대 개수는 12개
  • replication set에서 투표를 할 수 있는 노드의 최대 개수는 7개
  • primary와 secondary 서버 간에 데이터 동기화가 발생하지만, 통신 지연이 어느정도 존재한다.
  • primary node가 다운되게 되면, oplog에 저장된 데이터가 동기화되지 못한 채로 데이터가 유실되는 문제 발생가능

Replica Set 구성 실습

  1. DB를 저장할 폴더 구성

system structure

  1. primary server 구동
mongod --replSet downSet -dbpath 'C:\Program Files\MongoDB\db' -port 10000
  1. secondary server 구동
mongod --replSet downSet -dbpath 'C:\Program Files\MongoDB\db2' -port 10001
mongod --replSet downSet -dbpath 'C:\Program Files\MongoDB\db3' -port 10002
  1. replica set 구성

primary server에 접속

mongosh localhost:10000

replica set config

Enterprise test> var config ={_id:"downSet",members:[{_id:0,host:"localhost:10000"},{_id:1,host:"localhost:10001"},{_id:2,host:"localhost:10002"}]};

Enterprise test> rs.initiate(config);
{ ok: 1 }

동기화가 완료되면 프롬프트 창에 해당 노드에 해당 되는 primary/secondary 여부가 표시된다. localhost:10000의 경우 아래와 같이 primary로 표신된다.

mongosh localhost:10000
Enterprise downSet [direct: primary] test>

10001,10002의 경우 아래와 같이 secondary로 표시된다.

mongosh localhost:10001
Enterprise downSet [direct: secondary] test>
  1. primary server가 다운 되었을 때의 상황 확인
//primary server db shutdown
mongosh localhost:10000
use admin
db.shutdownServer()

위와 같이 primary server을 종료하게 되면 secondary server 간에 투표를 진행해서 새로운 primary server을 선정한다. 아래의 결과를 확인해보면 10001 포트를 가지는 secondary server가 primary server로 전환되었음을 확인할 수 있다.

(base) PS C:\Windows\System32> mongosh localhost:10001
Current Mongosh Log ID: 63b24eb80cc798657d8332bc
Connecting to:          mongodb://localhost:10001/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.1
Using MongoDB:          6.0.3
Using Mongosh:          1.6.1

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2023-01-02T12:14:45.136+09:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2023-01-02T12:14:45.137+09:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
------

Enterprise downSet [direct: primary] test>

이때, 기존의 primary server였던 10000 포트에 대한 DB를 실행하게 되면 아래와 같이 secondary로 전환되어 있음을 확인할 수 있다.

e) PS C:\Windows\System32> mongosh localhost:10000
Current Mongosh Log ID: 63b24fc7d3b2c8e8b09f60e4
Connecting to:          mongodb://localhost:10000/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.1
Using MongoDB:          6.0.3
Using Mongosh:          1.6.1

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2023-01-02T12:30:09.124+09:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2023-01-02T12:30:09.125+09:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
------

Enterprise downSet [direct: secondary] test>

References

댓글남기기