기본 콘텐츠로 건너뛰기

IT인프라의 기술 테크 트리 공유 합니다.





제가 이것저것 두서없이 제자랑만 하잖아요? 

사람들에게 무언가의 전문가가 되기 위한 방법을 알려주려고 하다보니 
이걸 공유하는게 낫지 않을까 하여 정리를 해봅니다. 

전 개발쪽 보다는 인프라에 더 가깝지만, 
개발하시는 분들도 알고 하는 것과 모르고 개발 하는 것은 천지차이이기 때문에 제가 정리한 내용을 보시면서  빼먹은게 있다면 하나씩 배워 가시는게 좋지 않을까 합니다. 

테크 트리는 링크를 달아놓을께요.. 



지속적으로 추가할 테니 어딘가 즐겨 찾기를 해주시고, 수시로 확인하시면 좋을 것 같습니다. 
추가하고 싶은 내용이 있으면 언제든 코멘트 주시면 수시로 추가하겠습니다. 

이 기술을 배우고 싶은데 뭘 배우고 배우면 좋을까요? 
같이 물어보시면 여기 테크트리에서 화살표만 따라 가면 되도록 만들 예정인데요.. 

예를 들어, 

블록체인 기술을 알고 싶은 경우
암호화 알고리즘과 네트워크 기술, 그리고 파일 시스템 기술을 알면 배우기 쉽다 같은, 
이런식으로 만들어가려고 합니다. 물론 이게 다는 아니겠지만 지속적으로 보완해 가면서 누구나 배우고자 하는 기술을 거슬러 올라가서 공부할 수 있게 하고자 합니다. 

그리고 각 기술 박스를 클릭하면 링크가 달린 경우가 있는데요, 
이 링크를 클릭하면 기본적으로 wikipedia를 연결해 놓겠습니다. 
다국어로 하고 싶어서 기본은 영어로 하겠지만, 한글이라도 정말 좋은 문서가 있다면 한글 문서로 링크를 달 예정입니다. 

혹시 스스로 만든 블로그 링크를 주시거나 하면 
충분히 교육적으로 괜찮겠다 싶은 경우 링크를 달아드립니다. 

이 테크트리에는 네트워크의 기초에서부터 
OS의 구성요소, 그리고 이게 클라우드 서비스가 되었을 때의 서비스명과 코어 기술과의 관련.. 
스토리지역시 파일 시스템의 구성에서부터 클라우드 서비스에서 사용하는 파일 시스템들, 
데이터베이스에서 블록 체인 기술까지를 다루어 볼까 합니다.  

제가 IT 컨설턴트나 아키텍트에 대해서 이야기 하지만, 
무얼 배워야 하느냐? 라는 질문이 많거든요.. 
그런데, 제가 적은거를 전부 알아야 웬만한 프로젝트에 아키텍트로 들어갈 수가 있는데요.. 
생각보다 이렇게 광범위하게 아는 것보다, 
각각의 전문가들이 모여서 자기 분야의 설계를 하는 경우가 많습니다. 
각자의 전문가라는 사람들이 최적의 설계를 한다 하더라도, 
자기 분야 외에는 모르쇠 하는 경우가 많아서 
결국 퍼포먼스 이슈가 생기고, 
자기네는 잘못 없네 하면서 프로젝트가 산으로 갈 때가 많거든요. 
여기서 한 분야만 잘아는 아키텍트 들이 많기 때문에 
자기가 아는 분야만 어떻게든 해결하고 
나머지는 돈으로 쳐바르는 경우를 많이 봐왔습니다. 
하지만, 제가 프로젝트마다 들어가서 인정 받는 이유는, 
그런 전문가들이 설계한 내용을 읽을 수 있고, 
이들이 간과한 그들의 전문 외의 문제를 짚어줄 수 있기 때문입니다. 

아주 가볍게 예를 들어드릴께요. 

모 대기업 출판회사의 퍼포먼스 이슈로 제가 불려갔을 때에도, 
대형 SI기업이 이미 설계를 끝내고 제가 실무 지원으로 들어갔습니다. 
이들은 azure SQL Server를 최고 사양으로 쓰고 있어서 RDBMS만 한 달에 250만엔을 내고 있었습니다. 
그런데 그걸로 500명 밖에 동접을 받을 수가 없어서 RDBMS를 5Replica를 만들어서 월 1500만엔으로 동접 3000명을 커버하도록 확장하는 프로젝트였지요.. 
저는 이 확장용 SQL instance를 5대를 만들고 replica 설정만 하면 되는 용도로 불려갔는데, 
뭔가 이상했지요.. 월 250만엔짜리 인스턴스에서 500명 밖에 못받는게 말이야 방구야 하면서..
서버 구성 및 네트워크 구성, 그리고 서비스 소스까지 파들어가서 
SI기업이 놓치 퍼포먼스 이슈를 잡아 냈지요. 

SQL을 CackePHP에 올린 ORM모듈에 던지는데 ORM을 그냥 사용하는게 아니라 in 안의 SQL은 또 상황에 따라 루프 돌려 생성하도록 되어 있는데, 그 단계가 14단계 까지 in안에 in을 넣어놨네요.. 

이 근본적인 원인 만 해결하고, 
CakePHP에서 제공하는 설정만으로는 Replica를 자동으로 절환할 수 없어 소스를 건드려야 하지만, 
소스는 개발회사가 별도로 있어 안건드리는 조건으로 일을 해야 하는 상황이었습니다. 

그래서 cakePHP내의 코어 모듈 중에 SQL을 호출하는 모듈이 있는데, 
그 때의 SQL을 파싱해서 update나 insert가 있으면 마스터로, 없으면 레플리카를 Round robin으로 도메인화 하여 전송 하도록 모듈 자체를 바꾸어서 보여주었는데.. 

거기서 소스 자체의 문제를 지적했다가 잘렸네요;;;
10년이상 박혀있던 SI업체가 재계약이 끊길 근본적인 문제를 지적해버려서;;

분명 개발자가 할 수 있는 한계가 그 정도가 아닐까 합니다. 
조건이 많을 수록 SQL을 잘하는 사람이 최적화를 하고 성능에 맞추어 정규화를 하되 필드의 위치도 최적화 하고, 경우에 따라서 비정규화만 하면 되지만, 
그건 개발자의 영역을 벗어난 것이거든요.. 


이 외에도 블록체인 기술에 대해서 투자를 하려고 하는데 5000TPS 를 넘는 블록체인 기술이 있다고 하여 제게 봐달라고 했는데, 이 기술을 홍보한 업체는 github에 소스 공개가 되어 있지 않았습니다. 
보통 메이저 블록체인은 소스공개가 되어 있어서 그 소스를 보고 문제점을 찾을 수 있는데, 일단 공개 안된게 첫 번째이구요, 
RDBMS로 캐싱하고 여유분을 블록체인에 올린다면 5000TPS를 저도 믿어주지만, 
순수 퍼블릭 블록체인에서 5000TPS라고 하니까 전 믿을 수가 없지요. 

프라이빗 블록체인 중에서 Hyperledger의 경우 단일 서버로 하면 4000TPS가까이 나오지만, 노드 한 대 늘릴 때마다 1/2 에서 그 이상 떨어지는게 확인 되었습니다. 

이건 근본적인 이슈인데, 
아무리 합의 알고리즘 처리가 빠르다고 하더라도, 
네트워크 핸드쉐이킹이 0.1초 이상은 잡아야 하는데, 
여러 대의 노드에서 엄청 빨리 처리한 데이터라고 하더라도 그걸 한 군데 에서 합의 알고리즘 검증을 위한 통신만 수 초는 걸리게 됩니다. 
때문에 블록체인의 트랜잭션이 느린 근본적인 원인을 알고 그에 대한 해결 책들을 찾고 있는 것은 알고 있지만, 어떤 퍼블릭 블록체인도 이 네트워크 속도의 한계를 벗어난 곳은 없습니다. 
물론 병렬 쓰레드로 계산하면 0.1초에도 쓰레드 수만큼은 처리가 되므로 1초에 수백 TPS까지 만들 수는 있지만, 퍼블릭 이란 것은 글로벌 네트워크에서의 핸드쉐이크라는 전제이기 때문에 느려질 수 밖에 없는 상황이 엄청나게 많기 때문에 최대 400TPS라 한들 평균 20TPS가 되는건 어쩔 수 없습니다. 
게다가 20TPS라고 해도 대기 트랜잭션이 너무 많아 보통 15분 정도에 전송되는 경우가 많지요. 

이런 식으로 근본까지 알고 기술을 대하는 것과 
자기가 아는 개발 능력만을 가지고 기술을 대하는 것은 엄청난 차이가 생기게 되죠. 

이거 들으면 너 잘났어 하면서 또 싫어요 누르겠네요;; 

아뭏든, 

이 도식은 이제부터 만들어가는거라 부족함이 많고, 
아주 오래된 기술들은 저역시 하나하나 기억할 수 없기 때문에 빼먹는 것들이 있는데요.. 
이걸 같이 이야기 하면서 채워가려고 시작하는 것이니 
참여해 주시는 분들이 많을 수록 
빨리 더 좋은 내용이 보충 될 거라 믿습니다. 

참여하고 싶으신 분들은 제 프로필 보고 연락 주시면 
언제든 내용을 받거나 수정권한을 드리겠습니다. ^^

제가 가진 모든 지식을 공유 하고 싶습니다. 
이렇게 많은 지식인들의 공유로 
한국의 엔지니어의 능력이 모여 세계 최고 수준이 되길 기대합니다! 


giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

댓글

이 블로그의 인기 게시물

Alter table 에서 modify 와 change 의 차이 :: SQL Server

두 개의 차이를 모르는 경우가 많아서 정리합니다.  modify는 필드의 속성값을 바꿀때 사용하구요.. change는 필드명을 바꿀떄 사용합니다.  alter table tbbs modify bNote varchar(2000) NULL; alter table tbbs change bNoteOrg bNoteNew varchar(2000) NULL; change에는 원래 필드와 바꾸고 싶은 필드명을 넣어서 필드명을 바꾸는 것이죠~ 더 많은 SQL Server 팁을 보려면  https://github.com/LowyShin/KnowledgeBase/tree/master/wiki/SQL-Server giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

책에서는 안 알려주는 대규모 트래픽을 위한 설계

음성 버전 :  https://www.youtube.com/watch?v=ZZlW6diG_XM 대규모 트래픽을 커버하는 첫 페이지 만드는 법..  보통 DB를 연결할 때 대규모 설계는 어떻게 하시나요?  잘 만들었다는 전제 하에 동접 3000명 이하는  어떤 DBMS를 사용해도 문제 없이 돌아갑니다.  여기서 이미 터졌다면 이 콘텐츠를 보기 전에 DB의 기초부터 보셔야 합니다.  아.. 개발 코드가 터졌다구요? 그럼 개발자를 때리셔야지요..  만약 3000명을 넘겼다면? 이제 Write/Read를 분리해서  1 CRUD + n개의 READ Replica를 만들겠죠?  보통 Read Replica는 5개가 최대라고 보시면 됩니다.  누가 연구한 자료가 있었는데...  6번째 레플리카를 만든느 순간 마스터가 되는 서버의 효율 저하 때문에  5번째에서 6번쨰로 올릴때의 성능이 급격히 줄어든다는 연구 결과가 있습니다.  때문에 Azure에서도 replica설정할 때 5대까지 밖에 설정 못하게 되어 있지요.  유저의 행동 패턴에 따라 다르긴 하지만,  1 CRUD + 5 Read Replica의 경우 동접 15000명 정도는 커버 합니다.  즉, 동접 15000명 에서 다시 터져서 저를 부르는 경우가 많지요..  이 때부터는  회원 DB, 게시판DB, 서비스DB, 과금 DB 등등 으로 성격, 서로의 연관도에 따라 나누기 시작합니다.  물리적으로 DB가 나눠지면 Join을 못하거나 Linked Table또는 LinkDB등의 연결자를 이용해서 JOIN이 되기도 합니다.  그에 따라 성능 차이가 생기지만 가장 중요한 포인트는  서로 다른 물리적 테이블의 JOIN은 인덱스를 타지 않는다!  라는 것입니다. 즉, JOIN할 테이블들을 최소한으로 만든 뒤에 JOIN을 걸지 않으면 NoSQL처럼 느려터져 죽습니다.  양이 많은 DB에서 양이 적은 테이블을 가져와서 JOIN을 해야겠지요..  이렇게 해서 동접 10만명까지 커버를 했다 칩시다.  여기서 일반적인 동접의 기준도 서비스마

BI의 궁극판! Apache Drill을 써보자!

사실 Apache Drill 은 BI(Business Intelligence)라고 부르는 것 보다는 단순 데이터 연결 엔진이다. https://drill.apache.org/ 하지만 내가 왜 극찬을 하느냐면.. DBA로서 항상 문제가 되어왔던게, 이기종 데이터의 변환이나 처리였다. 포맷을 맞추는데 엄청난 시간이 걸리고, 데이터 임포트 실패가 무수하게 나고.. 한 번 잘못 데이터를 추출하면 다시 조정, 변환, 추출하는데 시간이 많이 걸린다. 그런데! Apache Drill은 그냥 RDB를 CSV랑 연결해서 조인해서 통계를 낼 수 있다. 그것도 표준 SQL을 사용하여! 예를 들어, CSV의 세 번째 컬럼이 price 이고, 물건의 판매이력을 PG사에서 CSV로 출력 받았다. 우리 DB와의 검증을 위해서는 수동으로 Import를 한 뒤에 포맷이 안맞아 잘리는 데이터가 있다면 다시 맞춰주고, 재 임포트를 수십 번, 그리고 나서 겨우 들어간 데이터를 조인하여 빠진 데이터를 분간한다. 숫자가 적다면 개발자가 개발로 처리할 수도 있지만, 건수가 하루에 300만건 짜리라면.. 한 달 온 파일은 9천만 건이다. 프로그램으로 고작 처리하는 것이 초당 500건. 거의 20만초, 에러 없이 약 56시간.. 에러가 생기면 다시 56시간.. ㅠㅡㅠ 이런게 현실이기 때문에 쿼리 말고는 방법이 없다. apache drill 의 진면목을 보자! 이번에는 좀 범용 적인 MySQL DB와 붙여 보자. . 난 이번에는 Mac에서 작업을 했기 때문에 그냥 다운 받아서 풀었음.. https://drill.apache.org/download/ 여기서 자기 OS에 맞는 버전을 받아서 설치하시길.. 압축을 풀고 나면 MySQL 커넥터를 붙여야 한다. https://dev.mysql.com/downloads/connector/j/5.1.html 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만