MongoDB Cluster ReplicaSet

С режимом работы кластера можно ознакомиться здесь

Начнем с кластера в режиме ReplicaSet

  • Машины должны видеть друг друга по имена через ИП АДРЕСА НЕ РАБОТАЕТ.
  • Дописываем в конфиг vim /etc/mongod.conf
replication:
   replSetName: "rs0"
sharding:
   clusterRole: "configsvr" 

Дальше нам понадобиться консольный доступ через утилиту mongosh (Если ставили из официальных реп то должна идти в комплекте, ну или придётся доставить)

Инициализируем кластер, перечисляя ноды, делаем только на одной ноде

rs.initiate(
  {
    _id: "rs0",
    configsvr: true,
    members: [
      { _id : 0, host : "mongodb1:27017" },
      { _id : 1, host : "mongodb2:27017" },

    ]
  }
)

Проверка Конфигурации

Enterprise rs0 [direct: primary] test> rs.conf()
{
  _id: 'rs0',
  version: 1,
  term: 10,
  members: [
    {
      _id: 0,
      host: 'mongodb1:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 1
    },
    {
      _id: 1,
      host: 'mongodb2:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 1
    }
  ],
  protocolVersion: Long("1"),
  writeConcernMajorityJournalDefault: true,
  settings: {
    chainingAllowed: true,
    heartbeatIntervalMillis: 2000,
    heartbeatTimeoutSecs: 10,
    electionTimeoutMillis: 10000,
    catchUpTimeoutMillis: -1,
    catchUpTakeoverDelayMillis: 30000,
    getLastErrorModes: {},
    getLastErrorDefaults: { w: 1, wtimeout: 0 },
    replicaSetId: ObjectId("62c2c06515c0c4c459c2688b")
  }

Статус Кластера

Enterprise rs0 [direct: primary] test> rs.status()
{
  set: 'rs0',
  date: ISODate("2022-07-04T14:30:17.750Z"),
  myState: 1,
  term: Long("10"),
  syncSourceHost: '',
  syncSourceId: -1,
  heartbeatIntervalMillis: Long("2000"),
  majorityVoteCount: 2,
  writeMajorityCount: 2,
  votingMembersCount: 2,
  writableVotingMembersCount: 2,
  optimes: {
    lastCommittedOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
    lastCommittedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
    readConcernMajorityOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
    appliedOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
    durableOpTime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
    lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
    lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z")
  },
  lastStableRecoveryTimestamp: Timestamp({ t: 1656945014, i: 1 }),
  electionCandidateMetrics: {
    lastElectionReason: 'stepUpRequestSkipDryRun',
    lastElectionDate: ISODate("2022-07-04T14:02:34.394Z"),
    electionTerm: Long("10"),
    lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1656943340, i: 7 }), t: Long("9") },
    lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1656943340, i: 7 }), t: Long("9") },
    numVotesNeeded: 2,
    priorityAtElection: 1,
    electionTimeoutMillis: Long("10000"),
    priorPrimaryMemberId: 1,
    numCatchUpOps: Long("0"),
    newTermStartDate: ISODate("2022-07-04T14:02:34.402Z"),
    wMajorityWriteAvailabilityDate: ISODate("2022-07-04T14:02:35.401Z")
  },
  electionParticipantMetrics: {
    votedForCandidate: true,
    electionTerm: Long("9"),
    lastVoteDate: ISODate("2022-07-04T14:00:34.356Z"),
    electionCandidateMemberId: 1,
    voteReason: '',
    lastAppliedOpTimeAtElection: { ts: Timestamp({ t: 1656943220, i: 72 }), t: Long("8") },
    maxAppliedOpTimeInSet: { ts: Timestamp({ t: 1656943220, i: 72 }), t: Long("8") },
    priorityAtElection: 1
  },
  members: [
    {
      _id: 0,
      name: 'mongodb1:27017',
      health: 1,
      state: 1,
      stateStr: 'PRIMARY',
      uptime: 8997,
      optime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
      optimeDate: ISODate("2022-07-04T14:30:14.000Z"),
      lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
      lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z"),
      syncSourceHost: '',
      syncSourceId: -1,
      infoMessage: '',
      electionTime: Timestamp({ t: 1656943354, i: 1 }),
      electionDate: ISODate("2022-07-04T14:02:34.000Z"),
      configVersion: 1,
      configTerm: 10,
      self: true,
      lastHeartbeatMessage: ''
    },
    {
      _id: 1,
      name: 'mongodb2:27017',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 8996,
      optime: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
      optimeDurable: { ts: Timestamp({ t: 1656945014, i: 1 }), t: Long("10") },
      optimeDate: ISODate("2022-07-04T14:30:14.000Z"),
      optimeDurableDate: ISODate("2022-07-04T14:30:14.000Z"),
      lastAppliedWallTime: ISODate("2022-07-04T14:30:14.470Z"),
      lastDurableWallTime: ISODate("2022-07-04T14:30:14.470Z"),
      lastHeartbeat: ISODate("2022-07-04T14:30:16.949Z"),
      lastHeartbeatRecv: ISODate("2022-07-04T14:30:15.998Z"),
      pingMs: Long("0"),
      lastHeartbeatMessage: '',
      syncSourceHost: 'mongodb1:27017',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 1,
      configTerm: 10
    }
  ],
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1656945014, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1656945014, i: 1 })
}

Добавить ноду в кластер. Выполняем на примаре наде.

Enterprise rs0 [direct: primary] test> rs.add( { host: "mongodb3:27017" } )
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1657003243, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1657003243, i: 1 })
}

Удалить Ноду

rs.remove("mongod3.example.net")

Изменить роль ноды в Secoundary

rs.stepDown()

Добавить комментарий 0