기본환경
사실 PHP 확장을 기반으로 한 Memcache 클라이언트는 실제로 오래 전에 구현되었으며 매우 안정적입니다. 먼저 몇 가지 용어를 설명하겠습니다. Memcache는 danga.com의 오픈 소스 프로젝트로 MySQL과 같은 서비스와 비교할 수 있습니다. PHP 확장 Memcache는 실제로 Memcache에 연결하는 방법입니다.
먼저 Memcache를 설치하는 방법에 대한 자세한 내용은 블로그의 여러 기사를 확인하세요.
둘째, PHP 확장 프로그램을 설치하세요. 공식 주소는 http://pecl.php.net/package/memcache
입니다.
마지막으로 Memcache 서비스를 시작합니다. 예를 들어 다양한 포트를 통해 여러 프로세스를 시작하여 배포를 시뮬레이션합니다.
매개변수 설명:
-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 프로세스를 닫아 데이터가 존재하는지 테스트할 수 있습니다. 예:
<?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); ?>
테스트 중에 그 중 하나를 끄면 데이터가 손실될 수 있습니다.
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 서버에 액세스하도록 합니다. 인트라넷 포트 및 인트라넷 액세스는 기타 불법 액세스를 효과적으로 방지할 수 있습니다.
设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网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服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。