Hello 👋

🧑🏻‍💻 A Developers who create code that changes the world

전체 글 99

[Linux] 디스크 검사

fsck 논리적 파일시스템 결함 검사기본검사fsck.ext4 /dev/sdX 클린해도 다시 검사fsck.ext4 -f /dev/sdX badblocks실제 물리적 손상 검사읽기 전용 검사fsck.ext4 /dev/sdX 읽기, 쓰기 검사 (데이터 삭제 [ -w 옵션 ] )badblocks -wsv /dev/sdX읽기, 쓰기 검사 (데이터 미삭제 [ -n 옵션 ] ) badblocks -nsv /dev/sdX Options-s: 진행상태-v: 상태출력-w: 디스크를 데이터를 삭제하면서 검사 - 상당한 시간 소요-n: 디스크 데이터 미삭제 검사 - -w옵션보다 더 많은 시간 소요

[Linux] 인터넷이 없는 서버에 Python + Poetry 프로젝트를 배포

원래의 Python + Poetry 프로젝트를 배포 방식 인터넷이 연결된 서버에 소스 코드를 배포한 뒤, `poetry install` 명령 하나로 필요한 Python 패키지들을 자동으로 설치 이 과정에서 Poetry는 `pypi.org`에서 패키지를 받아오고, `.cache/virtualenvs` 아래에 가상환경이 구성됨 하지만 서버를 현장에 설치해야하고 현장은 보안 때문에 인터넷을 연결할 수 없음 인터넷이 없는 서버에서 Python + Poetry 프로젝트 배포 가상환경 이 같은 빌드용 리눅스 PC 한 대를 준비하여 빌드를 해서 빌드한 파일을 가져가 서버에 배포 빌드한 가상환경 과 소스코드를 서버에 배포해야하는데가상환경은 /.cache/virtualenvs 경로에, 소스코드는 또 다른 경로에 있어서경..

[monitoring] Test PC로 기능 테스트 중 성능 저하 현상

프론트와의 기능 구현 테스트 중 DB load가 느려지는 현상 발생 원인을 찾기 위해 Grafana 접속 후 시스템 부하 확인 메모리 : 사용 가능 메모리가 30% → 7%까지 급감 load1 지표가 17:35쯤 58.7까지 급등 (정상보다 수십 배 높음) 17:35~17:40 사이 sda:read 및 dm-0:read가 최대 600MB/s 수준으로 증가 CPU : usage_user 95.8%까지 상승 특정 서비스나 프로세스가 메모리를 잡았을 확률이 높으며, MongoDB 관련 대용량 쿼리 실행을 했기 때문에 diskio가 급격히 증가 메모리 잡고 있는 프로세스 kill -9 명령어로 종료, api 요청 시 join과 같은 쿼리문 사용 지양

[MongoDB] HTTP, gRPC ObjectId 타입 인식 문제

* MongoDB의 _id나 특정 키가 ObjectId 타입일 경우, 이를 문자열로 변환하지 않고 그대로 전송하면 클라이언트에서 처리할 수 없음 * 반대로 클라이언트에서 문자열로 보낸 값을 MongoDB 쿼리에서 ObjectId로 변환하지 않으면 쿼리 결과가 제대로 반환되지 않는 문제가 발생 데이터를 API로 주고받을 때, MongoDB 필드 중 ObjectId인 경우에는 서버/클라이언트에서 변환 처리를 명시적으로 해줘야함 이를 해결하기 위해, JSON 형식의 데이터를 처리할 때 _id 필드를 ObjectId 로 변환해주는 로직이 필요def convert(value): if isinstance(value, dict): for key, item in value.items(): ..

Database/MongoDB 2025.01.08

[Nomad] 하나의 Nomad job으로 서비스 통합 배포

초기엔 각각의 Nomad job 파일을 별도로 작성해 배포 서비스가 늘어날수록 관리가 복잡해지고, Job 하나 바꿀 때마다 다른 서비스와의 연결 상태가 깨지거나 누락되는 문제가 발생' 아래와 같이 하나의 파일로 비슷한 유형의 서비스 일괄 배포 가능하도록 수정api-service : api task들을 group 단위로 모아 실행database-service : service들을 group 단위로 모아 실행persist-infra : system-infra와 DB등 고가용성 서비스들을 모아 실행이외에도 device관련 계층 등의 서비스를 모아 실행job "persist-infra" { datacenters = ["dc1"] group "persist-infra-group" { count = 1 ..

[Linux] 배포 버전 관리 방법

프로젝트를 하면서 ‘버전 관리’는 그냥 Git commit log를 정리하는 수준이라고 생각 하지만 실제로 서비스를 운영하고, 배포 환경을 다루고, 긴급 상황에서 이전 상태로 롤백하거나 특정 시점의 설정을 되살려야 했던 경험을 겪고 버전 관리의 중요성을 느낌 개발과 배포를 효율적으로 정리하기 위해 X.Y.Z 형식으로 세자리 버전 넘버링 방식 사용 각 숫자의 의미를 다음과 같이 정함X : 서비스의 아키텍처 등이 크게 바뀌는 경우Y : 기능이 새로 추가되거나 UI/UX가 바뀌는 경우Z : 버그 수정, 오타 수정 등이 되는 경우 실제 배포 흐름 (v0.1.4) 1. 프론트엔드 빌드 - 빌드한 파일 압축 후 서버로 전송2. DB 변경 - mongo compass로 컬렉션 import3. 백엔드 배포 - 서버 ..

[Nomad] HashiCorp Nomad 오케스트레이션 이슈 정리

nomad job 스크립트 자동 재시작 기능 (restart policy) Nomad는 작업이 죽었을 때 자동으로 재시작하거나 재배치를 시도할 수 있음 하지만 불필요하게 반복 재시작되면서 리소스를 과도하게 점유 할 수도 있음restart { attempts = 3 # 최대 재시도 횟수 interval = "5m" # 이 시간 내에 실패 횟수 초과하면 중단 delay = "15s" # 재시작 간격 둠 mode = "delay" # 즉시 중단 }nomad job 스크립트 리소스 과소/과다 할당 Nomad는 작업이 죽었을 때 자동으로 재시작하거나 재배치를 시도할 수 있음하지만 불필요하게 반복 재시작되면서 리소스를 과도하게 점유 할 수도..

[Python] 200대 상태 코드 처리 오류

API에서 고객 데이터를 삭제하는 DELETE 요청을 처리하던 중, 데이터는 정상적으로 삭제되었지만 " Delete failed "라는 메시지만 반환되었음, 전체적인 모든 코드들이 이렇게 짜여 있었기 때문에 한번 크게 리팩토링 해야할 필요가 있었음if code == 200: return {'message': 'Customer deleted successfully'}, 200else: return {'message': 'Delete failed'}, 500 MongoDB 응답 값을 출력해봤고, 삭제가 정상적으로 완료되었음에도 불구하고 204 상태 코드가 반환된다는 것을 확인DELETE 요청이 성공적으로 처리되었을 때 204 No Content도 반환될 수 있기 때문에, 이를 반영해 코드를 아래처..

Database/MongoDB 2024.09.20

[Linux] 리눅스 IP 관련 이슈 및 설정 명령어

네트워크 관련 이슈curl로 파일 다운로드가 안 되는 경우curl -o vps.sh "https://samsungaaaaa.com/aaa/bbbb/ccc/ddd/fileDownload.do?vaccineType=1"curl -v "url" 명령어로 로그 확인, 망 연결 안되어있거나, 보안, 인증/세션이 필요한 url일 확률이 높음 DHCP인데 IP가 안 잡힘# /etc/sysconfig/network-scripts/ifcfg-eth0 경로의 설정 파일에서 아래 내용 들어가있는지 확인BOOTPROTO=dhcp ONBOOT=yes 인터페이스 DOWN 상태인지 확인, NetworkManager가 막고 있는지 확인, 랜선/포트/스위치 연결 확인, 방화벽 차단 확인 IP 설정 명령어IP를 수동으로 설정하고 싶을 ..

[MongoDB] MongoDB ReplicaSet 기본 구성

MongoDB ReplicaSetReplica Set (몽고 이중화)가장 일반적인 이중화 방법, 데이터를 복제하여 장애 복구몽고디비를 사용하면 레플리카셋을 생성함으로써 레플리카를 설정할 수 있음레플리카셋은 클라이언트 요청을 처리하는 프라이머리 서버 한 대와, 프라이머리 데이터의 복사본을 갖는 세컨더리 서버 여러대로 이루어짐프라이머리 서버에 장애가 발생하면 세컨더리 서버를 자신들 중에서 새로운 프라이머리 서버를 선출할 수 있음복제를 사용하는 상태에서 서버가 다운되면, 복제 셋에 있는 다른 서버를 통해 데이터에 접근할 수 있음서버상의 데이터가 손상되거나 접근할 수 없는 상태라면 복제 셋의 다른 멤버로부터 새로운 복제 데이터를 만들 수 있음Replica Set 설계 방법복제 셋을 설계하기에 앞서 과반수 개념을..

Database/MongoDB 2024.09.11

[Linux] Clonezilla 디스크 매핑 오류 이슈

Clonezilla로 디스크 복제 시 장치명이 바뀌는 문제복제 전 디스크의 /dev/sda는 SSD로, /dev/sdb는 HDD로 잡혀있었지만Clonezilla로 부팅 후에는 /dev/sda가 HDD로 /dev/sda가 SDD로 디스크 인식 순서가 바뀌어 있었음 따라서, Clonezilla로 부팅 후 디스크 복제 시, 잡혀있는 디스크들의 용량 및 모델을 반드시 체크 후 실수 하지 않아야 함(잘못하면 데이터 날아갈 수 있음) 디스크 용량 및 모델명을 lsblk로 확인lsblk -o NAME,SIZE,MODEL,MOUNTPOINT # SSD, HDD구분, 디스크 크기 구분, mount 되어있는지 구분

[Linux] Clonezilla를 사용한 리눅스 백업 및 복구

Clonezilla 부팅 디스크 USB와 백업 이미지 파일 저장 할 USB 필요2가지 USB 모두 꽂고 부팅 시 Clonezilla로 부팅 [중요] 복구 시 복구할 하드웨어는 백업한 하드웨어의 용량보다 크거나 같아야함 이미지 백업 방법> 언어 - 영어 선택 > keymap 설정 화면Don't touch keymap 선택.> Start_Clonezilla 선택> 모드 선택 - 이미지 백업 및 복구 - device-image 선택 > 백업 이미지를 저장하거나 불러올 장소 설정local_dev 선택 - HDD나 USB에 이미지 저장> local_dev 선택 시 저장할 USB 선택 알림Ctrl+C 를 눌러 다음으로 진행> 백업 파일을 저장하거나 불러올 파티션 선택> 백업 파일을 저장하거나 불러올 폴더 선택> B..

[MongoDB] MongoDB 백업 및 복원

MongoDB 작업 중, 신중하지 못했던 데이터 작업으로 컬렉션의 모든 데이터를 Delete 함 따로 백업을 해놓지 않은 데이터라 복구할 수 없었음 데이터 작업에 신중할 필요가 있지만, 무엇보다 안전하게 하기 위해 백업 전략이 필요 mongodump로 백업하기 mongodump는 MongoDB 데이터를 BSON(Binary JSON) 포맷으로 덤프하는 툴 전체 데이터베이스 백업 (dump)mongodump --uri="mongodb://localhost:27017" --out=/backup/mongo_$(date +%F) #저장경로 - 오늘날짜 특정 데이터베이스만 백업mongodump --db=mydb --out=/backup/mongo_$(date +%F) mongorestore로 복원하기 m..

Database/MongoDB 2024.09.06

[Linux] 서버 RAID 설정

RAID 0스트라이핑 기능(분할 기록) 사용. 빠른 I/O 성능, 고장 대비 능력 XRAID 1두 개 이상의 디스크를 미러링을 통해 하나의 디스크처럼 사용RAID 2ECC(에러 검출 기능) 탑재RAID 3하나의 디스크를 에러검출을 위한 패리티 정보 저장용으로 사용하고 나머지 디스크에 데이터를 균등히 분산 저장 RAID 4RAID 3 방식과 같지만 블록 단위로 분산 저장RAID 5하나의 디스크에 패리티 정보를 저장하지 않고 분산 저장 (회전식 패리티 어레이)RAID 6하나의 패리티 정보를 두 개의 디스크에 분산 저장쓰기 능력은 저하될 수 있지만 고장 대비 능력이 매우 우수함 (두 개의 오류까지 검증 가능)RAID 0+1최소 4개 이상의 디스크를 2쌍씩 스트라이핑(RAID 0) 후 미러링(RAID 1) 방..

[Linux] Filezilla로 파일 복사 시 x권한(실행 비트)가 사라지는 이유

로컬에서 실행 권한(chmod +x)을 부여한 스크립트나 바이너리를 FileZilla로 서버에 전송하면, 업로드된 파일의 실행 비트가 빠져 -rw-r--r-- 형태로만 올라감 복사 과정에서 새로 파일을 “만들기” 때문에 umask 설정에 따라 실행 비트가 제거되는 것이 문제의 원인 SFTP/FTP 프로토콜 동작FileZilla가 사용하는 SFTP(or FTP) 전송은 새 파일 생성(create) 동작임서버 입장에서는 “새로 만든 파일”로 인식되므로, OS의 기본 umask가 적용되어 실행 비트가 제거됨서버 측 umask 설정실행 권한(x)은 원래부터 기본 생성 권한(666)에 포함되지 않으므로, 항상 빠지게 됨ex --> umask 022라면 새 파일 권한은 666-022=644 -> rw-r--r--..

[Monitoring] InfluxDB v1 웹 인터페이스 에러

InfluxDB v1.x 버전에서는 localhost:8086으로 접속했을 때 "404 page not found" 오류 발생 원인 : InfluxDB v1.x는 기본적으로 웹 인터페이스를 제공하지 않음. 웹 인터페이스는 InfluxDB v2부터 지원 결론 : 웹 인터페이스는 사용할 수 없고, CLI나 외부 도구(Grafana 등)를 사용해야 함 또는 v2로 업그레이드 하여 UI 인텊페이스 사용해야함

[Monitoring] Telegraf/Influxdb/Grafana를 이용한 Windows, Linux 시스템 모니터링 설정 및 문제 해결

- Telegraf: 다양한 시스템 메트릭(CPU, 메모리, 디스크 사용량 등)을 수집하는 에이전트- InfluxDB: 시계열 데이터베이스로, Telegraf가 수집한 데이터를 저장- Grafana: InfluxDB에 저장된 데이터를 시각화하여 모니터링 대시보드를 구축하는 도구 설치 및 설정 과정 (Windows & Linux)1) Telegraf 설치 및 설정 (Windows)Telegraf 다운로드 및 설치# PowerShell에서 Telegraf 다운로드wget https://dl.influxdata.com/telegraf/releases/telegraf-1.31.2_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.31.2_windows_amd64...

[Linux] 리눅스에서 HDD 마운트 및 자동 마운트 설정

1. 리눅스에서 추가 HDD 마운트리눅스 시스템에 새로운 HDD를 추가했을 때, 디스크를 사용하려면 먼저 파티션을 생성하고 파일 시스템을 만들어야 함 1-1. 파티션 생성새로운 HDD를 확인하고 파티션을 생성하기 위해 fdisk 명령어를 사용sudo fdisk /dev/sdbfdisk가 실행되면 다음 옵션을 사용하여 새로운 파티션을 만듦n: 새 파티션 생성p: Primary 파티션 선택파티션 번호 지정 (예: 1)첫 번째 섹터와 마지막 섹터는 기본값을 사용w: 변경 사항을 저장하고 fdisk를 종료1-2. 파일 시스템 생성새로 생성된 파티션 /dev/sdb1에 파일 시스템을 생성sudo mkfs.ext4 /dev/sdb1 1-3. 마운트 지점 생성 및 마운트마운트할 디렉토리 /storage를 생성하고, ..

[Linux] 리눅스 보안 설정

SSH root 접근 보안일반 계정 생성# root로 원격 접속을 바로 하면 '무작위 대입 공격'으로 패스워드가 탈취될 경우 위험하기 때문에 일반 계정을 생성해서 사용해야함useradd 계정이름passwd 패스워드ROOT 계정의 원격 접속 제한 및 포트 변경# SSH접근을 하기 위한 포트는 기본적으로 22번. 잘 알려진 포트 번호이기 때문에 공격 시도가 많음# 따라서 포트를 별도로 설정vi /etc/ssh/sshd_configPort 1234 # 주석 해제. 원하는 포트 입력하여 그 포트로 접속가능하게PermitRootLogin no # 옵션을 no로 변경하여 root로 원격 접속하지 못하도록 설정systemctl restart sshd # 재부팅계정 패스워드 보안계정 패스워드vi /etc/..

[Linux] 자주 쓰는 리눅스 명령어 정리

방화벽(Firewalld)열린 포트 및 서비스 확인sudo firewall-cmd --get-active-zones # 활성화된 zone 확인sudo firewall-cmd --zone=public --list-ports # 특정 zone에 열린 포트sudo firewall-cmd --zone=public --list-services # 특정 zone에 등록된 서비스sudo firewall-cmd --list-all # 전체 구성 정보포트/서비스 추가 및 삭제# 포트 추가 및 삭제 sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --zone=public --remove-port=8080/tcp --perma..