Redis Clients PREDIS

Redis Developer Course Redis Technical Support Redis Enterprise Server

Redis Clients PHPREDIS

Predis는 PHP 레디스 클라이언트입니다.   이 글은 주로 Rredis와 레디스 클러스터 테스트를 다룹니다.

이 문서는 버전 3.2.0을 기준으로 만들었습니다.

목차



테스트 준비: 레디스 클러스터 설치, PHP 소스

레디스 클러스터 설치

이전에 테스트한 phpredis와 같이 6개의 레디스 인스턴스로 구성했습니다.   여기서는 마스터, 슬레이브만 표시했습니다.   좀 자세한 내용을 보려면 바로 위 메뉴에 있는 phpredis을 참조하세요.

  • 마스터: 7000, 7001, 7002
  • 슬레이브: 7003, 7004, 7005

PHP 소스 설명

  • 클러스터 접속: $conn = new Predis\Client(IP:Port, $options);
  • 입력 SET: $conn->set("key1","value1")
  • 조회 GET: $conn->get("key1")

PHP 소스





Predis 클러스터 테스트

테스트 케이스


Case1) 정상 상태인 경우

웹 브라우저에서 테스트 페이지를 실행했다. 아래는 실행 결과 화면을 캡처한 것이다.

Predis cluster test
    그림 1-1   Predis Redis Cluster 테스트 결과 화면

Predis\Client()를 실행하면 Predis에서 IP와 Port를 이용해서 클러스터 정보 읽어와서 Predis에 저장한다.   클러스터 정보는 서버가 마스터인지 슬레이브인지, 각 마스터에 할당된 슬롯 정보 등이다.
Predis는 레디스 서버와 동일한 해시 함수를 가지고 있어서 입력받은 키(key)를 슬롯 번호로 변환한다.   그리고 가지고 있는 클러스터 정보와 비교해서 어느 서버에 저장할지 정한다.   그래서 $conn->set() 명령을 실행하면 어느 서버로 저장할지 개발자가 지정하지 않아도 Rredis가 알아서 저장한다.


Case2) 마스터 서버 하나가 다운될 경우

  • 3번 서버 7002을 redis-cli로 shutdown 시킨다.
  • [redis-3.2.0]# src/redis-cli -p 7002 shutdown
  • 다운 직후 테스트 페이지를 실행하면 key1,2,3번은 입력되고 key4에서 에러가 난다.
  • Predis cluster test error
        그림 1-2   Predis Redis Cluster 마스터 서버 다운 직후 테스트 결과 화면
  • 잠시 후에 다시 시도하면 key1부터 key6까지 에러 없이 입력된다.
  • 레디스 클러스터에서 7002번이 다운되었다는 것을 인지하고, 슬레이브인 7005번 서버가 마스터로 승격되는 시간은 cluster-node-timeout 파라미터 설정에 따라 다르다.   디폴트는 15초이고, 본 테스트에서는 3초로 설정했다.
  • 이렇게 변경된 레디스 클러스터 정보를 Predis가 읽어와서 적용하는 시간이 소요되고, 적용 후에는 에러 없이 정상적으로 처리된다.
  • 정리하면, 마스터 다운 시 정상적으로 복구되었다면 Predis도 해당 정보를 읽어와서 정상적인 처리를 한다.

Case3) 마스터 서버 하나의 모든 슬롯을 다른 서버로 재 할당(resharding)한 경우

현재 레디스 클러스터 상태

마스터 3대: 7000, 7001, 7005
슬레이브 2대: 7003, 7004
다운 1대: 7002

  • 7005번에 할당된 슬롯 5461개 모두 redis-trib.rb reshard 명령을 이용해서 7001번 서버로 옮긴다.
  • 테스트 페이지를 실행하면 정상적으로 처리되다.   PhpRedis에서는 슬롯을 가지고 있는 마스터가 2대 이하면 에러를 냈지만, Predis에서는 아무 문제없이 정상 처리되었다.

Case4) 마스터 서버 한 대를 추가하고 슬롯을 재 할당(resharding)한 경우

이전에 shutdown 시켰던 7002 서버를 클러스터에서 제거한 후 다시 새 마스터로 추가한다.

  • 클러스터에서 제거: cluster forget node-id 명령으로 제거한다.   이 명령은 한 노드에서만 실행하면 안 되고, 마스터, 슬레이브 관계없이 클러스터 모든 노드에서 해야 한다.
    이때는 redis-trib del-node를 사용할 수 없다.   왜냐하면 del-node는 서버가 살아있을 때만 가능하다.
  • [redis-3.2.0]# src/redis-cli -p 7000 cluster forget 2cde84c7040324...f7b78eeb
    7002를 제외하고 다른 노드에서도 실행한다.
  • 7000번 서버를 재 시작하기 전에 7000 디렉터리 아래에 redis.conf 만 남기고 nodes.conf, appendonly.aof 같은 다른 파일은 모두 삭제한다.
  • 서버를 재 시작한다.
  • [redis-3.2.0]# src/redis-server 7002/redis.conf
  • 클러스터에 서버를 추가한다.
  • [redis-3.2.0]# src/redis-trib.rb add-node 127.0.0.1:7002 127.0.0.1:7000
  • 7001번 서버에서 7002번 서버로 슬롯 500개를 할당한다.
  • [redis-3.2.0]# src/redis-trib.rb reshard 127.0.0.1:7000
  • 테스트 페이지를 실행하면 정상적으로 수행된다.
  • 정리하면 노드 추가 시 Predis에서 정상적으로 처리한다.   하지만, 노드 추가, 슬롯 할당 작업과 Predis에서 변경된 클러스터 정보 업데이트 시간이 필요하므로 정비 시간을 가지고 처리할 것을 권고합니다.

Case5) 마스터 서버 한 대를 제거한 경우

이번에는 7000 서버를 클러스터에서 제거한다.   클러스터에서 제거할 노드가 슬롯을 가지고 있으면 제거되지 않으므로, 7000번 서버가 가지고 있는 슬롯을 7005번 노드에 재 할당한다.

  • 슬롯 재 할당
  • [redis-3.2.0]# src/redis-trib.rb reshard 127.0.0.1:7000
  • 노드 제거
  • [redis-3.2.0]# src/redis-trib.rb del-node 127.0.0.1:7001 322ad736e...dd218b
  • 테스트 페이지를 실행하면 정상적으로 처리된다.

테스트 정리

모든 테스트 케이스에서 개발자가 특별히 해 주어야 할 것 없이 정상적으로 처리되었다.   PhpRedis에서는 슬롯이 할당된 마스터 서버가 2대 이하면 접속 에러가 발생했지만 Predis에서는 문제없이 처리되었다.


접속 테스트

Rredis로 접속할 때 클러스터의 모든 IP:Port를 지정하지 않아도 된다.
마스터, 슬레이브 관계없이 하나만 지정해도 된다.   여러 개를 지정해도 첫 번째 지정한 노드에서 클러스터 정보를 얻어오는 것으로 보인다.   그런데 이렇게 하나만 지정하면 그 서버가 다운되었을 경우에는 접속할 수 없게 되므로 가능한 모든 노드를 지정하는 것이 좋다.
현재 없는 노드를 지정해도 된다.   이것은 클러스터에서는 클러스터를 구성하고 있는 서버가 다운될 것을 가정하고 클러스터를 구성하는 것이므로, 현재 없는 노드/다운된 노드를 지정해도 에러를 발생시키지 않는 것이 당연한다.


조회 명령은 슬레이브 노드에서 처리하는 방법

$options = ['replication' => true];   이런 옵션이 있어서 테스트해보았는데, 클러스터가 아닌 마스터, 슬레이브 구성에서 슬레이브로 조회 명령을 처리하게 할 수 있는 것으로 보인다.
Predis는 조회 명령을 슬레이브에서 처리할 수 있는 방법을 아시면 redisgate@gmail.com로 알려주시면 고맙겠습니다.



Predis 직접 접속 테스트

여기서는 레디스 서버에 IP와 Port를 직접 지정해서 접속하는 방법을 설명한다.
이것은 클러스터를 사용하지 않고 단독 서버를 사용할 경우와 클러스터를 사용해도 INFO 같은 서버 명령은 특정 서버에 접속해서만 실행할 수 있기 때문이다.
직접 접속은 $options을 지정하지 않으면 된다.

$params = ['tcp://127.0.0.1:6000'];
$conn = new Predis\Client($params);



Predis 설치

Predis 설치

Predis 설치는 웹 설치 명령 요약: Composer를 이용한 설치.
본 작업은 Web root 디렉터리에서 한다.

cURL을 이용해서 Composer 설치하기
Predis용 composer.json 파일 만들기
Predis 설치

개인적으로 Composer를 이해하는데 시간이 좀 걸렸고, Predis를 웹 디렉터리에 설치하지 않고 home 디렉터리에 설치해서, 테스트가 잘 되지 않아 고생 좀 했습니다.

진행과정

  • cURL을 이용해서 Composer 설치하기

  • Predis용 composer.json 파일 만들기: Composer로 Predis를 설치하기 위해서이다.
  • Predis 설치: php composer.phar install
  • Composer의 vendor 디렉터리를 Predis로 변경한다.



참고 자료

  • Predis에 대한 더 자세한 내용은 Predis 공식 홈페이지를 참고하세요.
  • cURL , 아래는 crul -sS 옵션에 대한 설명입니다.

<< Table PREDIS Server Configuration >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.