laravel predis phpiredis 설치하기

Updated on

aws elasticache 를 이용하는데에 있어서,
laravel phpredis에서는 read, write를 자동으로 나눠주지 않는다.
하지만, aws redis는 cluster 또는 싱글 복제 모드만 지원한다…

아직까지, laravel 에서는 aws redis cluster 를 사용하기에는.. 뭔가 부족한거같다. 내 공부가 부족한걸수도.

이걸 나누기 위해서는, haproxy나 twemproxy 나 dynomite 를 사용하라고는 하는데…

이렇게 세팅해서 구성하면 더 좋을 수도 있겠지만, 그냥 나는 predis를 사용하기로 했다.
haproxy 를 사용하게 되면, 고가용성으로 또 서버를 구축해줘야하고, 그렇게 됬다가, haproxy가 문제 되면 아예 사용을 못하는 상황이 올 수도 있으니.

predis의 최대의 단점은 phpredis보다 속도가 10% ~ 100% 까지 loss가 있다는 거다.

아무튼, 설치 방법은
predis 를 설치하면되는데, 여기에 C로 작업된 phpiredis를 이용하여 성능 손실을 개선할 수 있다는 내용이 있다.

# Install
RUN cd /usr/src/ \
    && curl -fsSL https://github.com/redis/hiredis/archive/v1.0.2.tar.gz -o hiredis.tar.gz \
    && mkdir -p hiredis \
    && tar -xf hiredis.tar.gz -C hiredis --strip-components=1 \
    && cd hiredis \
    && make \
    && make install \
    && cp hiredis.h /usr/include/hiredis \
    && ldconfig

이렇게 하여, hiredis를 설치해준다. (phpiredis는 이것을 필요로 함)

# Install phpiredis
 && cd /usr/src/php/ext \
 && curl -fsSL https://github.com/nrk/phpiredis/archive/v1.1.tar.gz -o phpiredis.tar.gz \
 && mkdir -p phpiredis \
 && tar -xf phpiredis.tar.gz -C phpiredis --strip-components=1 \
 && rm phpiredis.tar.gz \
 && docker-php-ext-configure phpiredis --enable-phpiredis \
 && docker-php-ext-install phpiredis \
 && rm -rf phpiredis \

이렇게 하여금, 최신 버젼인 1.1을 설치해준다.

그러면 위와 같이 될 것이다.

        'client' => env('REDIS_CLIENT', 'phpredis'),
        'cluster' => true,
        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
            'replication' => true,
            'connections' => [
                'tcp'  => 'Predis\Connection\PhpiredisStreamConnection',  // PHP stream resources
                'unix' => 'Predis\Connection\PhpiredisSocketConnection',  // ext-socket resources
            ],
        ],

        'clusters' => [
            'default' => [
                // masters
                [
                    'host' => env('REDIS_SHARD_1_HOST', '127.0.0.1'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_SHARD_1_PORT', 6379),
                    'database' => 0,
                    'alias' => 'master',
                    'read_write_timeout' => 60,
                ],
                // slaves (replicas)
                [
                    'host' => env('REDIS_SHARD_1_HOST_REPLICA', '127.0.0.1'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_SHARD_1_PORT_REPLICA', 6379),
                    'database' => 0,
                    'read_write_timeout' => 60,
                ],
            ],
        ],

그 상태에서 위 database config 를 설정해주면 된다.

REDIS_CLIENT=predis

당연히 위 값을 설정해주어야만 된다.

그러면 잘 된다…

그런데 여기서 문제는, 아무리 테스트를 돌려봐도,

‘tcp’ => ‘Predis\Connection\PhpiredisStreamConnection’,

를 사용한거나 안한거나 속도 성능 개선에 전혀 달라지는게 없다는거다 !!

아마도 pipeline 형태로 쏘는 redis query 문에서는 성능 개선의 효과를 보는 것이 아닐까 ?

흠…