[작성자:] d_dive

  • Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    📌 Github Token 발급

    오른쪽 하단, Setting 메뉴에 들어간다.

    왼쪽 하단 끝에 Developer Settings 메뉴에 들어간다.

    왼쪽 하단에 Personal access tokens 메뉴에 들어간다. (Tokens (Classic))

    Token을 발급을 받는다. (repo, admin:org, admin:repo_hook를 체크.)

    📌 Jenkins 설정

    jenkins를 구축 후, 로그인하고 들어가면 아래와 같은 페이지가 나오는데 해당 페이지에서 Jenkins 관리로 들어간다.

    System Configuration ➡️ System ➡️ Github Servers 부분을 찾는다.

    다음과 같이 설정한다.

    잘 연결되는지 테스트까지 한 후, 새로운 Item 생성 (Freestyle project)

    Github project ➡️ project url 부분에 Git repo를 연결하고 자격증명은 위에서 만들었던걸로 설정해준다.

    GitHub hook trigger for GITScm polling를 체크를 체크하면 mater(main)브랜치에 업데이트가 있으면 자동으로 빌드)

  • Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    • Docker에 설치
    ## lastest LTS version
    
    docker pull jenkins/jenkins:lts-jdk17
    • macOS에 설치
    Install the latest LTS version: brew install jenkins-lts
    Start the Jenkins service: brew services start jenkins-lts
    Restart the Jenkins service: brew services restart jenkins-lts
    Update the Jenkins version: brew upgrade jenkins-lts
    • centOS에 설치
    ## use this repository
    sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
      sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
      
    ## 설치.
    yum install fontconfig java-17-openjdk
    yum install jenkins
    • ubuntu에 설치
    sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
        https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
        
    echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
        https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
        /etc/apt/sources.list.d/jenkins.list > /dev/null
        
    sudo apt-get update
      sudo apt-get install fontconfig openjdk-17-jre
      sudo apt-get install jenkins

  • Nexus로 Private Docker Registry 구축기

    Nexus로 Private Docker Registry 구축기

    Private Docker registry 를 만들거나 사내 Docker 저장소 만들 목적

    📦 환경

    • 우분투 22.04 — Server 버전.
    • 도커 설치.

    📌 도커 컨테이너로 Nexus 컨테이너 실행

    docker run -d --name nexus \
    -p 8081:8081 -p 8082:8082 \
    -p 8083:8083 -p 5000:5000 \
    -v nexus-data:/nexus-data \
    sonatype/nexus3

    Nexus 웹 페이지는 http://서버IP:8081 로 접속. 최초, 어드민 계정으로 로그인

    id: admin
    pwd: cat /nexus-data/admin.password 로 명령어 쳤을 때 나오는 명렁어.

    로그인 후, 개인적인 비밀번호로 바꿀 수 있다.

    ✅ Nexus 에서 docker hosted, docker — Proxy Blob 생성

    아래와 같이 순차적으로 생성.

    • docker-hosted
    • docker-hub

    ✅ Nexus 에서 docker-hosted, docker-proxy 저장소 생성

    해당화면에서 Create repository 클릭

    ✔️ docker-hosted 선택.

    • Name은 docker-hosted
    • http 영역 체크 및 5000 입력.
    • Enable Docker V1 API 체크.
    • Blob store docker-hosted 선택.

    ✔️ docker-proxy 선택.

    • Name은 docker-hub
    • Enable Docker V1 API 체크.
    • Remote storage 에 https://registry-1.docker.io 입력.
    • Use Docker Hub 선택.

    ✅ Nexus 에서 Realms 설정.

    설정 ➡️ Realms ➡️ Docker Bearer Token Realm ➡️ Active 로 Save

    ✅ Docker 명령어 HTTP 사용 가능 설정 (v1)

    /etc/docker/daemon.json 파일 생성. 기존에 존재하지 않는 파일이라면 새로 만들어야 한다.

    cat /etc/docker/daemon.json
    
    ---
    
    {
            "insecure-registries" : ["서버IP:5000"]
    }
    
    ---
    위 내용으로 저장.
    
    systemctl restart docker # 도커 재시작.
    docker restart nexus # 넥서스 컨테이너 재시작.

    📌 Private Docker 저장소 로그인

    docker login 서버IP:5000
    
    ---
    Username: admin
    Password:
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded

    🚀 Private Docker 저장소에 Push

    docker push 서버IP:5000/도커이미지이름:태그이름

    🚀 Private Docker 저장소에 Pull

    docker pulll 서버IP:5000/도커이미지이름:태그이름

    🧷 SSL이 적용되어야 etc/docker/daemon.json 파일 생성 과정이 생략 가능.

  • MongoDB에서 Oplog 사이즈 확인하는 법

    MongoDB에서 Oplog 사이즈 확인하는 법

    MongoDB에서 Oplog 사이즈 확인하는 법

    MongoDB의 oplog(Operation Log, 작업 로그)는 MongoDB 복제(replication)에서 사용되는 특별한 컬렉션으로, 변경 사항을 기록하는 역할.

    📦 oplog란?

    • oplog(rs.oplog)는 MongoDB 복제 세트(replica set)에서 Primary 노드의 데이터 변경 사항을 기록하는 컬렉션입니다.

    • Secondary 노드는 Primary의 oplog를 읽고 동일한 작업을 수행하여 데이터를 동기화함.

    • 컬렉션 이름: local.oplog.rs

    • Capped Collection(고정 크기 컬렉션)으로 동작하며, 일정 크기가 차면 가장 오래된 데이터부터 삭제!

    📦 oplog의 동작 방식

    1. Primary 노드에서 변경 발생

    • insert, update, delete 작업이 수행될 때, oplog에 기록됨.

    2. Secondary 노드가 oplog를 읽음

    • Secondary 노드는 Primary의 oplog를 주기적으로 읽어 적용함.

    3. 동기화 유지

    • Primary에서 발생한 변경 사항을 Secondary가 동일하게 수행하여 데이터 일관성을 유지.

    📦 oplog 확인 방법

    MongoDB에서 oplog를 직접 확인하려면 아래 명령을 실행

    use local
    db.oplog.rs.find().limit(10).pretty()
    • local 데이터베이스에 oplog.rs 컬렉션이 저장.
    • 위 명령을 실행하면 최근 10개의 oplog 항목을 확인가능.

    📦 oplog 항목 예시

    {
       "ts" : Timestamp(1712432874, 1),
       "t" : NumberLong(2),
       "h" : NumberLong("890273918273918273"),
       "v" : 2,
       "op" : "i",
       "ns" : "mydb.users",
       "o" : {
           "_id" : ObjectId("65f3b69ad2b3e6b5d3a6f6d1"),
           "name" : "Alice",
           "age" : 28
       }
    }
    • “op”: 작업 유형 (“i”: insert, “u”: update, “d”: delete)
    • “ns”: 네임스페이스(데이터베이스 및 컬렉션 정보)
    • “o”: 변경된 문서 내용.

    📦 oplog의 크기 확인 및 조정

    • oplog의 크기를 확인
    db.getReplicationInfo()
    • oplog 크기를 늘리려면 (예: 10GB)
    db.adminCommand({ replSetResizeOplog: 1, size: 10240 })

    🚀 정리.

    • oplog는 MongoDB 복제(replication)에서 Primary의 변경 사항을 기록하는 로그
    • Secondary 노드는 oplog를 읽고 동일한 작업을 수행하여 데이터 일관성을 유지
    • oplog 크기가 고정되어 있으며, 오래된 로그는 자동으로 삭제
  • MongoDB 설치한 OS 에서 “Too many open files” 에러 발생 시 해결 가이드

    MongoDB 설치한 OS 에서 “Too many open files” 에러 발생 시 해결 가이드

    Linux 서버(여기선 AWS EC2)를 운영하다보면 어제만해도 잘 돌아가던 서버 어플리케이션이 “Too many open files” 에러를 뱉고 죽는 현상이 발생함.

    이런 오류가 생기는 이유는 프로세스가 OS에 요청할수 있는 리소스의 개수/양 (여기서는 NOFILE 이라 불리는 최대 Open 가능한 파일 개수)에 Limit가 있고, 프로세스가 그 제한을 넘었기 때문이다.

    해결방법

    각 프로세스의 Limit는 그 프로세스가 실행되는 계정의 Limit를 바탕으로 만들어지므로 프로세스의 Limit를 올려준다고 해서 문제가 해결되진 않는다. 계정과 프로세스 모두 변경해 주어야 그 프로세스를 다시 시작했을때에도 같은 문제가 생기지 않음.

    $ ulimit -Hn
    4096
    $ ulimit -Sn
    1024

    Limit는 Soft와 Hard 2가지가 있는데 Soft Limit은 non-root 계정에서도 설정 가능하며 일시적으로 이를 넘어도 시스템 상에서 경고 이메일만 보낼뿐 큰 문제가 되지 않지만 Hard Limit는 root 계정에서만 세팅이 가능하고 절대로 넘을수 없는 Limit이다. Too many open files가 계속 발생하고 아예 기능이 동작하지 않을 경우 프로세스에 기본 할당된 Hard Limit를 넘었다고 볼수 있음.

    root 계정으로 /etc/security/limits.conf에 다음 내용을 추가.

    * hard nofile 500000
    * soft nofile 500000
    root hard nofile 500000
    root soft nofile 500000
    $ cat /proc/sys/fs/file-max

    계정에 할당된 Limit을 변경했다면 터미널을 로그아웃 했다가 다시 로그인 한 후에 앞에서 실행한 ulimit으로 값이 변경되어 있는지 확인해야 한다.

    이제 프로세스에 대한 Limit을 올려줄 차례다. 프로세스를 죽였다가 다시 살리면 되지만 운영환경에선 프로세스를 죽이면 안되는 때가 있음.

    방법

    $ ps -ef | grep foobar
    1234
    $ prlimit --nofile --output RESOURCE,SOFT,HARD --pid 1234
    $ prlimit --nofile=500000 --pid=1234

    이렇게 변경을 하면 Soft Limit과 Hard Limit이 동일하게 500000으로 맞춰진다. 다시 이전 command를 실행해서 더블체크.

  • MongoDB 에서 Replica Set Secondary Node 동기화 시간 확인하는 방법

    MongoDB 에서 Replica Set Secondary Node 동기화 시간 확인하는 방법

    MongoDB 에서 Replica Set Secondary Node 동기화 시간 확인하는 방법

    몽고디비 레플리카 셋으로 구축 되어 있을 때 secondary node가 primary node를 어느정도 동기화 하고 있는지, 알아 볼 수 있다.

    use admin
    db.auth({...})
    
    rs.printSecondaryReplicationInfo()

    나오는 시간이 Primary Node에 대해 동기화 하는 정도까지의 지연시간이다.

  • MongoDB DB 다운 시 재가동 방법

    MongoDB DB 다운 시 재가동 방법

    MongoDB DB 다운 시 재가동 방법

    mongoDB가 어떤 이유로 인해 DB 프로세스가 다운될 수 있다. 이유는 log를 살펴봐야한다. 보통 /var/log/mongodb/ 쪽에 기록되어 있다. 실제로 root로 접속 후, mongo가 죽었는지 확인해봐야 한다.

    mongo
    • 다시 살리는 code
    # root 권한으로.
    mongod --config /etc/mongod.conf

    만약에 다시 살리지 못하면, 백업 시켜둔 파일을 교체해서 다시 기동해야 한다.

    /var/lib/ 폴더를 봐야 한다.

    rm -rf mongo # 기존 파일 지우기.
    mv mongo.203.20240505 mongo # 파일 교체.

    그 다음, 재기동 해보자

    # root 권한으로.
    mongod --config /etc/mongod.conf

    그럼, 보통 재기동이 된다.

    이제, db단에서 레플리카셋 서버끼리 얼마나 동기화가 되었고, 지연이 얼마나 되는지 알아보자.

    ### 복제 지연 확인
    o 현재 어디까지 동기화를 진행했으며 얼마나 지연이 발생하는지 파악.
       PRIMARY> rs.printSecondaryReplicationInfo()
  • MongoDB 에서 wiredTiger engine 파일 찾는 법

    MongoDB 에서 wiredTiger engine 파일 찾는 법

    MongoDB 에서 wiredTiger engine 파일 찾는 법

    찾게 된 이유 : 몽고디비에서 CRUD를 할때 checksum이 match가 되지 않는 오류 발생 => 몽고디비 다운으로 이어졌다.

    log를 찾아보면, collection-218–4990451227493674325.wt 식의 파일 이름들이 보임.

    해당 wt파일이 어떤 database의 collection인지 찾아 볼 수 있음.

    from pymongo import MongoClient
    conn = MongoClient(host='host', port=port, username='username', password='password')
    databases = conn.list_database_names()
    # 몽고디비에서 wt파일 찾는 법.
    for db_name in databases:
        db = conn[db_name]
        collections = db.list_collection_names()
        for coll_name in collections:
            stats = db.command("collstats", coll_name)
            if 'wiredTiger' in stats and 'uri' in stats['wiredTiger']:
                uri = stats['wiredTiger']['uri']
                if "~~파일이름~~" in uri:
                    print(f"Found in {db_name}.{coll_name}")

    이렇게 하면 wt파일이 어느 database의 collection인지 찾아볼 수 있다.

  • MongoDB TooManyLogicalSessions 에러

    MongoDB TooManyLogicalSessions 에러

    ERROR Case
    pymongo.errors.OperationFailure: cannot add session into the cache, full error: {‘operationTime’: Timestamp(1714353661, 2), ‘ok’: 0.0, ‘errmsg’: ‘cannot add session into the cache’, ‘code’: 261, ‘codeName’: ‘TooManyLogicalSessions’, ‘$clusterTime’: {‘clusterTime’: Timestamp(1714353661, 2), ‘signature’: {‘hash’: b’\x81\xd5\x8f0[\x82\xcb{\xd8]\xd4\xba\x97\xc4\x0f+R \x88"’, ‘keyId’: 7317447343970713660}}}

    참고자료

    maxsession 관련 정보 :

    Maxsession 관련 정보의 reference

    서버세션 또는 논리적세션 명령 :

    서버세션 또는 논리적세션


    🚀 확인 Commmand

    ### 로지컬 세션 확인. (PRIMARY)
    # mongo
    mongo
    use admin
    db.auth({user:'', pwd:''})
    db.serverStatus().logicalSessionRecordCache

  • MongoDB 레플리카 셋 구축 가이드

    MongoDB 레플리카 셋 구축 가이드

    MongoDB 레플리카 셋 구축 가이드

    • 몽고디비 레플리카 셋 구축.

    ON-premise 서버 교체로 인해 몽고디비 레플리카셋 테스트의 기록

    몽고디비를 같은 버전으로 설치

    sudo vi /etc/yum.repos.d/mongodb-org-4.0.repo
    
    ---
    [mongodb-org-4.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

    몽고디비 4.0.28 버전 설치

    sudo yum install -y mongodb-org-4.0.28

    설치되는 것들


    • mongodb-org-server: MongoDB 서버
    • mongodb-org-mongos: MongoDB의 라우팅 서버
    • mongodb-org-shell: MongoDB 셸 도구
    • mongodb-org-tools: 백업 및 복구 도구

    🚨 몽고디비 config 파일 구성을 바꾸거나, security 관련해서 키파일을 넣어주면 systemctl 로는 몽고디비 실행 불가.

    mongod --config /etc/mongod.conf

    이 명령어로 실행해야 함

    한개의 서버에 포트를 나누어 몽고디비 2개 실행

    포트를 나누는 conf 파일을 하나 더 만든다. 기존 mongod.conf 파일을 copy => mongod02.conf로..

    • 바뀌는 부분.
    • path: /var/log/mongodb02/mongod02.log
      dbPath: /var/lib/mongo02
      pidFilePath: /var/run/mongodb/mongod02.pid
    • 디렉토리는 직접 생성해줘야 함.
    • chmod, chown 둘 다 확인해야 함. => 안그러면 오류남.
    # mongod02.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
      logRotate: rename
      path: /var/log/mongodb02/mongod02.log
    # Where and how to store data.
    storage:
      dbPath: /var/lib/mongo02
      journal:
        enabled: true
    #  engine:
    #  mmapv1:
    #  wiredTiger:
    # how the process runs
    processManagement:
      fork: true  # fork and run in background
      pidFilePath: /var/run/mongodb/mongod02.pid  # location of pidfile
      timeZoneInfo: /usr/share/zoneinfo
    # network interfaces
    net:
      port: 27018
      # bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
      bindIp: 0.0.0.0
    security:
      keyFile: /etc/mongodb.key
      authorization: enabled
    #operationProfiling:
    replication:
      replSetName: rs0
    #sharding:
    ## Enterprise-Only Options
    #auditLog:
    #snmp:
    • 실행 하려면..
    mongod --config /etc/mongod02.conf
    
    ### 설정 포트에 몽고디비 접속하려면.
    mongo --port 27018

    replica set 설정

    먼저 primary로 원하는 서버에 들어가 mongo shell 접속. mongo shell 에서,

    use admin
    -> 계정을 안만들었으면, conf 파일에서 security를 주석 처리해준 다음, mongo shell 다시 들어와 admin 계정 생성.
    만든 다음, conf 파일에서 security 주석 제거 한 다음, mongo shell 들어와서,
    rs.initiate({
      _id: "설정한 레플리카 셋 이름",
      members: [
        { _id: 0, host: "primary_host:27017" },     // Primary 노드
        { _id: 1, host: "secondary_host_1:27017" }, // Secondary 노드
        { _id: 2, host: "secondary_host_2:27017" }  // Secondary 노드
      ]
    })
    이런식으로, 코드 날리기.

    rs.status() 로 상태확인 하기

    포트는 열려 있어야 함. 포트 안열리면 통신 안됨 (27017)