1. 메모리 캐싱 방법(APCu, Redis, Memcached)
ubuntu에서 사용할 수 있는 메모리 캐싱 방법으로 APCu, Redis, Memcached 가 있습니다. 각각의 캐싱 도구는 다양한 용도와 요구 사항에 맞게 선택해야 합니다.
- 예를 들어, APCu는 PHP 코드의 성능을 향상시킬 수 있지만 단일 서버에서만 사용 가능하므로 분산 환경에는 적합하지 않습니다.
- Redis는 다양한 데이터 구조와 클러스터링 기능을 제공하여 복잡한 애플리케이션에 적합합니다.
- Memcached는 분산 환경에서 대규모 처리량을 지원하기 위해 설계되었습니다.
1) APCu (Alternative PHP Cache user caching)
APCu는 PHP 확장 기능으로서 로컬 서버 내에서 데이터를 캐시하는 데 사용되며 단일 서버 환경에서 사용하기 적합합니다. APCu는 프로세스 간 데이터 공유가 불가능하며, 데이터는 해당 프로세스에서만 유지됩니다.
- PHP용 메모리 캐싱 시스템입니다.
- PHP 코드에 직접 접근하여 데이터를 캐싱할 수 있습니다.
- 단일 서버에서만 사용 가능하며 분산 환경에는 적합하지 않습니다.
- APCu는 기본적으로 메모리에 데이터를 저장하므로 빠른 읽기/쓰기 속도를 제공합니다.
- 그러나 APCu는 데이터 유지 및 복제를 지원하지 않으므로 서버 장애 시 데이터 손실 가능성이 있습니다.
2) Redis
Redis는 오픈 소스 인메모리 데이터 구조 저장소로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장하고 디스크에 지속적으로 저장할 수 있습니다. 다양한 데이터 구조 (문자열, 해시, 리스트, 세트 등)를 지원하며 Pub/Sub 메커니즘을 통해 메시지 브로커로도 사용할 수 있습니다.
- 단일 스레드로 작동하며, 이벤트 기반 아키텍처를 사용하여 동시성 문제를 해결합니다.
- 문자열, 해시, 목록, 세트, 정렬된 세트 등 다양한 데이터 구조를 지원합니다..
- Publish/Subscribe (Pub/Sub) 메커니즘을 지원하여 메시지 기반 아키텍처를 구축할 수 있습니다
- 마스터-슬레이브 복제 및 Redis 클러스터와 같은 분산 시스템을 지원합니다.
- 다양한 성능 모니터링 및 관리 도구를 제공하여 데이터베이스 인스턴스의 상태를 모니터링하고 성능을 최적화할 수 있습니다.
3) Memcached
Memcached는 분산 메모리 객체 캐시 시스템으로 다중 서버 환경에서 스케일 아웃이 가능하며, 데이터를 메모리에 저장합니다. 데이터는 키-값 형태로 저장되며, 복잡한 데이터 구조를 지원하지 않습니다.
- 분산 객체 캐싱 시스템입니다.
- 키-값 형태의 데이터를 저장하고 검색하는 데 사용됩니다.
- 분산 환경에서 사용하기 적합하며, 여러 서버 간에 데이터를 공유할 수 있습니다.
- Memcached는 단순한 키-값 저장소로서 복잡한 데이터 구조를 지원하지 않습니다.
- 메모리 사용량이 크고, 디스크에 데이터를 저장하지 않으므로 서버 장애 시 데이터 손실 가능성이 있습니다.
일반적으로 APCu, Redis 및 Memcached 모두 설치하고 운영할 수 있습니다.
모든 시스템을 동시에 운영할 때는 서버 리소스 (메모리 및 CPU)를 고려해야 하며, 각 캐시 시스템의 설정과 운영 방법을 이해하고 최적화해야 합니다. 또한 데이터 일관성과 동기화 문제도 고려해야 합니다.
2. APCu 캐싱
1) APCu 설치
APCu를 설치하기 위해 다음 명령어를 실행합니다.
sudo apt install php8.2-apcu
2) APCu 활성화(acpu.ini)
PHP 설정 파일을 열기 위해 다음 명령어를 실행합니다. php 버전은 서버에 설치된 php 버전을 입력합니다.
Apache 웹 서버를 사용한다면 /etc/php/8.2/apache2/php.ini
을 수정해야 합니다.
sudo nano /etc/php/8.2/apache2/php.ini
PHP-FPM (PHP FastCGI Process Manager)에서 php를 사용한다면 sudo nano /etc/php/8.2/fpm/php.ini
를 수정하거나 acpu.ini
파일을 수정합니다.
만약 acpu.ini
파일이 없다면 /etc/php/8.2/mods-available/apcu.ini
파일을 생성하고 다음 내용을 붙여 넣습니다.
sudo nano /etc/php/8.2/mods-available/apcu.ini
extension = apcu.so
apc.enabled = 1
다음 명령어로 apcu 모듈을 활성화합니다.
sudo phpenmod -v 8.2 apcu
nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.
sudo systemctl restart nginx
3) APCu 실행 확인(acpu.ini)
아래 명령어를 실행해서 phpinfo() 함수의 결과를 출력하고 APCu 관련 설정, 버전 정보, 디렉토리 경로 등을 확인할 수 있습니다.
php -i | grep apcu
1. Redis 캐싱
1) Redis 설치
Redis를 설치하기 위해 다음 명령어를 실행합니다. 설치가 완료되면 Redis 서버가 자동으로 시작됩니다
sudo apt install redis-server
2) Redis 상태 확인
서비스 상태를 확인하기 위해 다음 명령어를 실행합니다.
Redis 서버가 정상적으로 실행 중인지 확인한 후, 필요에 따라 Redis 구성 파일을 수정할 수 있습니다. 구성 파일은 /etc/redis/redis.conf
경로에 위치해 있습니다
sudo systemctl status redis-server
sudo usermod -a -G redis www-data
3) 방화벽 설정(iptables)
redis-server
가 사용하는 6379 port 를 개방하고 iptable을 저장 및 리로드 합니다.
sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
sudo netfilter-persistent save
sudo netfilter-persistent reload
4) Redis와 php 연동
Redis PHP 확장 모듈을 설치합니다.
sudo apt install php8.2-redis
nginx 서버를 재시작하여 변경 사항이 적용되도록 합니다.
sudo systemctl restart nginx
5) Redis 활성화(redis.ini)
sudo nano /etc/php/8.2/mods-available/redis.ini
에서 아래 코드를 추가합니다.
sudo nano /etc/php/8.2/mods-available/redis.ini
extension = redis.so
PHP-FPM 서버를 재시작합니다.
sudo systemctl restart php8.2-fpm
새로운 PHP 파일을 생성하고 다음과 같은 코드를 작성하여 Redis와의 연결 및 작업을 확인할 수 있습니다(value 출력)
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
// 문자열 저장 및 조회 예제
$redis->set("key", "value");
echo $redis->get("key");
// 해시 저장 및 조회 예제
$redis->hSet("hash", "field", "value");
echo $redis->hGet("hash", "field");
// 연결 종료
$redis->close();
?>
2. Memcached 캐싱
1) Memcached 설치
Memcache를 설치하기 위해 다음 명령어를 실행합니다.
sudo apt install memcached
2) Memcached 서비스 시작
다음 명령어를 실행해서 Memcached 서비스를 시작합니다.
sudo systemctl start memcached
sudo systemctl status memcached
Memcached 서비스가 부팅시 자동으로 시작되도록 아래 코드를 실행합니다.
sudo systemctl enable memcached
3) 방화벽 설정(iptables)
Memcached는 localhost(127.0.0.1)의 11211 포트에서 실행됩니다.
Memcached가 실행되도록 iptables 11211 포트를 개방합니다.
sudo iptables -A INPUT -p tcp --dport 11211 -j ACCEPT
sudo netfilter-persistent save
sudo netfilter-persistent reload
추가로, Memcached를 사용하는 애플리케이션 구성을 위해 다음과 같은 설정 파일을 편집할 수 있습니다:
- 메모리 할당량 수정:
/etc/memcached.conf
파일에서-m
옵션 값을 수정하여 할당량을 조정할 수 있습니다. - 바인딩 주소 수정:
/etc/memcached.conf
파일에서-l
옵션 값을 변경하여 다른 IP 주소로 바인딩할 수 있습니다. - 포트 수정:
/etc/memcached.conf
파일에서-p
옵션 값을 변경하여 다른 포트 번호로 설정할 수 있습니다.
4) PHP 연동(php.ini)
아래 명령어를 실행해서 패키지를 설치합니다.
sudo apt install php8.2-memcached
/etc/php/8.2/fpm/php.ini
파일 또는 /etc/php/8.2/mods-avaiable/memcached.ini
에서 extension=memcached.so
라인을 찾아 주석 해제하고 저장합니다.
sudo nano /etc/php/8.2/mods-available/memcached.ini
5) Memcached 작동 확인
다음 코드를 사용하여 Memcached 서버에 연결하고 값을 저장하고 검색하며 테스트 할 수 있습니다.(value 출력 정상)
<?php
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$memcached->set('key', 'value', 60); // 60초 동안 값 저장
$value = $memcached->get('key');
echo $value; // 저장된 값 출력
?>
4. 추가 학습 자료
APCu, Redis, Memcached와 관련된 공식 문서 및 참고 자료 링크입니다
1) APCu
- APCu 공식 문서: https://www.php.net/manual/en/book.apcu.php
- “APCu: User Caching and Optimization” (정보 및 예제 포함): https://www.sitepoint.com/caching-with-apcu/
- “APCu vs Redis vs Memcached” (비교 및 성능 테스트): https://haydenjames.io/apcu-vs-redis-vs-memcached/
2) Redis
- Redis 공식 문서: https://redis.io/documentation
- “Redis Basics for Beginners” (기본 개념 소개): https://www.digitalocean.com/community/tutorials/redis-basics-for-beginners
- “Redis Tutorial” (예제와 함께 Redis 학습): https://www.tutorialspoint.com/redis/index.htm
3) Memcached
- Memcached 공식 문서: https://memcached.org/documentation
- “Memcached Tutorial” (기본 개념과 예제 포함): https://www.tutorialspoint.com/memcached/index.htm
- “Introduction to Memcached” (Memcached 소개 및 사용 사례): https://phoenixnap.com/kb/memcached-tutorial