ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2대의 서버로 구성하는 개발용 Shard Cluster
    Database/MongoDB 2023. 2. 2. 22:46

    각 장비에 mongodb 2개, config server 1개, mongos 1개가 구성됩니다.

    Config, db, pid 경로 및 파일을 추가생성하여 하나의 서버에서 다수개를 구동할 수 있습니다.

    다만 ReplicaSet 의 절체가 정상적으로 이루어지지 않는 경우가 발생할 수 있는점과 성능 및 구조상 이슈로 인하여 MongoDB 에서는 해당 구조를 추천해주지 않지만, 기존 IPRON 의 구조가 장비 2대를 통한 Active/Standby 임으로 임의 구성해보았습니다.

    커맨드구성으로도 가능하지만, 차후 관리편의성을 생각해서 systemctl 에 등록하는 방향으로 가이드합니다.

     

    두대의 장비에 이중화 설정 및 Shard Cluster 구성은 다음과 같이 생성됩니다.

    2대의 장비간 연동

     

    Shard Cluster 에서 Config Server , Shard , Mongos 는 아래와 같이 통신합니다.

    shard cluster 구성

     

    ReplicaSet 구성

    최초 설치되는 mongod 데몬의 설정을 생략하고 가이드 합니다.

    # Server 1
    # /etc/mongod.conf
    # 기본 정보에서 아래내용만 추가, 변경
    # Server 2 에는 replSetName: "rs1" 으로 설정
    net:
      port: 27017
      bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
    
    # 해당 DB는 rs0 라는 ReplicaSet 임을 명시
    replication:
      replSetName: "rs0"
    
    # Shard 구성시 Config Server가 아닌 Shard 로 동작할 것을 설정
    sharding:
      clusterRole: shardsvr
    # Server 1
    # /etc/mongod2.conf
    # mongod.conf 에서 복사하여 아래 내용을 적용
    # Server 2 에는 replSetName: "rs0" 으로 설정
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb2/mongod.log
    
    processManagement:
      fork: true  # fork and run in background
      pidFilePath: /var/run/mongodb2/mongod.pid  # location of pidfile
      timeZoneInfo: /usr/share/zoneinfo2
    
    storage:
      dbPath: /var/lib/mongo2
    
    net:
      port: 27018
      bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
    
    # 해당 DB는 rs1 라는 ReplicaSet 임을 명시
    replication:
      replSetName: "rs1"
    
    # Shard 구성시 Config Server가 아닌 Shard 로 동작할 것을 설정
    sharding:
      clusterRole: shardsvr
    # systemctl 을 이용한 구동을 하려면 service 구성을 추가
    # 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
    # mongod2 및 mongodb2 로 바뀐 부분만 확인하여 변경
    #
    # cd /etc/systemd/system/multi-user.target.wants
    # cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongod2.service
    # ln -s /usr/lib/systemd/system/mongod2.service mongod2.service
    # vi mongod2.service
    
    [Unit]
    Description=MongoDB Database Server
    Documentation=https://docs.mongodb.org/manual
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    User=mongod
    Group=mongod
    Environment="OPTIONS=-f /etc/mongod2.conf"
    EnvironmentFile=-/etc/sysconfig/mongod
    ExecStart=/usr/bin/mongod $OPTIONS
    ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb2
    ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb2
    ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb2
    PermissionsStartOnly=true
    PIDFile=/var/run/mongodb2/mongod.pid
    Type=forking
    # file size
    LimitFSIZE=infinity
    # cpu time
    LimitCPU=infinity
    # virtual memory size
    LimitAS=infinity
    # open files
    LimitNOFILE=64000
    # processes/threads
    LimitNPROC=64000
    # locked memory
    LimitMEMLOCK=infinity
    # total threads (user+kernel)
    TasksMax=infinity
    TasksAccounting=false
    # Recommended limits for mongod as specified in
    # https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings
    
    [Install]
    WantedBy=multi-user.target
    호스트명을 등록해줍니다.
    vi /etc/hosts
    <serverip1> db1
    <serverip2> db2
    위의 설정을 완료했다면 연관 폴더 생성 및 권한변경 후 실행 
    mkdir /var/log/mongod2
    mkdir /var/lib/mongod2
    mkdir /var/run/mongod2
    chown mongod:mongod /var/log/mongod2
    chown mongod:mongod /var/lib/mongod2
    chown mongod:mongod /var/run/mongod2
    
    systemctl restart mongod
    systemctl restart mongod2
    ReplicaSet 에 대한 Server 설정을 진행합니다.
    아래 명령들은 한쪽 장비에서만 진행합니다.
    
    $ mongo --port 27017
    
    > db.runCommand( {"replSetInitiate" :   {"_id" : "rs0", "members" :   [ { "_id" :1, "host": "db1:27017"},      { "_id" :2, "host" : "db2:27018"} ] }} )
    
    > exit
    
    $ mongo --port 27018
    
    > db.runCommand( {"replSetInitiate" :   {"_id" : "rs1", "members" :   [ { "_id" :1, "host": "db2:27017"},      { "_id" :2, "host" : "db1:27018"} ] }} )
    
    > exit

    위 구성까지 완료시 mongo Shell 로 접속시 PRIMARY/SECONDARY 중 하나가 Console Name으로 확인됩니다.

     

    Config Server 설치

    Config Server 는 같은 ReplicaSet으로 구성하면 됩니다. ReplicaSet Name 은 Shard를 구성할때 사용한 ReplicaSet Name 과는 별도입니다.

    양쪽 서버에 동일하게 설정하여 구성합니다.

    # /etc/mongocfg.conf
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongocfg/mongod.log
    
    storage:
      dbPath: /var/lib/mongocfg
      journal:
        enabled: true
    
    processManagement:
      fork: true  # fork and run in background
      pidFilePath: /var/run/mongocfg/mongod.pid  # location of pidfile
    
    net:
      port: 27019
      bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
    
    # config server 간 replicaSet
    replication:
      replSetName: "rscfg"
    
    # config server 명시
    sharding:
      clusterRole: configsvr
    # systemctl 을 이용한 구동을 하려면 service 구성을 추가
    # 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
    #
    # cd /etc/systemd/system/multi-user.target.wants
    # cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongocfg.service
    # ln -s /usr/lib/systemd/system/mongocfg.service mongocfg.service
    # vi mongocfg.service
    [Service]
    User=mongod
    Group=mongod
    Environment="OPTIONS=-f /etc/mongocfg.conf"
    EnvironmentFile=-/etc/sysconfig/mongod
    ExecStart=/usr/bin/mongod $OPTIONS
    ExecStartPre=/usr/bin/mkdir -p /var/run/mongocfg
    ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongocfg
    ExecStartPre=/usr/bin/chmod 0755 /var/run/mongocfg
    PermissionsStartOnly=true
    PIDFile=/var/run/mongocfg/mongod.pid
    위의 설정을 완료했다면 연관 폴더 생성 및 권한변경 후 실행 
    mkdir /var/log/mongocfg
    mkdir /var/lib/mongocfg
    mkdir /var/run/mongocfg
    chown mongod:mongod /var/log/mongocfg
    chown mongod:mongod /var/lib/mongocfg
    chown mongod:mongod /var/run/mongocfg
    
    systemctl restart mongocfg
    해당 명령은 한쪽 장비에서만 진행합니다.
    
    $mongo --port 27019
    
    > rs.initiate({_id:"rscfg",members:[{_id:1, host: "db1:27019"}, {_id:2, host : "db2:27019"}]})
    
    > rs.status()
    
    > exit

     

    Mongos 구성

    config File 에서는 Config Server 에 대한 Access 정보를 기입합니다.

    shard 나 config server 와 달리 해당 서버는 mongos 프로세스를 이용하여 구동합니다.

    # /etc/mongos.conf
    # 다른 conf 와 달리 아래 내용만 추가하여 새로 생성
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongos/mongos.log
    
    processManagement:
      fork: true  # fork and run in background
      pidFilePath: /var/run/mongos/mongod.pid  # location of pidfile
    
    # network interfaces
    net:
      port: 27020
      bindIp: 0.0.0.0 
    
    sharding:
      configDB: rscfg/db1:27019,db2:27019
    # systemctl 을 이용한 구동을 하려면 service 구성을 추가
    # 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
    #
    # cd /etc/systemd/system/multi-user.target.wants
    # cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongos.service
    # ln -s /usr/lib/systemd/system/mongos.service mongos.service
    # vi mongos.service
    [Service]
    User=mongod
    Group=mongod
    Environment="OPTIONS=--config /etc/mongos.conf"
    EnvironmentFile=-/etc/sysconfig/mongod
    ExecStart=/usr/bin/mongos $OPTIONS
    ExecStartPre=/usr/bin/mkdir -p /var/run/mongos
    ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongos
    ExecStartPre=/usr/bin/chmod 0755 /var/run/mongos
    PermissionsStartOnly=true
    PIDFile=/var/run/mongos/mongod.pid
    mkdir /var/log/mongos
    chown mongod:mongod /var/log/mongos
    
    systemctl restart mongos
    아래 명령은 한쪽장비에서만 진행합니다.
    
    $ mongo --port 27020
    
    > sh.status()
    
    > sh.addShard("rs0/db1:27017,db2:27018")
    
    > sh.addShard("rs1/db2:27017,db1:27018")
    
    > sh.status()
    

     

    Shard 설정

    $ mongo --port 27020
    
    > sh.enableSharding("<database>") // 데이터베이스가 샤딩되도록 설정
    
    > sh.shardCollection("<namespace>", {shardkey}) // Collection을 샤딩되도록 설정
    
    > use <database>
    
    > db.stats()
    
    //mydb 의 TEST라는 Collection을 샤딩 설정하였을때 rs0과 rs1에 청크가 분산되어 생성됩니다.
    {
            "raw" : {
                    "rs0/db1:27017,db2:27018" : {
                            "db" : "mydb",
                            "collections" : 1,
                            "views" : 0,
                            "objects" : 35359,
                            "avgObjSize" : 52,
                            "dataSize" : 1838668,
                            "storageSize" : 507904,
                            "indexes" : 1,
                            "indexSize" : 450560,
                            "totalSize" : 958464,
                            "scaleFactor" : 1,
                            "fsUsedSize" : 7318519808,
                            "fsTotalSize" : 47220527104,
                            "ok" : 1
                    },
                    "rs1/db1:27018,db2:27017" : {
                            "db" : "mydb",
                            "collections" : 1,
                            "views" : 0,
                            "objects" : 18742,
                            "avgObjSize" : 52,
                            "dataSize" : 974584,
                            "storageSize" : 270336,
                            "indexes" : 1,
                            "indexSize" : 258048,
                            "totalSize" : 528384,
                            "scaleFactor" : 1,
                            "fsUsedSize" : 2925694976,
                            "fsTotalSize" : 47220527104,
                            "ok" : 1
                    }
            },
            "objects" : 54101,
            "avgObjSize" : 52,
            "dataSize" : 2813252,
            "storageSize" : 778240,
            "totalSize" : 1486848,
            "indexes" : 2,
            "indexSize" : 708608,
            "scaleFactor" : 1,
            "fileSize" : 0,
            "ok" : 1,
            "operationTime" : Timestamp(1618552944, 236),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1618552944, 236),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    }
    

    'Database > MongoDB' 카테고리의 다른 글

    Transaction  (0) 2023.02.02
    ReplicaSet  (0) 2023.02.02
    Sharding & Cluster  (1) 2023.02.02
    View  (0) 2023.02.02
    Index  (1) 2023.02.02
Designed by Tistory.