XE는 여러대의 서버를 사용하는 것에 대해서 크게 고려가 되어있지 않은 CMS 라서,
서버를 스케일업하는데 상당히 고생을 많이 했습니다.
이래저래 체득한 내용에 대해서 다른 사용자 분들과 공유해보고자 합니다.
일단 서비스 상황은,
PHP 의 CPU 부족량이 너무 심각해서, PHP 전용 서버 1대에서 -> 3~4대까지 스케일업을 고려해야하는 상황이었습니다.
일단 XE, 라이믹스는 기본적으로 파일캐시를 상당히 많이 사용하기 때문에,
코드를 어떻게 공유하냐 부터 첫번째 문제에 봉착하게 되었습니다.
1. 코드를 git 같은 코드 관리 시스템을 쓰던, rsync 를 쓰던 공유하고, 파일 캐시는 전부 없앤다.
2. NFS 를 통해서 코드와 파일캐시를 공유한다.
둘다 작업을 해봤습니다만, 결과적으로 선택한건 2번이었습니다.
저도 1번이 훨씬 효율적이라고 생각했습니다만,
php7 버전 이상대에서 제공되는 opcache 의 성능이 워낙 좋아서, 파일캐시를 없애고 memcache 등에 서브하는것보다,
파일캐시로 그냥 NFS 로 주고받는것이 훨씬 큰 어려움없이 쉽게 구축할수 있고 성능도 크게 떨어지지 않았습니다.
다만 opcache 를 매번 요청할때마다 체크하는 형식이면 비효율성이 크게 늘어나기 때문에 opcache 를 수동으로 초기화하기전에는 체크하지 않도록 설정해 두는것이 필요합니다.
그후에 두번쨰 문제는 memcache 문제였습니다.
사실 논리적으로는 1대의 memcache 서버에 모든 php 서버가 접근하는것이 가장 문제가 적은 서비스 구조입니다만,
object cache 에 다량의 연결을 하는 XE 방식으로는, (한번에 필요한 캐시 데이터를 모아서 가져오지 않는)
private network 라고 해도 네트워크 상으로 연결하게 되면 생각보다 많은 지연시간을 잡아먹게 되더라구요.
그래서 서버별로 memcache 를 설치하고,
memcache 를 flush 하거나 put 할때, 각 서버에 모두 리퀘스트를 날리는 방향으로 cache 시스템을 개조했습니다.
그 결과, php 서버 3대~4대 정도까지는 크게 서버 추가에 따른 큰 성능 저하 없이 다량의 리퀘스트를 처리할수 있었습니다.
글의 요점은,
1. php7 이상일경우 opcache 가 워낙 강력하게 커버해주기 때문에 그냥 NFS 연결같은걸로 편하게 붙여놓자.
2. memcache 등의 object cache 용도는 각 서버별로 연결해 두는것이 훨씬 좋다.
현재 1번 방식과 2번 방식을 모두 운영중인데, 1번 방식이 다루기 더 까다롭습니다.
혹시 2번 NFS 방식은 어떤 방식을 사용하셨나요? 참조할 만한 곳 있을까요?