728x90
반응형

기본서이긴 하지만 기본이 없는 나를 위한 정리! 

(진짜 진짜 뭐라도 공부 좀 하자 싶어서 ^^)

인터넷은 잘 동작하고 있어서 대부분의 사람들은 인공의 무언가라기보다 태평양 같은 천연자원으로 생각한다. 이런 규모의 기술이 이토록 오류가 없었던 적은 언제가 마지막일까?
- 앨런 케이, Dr. Dobbs 저널 인터뷰에서(2012)

-> 내가 든 생각은 누군가의 영혼이 갈려서..? ㅋㅋㅋ

 


데이터 중심 애플리케이션의 경우 CPU 성능은 애플리케이션을 제한하는 요소가 아니며, 더 큰 문제는 보통 데이터의 양, 데이터의 복잡도, 데이터의 변화속도다.

데이터 중심 애플리케이션은 

  • 데이터베이스
  • 캐시(읽기 속도 향상)
  • 검색 색인
  • 스트림 처리
  • 일괄 처리

를 필요로 한다.

그러나, 애플리케이션마다 요구사항이 다르기 때문에 애플리케이션을 만들 때 어떤 도구와 어떤 접근 방식이 수행 중인 작업에 가장 적합한지 생각해야 한다.

-> 신뢰성 / 확장성 / 유지보수성


데이터 시스템에 대한 생각

데이터 저장과 처리를 위한 여러 새로운 도구들이 모여 만드는 데이터 시스템에 대한 이해가 필요!

데이터 시스템에서의 좋은 API는 어떤 모습일까?

 

1. 신뢰성

하드웨어나 소프트웨어 결함, 심지어 휴먼에러 같은 역경에 직면하더라도 시스템은 지속적으로 올바르게 동작해야 한다.

-> 올바르게, 무언가 잘못되더라도 지속적으로 올바르게 동작함.

잘못될 수 있는 일: 결함

결함을 예측하고 대처할 수 있는 시스템: 내결함성, 탄력성(resilient)

사실 모든 결함을 막을 수 없기에(블랙홀이 지구와 지구상의 모든 서버를 삼켜버려도 웹 호스팅이 가능한 내결함성을 지닐 순 없기에...ㅋㅋ),

특정 유형의 결함 내성에 대해서만 이야기 하는 것이 타당하다.

결함과 장애는 다름

결함: 사양에서 벗어난 시스템의 한 구성 요소

장애: 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우.

내결함성 시스템을 훈련시킴 -> 넷플릭스 카오스 몽키 예시

 

오류와 결함의 종류:

하드웨어 결함 / 소프트웨어 오류(신속한 해결책이 없음) / 인적 오류(롤백 필요, 테스트 추가, 모니터링 대책, 조기 교육(ㅜㅜ))

 

신뢰성은 단순한 것이 아니다. 일상적인 애플리케이션 조차도 안정적으로 작동해야 한다.

"중요하지 않은" 애플리케이션도 사용자에 대한 책임이 있어야 한다. 사진 애플리케이션에서 사진이 모두 사라진다면 어떻게 될 것인가? 백업을 복원하는 방법을 알고 있을까?

2. 확장성

시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 한다.

시스템이 현재 안정적으로 동작한다고 해서 미래에도 안정적으로 동작한다는 보장은 없다. 

시스템은 전에 처리했던 양보다 더 많은 데이터를 처리하고 있을지도 모른다.

확장성은 증가한 부하에 대처하는 시스템 능력을 말하는데, 이때 고려한 질문은,

"시스템이 특정 방식으로 커지면 이에 대처하기 위한 선택은 무엇인가?", "추가 부하를 다루기 위해 계산 자원을 어떻게 투입할까?"라는 구체적인 용어이다.

부하 기술하기

부하 매개변수: 웹 서버의 초당 요청 수, 데이터베이스의 읽기 대 쓰기 비율, 활성 사용자 수, 등

트위터 예시: 

사용자는 팔로워에게 새로운 메시지를 게시할 수 있다(평균 초당 4.6k 요청, 피크일 때 초당 12k 요청 이상)
사용자는 팔로우한 사람이 작성한 트윗을 볼 수 있다(초당 300k 요청)

성능 기술하기

1. 부하 매개변수를 증가시키고 시스템 자원은 변경하지 않고 유지하면 시스템 성능은 어떻게 영향을 받을까?

2. 부하 매개변수를 증가시켰을 때 성능이 변하지 않고 유지되길 원한다면 자원을 얼마나 많이 늘려야 할까?

시스템 성능 면에서 일괄 처리 시스템은 처리량, 온라인 시스템은 응답시간이 중요한 성능 지표이다.

평균보다 여러가지 상황을 고려한 백분위 응답시간을 사용하는 것이 좋다.

사용자가 보통 얼마나 오랫동안 기다려야 하는지 알고 싶다면 중앙값이 좋은 지표다.(p50)

응답 시간 지연에 따라 매출에 영향을 주기도 하는 시스템이 있다는 것을 기억하자!

 

시스템의 확장성을 테스트하려고 인위적으로 부하를 생성하는 경우 부하 생성 클라이언트는 응답 시간과 독립적으로 요청을 지속적으로 보내야 한다. 만약 클라이언트가 다음 요청을 보내기 전에 이전 요청이 완료되길 기다리면 테스트에서 인위적으로 대기 시간을 실제보다 더 짧게 만들어 평가를 왜곡한다.

 

부하 대응 접근 방식

성능 측정을 위한 부하와 지표 매개변수를 확인했다.

부하 매개변수가 어느 정도 증가하더라도 좋은 성능을 유지하려면 어떻게 해야 할까?

흔히 아는 내용: 스케일 업 / 스케일 아웃

적절한 사양의 장비 몇 대가 다량의 낮은 사양 가상 장비보다 훨씬 간단하고 저렴함

일부 시스템은 탄력적이다. 컴퓨팅 자원을 자동으로 추가할 수 있다는 점.

그렇지 않은 시스템은 수동으로 확장해야 한다.(수동으로 확장하는 시스템이 더 간단하고 운영상 예상치 못한 일이 더 적다. -> 이해 안됨!)

다수의 장비에 stateless 서비스를 배포하는 일은 상당히 간단하지만,

단일 노드에 stateful 데이터 시스템을 분산 설치하는 일은 복잡하다.

그래서 대용량 데이터와 트래픽을 다루지 않는 사용 사례에도 분산 데이터 시스템이 향후 기본 아키텍처로 자리 잡을 가능성이 있다.

 

특정 애플리케이션에 적합한 확장성을 갖춘 아키텍처는 주요 동작이 무엇이고 잘하지 않는 동작이 무엇인지에 대한 가정을 바탕으로 구축하고 이 가정은 곧 부하 매개변수가 된다.

3. 유지보수성

시간이 지남에 따라 여러 다양한 사람들이 시스템 상에서 작업할 것이기 때문에 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있게 해야 한다.

초기 개발 그 이후 지속해서 이어지는 유지보수에 소프트웨어 비용의 대부분이 들어간다.

레거시 시스템 유지보수 작업은 모두가 싫어하는 일이다(나도..)

그래서 이러한 유지보수 중 고통을 최소화하고 레거시 소프트웨어를 직접 만들지 않게끔 애초에 설계를 잘해야 한다. 

이러한 원칙으로는

  • 운용성: 운영팀이 시스템을 원활하게 운영할 수 있게 쉽게 만들어라.
  • 단순성: 시스템에서 복잡도를 최대한 제거해 새로운 엔지니어가 시스템을 이해하기 쉽게 만들어라.
  • 발전성: 엔지니어가 이후에 시스템을 쉽게 변경할 수 있게 하라. 그래야 요구사항 변경 같은 예기치 않은 사용 사례를 적용하기가 쉽다. 이 속성은 유연성/수정가능성/적응성으로 알려져 있다.

운용성 책임 작업 중 기억에 남는 작업:

  • 시스템 장애, 성능 저하 등의 문제의 원인을 추적
  • 예측 가능한 운영과 안정적인 서비스 환경을 유지하기 위한 절차 정의
  • 개인 인사 이동에도 시스템에 대한 조직의 지식을 보존함

단순성에서 기억에 남는 내용:

  • 변수 명명, 모듈 간 강한 커플링, 임시방편으로 문제를 해결한 사례, 복잡한 의존성 등등이 복잡도의 다양한 증상이다.

복잡도 때문에 시스템 유지보수가 어려울 때 예산과 일정이 초과되며 버그가 생길 위험이 더 크다.

시스템을 단순하게 ㅁ나든느 일이 반드시 기능을 줄인다는 의미는 아니다. 우발적 복잡도를 줄인다는 뜻일 수 있다.

추상화하면 우발적 복잡도를 제거할 수 있다.

발전성: 변화를 쉽게 만들기

시스템의 요구사항이 영원히 바뀌지 않을 가능성은 매우 적다.

(최근 진행한 업무에서 짠 스크립트는 버전 26까지 갔던 거 보면 사실인 듯하다 ㅋㅋ)

조직 프로세스 측면에서 애자일 작업 패턴은 변화에 적응하기 위한 프레임워크를 제공한다. 

애자일 커뮤니티에서는 자주 변화하는 환경에서 소프트웨어를 개발할 때 도움이 되는 기술 도구와 패턴을 개발하고 있다.


정리

데이터 중심 애플리케이션을 생각하는 기본적인 방법 몇 가지를 알아봤다.

애플리케이션이 유용하려면 충족되어야 할 요구사항(비기능적 요구사항, 기능적 요구사항) 중 신뢰성/유지보수성/확장성을 살펴봤다.

신뢰성: 결함이 발생해도 시스템이 올바르게 동작하게 만드는 것.

확장성: 부하가 증가해도 좋은 성능을 유지하기 위한 전략.

유지보수성: 본질은 시스템에서 작업한느 엔지니어와 운영팀의 삶을 개선. 좋은 추상화를 통한 복잡도를 줄이기.

 

안타깝게도 애플리케이션을 신뢰할 수 있고, 확장 가능하며 유지보수하기 쉽게 만들어주는 간단한 해결책은 없다. 

하지만 여러 애플리케이션에서 계속 재현되는 특정 패턴과 기술이 있다.

728x90
반응형
728x90
반응형

1. Homebrew를 통해 설치 (시간이 조금 걸린다)

>> brew install redis

 

2. redis server 시작

>> brew services restart redis

3. redis-cli 접속

>> redis-cli

 

4. redis info 확인

>> brew info redis

위와 같이 사용 가능.

port는 6379인 것으로 확인

 


 

Redis 특징

  • key-value 형태의 NoSQL
  • in-memory 기반으로 세컨더리DB 정도로 활용
728x90
반응형
728x90
반응형
#!/bin/bash


# 원하는 시작 날짜
START=20211031


# 원하는 종료 날짜
END=20220522


CURRENT="$START"



while [ "$CURRENT" != "$END" ]; do

    hadoop fs -rm -r /user/table/mydb.db/mytable/pt=$CURRENT

    CURRENT=`date -d "$CURRENT 1 day" +"%Y%m%d"`

done
728x90
반응형
728x90
반응형

자꾸 까먹어서 정리

hdfs 파일 삭제

> hadoop fs -rm -skipTrash {경로}

 

hdfs 디렉터리 삭제

> hadoop fs- rm -r -skipTrash {경로}

 

-skipTrash를 써주면 휴지통 거치지 않고 바로 삭제됨

728x90
반응형
728x90
반응형

특정 파일에 특정 단어 카운트 명령어 자꾸 까먹는다..

grep -c '찾는 단어' filename.log
728x90
반응형
728x90
반응형

10분이라도 시간을 내어 내가 좋아하는 회사 선배님께서 추천해주신 책을 읽고 있다.

'이펙티브 엔지니어'라는 책인데 개발자의 인생을 바꾸는 효율성의 법칙을 중심으로 여러 가지 개념, 자세(?) 등을 설명해준다.

https://book.interpark.com/product/BookDisplay.do?_method=Detail&sc.shopNo=0000400000&dispNo=&sc.prdNo=354815916&sc.saNo=002001023&bkid1=category&bkid2=ct028023&bkid3=c1&bkid4=001 

 

싸니까 믿으니까 인터파크도서

조인석(Elastic 수석 기술지원 엔지니어 & 솔루션 테크 리드) 이 책을 접한 여러분은 행운입니다. 이 책으로 지금 여러분이 속한 조직의 부족한 부분을 확인하고, 보완하기 위한 구체적인 솔루션을

book.interpark.com

개인적으로는 동기부여가 정말 많이 되는 책이라서, 이제 막 개발자로 일을 시작하는 신입 개발자분들부터 팀 리더급인 분들에게까지 추천하고 싶은 책이다.

아직 읽어야 할 페이지가 많이 남아서 더욱 기대된다. 

 

레버리지

단위 시간당 생산하는 가치라는 개념으로 레버리지를 소개한다. 

지금 하는 일이 현재 목표를 이루기 위해 가장 높은 레버리지를 내는가? 라는 질문을 꾸준히 하며 레버리지가 높은 일들을 우선적으로 함으로써 생산성과 효율성을 높여야 한다.


먹고 놀고 일하느냐 바쁜 현대사회, 정말 단 10분 시간 내어 보거나 지하철(탈 일이 거의 없지만,,)에서 틈틈이 읽고 있다.

읽다가 '어맛, 이건 꼭 기억하고 싶어!' 하는 내용이 있어 책상에 앉은 김에 오늘은 독서 대신 기록을 하려고 한다.

 

근무 시간을 활용해서 새로운 기술을 발전시켜라

회사에서 해야 할 일이 너무 많아 부담을 느낄 수 있는데, 20% 시간 동안, 즉 일주일 중 하루에 해당하는 시간을 회사를 더 발전시킬 사이드 프로젝트에 씀으로써 장기적으로 개발자의 성장과 회사의 발전에 투자하는 것이 좋다고 한다.

직장에서 이용할 수 있는 자원을 활용하는 10가지 방법을 제안하는데

  1. 회사에서 가장 뛰어난 개발자가 작성한 코어 추상화 코드를 연구하라
    • 대규모 코드 베이스의 초창기 개발자가 작성한 코어 라이브러리 코드를 읽어보고
    • 어떤 점을 배울 수 있는지 고민하며, 이전 버전 코드에서 재작성된 코드를 중점적으로 이해해라
  2. 더 많은 코드를 작성하라
    • 프로그래밍 실력이 부족하다고 느낀다면 회의나 제품 설계에 쓰는 시간을 줄이고 코드를 만들고 작성하는 시간을 늘려라
    • 기억에서 지식을 불러올 때 더 잘 익힐 수 있다.
    • 능동적으로 프로그래밍해라.
    • 프로그래밍 기술을 발전시키는 활동은 레버리지가 높은 활동이다.
  3. 내부에서 제공되는 기술 교육 자로를 꼼꼼히 살펴보라
    • 설계 문서나 기술 강연을 학습에 활용하라
    • (온보딩 등 교육 프로그램이 있어야 하는 이유!)
  4. 자신이 사용하는 프로그래밍 언어를 마스터하라
    • 언어별로 좋은 책 한두 권을 읽어라
    • 각 언어의 고급 개념을 제대로 이해하고 코어 라이브러리에 익숙해져라
  5. 코드 리뷰는 가장 혹독한 리뷰어에게 부탁하라
    • 언제나 더 좋아질 수 있다.
    • 아무에게나 리뷰 부탁은 지양, 꼼꼼히 검토할 수 있는 리뷰어에게 부탁하자.
  6. 발전하고 싶은 분야에 관한 수업을 수강하라
    • 기업에서 연계된 교육을 적극 활용
  7. 관심 있는 프로젝트 설계 논의에 참여하라
    • 초대받기를 기다리지 마라.
  8. 다양한 프로젝트에 참여하라
    • 비슷한 방법으로 비슷한 일을 해서는 성장하기 어렵다.
    • 다양한 프로젝트에 교차로 참여하여 여러 기술을 교차로 연습해라.
  9. 보고 배울 만한 것이 있는 시니어 개발자가 최소한 몇 명 이상 되는 팀에 머물러라.
    • 그렇지 않다면 팀을 바꾸는 것을 고려
  10. 모르는 코드에 용감하게 뛰어들어라
    • '자신이 모르는 코드에 뛰어드는 것을 겁내지 않는 것'이 엔지니어링 분야에서의 성공과 큰 연관이 있다.
    • 실패를 두려워하지 말고 모르는 분야를 파헤치는 연습을 많이 해라. 그래야 발전한다

 


 

정말 피가 되고 살이 되는 말이다. 그런데 정리를 하고보니..

회사에서 정말~~~~ 바쁘게 있어야 할 것 같다. ㅋㅋㅋㅋ

다양한 프로젝트에 참여도 해야 하고 그 와중에 코드도 많이 작성해야 하는데 불필요한 회의나 설계는 빠져야 하는데 또 관심 있는 프로젝트 설계 논의에는 참여해야 한다. ㅋㅋㅋㅋㅋ

화이팅~

728x90
반응형

+ Recent posts