웹사이트 검색

Ubuntu 14.04에서 Redis 클러스터를 구성하는 방법


소개

Redis는 지속성을 위해 선택적 디스크 쓰기와 함께 메모리 내 스토리지 모델을 사용하는 오픈 소스 키-값 데이터 저장소입니다. 다른 기능 중에서 트랜잭션, 게시/구독 및 자동 장애 조치를 제공합니다. 프로덕션 환경에서는 Linux와 함께 Redis를 사용하는 것이 좋지만 개발자는 개발 및 테스트하는 플랫폼으로 OS X도 언급합니다. Redis는 대부분의 언어로 작성된 고객을 보유하고 있으며 웹사이트에 추천 언어가 표시되어 있습니다.

프로덕션 환경의 경우 두 개 이상의 노드에서 데이터를 복제하는 것이 모범 사례로 간주됩니다. 중복성은 환경 장애 시 복구를 허용하며, 이는 애플리케이션의 사용자 기반이 성장할 때 특히 중요합니다.

이 가이드가 끝나면 다음과 같이 DigitalOcean에 두 개의 Redis Droplet을 설정하게 됩니다.

  • Redis 마스터 서버용 Droplet 1개
  • Redis 슬레이브 서버용 Droplet 1개

또한 슬레이브 서버로 전환하고 임시 마스터로 설정하는 방법도 보여줍니다.

하나 이상의 슬레이브 서버를 자유롭게 설정하십시오.

이 문서는 마스터-슬레이브 Redis 클러스터 설정에 중점을 둡니다. 일반적인 Redis와 데이터베이스로서의 기본 사용법에 대해 자세히 알아보려면 이 사용법 자습서를 참조하십시오.

전제 조건

이전 릴리스 및 기타 Linux 배포판에서 작동할 수 있지만 Ubuntu 14.04를 권장합니다.

테스트 목적으로 처리할 실제 워크로드가 없기 때문에 작은 인스턴스를 사용하지만 프로덕션 환경에는 더 큰 서버가 필요할 수 있습니다.

  • 우분투 14.04 LTS
  • 필요한 모든 크기의 두 방울; 하나의 마스터와 하나 이상의 슬레이브
  • Ubuntu 14.04의 초기 서버 설정에 설명된 대로 루트가 아닌 sudo 사용자로 SSH를 통해 시스템에 액세스

1단계 - Redis 설치

마스터 서버를 호스팅할 Droplet부터 시작하여 첫 번째 단계는 Redis를 설치하는 것입니다. 먼저 Chris Lea의 Redis 리포지토리를 추가해야 합니다(항상 그렇듯이 타사 리포지토리를 추가할 때는 각별히 주의해야 합니다. 이 리포지토리를 유지 관리하는 사람이 평판이 좋기 때문에 이 리포지토리를 사용합니다).

  1. sudo add-apt-repository ppa:chris-lea/redis-server

ENTER를 눌러 리포지토리를 수락합니다.

다음 명령을 실행하여 패키지를 업데이트합니다.

  1. sudo apt-get update

Redis 서버를 설치합니다.

  1. sudo apt-get install redis-server

Redis가 실행 중인지 확인합니다.

  1. redis-benchmark -q -n 1000 -c 10 -P 5

위의 명령은 redis-benchmark가 총 1000개의 요청, 10개의 병렬 연결 및 파이프라인 5개의 요청으로 자동 모드에서 실행되기를 원한다는 것을 의미합니다. Redis에 대한 벤치마크 실행에 대한 자세한 내용을 보려면 터미널에 redis-benchmark --help를 입력하면 예제와 함께 유용한 정보가 출력됩니다.

벤치마크를 실행하십시오. 완료되면 다음과 유사한 출력이 표시됩니다.

Output
PING_INLINE: 166666.67 requests per second PING_BULK: 249999.98 requests per second SET: 249999.98 requests per second GET: 499999.97 requests per second INCR: 333333.34 requests per second LPUSH: 499999.97 requests per second LPOP: 499999.97 requests per second SADD: 499999.97 requests per second SPOP: 499999.97 requests per second LPUSH (needed to benchmark LRANGE): 499999.97 requests per second LRANGE_100 (first 100 elements): 111111.12 requests per second LRANGE_300 (first 300 elements): 27777.78 requests per second LRANGE_500 (first 450 elements): 8333.33 requests per second LRANGE_600 (first 600 elements): 6369.43 requests per second MSET (10 keys): 142857.14 requests per second

이제 Redis 슬레이브 서버에 대해 이 섹션을 반복합니다. 더 많은 Droplet을 구성하는 경우 필요한 만큼 슬레이브 서버를 설정할 수 있습니다.

이 시점에서 Redis가 설치되어 두 노드에서 실행됩니다. 노드의 출력이 위에 표시된 것과 유사하지 않으면 설정 프로세스를 신중하게 반복하고 모든 전제 조건이 충족되는지 확인하십시오.

2단계 - Redis 마스터 구성

이제 Redis가 2-Droplet 클러스터에서 실행 중이므로 구성 파일을 편집해야 합니다. 보시다시피 마스터 서버와 슬레이브 구성에는 약간의 차이가 있습니다.

먼저 마스터부터 시작하겠습니다.

원하는 텍스트 편집기로 /etc/redis/redis.conf를 엽니다.

  1. sudo nano /etc/redis/redis.conf

다음 줄을 편집합니다.

TCP의 keepalive 타이머에 적절한 값을 설정합니다.

tcp-keepalive 60

다음 줄을 주석 처리하여 웹의 모든 사용자가 서버에 액세스할 수 있도록 합니다.

#bind 127.0.0.1

Redis의 특성과 매우 빠른 속도를 고려할 때 공격자는 많은 문제 없이 암호를 무차별 대입할 수 있습니다. 그렇기 때문에 requirepass 줄의 주석을 제거하고 복잡한 암호(또는 가급적이면 복잡한 암호 문구)를 추가하는 것이 좋습니다.

requirepass your_redis_master_password

사용 시나리오에 따라 다음 줄을 변경할 수 있습니다. 이 자습서에서는 키 삭제가 발생하지 않아야 한다고 가정합니다. 이 줄의 주석을 해제하고 다음과 같이 설정합니다.

maxmemory-policy noeviction

마지막으로 데이터 백업에 필요한 다음과 같은 변경을 수행하려고 합니다. 주석을 제거하거나 다음과 같이 설정하십시오.

appendonly yes
appendfilename redis-staging-ao.aof

변경 사항을 저장합니다.

Redis 서비스를 다시 시작하여 구성 변경 사항을 다시 로드합니다.

  1. sudo service redis-server restart

더 나아가고 싶다면 이 튜토리얼의 Redis 작업 섹션을 따라 마스터 데이터베이스에 고유한 콘텐츠를 추가할 수 있으므로 나중에 슬레이브 서버에 어떻게 복제되는지 확인할 수 있습니다.

이제 마스터 서버가 준비되었으므로 슬레이브 시스템으로 이동하겠습니다.

3단계 - Redis 슬레이브 구성

슬레이브 서버가 마스터 인스턴스에 연결할 수 있도록 몇 가지 사항을 변경해야 합니다.

원하는 텍스트 편집기로 /etc/redis/redis.conf를 엽니다.

  1. sudo nano /etc/redis/redis.conf

다음 줄을 편집합니다. 일부 설정은 마스터와 유사합니다.

다음 줄을 주석 처리하여 웹의 모든 사용자가 서버에 액세스할 수 있도록 합니다.

#bind 127.0.0.1

슬레이브 서버에도 명령을 내릴 수 있도록 암호가 필요합니다(예: INFO). 이 줄의 주석을 제거하고 서버 비밀번호를 설정하십시오.

requirepass your_redis_slave_password

이 행의 주석을 제거하고 마스터 서버에 도달할 수 있는 IP 주소와 해당 머신에 설정된 포트를 표시하십시오. 기본적으로 포트는 6379입니다.

slaveof your_redis_master_ip 6379

masterauth 줄의 주석을 제거하고 이전에 마스터 서버에서 설정한 암호/암호 문구를 제공합니다.

masterauth your_redis_master_password

이제 이러한 변경 사항을 저장하고 파일을 종료하십시오. 다음으로 마스터 서버에서 했던 것처럼 서비스를 다시 시작합니다.

  1. sudo service redis-server restart

이렇게 하면 Redis가 다시 초기화되고 수정된 파일이 로드됩니다.

Redis에 연결:

  1. redis-cli -h 127.0.0.1 -p 6379

슬레이브 서버의 비밀번호로 인증합니다.

  1. AUTH your_redis_slave_password

이 시점에서 우리는 두 머신이 적절하게 구성된 기능적인 마스터-슬레이브 Redis 클러스터를 실행하고 있습니다.

4단계 - 마스터-슬레이브 복제 확인

장애 조치 동작 스크립팅을 시작하려는 경우 설정을 테스트하면 Redis Droplet의 동작을 더 잘 이해할 수 있습니다. 이제 우리가 원하는 것은 구성이 올바르게 작동하고 마스터가 슬레이브 Redis 인스턴스와 통신하는지 확인하는 것입니다.

먼저 마스터 서버에서 터미널을 통해 Redis에 연결합니다.

먼저 기본적으로 포트 6379에서 실행되는 로컬 인스턴스에 연결합니다. 포트를 변경한 경우 그에 따라 명령을 수정합니다.

  1. redis-cli -h 127.0.0.1 -p 6379

이제 마스터를 구성할 때 설정한 비밀번호로 Redis에 인증합니다.

  1. AUTH your_redis_master_password

그리고 응답으로 OK를 받아야 합니다. 이제 다음을 실행하기만 하면 됩니다.

  1. INFO

마스터 Redis 서버에 대해 알아야 할 모든 것이 표시됩니다. 특히 다음 출력과 같은 #Replication 섹션에 관심이 있습니다.

Output
. . . # Replication role:master connected_slaves:1 slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1 master_repl_offset:407 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:406 . . .

다른 인스턴스가 마스터 Droplet과 통신하고 있음을 나타내는 connected_slaves:1 줄에 주목하십시오. 또한 포트, 상태 및 기타 정보와 함께 슬레이브 IP 주소를 얻는 것을 볼 수 있습니다.

이제 슬레이브 머신의 #Replication 섹션을 살펴보겠습니다. 프로세스는 마스터 서버와 동일합니다. Redis 인스턴스에 로그인하고 INFO 명령을 실행하고 출력을 봅니다.

Output
. . . # Replication role:slave master_host:111.111.111.111 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:1401 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . .

우리는 이 머신이 슬레이브 역할을 하고 있고, 마스터 Redis 서버와 통신하고 있으며 자체 슬레이브가 없음을 알 수 있습니다.

5단계 - 슬레이브로 전환

이 아키텍처를 구축한다는 것은 데이터 무결성을 보장하고 애플리케이션의 가동 중지 시간을 최소화하는 방식으로 장애를 처리하기를 원한다는 의미이기도 합니다. 모든 슬레이브는 마스터로 승격될 수 있습니다. 먼저 수동으로 전환을 테스트해 보겠습니다.

슬레이브 머신에서 Redis 인스턴스에 연결해야 합니다.

  1. redis-cli -h 127.0.0.1 -p 6379

이제 슬레이브를 구성할 때 설정한 비밀번호로 Redis로 인증합니다.

  1. AUTH your_redis_slave_password

슬레이브 동작을 끕니다.

  1. SLAVEOF NO ONE

응답은 OK여야 합니다. 이제 다음을 입력하십시오.

  1. INFO

# Replication 섹션을 찾아 다음 출력을 찾습니다.

Output
. . . # Replication role:master connected_slaves:0 master_repl_offset:1737 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . .

예상한 대로 슬레이브가 마스터로 바뀌었고 이제 다른 머신(있는 경우)의 연결을 수락할 준비가 되었습니다. 주 마스터 서버를 디버깅하는 동안 임시 백업으로 사용할 수 있습니다.

초기 마스터에 의존하는 여러 슬레이브가 있는 경우 모두 새로 승격된 마스터를 가리켜야 합니다.

오류가 감지되면 다음 단계를 구현해야 하므로 쉽게 스크립팅할 수 있습니다.

  • 애플리케이션에서 Redis에 대한 모든 요청을 슬레이브 머신으로 보냅니다.
  • 해당 슬레이브에서 SLAVEOF NO ONE 명령을 실행합니다. Redis 버전 1.0.0부터 이 명령은 슬레이브에게 데이터 복제를 중지하고 마스터 서버 역할을 시작하도록 지시합니다.
  • 남아 있는 모든 슬레이브(있는 경우)에서 SLAVEOF hostname port를 실행하면 이전 마스터에서 복제를 중지하고 이제 데이터를 완전히 폐기하고 새 마스터에서 복제를 시작합니다. hostnameport를 새로 승격된 마스터의 올바른 값으로 바꾸십시오.
  • 문제를 분석한 후 특정 설정에 필요한 경우 초기 서버를 마스터로 되돌릴 수 있습니다.

위에서 설명한 단계를 수행하는 방법에는 여러 가지가 있습니다. 그러나 환경에 적합한 솔루션을 구현하고 실제 오류가 발생하기 전에 철저하게 테스트하는 것은 사용자의 몫입니다.

6단계 - 마스터에 다시 연결

원래 마스터 서버에 다시 연결해 봅시다. 슬레이브 서버에서 Redis에 로그인하고 다음을 실행합니다.

  1. SLAVEOF your_redis_master_ip 6379

INFO 명령을 다시 실행하면 원래 설정으로 돌아간 것을 볼 수 있습니다.

결론

하나는 Redis 마스터 역할을 하고 다른 하나는 데이터를 슬레이브로 복제하는 두 개의 서버로 구성된 환경을 적절하게 설정했습니다. 이렇게 하면 마스터 서버가 오프라인이 되거나 데이터가 손실되는 경우 문제가 해결될 때까지 복구를 위해 슬레이브 중 하나로 전환하는 방법을 알 수 있습니다.

다음 단계에는 자동화된 장애 조치 절차를 스크립팅하거나 Tinc와 같은 VPN 솔루션을 사용하여 모든 Droplet 간의 보안 통신을 보장하는 것이 포함될 수 있습니다. 또한 테스트 절차와 스크립트는 구성을 검증하는 데 필수적입니다.

또한 프로덕션 환경에서 이러한 종류의 설정을 배포할 때 예방 조치를 취해야 합니다. Redis 설명서 페이지를 검토해야 하며 애플리케이션에 적합한 보안 모델을 명확하게 이해해야 합니다. 우리는 종종 Redis를 세션 저장소로 사용하며 여기에 포함된 정보는 공격자에게 유용할 수 있습니다. 일반적인 관행은 사설 네트워크를 통해서만 이러한 시스템에 액세스할 수 있도록 하고 여러 계층의 보안 뒤에 배치하는 것입니다.

이는 데이터 저장소를 구축할 수 있는 간단한 시작점입니다. 마스터-슬레이브 아키텍처를 사용하도록 Redis를 설정하는 방법에 대한 완전한 가이드는 결코 아닙니다. 이 안내서에서 다루어야 한다고 생각하는 것이 있으면 아래에 의견을 남겨주십시오. 이 주제에 대한 자세한 정보와 도움말은 DigitalOcean Q&A에서 시작하는 것이 좋습니다.