웹사이트 검색

Ubuntu 14.04에서 Memcache를 설치하고 사용하는 방법


소개

웹 사이트가 성장하고 트래픽이 증가함에 따라 스트레스를 가장 빠르게 나타내는 구성 요소 중 하나는 백엔드 데이터베이스입니다. 데이터베이스가 분산되어 있지 않고 높은 로드를 처리하도록 구성되어 있지 않은 경우 상대적으로 적은 양의 트래픽 증가에도 쉽게 압도당할 수 있습니다.

이를 처리하는 한 가지 방법은 memcached와 같은 메모리 개체 캐싱 시스템을 활용하는 것입니다. Memcached는 일반적으로 데이터베이스에서 검색되는 정보를 메모리에 임시로 저장하여 작동하는 캐싱 시스템입니다. 메모리 내 정보에 대한 다음 요청은 백엔드 데이터베이스에 스트레스를 주지 않고 매우 빠릅니다.

이 가이드에서는 Ubuntu 14.04 서버에서 memcached를 설치하고 사용하는 방법에 대해 설명합니다.

전제 조건

시작하기 전에 sudo 권한에 액세스할 수 있는 루트가 아닌 일반 사용자가 서버에 있어야 합니다. 이러한 사용자를 아직 생성하지 않은 경우 Ubuntu 14.04용 초기 설정 가이드의 1-4단계를 수행하여 생성할 수 있습니다.

일반 사용자를 구성했으면 이 가이드를 계속 진행하세요.

Memcached 및 구성 요소 설치

시작하려면 우분투 저장소에서 필요한 모든 구성 요소를 가져와야 합니다. 운 좋게도 필요한 모든 것을 사용할 수 있습니다.

이 세션에서 apt를 사용한 첫 번째 작업이므로 로컬 패키지 인덱스를 업데이트해야 합니다. 그런 다음 프로그램을 설치할 수 있습니다.

상호 작용을 처리하기 위해 memcached와 MySQL 데이터베이스 백엔드 및 PHP를 설치할 것입니다. 또한 memcached 상호 작용을 처리하는 PHP 확장을 설치하고 있습니다. 다음을 입력하여 필요한 모든 것을 얻을 수 있습니다.

sudo apt-get update
sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached

사용 가능한 *두 개의 \PHP Memcache 확장이 있습니다. 하나는 php5-memcache이고 다른 하나는 php5-memcached입니다. 두 번째 예). 이 중 두 번째는 안정적이고 더 넓은 범위의 기능을 구현하기 때문에 사용하고 있습니다.

아직 MySQL을 설치하지 않은 경우 설치 시 관리자 암호를 선택하고 확인하라는 메시지가 표시됩니다.

이렇게 하면 필요한 모든 것이 설치 및 구성됩니다.

설치 확인

믿거나 말거나, memcached는 이미 완전히 설치되어 있고 바로 사용할 수 있습니다. 다양한 방법으로 이를 테스트할 수 있습니다.

첫 번째 방법은 비교적 간단합니다. memcached 확장에 대해 알고 있는지 여부와 활성화 여부를 PHP에 물어볼 수 있습니다. 유비쿼터스 PHP 정보 페이지를 생성하여 이를 수행할 수 있습니다.

이는 문서 루트에 info.php라는 파일을 생성하여 쉽게 수행할 수 있습니다. Ubuntu 14.04의 Apache에서 기본 문서 루트는 /var/www/html입니다. 여기에서 루트 권한으로 파일을 엽니다.

sudo nano /var/www/html/info.php

이 파일에서 다음을 입력합니다. 이것은 기본적으로 서버에 대한 정보를 수집하고 웹 친화적인 레이아웃으로 인쇄하는 PHP 함수를 호출합니다.

<?php
phpinfo();
?>

이제 서버의 도메인 이름 또는 공용 IP 주소 뒤에 /info.php를 입력하면 정보 페이지가 표시됩니다.

<예비>

아래로 스크롤하거나 "memcached\ 섹션 헤더를 검색하면 다음과 같은 내용을 찾을 수 있습니다.

이는 memcached 확장이 활성화되고 웹 서버에서 발견됨을 의미합니다.

다음을 입력하여 memcached 서비스가 실행 중인지 확인할 수도 있습니다.

ps aux | grep memcached
memcache  6584  0.0  0.0 327448  3004 ?        Sl   14:07   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
demouser  6636  0.0  0.0  11744   904 pts/0    S+   14:29   0:00 grep --color=auto memcached

다음을 입력하여 통계에 대한 서비스를 쿼리할 수 있습니다.

echo "stats settings" | nc localhost 11211

memcached 서비스를 중지, 시작 또는 다시 시작해야 하는 경우 다음과 같이 입력하면 됩니다.

<예비>

Memcached가 데이터를 캐시할 수 있는지 테스트

이제 memcached가 실행 중이고 이에 연결할 PHP 확장이 활성화되었음을 확인했으므로 데이터를 저장하도록 시도할 수 있습니다.

우리는 다른 PHP 스크립트를 생성하여 이를 수행할 것입니다. 이번에는 더 복잡해집니다.

문서 루트에서 cache_test.php라는 파일을 엽니다.

sudo nano /var/www/html/cache_test.php

내부에서 PHP 래퍼 태그를 생성하여 시작합니다.

<예비>

여기에서 PHP Memcached 객체의 새 인스턴스를 생성하고 변수에 저장할 것입니다. 이 PHP 개체가 서버에서 실행 중인 실제 memcached 서비스에 연결할 수 있는 위치를 정의할 것입니다. Memcached는 기본적으로 포트 11211에서 실행됩니다.

<예비>

다음으로 Memcached 인스턴스에 캐시에서 키를 쿼리하도록 지시할 것입니다. 이 키는 아직 만들지 않았기 때문에 무엇이든 호출할 수 있습니다. "blah\를 사용하겠습니다. 이 요청의 결과는 $result 변수에 저장됩니다.

<예비>

$result=$mem->get(\blah”);

다음으로 반환된 항목이 있는지 테스트하기만 하면 됩니다. memcached가 "blah\라는 키를 찾은 경우 해당 키와 관련된 값을 인쇄하기를 원합니다. memcached가 일치하는 키를 찾을 수 없으면 그렇게 말하는 메시지를 인쇄해야 합니다.

그런 다음 다음에 값을 요청할 때 memcached가 우리가 제공한 값을 찾을 수 있도록 값으로 키를 설정해야 합니다.

<예비>

$result=$mem->get(\blah);

if ($result) {

이 시점에서 스크립트가 완료되었습니다. 웹 브라우저에서 이 페이지를 방문하면 이것이 어떻게 작동하는지 확인할 수 있습니다.

<예비>

처음에는 다음과 같은 페이지가 표시됩니다.

그러나 페이지를 새로 고치면 다른 메시지가 표시됩니다.

보시다시피 memcached 서비스는 이제 스크립트가 설정한 데이터를 캐싱합니다.

일시적으로 데이터베이스 값 캐싱 테스트

이제 memcached에 데이터를 저장하는 기능을 테스트했으므로 보다 현실적인 시나리오인 데이터베이스 쿼리의 결과를 일시적으로 캐싱할 수 있습니다.

MySQL에서 샘플 데이터 생성

이렇게 하려면 먼저 데이터베이스에 일부 정보를 저장해야 합니다.

다음을 입력하여 관리 사용자로 MySQL 인스턴스에 연결합니다. 설치 중에 설정한 MySQL 루트 암호를 입력해야 합니다.

mysql -u root -p

그런 다음 MySQL 프롬프트가 표시됩니다.

먼저 테스트할 데이터베이스를 생성하려고 합니다. 그런 다음 데이터베이스를 선택합니다.

CREATE DATABASE mem_test;
USE mem_test;

생성한 데이터베이스에 액세스할 수 있는 암호 testing123을 사용하여 test라는 사용자를 생성해 보겠습니다.

GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123';

이제 정말 기본적인 테이블을 만들고 레코드를 삽입할 것입니다. 테이블 이름은 sample_data이며 인덱스와 문자열 필드만 있습니다.

CREATE TABLE sample_data (id int, name varchar(30));
INSERT INTO sample_data VALUES (1, "some_data");

이제 구조가 생성되고 데이터가 삽입되었습니다. MySQL을 종료할 수 있습니다.

exit

MySQL 데이터를 캐시하는 PHP 스크립트 만들기

이제 MySQL에 데이터가 있으므로 프로덕션 PHP 애플리케이션과 유사한 방식으로 작동하는 또 다른 PHP 스크립트를 만들 수 있습니다.

memcached에서 데이터를 찾고 데이터를 찾으면 반환합니다. 데이터를 찾지 못하면 데이터베이스 자체에서 쿼리한 다음 향후 쿼리를 위해 결과를 memcached에 저장합니다.

시작하려면 문서 루트에 다른 PHP 스크립트를 만듭니다. 우리는 이 스크립트를 database_test.php라고 부를 것입니다:

sudo nano /var/www/html/database_test.php

마지막 스크립트와 비슷한 방식으로 시작합니다. PHP memcached 인스턴스를 생성한 다음 지난번과 마찬가지로 서버에서 실행 중인 memcached 서비스의 위치를 알려줄 것입니다.

<예비>

다음으로 마지막 스크립트에서 처음 출발할 때 PHP가 MySQL 데이터베이스에 연결하는 방법을 정의해야 합니다. 생성한 사용자의 로그인 자격 증명을 지정해야 하며 사용할 데이터베이스를 알려줘야 합니다.

<예비>

mysql_connect(\localhost”, \test”, \testing123”) 또는 die(mysql_error());

다음으로 테이블에 삽입한 데이터를 가져오는 데 필요한 쿼리를 설계해야 합니다. 이것을 $query 변수에 저장합니다.

그런 다음 memcached가 정보를 참조하는 데 사용할 키를 저장할 $querykey 변수를 만듭니다.

문자열 "KEY\를 사용한 다음 쿼리의 md5(해싱 방법) 체크섬을 끝에 추가하여 이 키를 만듭니다. 이렇게 하면 더 큰 데이터 세트에서 이 기술을 사용하는 경우 각 키가 고유합니다. 또한 일치하는 쿼리가 후속 요청에 대해 동일한 키를 생성하도록 합니다.

<예비>

mysql_connect(\localhost, \test, \testing123) 또는 die(mysql_error());

$query=\sample_data에서 ID 선택 WHERE 이름='some_data'”;

다음으로 마지막 스크립트와 마찬가지로 $result 변수를 생성합니다. 이것은 이전과 마찬가지로 memcached 쿼리의 결과를 보유합니다. 시스템에서 해당 키로 식별되는 레코드가 있는지 확인하기 위해 생성한 쿼리 키를 memcached에 요청하고 있습니다.

<예비>

mysql_connect(\localhost, \test, \testing123) 또는 die(mysql_error());

$query=\id가 1인 sample_data에서 이름 선택”;

$result=$mem->get($querykey);

이제 결과가 memcached에서 발견될 때 어떤 일이 발생할지 결정하는 실제 테스트 로직을 수행할 준비가 되었습니다. 결과가 발견되면 추출한 데이터를 인쇄하고 memcached에서 직접 검색할 수 있었다고 사용자에게 알리고 싶습니다.

<예비>

mysql_connect(\localhost, \test, \testing123) 또는 die(mysql_error());

$query=\id가 1인 sample_data에서 이름 선택”;

$result=$mem->get($querykey);

if ($result) {

이제 대체 시나리오에 대한 논리를 추가해 보겠습니다. 결과를 찾을 수 없으면 우리는 MySQL에 데이터를 요청하기 위해 만든 쿼리를 사용하려고 합니다. 우리는 이것을 우리가 만든 $result 변수에 저장할 것입니다. 이것은 배열의 형태가 될 것입니다.

쿼리 결과를 얻은 후에는 그 결과를 memcached에 추가해야 다음에 작업을 수행할 때 데이터가 거기에 있게 됩니다. 데이터를 참조하는 데 사용할 키($querykey 변수로 이미 생성함), 데이터 자체( $result MySQL 쿼리의 변수) 및 데이터를 캐시하는 시간(초)입니다.

콘텐츠를 10초 동안 캐시할 것입니다. 현실 세계에서는 콘텐츠를 더 오래 캐시하는 것이 가장 유익할 것입니다. 콘텐츠가 많이 변경되지 않는다면 아마도 10분(600초)에 가까울 것입니다. 테스트를 위해 더 작은 값을 사용하면 memcached 서비스를 다시 시작하지 않고도 상황을 더 빠르게 확인할 수 있습니다.

그런 다음 쿼리 결과와 함께 유사한 메시지를 출력하고 사용자에게 무슨 일이 일어났는지 알려줄 것입니다. 이 전체 블록을 이전 if에 대한 else로 추가해야 합니다.

<예비>

mysql_connect(\localhost, \test, \testing123) 또는 die(mysql_error());

$query=\id가 1인 sample_data에서 이름 선택”;

$result=$mem->get($querykey);

경우 ($결과) {

이것이 완성된 스크립트입니다. memcached에서 데이터를 가져오고 반환하려고 시도합니다. 실패하면 MySQL에서 직접 쿼리하고 결과를 10초 동안 캐시합니다.

스크립트 테스트

이제 스크립트를 작성했으므로 웹 브라우저에서 파일 위치로 이동하여 스크립트를 실행할 수 있습니다.

<예비>

페이지를 처음 방문하면 다음과 같은 출력이 표시됩니다.

이것을 새로 고치면(마지막 방문 후 10초 이내) 이제 페이지에 다른 메시지가 표시됩니다.

다시 조금 기다리면 캐시된 콘텐츠가 만료되고 memcached에서 다시 제거됩니다. 적절한 값을 얻으려면 서버가 데이터베이스로 돌아가야 하므로 이 시점에서 새로 고침하여 첫 번째 메시지를 다시 가져올 수 있습니다.

결론

지금쯤이면 memcached가 작동하는 방식과 이를 활용하여 웹 서버가 동일한 콘텐츠에 대해 반복적으로 데이터베이스에 도달하지 않도록 하는 방법을 충분히 이해했을 것입니다.

이 가이드에서 생성한 PHP 스크립트는 예제일 뿐이지만 시스템 작동 방식에 대한 좋은 아이디어를 제공해야 합니다. 또한 memcached를 확인하고 필요한 경우 데이터베이스에 폴백할 수 있도록 코드를 구조화하는 방법에 대한 좋은 아이디어를 제공해야 합니다.

저스틴 엘링우드