본문 바로가기
서버 및 보안

Redis

by 다움위키 2023. 11. 28.

Redis 그리고 미디어위키

Redis (/ˈrɛdɪs/; Remote Dictionary Server)는 인-메모리 데이터 구조 창고로, 선택적 내구성을 갖는 분산된, 인-메모리 키-값 데이터베이스, 캐시, 및 메시지 브로커로 사용됩니다. Redis는 문자열, 목록, , 집합, 정렬된 집합, 하이퍼로그로그, 비트맵, 스트림, 및 공간 인덱스와 같은 다양한 종류의 추상 데이터 구조를 지원합니다. 그 프로젝트는 Salvatore Sanfilippo에 의해 개발되고 유지-관리되었습니다. 2015년부터 2020년까지, 그는 Redis Labs에 의해 후원되는 프로젝트 핵심 팀을 이끌었습니다. Salvatore Sanfilippo는 2020년에 유지 관리자로서 Redis를 떠났습니다. 그것은 BSD 3-clause 라이선스에 따라 출시된 오픈-소스 소프트웨어입니다. 2021년에, 원저자이자 주요 유지-관리자가 떠난 지 얼마 되지 않아, Redis Labs는 그것의 이름에서 Labs를 버리고 현재는 redis, 오픈 소스 DB와 마찬가지로 Redis Labs, 상용 회사가 "redis"라고 참조됩니다.

Installation

먼저 Redis 인스턴스를 구성하고, PHP에 대해 Redis 클라이언트 라이브러리를 설치해야 합니다. 대부분의 환경에서는 phpredis PHP 확장이 요구됩니다. Ondrej 저장소로부터 패키지가 제공되므로 다음과 같이 설치할 수 있습니다:

  • sudo apt install redis-server php8.1-redis

Ondrej 저장소를 추가하지 않았으면,

  • sudo apt install redis-server php7.4-redis

만약 좀 더 최신의 버전을 사용하고 싶다면, 백포트에서 설치할 수 있습니다:

  • sudo apt install redis-server/bullseye-backports

Ubuntu

최근 버전을 사용하고 싶다면, PPA에서 설치할 수 있습니다:

  • sudo add-apt-repository ppa:redislabs/redis
  • sudo apt update
  • sudo apt upgrade

Configuration

구성 파일을 설치 중에 자동으로 생성되며, 몇 가지 사항을 수정합니다.

먼저, 파일 내부에서 supervised 지시어를 찾습니다. 이 지시어는 서비스로 Redis를 관리하는 init 시스템을 선언하는 것을 허용하고, 운영에 대한 제어 기능이 향상됩니다. 기본값은 no로 설정되어 있으므로, systemd init 시스템을 사용하도록 수정합니다:

  • sudo nano /etc/redis/redis.conf
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

그런 다음 구성 파일의 변경 사항을 반영하기 위해 Redis 서비스를 다시 시작합니다.

  • sudo systemctl restart redis-server

Set Password

설정 파일에서 requirepass로 검색을 하면, 아래의 줄을 주석 해제하고 foobared 대신에 자신의 암호를 적어줍니다: 이 경우에는 사용하려는 프로그램에서 암호 설정을 하셔야 합니다.

# requirepass foobared

Basic System Tuning

Redis의 성능을 향상하려면 리눅스 커널 설정을 다음과 같이 조정하십시오.

  • sudo sysctl vm.overcommit_memory=1

부팅 때마다 적용하기 위해서 /etc/sysctl.conf에 적어둡니다.

  • vm.overcommit_memory = 1

Test

다른 구성을 변경하기 전에 Redis가 예상대로 동작하는지 확인할 필요가 있습니다.

먼저 서비스가 동작 중인지 확인을 합니다.

  • sudo systemctl status redis-server
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-09-28 16:44:42 KST; 2h 35min ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
  Process: 11805 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 11811 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 11834 (redis-server)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/redis-server.service
           └─11834 /usr/bin/redis-server 127.0.0.1:6379

Sep 28 16:44:42 dawoum systemd[1]: Starting Advanced key-value store...
Sep 28 16:44:42 dawoum systemd[1]: redis-server.service: Can't open PID file 
Sep 28 16:44:42 dawoum systemd[1]: Started Advanced key-value store.

Redis가 올바르게 작동하는지 확인하기 위해, 명령-줄 클라이언트를 사용하여 서버에 연결합니다. 그리고 ping 명령을 입렵합니다.

  • redis-cli
127.0.0.1:6379> ping
PONG

위와 같이 PONG을 출력하며, 이것은 서버 연결이 잘 되고 있음을 의미합니다.

이제 캐싱이 되는지 확인할 차례입니다. 다음 순서로 이루어집니다.

  1. 하나의 키에 값을 할당합니다.
  2. 해당 키에 저장된 값이 출력되는지 확인합니다.
  3. 서비스를 다시 시작합니다.
  4. 해당 키를 다시 불렀을 때 그 값이 출력되는지 확인합니다.

먼저 1, 2번 과정을 수행합니다.

  • redis-cli
127.0.0.1:6379> set test "It's working!"
OK
127.0.0.1:6379> get test
"It's working!"
127.0.0.1:6379> exit

3번 서비스를 재시작합니다.

  • sudo systemctl restart redis-server

4번 해당 키를 불러봅니다.

  • redis-cli
127.0.0.1:6379> get test
"It's working!"

이것으로 Redis 설치가 작동하고 있고, 사용할 준비가 되었음을 알 수 있습니다.

Using Docker

먼저 도커를 구성해야 하는데, Docker_(software)#Installations를 참조하십시오.

다음과 같이 설치하고, 실행하십시오:

  • docker pull redis
  • docker run --name test-redis -d -p 6379:6379 redis

물론, 기존에 redis를 독립프로그램으로 실행중이었으면, 중지해야 포트를 이용할 수 있습니다:

  • sudo systemctl stop redis

MediaWiki Configuration

단 시일 내에 중요한 시스템 환경을 너무 많이 구축하다보니, 시스템에 심각한 문제가 생겼습니다. 정확히 무엇이 문제인지 확인이 불가능하지만, redis를 죽이고 memcached를 사용하면 정상 작동합니다. 이 문제는 해결이 되지 않았습니다. 추정해 보면, 아마도 Manual:Job queue를 실행하는 스크립트의 경로를 수정하지 않음으로써, Redis와 key와 value 값이 매칭이 되지 않게 입력되었던 것으로 추정됩니다. Redis 캐시를 삭제하고 서비스를 다시 시작해 봅니다.
  • redis-cli
127.0.0.1:6379> FLUSHALL
127.0.0.1:6379> FLUSHALL ASYNC
127.0.0.1:6379> exit

먼저 이전에 남아 있을 수 있는 Job을 전부 비웁니다.

  • sudo systemctl stop memcached.service
  • sudo systemctl disable memcached.service
  • cd /var/www/html/w
  • php maintenance/runJobs.php
  • sudo systemctl restart php7.3-fpm.service

미디어위키에서 이전에 사용하던 Memcached 대신에 Redis를 사용하도록 설정을 변경해야 합니다. LocalSettings.php에 씁니다.

## Shared memory settings for MEMCACHED
#$wgMainCacheType = CACHE_MEMCACHED;
#$wgParserCacheType = CACHE_MEMCACHED; # optional
#$wgMessageCacheType = CACHE_MEMCACHED; # optional
#$wgMemCachedServers = [ '127.0.0.1:11211' ];
#$wgSessionsInObjectCache = true; # optional
#$wgSessionCacheType = CACHE_MEMCACHED; # optional
#$wgSessionsInMemcached = true; # optional
#$wgUseMemCached = true;
## for redis
/** @see RedisBagOStuff for a full explanation of these options. **/
$wgObjectCaches['redis'] = array(
    'class'                => 'RedisBagOStuff',
    'servers'              => array( '127.0.0.1:6379' ),
    // 'connectTimeout'    => 1,
    // 'persistent'        => false,
    // 'password'          => 'secret',
    // 'automaticFailOver' => true,
);
$wgMainCacheType = 'redis';
$wgSessionCacheType = 'redis';  // same as WMF prod
$wgMessageCacheType = 'redis';
$wgParserCacheType = 'redis';
$wgLanguageConverterCacheType = 'redis';

Job queue

$wgJobTypeConf['default'] = [
    'class'          => 'JobQueueRedis',
    'redisServer'    => '127.0.0.1:6379',
    'redisConfig'    => [],
    'claimTTL'       => 3600,
    'daemonized'     => true
 ];

그 순간부터 지정된 서버를 실행하는 Redis 인스턴스로 작업이 전달됩니다.

Troubleshooting

pidfile message

다음과 같이 메시지가 출력됩니다:

  • sudo systemctl status redis.service

redis-server.service: Can't open PID file /run/redis/redis-server.pid (yet?) after start: Operation not permitted

아래와 같이 시작 스트립트를 수정합니다.

  • cp /lib/systemd/system/redis-server.pid /etc/systemd/system/
  • sudo gvim /etc/systemd/system/redis-server.service

[Service] Type=forking ExecStart=/usr/bin/redis-server /etc/redis/redis.conf ExecStartPost=/bin/sleep 1 # 이 줄 추가. ExecStop=/bin/kill -s TERM $MAINPID PIDFile=/run/redis/redis-server.pid

아래와 같이 재시작하고, 확인을 합니다.

  • sudo systemctl daemon-reload
  • sudo systemctl restart redis-server.service
  • sudo systemctl status redis-server.service

php-redis

새로운 php가 출시되면, php-luasandbox, php-redis를 컴파일해야 합니다. Php-luasandbox는 rebuild가 쉽게 되지만, php-redis는, 아직은 해결책이 없은, 오류가 생기면서 모듈이 생기지 않습니다.

어쨌든, PPA에서 소스를 가져와서

  • sudo apt install php-all-dev
  • phpize
  • ./configure
  • make

모듈을 정해진 위치로 옮기고, 이전 버전과 마찬가지로 환경설정 파일을 만듭니다.

  • sudo cp modules/redis.so /usr/lib/php/20190902/
  • sudo cp /etc/php/7.3/mods-available/redis.ini /etc/php/7.4/mods-available
  • cd /etc/php/7.4/fpm/conf.d
  • sudo ln -sf /etc/php/7.4/mods-available/redis.ini 20-redis.ini
  • cd /etc/php/7.4/cli/conf.d
  • sudo ln -sf /etc/php/7.4/mods-available/redis.ini 20-redis.ini

job queue에 필요하기 때문에, 반드시 만들어야 합니다. 시스템에 엄청한 부하를 유발할 수 있기 때문에 설정이 필요합니다.

  • sudo systemctl restart php7.4-fpm

이후에 nginx에서 php를 최신판으로 바꾸고 서비스를 재시작하십시오.

FLUSHALL and FLUSHDB

바니쉬를 HTTPS에서 사용해 보고자 설정을 수정하던 중에, 어느 순간 이미지 로딩이 되지 않는 문제가 발생했습니다. 다음 두 명령이 도움이 됩니다.

  • rebuildAll.php refreshLinks.php, runJobs.php를 수행해 볼 수 있고, 다음 두 명령으로 최종 이미지가 전부 연결이 되었습니다.
  • redis-cli FLUSHALL
  • redis-cli FLUSHDB

또는, 시스템의 IP 주소가 바뀌고 나서, 홈페이지 접근 시간이 오래 걸리면, 이 명령이 도움이 되기도 하는 것으로 보입니다.

Disk Usage

어느날 SDD의 남은 용량이 갑자기 작아져서 확인을 해보니, 다음 파일이 85G 이상을 차지하고 있습니다.

  • /var/lib/redis/appendonly.aof

설정 파일 /etc/redis/redis.conf에서 appendonly yes로 바꾸면 생기는 파일입니다. 이것을 no로 바꾸고 제거해도 상관없습니다.

Further reading

External links