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번 과정을 수행합니다.
- 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 캐시를 삭제하고 서비스를 다시 시작해 봅니다.
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
- Jeremy Zawodny, Redis: Lightweight key/value Store That Goes the Extra Mile, Linux Magazine, August 31, 2009
- Isabel Drost and Jan Lehnard (29 October 2009), Happenings: NoSQL Conference, Berlin, The H. Slides for the Redis presentation. Summary.
- Billy Newport (IBM): "Evolving the Key/Value Programming Model to a Higher Level" Qcon Conference 2009 San Francisco.
- A Mishra: "Install and configure Redis on Centos/ Fedora server".
- E. Mouzakitis: "Monitoring Redis Performance"