>  기사  >  백엔드 개발  >  PHP 확장 Memcache 분산 배포 솔루션_php 기술

PHP 확장 Memcache 분산 배포 솔루션_php 기술

WBOY
WBOY원래의
2016-05-16 20:03:521023검색

기본환경

사실 PHP 확장을 기반으로 한 Memcache 클라이언트는 실제로 오래 전에 구현되었으며 매우 안정적입니다. 먼저 몇 가지 용어를 설명하겠습니다. Memcache는 danga.com의 오픈 소스 프로젝트로 MySQL과 같은 서비스와 비교할 수 있습니다. PHP 확장 Memcache는 실제로 Memcache에 연결하는 방법입니다.

먼저 Memcache를 설치하는 방법에 대한 자세한 내용은 블로그의 여러 기사를 확인하세요.
둘째, PHP 확장 프로그램을 설치하세요. 공식 주소는 http://pecl.php.net/package/memcache
입니다. 마지막으로 Memcache 서비스를 시작합니다. 예를 들어 다양한 포트를 통해 여러 프로세스를 시작하여 배포를 시뮬레이션합니다.

코드 복사 코드는 다음과 같습니다.
/usr/local/bin/memcached -d -p 11211 -u 루트 -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid

3개를 시작하고 테스트를 용이하게 하기 위해 10M 메모리만 사용하십시오.

매개변수 설명:

-d 옵션은 데몬 프로세스를 시작하는 것입니다.
-m은 Memcache에 할당된 메모리 양(MB)이며 여기서는 512MB입니다.
-u는 Memcache를 실행하는 사용자입니다. 여기서는 루트입니다.
-l은 청취 서버의 IP 주소입니다. 주소가 여러 개인 경우 서버의 IP 주소를 192.168.0.1로 지정했습니다.
-p는 Memcache가 수신 대기하는 포트를 설정하는 것입니다. 여기서는 11211을 설정했습니다. 1024 이상의 포트를 설정하는 것이 좋습니다.
-c 옵션은 실행할 수 있는 최대 동시 연결 수입니다. 기본값은 1024입니다. 여기서는 서버 부하에 따라 512로 설정했습니다.
-P는 Memcache를 저장할 pid 파일을 설정하는 것입니다. 여기에 저장합니다.

분산 배포

PHP PECL 확장의 Memcache는 실제로 버전 2.0.0에서 다중 서버 지원을 구현했으며 현재는 2.2.5입니다. 다음 코드를 참고하세요

$memcache = new Memcache;
$memcache->addServer('localhost', 11211);
$memcache->addServer('localhost', 11213);
$memcache->addServer('localhost', 11214);
$memStats = $memcache->getExtendedStats();
print_r($memStats);

위의 예시를 통해 Memcache의 분산 배포가 구현되었습니다. 정말 간단하지 않나요?

분산시스템의 건전한 운영

Memcache를 실제 사용하면서 가장 심각한 문제는 서버를 추가하거나 제거할 때 대규모 캐시 손실이 발생하여 데이터베이스 성능 병목 현상이 발생할 수 있다는 것입니다. 테스트하는 동안 memcached 프로세스를 닫아 데이터가 존재하는지 테스트할 수 있습니다. 예:

<&#63;php
//第一次设置值后再作注释

$memcache = new Memcache;
$memcache->addServer('localhost', 11211);

//$memcache->set("mykey", "这个值在11213添加前添加的");

$memcache->addServer('localhost', 11213);

if (!$memcache) echo "Connection to memcached failed";
  /*
  $memcache->set("str_key", "String to store in memcached");
  $memcache->set("num_key", 123);

  $object = new StdClass;
  $object->attribute = 'test';
  $memcache->set("obj_key", $object);

  $array = Array('assoc'=>123, 345, 567);
  $memcache->set("arr_key", $array);
  */

  var_dump($memcache->get('mykey'));
  var_dump($memcache->get('str_key'));
  var_dump($memcache->get('num_key'));
  var_dump($memcache->get('obj_key'));

$memStats = $memcache->getExtendedStats();
var_dump($memStats);
&#63;>

테스트 중에 그 중 하나를 끄면 데이터가 손실될 수 있습니다.

string '这个值在11213添加前添加的' (length=35)
string 'String to store in memcached' (length=28)
boolean false
boolean false

이런 상황을 방지하려면 먼저 일관된 해싱 알고리즘을 읽어보세요. 중국어 소개는 memcached 종합 분석을 참조하세요.-4. memcached의 분산 알고리즘은 선택한 서버의 알고리즘을 변경하여 구현됩니다. 액세스하는 동안.

Memcached를 "분산형" 캐시 서버라고 하지만 서버측에는 "분산형" 기능이 없습니다.

PHP의 Memcache 확장 memcache.c 소스 코드에서

수정

"memcache.hash_strategy" = 표준

에 대한

"memcache.hash_strategy" = 일관성
다시 컴파일하세요. 이번에는 일관성 있는 해싱 알고리즘을 사용하여 데이터에 액세스할 서버를 찾을 차례입니다.
효과적인 테스트 데이터에 따르면 일관된 해싱을 사용하면 Memcache를 추가하거나 삭제할 때 대규모 캐시 손실 상황이 크게 개선될 수 있습니다.

NonConsistentHash: 92% of lookups changed after adding a target to the existing 10
NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets
ConsistentHash: 6% of lookups changed after adding a target to the existing 10
ConsistentHash: 9% of lookups changed after removing 1 of 10 targets

보안 구성

Memcache 서버는 별도의 검증 과정 없이 클라이언트에 접속한 후 바로 작동합니다. 서버가 인터넷에 직접 노출된다면 최소한 데이터가 유출되어 관련 없는 사람이 볼 수 있으며, 최악의 경우에는 더욱 위험합니다. Mecache가 루트 권한으로 실행되고 서버에 알려지지 않은 버그나 버퍼 오버플로가 있을 수 있으므로 서버가 침입당할 수 있으므로 위험이 예상됩니다.

인트라넷 접속

두 서버 간, 일반적으로 웹 서버와 Memcache 서버 간 인트라넷 액세스를 사용하는 것이 가장 좋습니다. 일반 서버에는 두 개의 네트워크 카드가 있는데, 하나는 인터넷을 가리키고 다른 하나는 인트라넷 네트워크 카드를 통해 웹 서버가 Memcache 서버에 액세스하도록 합니다. 인트라넷 포트 및 인트라넷 액세스는 기타 불법 액세스를 효과적으로 방지할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid

Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接

设置防火墙

防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。 一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。

# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT


上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.