대용량 검색 처리를 위한 inverted index (역색인) 설명

HYEONG HWAN, MUN/ 1월 11, 2016/ 미분류/ 0 comments

#최종 수정 : 2017-03-22 – 내용과 예제를 보강하였습니다. 라엘이의 한마디 : 역방향 인덱스(inverted index)는 원래 대용량 텍스트 검색을 위해서 고안된 방법입니다. 요즘의 SNS에서 주로 사용되는 #태그 검색 기능을 당신의 시스템에 넣고 싶다면 반드시 역방향 인덱스 방법을 사용해야 할 것입니다. (물론 본문을 Full-scan 해서 LIKE 검색을 해도 되지만 매우 비효율적인 방법입니다.) 나름 쉽게 설명한다고 적었는데, 비전공자에게는 어려울 수도 있다. – 빅데이터 먼저 “빅데이터“란 무엇일까? http://en.wikipedia.org/wiki/Big_data 위키피디아에서는 “매우 양이 많고 복잡해서 기존에 사용하던 분석방식으로는 처리하기 힘든 데이터들(Data-Set)” 이라고 정의되어 있다. 과거에 비해서 인터넷이 비약적인 성장을 하였고, 언제 어디서나 인터넷에 접속할 수 있는 “유비쿼터스”의 시대 도래로 인해 우리는 항상 인터넷에 연결되어 있다.그러다 보면 많은 종류, 많은 수의 document 를 생성하게 된다.“빅 데이터”(=BIG DATA)(=HIGH VOLUME DATA) 라고 함은 보통 million(백만) document 이상의 data-set을 말하는데 이런…

Ubuntu 16.04 LTS 웹서버 세팅방법 (Nginx + PHP7-FPM + MariaDB)

HYEONG HWAN, MUN/ 11월 28, 2015/ 미분류/ 145 comments

Last updated : 2017-04-04 [주의] 기존의 Ubuntu 14.04 세팅방법 글은 : https://blog.lael.be/post/4886 로 이전되었습니다. 글 비밀번호는 ubuntu 입니다. [주의] 이 글은 Ubuntu 16.04 LTS 에 맞추어 작성되었습니다. [정보] 회사 내에 전문 담당자가 없거나 리눅스에 서투르신 경우, 작업의뢰를 신청하세요. 프리랜서 이전/세팅 대행 : https://www.xetown.com/freelancer/3456 . 당신의 요청이 합당하다면 저분이 의뢰를 받아주실 겁니다. #16.10.04 무료 보안인증서(SSL) 적용방법이 추가됨 무료 보안인증서 설치방법이 추가되었습니다. HTTPS 사용을 원하신다면, 본문을 다 읽으신 후 다음의 글로 이동해주세요. https://blog.lael.be/post/5107 – English version is also available. * Nginx 가 아닌 Apache 로 PHP 웹서버를 구축하시려면 https://blog.lael.be/post/73 글로 이동하세요. (쉽고 편함) * Ubuntu 에서 JSP 웹서버 세팅을 원하시면 https://blog.lael.be/post/858 글로 이동하세요. * Ubuntu 에서 PHP와 JSP를 동시 구동하고 싶으시면 https://blog.lael.be/post/1023 글로 이동하세요. * Ubuntu 가상서버호스팅을 찾는 중이라면 https://blog.lael.be/post/44 글로 이동하세요. Nginx 공식사이트는 http://nginx.org/ 이다. 엔진엑스 라고 부른다. Igor Sysoev (이고르 시소에브) 라는 러시아 개발자가 개발했으며,…

Laravel 이해 시작단계. Static 호출로 객체 사용하기.

HYEONG HWAN, MUN/ 11월 17, 2015/ 미분류/ 2 comments

Laravel(라라벨) 이라는 프레임웍을 뜯어보고 있다. 대세 트랜드 코드를 보면 “이런 것도 되는구나” 라는 것을 느낀다.   프로그래밍 언어에 따라서 규칙이 약간씩 다른데, 불변의 진리라고 알고 있었던 것들이 바뀌는 것을 보면 혼란이 일어나곤 하더라. PHP의 경우 선언 안한 메소드를 호출할 수 있고 (정적호출, 객체호출 등의 분기도 가능하다), 선언되지 않은 프로퍼티(속성값)에 값을 할당할 수 있는 등 신기한 것들이 되더라. 나중에 다룰 것인데 먼저 이론을 보고 싶은 사람은 PHP Magic Method 를 살펴보아라. (http://php.net/manual/en/language.oop5.magic.php)   Laravel 의 주요 사용 방법인 Facade(파사드)에 대해 이해하려면 몇가지를 알아야 한다. 먼저 Facade 의 의미를 알아보도록 하자. 길고 장황하고 정확한 설명이 있겠지만 내가 의역하고 요약해서 Facade 를 설명하자면 static 함수 호출을 객체의 클래스(=서비스 라고 부르더라)와 연결시켜 주는 것 이다.       아무튼 Facade 이해의 첫번째 단계인 “static 호출로…

XECon 2015에 참여합니다.

HYEONG HWAN, MUN/ 11월 3, 2015/ 미분류/ 0 comments

XpressEngine(이하 XE) 은 네이버 주식회사에서 유지/개발 하는 오픈소스 컨텐츠 관리 소프트웨어 입니다. 이 소프트웨어의 개발팀에서 XECON2015를 개최합니다! 당연히 이것은 개발자 대상의 행사입니다. 일단 지인과 함께 참가 신청은 했습니다.   참가 신청 및 프로그램 소개 페이지 : https://xecon2015.xpressengine.com/ 날짜 : 2015년 11월 14일 토요일 오후 1시 장소 : 서울시 마포구 상암동 누리꿈스퀘어 3층 인원 제한 : 선착순 600명     얼마나 멋진 분들이 오실지 벌써부터 기대가 되네요.  

Ubuntu 서버에서 PHP7 설치 적용하기

HYEONG HWAN, MUN/ 10월 22, 2015/ 미분류/ 17 comments

이 문서는 Ubuntu 16.04 LTS 가 출시됨에 따라 폐기되었습니다. PHP 7.0 을 설치하시려면 운영체제 Ubuntu 16.04 LTS 를 사용해주세요. 다음으로 이동 : https://blog.lael.be/post/73   이 글은 한번에 끝내는 Ubuntu 웹서버세팅 (우분투 서버세팅) 9번 항목의 PHP 5.5.9 설치 대신에 PHP 7.0 을 설치하는 방법을 설명합니다.   PHP7 공식 위키 참조 (https://wiki.php.net/todo/php70#timetable)   PHP7 은 2015년 6월 11일에 최초 개발 버전이 공개되었으며 최종 공식 정식버전 발표일은 2015년 12월 3일 입니다.   현재 PHP 언어로 개발된 자체 솔루션을 운영중이라면 업그레이드를 하지 마시기 바랍니다. 속도는 빨라지는데… 구동되지 않을 것입니다. (하얀 공백 화면을 보게 될 것입니다.)   현재 WordPress, Drupal, XpressEngine, 그누보드(영카트) 가 PHP7 환경에서 동작하는 것을 확인하였습니다. 다만 일부 WordPress 플러그인, Drupal 플러그인, XpressEngine 모듈, 그누보드 플러그인(빌더등) 가 PHP7 환경에서 동작하지 않는 것을 확인했으며 결과적으로 이 플러그인/모듈/빌더 를…

Ubuntu Varnish Cache 를 구축하여 웹서비스를 가속화시키기 (바니쉬 캐시)

HYEONG HWAN, MUN/ 10월 19, 2015/ 미분류/ 6 comments

웹 사이트를 잘 운영하면 방문자 수가 늘어나고, 어느 순간 사이트가 급격히 느려지게 된다. 어느 순간 답답함이 느껴지고 그 답답함이 점점 커지며, 급기야 방문자의 항의 글을 보게되면 혼란에 빠지게 된다.   당신의 웹서비스를 가속화(튜닝) 하는 방법에는 다음의 3가지 단계가 있다.   1. 서버 사양 올리기. 1코어 1기가 서버를 4코어 4기가 서버로 올리는 것이다. 매우 간단하고 빠르고 쉽다. 자동차로 비유하자면 엔진을 하나 더 다는 것이다. 그런데 엔진이 무한정 달리는 것도 아니고, 엔진이 2개가 된다고 속도가 2배가 되지도 않는다. 엔진 사는데 돈이 든다.   2. 서버 구동 소프트웨어 최적화하기. 서버 구동 소프트웨어 설정 값을 조정하여 더 효율적으로 동작할 수 있게 한다. 자동차로 비유하자면 엔진 연비를 향상시키는 것이다. 급출발, 급정거 하지 않고 브레이크를 적게 밟으며 권장속도로 운전한다. 돈이 들지는 않지만 연비향상 방법을 알고 있어야…

Ubuntu 추가 랜카드 설정 및 사설네트워크 구축하기

HYEONG HWAN, MUN/ 9월 13, 2015/ 미분류/ 0 comments

  # 용어 설명 # 랜카드 = Network Interface Card = NIC = Interface Card = Interface 네트워크 하는 사람이 “두번째 인터페이스 아이피가 뭐야?” 라고 물어보면 “두번째 슬롯에 꼽혀진 랜카드에 할당된 아이피를 물어보는 것이다.”   1. 추가 랜카드를 장착할 수 있는 업체 조사 * 편의상 1달러는 1000원, 100엔은 1000원 으로 계산하여 표시하겠다. (2015년 9월 10일 기준 실제 환율은 1달러 = 1180원, 100엔 = 980원 이다.) * 모든 클라우드 서버 호스팅 업체의 내부아이피 트래픽은 과금되지 않는다. 아예 측정하지 않거나(unmetered), 측정한 후에 0원을 곱해서 청구(zero cost)한다. 공인아이피 통신 트래픽은 과금된다. 같은 호스팅 회사라고 하더라도  과금되지 않기위해서 되도록 서버간에는 내부아이피로 통신하도록 하자.   클라우드 업체 목록은 이곳에서 찾을 수 있다. (https://blog.lael.be/post/44) Vultr (공인아이피 : 2000원, 사설아이피 : 무료) ConoHa (공인아이피 : 3500원, 사설아이피…

PHP의 자료형(Data Type)과 자동형변환(Type Juggling) 알아보기

HYEONG HWAN, MUN/ 8월 31, 2015/ 미분류/ 0 comments

프로그래밍 언어의 조건 컴퓨터공학전공 4학년 교과과정 중에 Programming Language 라는 수업이 있다. 이 수업에서는 그동안 무심코 배워왔던 프로그래밍 언어의 역사와, 언어의 발명일, 영향을 받은 언어, 영향을 끼친 언어, 기본 정신, 주 응용분야 등을 배운다. 프로그래밍 언어의 조건과 Language Designer 의 역할에 대해서 배우고 직접 자신만의 언어 규칙을 정하고 어휘분석기(Lexer)와 구문분석기(Parser) 자료형검사기(Type Checker)를 만들어본다.   코드가 실행되기 까지 꽤나 다양한 단계가 있는데 각 단계에 대해서 배운다.     프로그래밍 언어는 반드시 다음의 4가지 속성을 가지고 있어야 한다. – Syntax(구문구조) : 문법적으로 올바른 프로그램에 대해 정확하게 설명. – Names(이름) : 프로그램에서의 다양한 개체에 대해 이름을 명명함. (변수명, 타입명, 함수명, 클래스명 등등) – Types(타입) : 타입이란 값의 그룹과 값이 할 수 있는 연산에 대해서 정의합니다. 이로인해서 올바른 연산을 파악하고 타입에러를 검출할 수 있습니다.…

실제 운영 중인 서비스에 실시간 패치를 하는 방법

HYEONG HWAN, MUN/ 8월 14, 2015/ 미분류/ 0 comments

먼저 컴퓨터공학 용어인 Atomic operation 에 대해 알아보자.   Atomic operation(원자적 연산)은 다음 두가지 조건을 반드시 만족해야 한다. 1. 모든 조작이 완료할 때까지 어떤 프로세스도 변경을 알지 못하도록 비가시적이어야 한다. 2. 조작 중에 어느 하나라도 실패한다면 조작 전체도 실패하고 시스템의 상태를 조작 이전 상태로 복구해야 한다. 외부에서는 조작의 집합이 단번에 성공하거나 실패하는 것으로 보인다. 쉽게 말해서 중간 상태가 없는 것이다.   자세한 설명 및 예시는 여기를 참조 : http://vaert.tistory.com/39     리눅스 tar 프로그램을 사용해서 압축해 본 적이 있는가? 압축 중에 Control – C 를 사용하면 압축이 중지된다. 이것을 다시 이해해 보자면 tar 압축 프로세싱 중에 다른 명령(Abort)이 들어온 것이다. 압축 중인 파일을 다른 프로그램이 다운로드(Read) 한다면 현재 압축된 파일만큼 다운로드 될 것이다. (즉 압축 중인 파일을 다운받게됨.)   tar 명령은 Atomic…

언제 웹서버와 DB서버를 분리해야 하는가?

HYEONG HWAN, MUN/ 8월 13, 2015/ 미분류/ 2 comments

보통 서비스를 처음 세팅할 때 웹서버와 디비서버를 같은공간에 설치하곤 한다.   서버의 능력치를 1이라고 가정하자. 초기 서비스 운영시에는 웹 0.1, 디비 0.1 의 능력이 필요하기 때문에 한 서버 공간을 사용해도 서비스 운영에 지장이 없다. 최상의 성능을 발휘할 수 있는 것이다.   하지만 서비스의 사용자가 늘어나게 되면 이야기가 달라진다. 서비스의 부하량이 증가해서 예를들어 웹 0.7, 디비 0.7 의 능력을 사용하는 상황이 된다면, 서버의 능력치인 1이 넘어갔기 때문에(0.7 + 0.7 = 1.4) 과로(over work)를 하게 된다. <그림 : uptime 명령어로 현재 서버의 총 CPU부하량을 볼 수 있다> #cat /proc/cpuinfo | grep CPU | wc -l 이 명령어를 통해 CPU 부하량 제한을 알 수 있다. (정확히 말하자면 CPU코어 수를 알 수 있다.) 위의 스크린샷을 찍은 서버의 경우, 2코어 서버라서 CPU부하량이 2 까지는 정상동작됨을…

한번에 끝내는 CentOS 웹서버세팅 (센토스 서버세팅)

HYEONG HWAN, MUN/ 8월 3, 2015/ 미분류/ 15 comments

Last updated : 2016-11-08 CentOS 에서의 웹서버 구축 방법을 요청하셔서 작성해 봅니다. Ubuntu, CentOS, Fedora, ArchLinux 등에서 어떤 것이 가장 좋은 운영체제 일까요? 본인에게 편한 운영체제가 가장 좋습니다. (일방적으로 하나의 좋은 것이 있다면 다들 그것만 쓰고 나머지는 도태되겠죠.) 참고로 저에겐 Ubuntu 가 편합니다.   현재 배포된 CentOS 버전은 아래와 같습니다. 참조 : https://ko.wikipedia.org/wiki/CentOS   이 글에서는 CentOS 7.0 또는 그 이상 버전에서 사용가능한 설정 방법을 설명하도록 하겠습니다.   참고로 운영체제 이미지는 다음의 위치에서 다운로드 가능합니다. https://www.centos.org/download/ Everything ISO : 운영체제 파일 + 패키지 파일 이 모두 담겨있음. 인터넷이 안되는 환경에서 사용할 수 있음. Minimal ISO : 운영체제 파일. 패키지는 인터넷 연결을 통해 설치해야 함. 일반적으로 이 이미지를 CD 장치 또는 DVD 에 기록 후 사용합니다.     1) 리눅스 버전체크 #uname -a…

PHP7.0 은 얼마나 빠를까?

HYEONG HWAN, MUN/ 7월 28, 2015/ 미분류/ 4 comments

* PHP7 을 설치하시려면 다음의 글 (https://blog.lael.be/post/2407)을 참조하세요. (Apache with Mod-PHP7) * PHP를 최신버전으로 구축하고 싶다면 https://blog.lael.be/post/2600 글로 이동하세요. (Nginx + PHP7-FPM + MariaDB)   최근 궁금한 것이 두가지 생겨서 테스트해보았습니다.   1. PHP 업로드 중에 읽기 요청이 들어오면 어떻게 되나? Read lock 이 걸리나? 물론 파일 변경이 0.005초 이내로 이루어지지만 그 사이에 read 가 일어날 경우 어떻게 되는지 궁금하여 실험해 보았습니다. 테스트 결과 : php 업로드 중에 읽기 요청이 들어오면 업로드 된만큼 해석해서 처리 -> 100% 에러발생 따라서 변경중에 엑세스가 일어나지 않게 maintenance mode 를 만들거나 linux rename 같은 atomic 함수를 이용하라고 하는군요.   참조 : http://stackoverflow.com/questions/15478298/what-happens-when-php-file-is-replaced-while-being-executed-on-linux-apache-serv 참조 : http://stackoverflow.com/questions/9021849/does-apache-read-lock-files-before-serving-them 참조 : http://superuser.com/questions/101676/is-there-some-difference-between-mv-and-cp-rm-the-old-file-on-unix   2. PHP 7.0 이 공식 문서에 따르면 이전버전보다 2배 빠르다고 한다. 정말일까?   공식 문서 : http://php.net/index.php     기존…

IDC 서버를 Amazon 클라우드로 마이그레이션 하고 난 후기

HYEONG HWAN, MUN/ 7월 14, 2015/ 미분류/ 2 comments

글 작성 이후에 서버의 구성을 조금 바꾸었습니다. 예를 들어 현재 제가 관리하는 시스템은 사용자의 관여 없이 자동으로 장애처리 및 오토스케일링(UP&Down)이 작동합니다. 해당 내용은 추후 글 수정시 추가하도록 하겠습니다. < 그림 : 장애가 발생하여 자동으로 서버가 증설되었고, 장애 상태가 종료되어 증설된 서버가 자동으로 제거되었다 > 서버 관리자의 개입 없이 전자동으로 이루어지는 프로세스이며, 최종 고객이나 담당자 그리고 서버관리자까지도 장애를 느끼지 못한다. #글 본문시작. 최근 회사의 서비스 인프라를 아마존 클라우드로 이전하였다. 물리서버(Metal Server)를 오래사용되다 보니까 원인을 알 수 없는 하드웨어 장애가 발생하더라.   서버 운영의 유연성과 하드웨어 장애로 부터 벗어나기 위해서 Cloud 환경으로 바꾸어보았다.   – 클라우드 인프라의 장점   – 빠른 설치 및 운영 대기 시간 감소 : IDC 에서 신규 장비 입고 후 구축하면 최소 이틀 걸린다. 클라우드 환경에서 신규 서버…

웹 프로젝트 진행의 올바른 방법

HYEONG HWAN, MUN/ 7월 13, 2015/ 미분류/ 4 comments

글쓰고자 하는 내용이 몇가지 있는데,  글을 쓸 수 있는지 날마다 나의 컨디션을 살펴보다가 오늘은 써도 되겠다 싶어서 쓰도록 한다.   제목이 딱딱한 표현인 “올바른 방법(Right way)” 이라는 단어를 사용했는데 “라엘이가 제안하는 방법(Suggested way)” 이라고 풀어서 해석하도록 하여라. 가장 좋은 프로그래밍 언어는 “본인에게 쉬운 언어” 이며, 가장 좋은 프로젝트 진행 방법 역시 “팀원들에게 쉬운 방법” 이다. – 참고 : 더 좋은 방법을 사용하면 더 쉬워진다.   라엘이는 초등학교 고학년때 html 과 frameset 등을 다루었고, 중학교 시절 js, css, ls 같은 리눅스 명령어를 다루었다. 벌써 10년도 더 된 일인데, 일찍 접했다는 것이 중요한 것이 아니라 꾸준히 하고 있다는 것이 중요한 것이다.   여러가지 프로젝트를 지켜보고, 스스로 진행해 보면서 2015년 현재 트랜드에 맞는 진행방법을 설명하고자 한다.   – 조건 : 프로젝트 구성원이 둘…

php 세션 저장소를 redis 로 바꾸어 본 후기.

HYEONG HWAN, MUN/ 6월 16, 2015/ 미분류/ 3 comments

어떤 웹 프로그램의 속도가 느려서 디버깅을 했었는데, 느린 부분이 session_start() 구문이었다.   저 한 줄 실행하는데, 1.2초~ 2.5초가 걸리더라. 하나의 PHP 파일에 대하여, 동시에 20개의 POST 요청을 하는 프로그램이었다.   – 세션 구문이 느리니까 개선을 위하여 redis 를 설치해 보았다. 공식사이트는 이곳 (http://redis.io/download) 이다. PHP 연동 파일은 http://redis.io/clients#php 에서 찾아볼 수 있다. 라엘이는 phpredis 를 선택해서 설치하였다. 설치방법은 사이트에 잘 나와있으니 따라하면 된다.   적용 직후 반응 속도가 대폭 개선되었다. 세션의 속도가 개선된 후에, 2번째로 시간을 오래 소비하는 요인을 찾았고 그것은 어떤 SQL 구문이었다. 해당 SQL 구문을 개선한 후에 만족할 만한 반응속도를 얻었다.   이상한 점은 그 후에 file session hander 로 바꾸어도 빠른 속도가 나오더라는 것이다.   최종적으로 redis session 과 file session 의 속도차이는 거의 나지 않았다. – 반응속도가 만족스러워져서…