문제해결

이 페이지에서는 다양한 오류 시나리오, 해당 시나리오의 오류 메시지, 오류 해결을 위한 문제해결 단계를 설명합니다.

연결 오류 시나리오

인스턴스에 연결 문제가 발생하는 경우 이 섹션의 시나리오 중 하나가 문제의 원인인지 확인합니다.

그렇지 않은 경우 Redis 노드 중 하나로 텔넷을 실행하고 몇 가지 간단한 Redis 명령어를 실행하여 인스턴스가 응답하는지 여부를 확인합니다.

다른 VPC 네트워크에 프로비저닝된 리소스로 연결 오류 발생

Compute Engine VM과 같은 Google Cloud 리소스에서 Memorystore 인스턴스에 연결하려면 Redis 인스턴스와 동일한 승인된 VPC 네트워크에 리소스를 프로비저닝해야 합니다.

다른 리전 또는 VPC 네트워크의 리소스에서 Memorystore 인스턴스로 텔넷에 연결하려고 하면 다음 오류 메시지가 표시됩니다.

telnet: Unable to connect to remote host: Connection timed out

삭제된 VPC 네트워크 피어링으로 인해 발생한 연결 오류

Memorystore for Redis 인스턴스를 만들면 VPC 네트워크와 Google 내부 VPC 네트워크 간에 VPC 피어링이 생성됩니다.

네트워크 피어링에는 다음 형식이 사용됩니다.

redis-peer-############

이 네트워크 피어링이 삭제되면 Redis 인스턴스로 텔넷에 연결하려고 하면 다음 오류 메시지가 표시됩니다.

telnet: Unable to connect to remote host: Connection timed out

삭제된 네트워크 피어링을 다시 설정하는 가장 쉬운 방법은 Memorystore for Redis 인스턴스를 만드는 것입니다. 새 Redis 인스턴스를 만들면 삭제된 네트워크 피어링이 다시 설정되므로 삭제할 수 있으며 원래의 Redis 인스턴스에 필요한 네트워크 피어링이 있습니다.

방화벽 규칙이 인스턴스 IP 주소 차단

Redis 포트(6379) 또는 인스턴스의 IP 주소를 차단하는 이그레스 방화벽 규칙을 만드는 경우 연결 문제가 발생할 수 있습니다.

Redis 인스턴스의 IP 범위를 차단하는 네트워크 방화벽 규칙을 만들지 않아야 합니다.

높은 CPU 사용량 오류 시나리오

리소스를 많이 사용하는 Redis 명령어의 부적절한 사용으로 인한 Redis 인스턴스 응답 없음

Redis 인스턴스에 높은 지연 시간, 응답 없음 또는 연결 문제가 발생하는 경우 다음과 같이 리소스를 많이 사용하는 Redis 명령어를 잘못 사용했기 때문일 수 있습니다.

이 명령어를 실행하면 인스턴스에 과도한 CPU 부담이 발생할 수 있습니다. 오픈소스 Redis는 프로덕션 환경에서 KEYS를 실행하지 않는 것이 좋습니다. 대신 KEYS 명령어의 안전한 대안인 SCAN을 사용할 수 있습니다. LRANGE를 사용하여 키스페이스의 전체 또는 대규모 하위 집합을 쿼리하면 높은 CPU 리소스가 필요할 수 있습니다. 복잡한 Lua 스크립트를 EVAL과 함께 사용하면 CPU 사용량이 증가할 수 있습니다.

HGETALLZRANGE는 매우 많은 키를 반환하므로 서버 성능에 부정적인 영향을 줄 수도 있습니다.

비용이 많이 드는 명령어를 실행하기 전에 명령어가 쿼리하는 데이터 구조의 크기를 확인하여 지연 시간이 발생하지 않는지 확인해야 합니다.

인스턴스의 지연 시간이 길어지거나 응답이 없는 경우 클라이언트 측 로그를 확인하여 고비용 명령어가 실행되었는지 확인합니다. 있다면 시간을 기록해 둡니다. 다음으로 Cloud Monitoring을 사용하여 redis.googleapis.com/stats/cpu_utilization 측정항목을 확인합니다. CPU 사용량이 높은 기간과 고비용 명령어가 실행된 기간이 일치하는지 확인하세요.

프로덕션 환경에서는 KEYS 명령어를 사용하지 않는 것이 좋습니다. EVAL의 경우 덜 복잡한 Lua 스크립트를 사용합니다. LRANGE의 경우 단일 작업에서 쿼리되는 키 세트의 키 수를 줄입니다.

네트워크 오류 시나리오

할당된 IP 범위가 소진되었거나 충돌하는 경로가 있음

Memorystore for Redis 전용 IP 주소 범위 내에 리소스를 만들면 모든 주소가 소진되어 아래의 오류 메시지가 표시될 수 있습니다. 또는 만들려고 하는 Redis 인스턴스의 IP 주소와 충돌하는 경로가 있을 수 있습니다.

이러한 시나리오에서는 다음과 같은 오류 메시지가 표시됩니다.

The IP ranges for the connection do not have enough available IPs. Allocate a new range or expand existing range and try again.

이 문제는 추가 IP 주소를 할당하거나 경로 충돌 불일치를 삭제하여 해결할 수 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 IP 주소 범위 소진을 참조하세요.

네트워크에 비공개 서비스 액세스 연결이 설정되어 있지 않음

Redis 인스턴스가 비공개 서비스 액세스 연결 모드를 사용하고 네트워크에 비공개 서비스 액세스 연결이 없는 경우 다음 오류가 발생할 수 있습니다.

Google private service access is not enabled. Enable private service access and try again

이 문제를 해결하려면 비공개 서비스 액세스 연결을 설정하세요.

비공개 서비스 액세스를 위한 네트워크 피어링이 삭제됨

비공개 서비스 액세스 연결을 설정하면 프로젝트의 VPC 네트워크 피어링 페이지에 표시되는 servicenetworking-googleapis-com이라는 네트워크 피어링 연결이 생성됩니다.

네트워크 피어링을 삭제하면 기존 Redis 인스턴스에서 다음과 같은 오류가 반환됩니다.

  • telnet: Unable to connect to remote host: Connection timed out

네트워크 피어링을 삭제하면 Redis 인스턴스를 만들 때 다음 오류가 반환됩니다.

  • Private services access is not configured correctly. For steps on how to verify the connection, check the documentation.

이 문제를 해결하려면 비공개 서비스 액세스 연결 설정에서 gcloud 안내의 마지막 단계를 따르세요.

Redis 인스턴스 생성 중 네트워킹 플래그 충돌

--reserved-ip-range 매개변수와 --connect-mode=private-service-access 매개변수를 모두 사용하면 다음과 같은 오류가 발생합니다.

Reserved IP range is not supported for --connect-mode private services access

이 문제를 해결하려면 --reserved-ip-range--connect-mode=direct-peering과 함께 사용하거나 --connect-mode=PRIVATE_SERVICE_ACCESS를 사용하세요.

비공개 서비스 액세스 연결 모드에서는 --reserved-ip-range 매개변수가 지원되지 않으므로 둘 다 동시에 사용할 수 없습니다.

프로젝트의 서브네트워크 할당량 초과

프로젝트 내에서 만들 수 있는 서브네트워크 수에는 제한이 있습니다. 이 할당량을 초과하면 다음과 같은 오류 메시지가 반환됩니다.

Internal network quota exceeded. Please request higher limit here: https://forms.gle/ZfVduUGq2iSYcYGm8 또는

Unable to create instance. Network quota limit has been reached. Please request higher limit here: https://forms.gle/ZfVduUGq2iSYcYGm8

이 문제를 해결하려면 오류 메시지에 있는 양식을 작성하거나 Google Cloud 지원팀에 문의하세요.

호스트 프로젝트에 서비스 프로젝트가 연결되지 않음

공유 VPC를 사용하는 경우 다음 오류가 발생하면 서비스 프로젝트가 호스트 프로젝트에 연결되지 않은 것입니다.

Invalid network name <network-name>. Project <project-name> referenced is not the host project for <service-project-name>.

이 문제를 해결하려면 호스트 프로젝트에 서비스 프로젝트를 연결하세요.

인스턴스 생성 중에 다이렉트 피어링 연결 모드 및 공유 VPC 네트워크를 사용할 수 없음

인스턴스의 호스트 프로젝트에서 공유 VPC 네트워크를 지정하는 동안 다이렉트 피어링 연결 모드로 서비스 프로젝트에 Redis 인스턴스를 만들 수 없습니다.

--connection-mode 값을 설정하지 않으면 연결 모드가 기본적으로 direct-peering으로 설정됩니다. 인스턴스를 만드는 동안 다이렉트 피어링 연결 모드를 사용하려고 시도하고 호스트 프로젝트에서 공유 VPC 네트워크를 --network 값으로 선택하면 다음과 같은 오류가 발생합니다.

Authorized_network must exist in the same project as redis instance

이 문제를 해결하려면 Redis 인스턴스 생성 명령어에 --connect-mode=PRIVATE_SERVICE_ACCESS를 지정하거나 Redis 인스턴스와 동일한 프로젝트에서 승인된 VPC 네트워크를 선택해야 합니다.

지원되지 않는 Compute Engine IP 주소 범위

172.17.0.0/16 범위 내에 IP 주소가 있는 Compute Engine VM에서 Memorystore for Redis에 액세스할 수 없습니다.이 범위는 내부 구성요소용으로 예약되어 있기 때문입니다.

다른 Google Cloud 리소스에서 Redis 인스턴스에 연결하는 중 오류 발생

서버리스 VPC 액세스 커넥터가 필요한 서버리스 환경에서 인스턴스에 연결하는 중 오류 발생

서버리스 VPC 액세스 커넥터가 필요한 서버리스 환경 중 하나를 사용하여 Redis 인스턴스에 연결할 수 없는 경우 환경을 위한 서버리스 VPC 액세스 커넥터를 설정하지 않았을 수 있습니다.

자세한 내용은 서버리스 VPC 액세스 커넥터 요구사항을 참조하세요.

Google Kubernetes Engine 클러스터를 사용하여 인스턴스에 연결할 때 오류 발생

클러스터에서 VPC 기반/IP 별칭을 사용 설정하지 않으면 GKE 클러스터에서 Memorystore for Redis 인스턴스에 연결할 수 없습니다. GKE 클러스터를 만드는 동안 VPC 기반/IP 별칭을 사용 설정하는 것이 가장 쉽습니다. 클러스터를 만들 때 고급 옵션에서 VPC 기반을 선택하세요. 자세한 내용은 VPC 기반 클러스터 만들기를 참조하세요.

Identity and Access Management(IAM) 오류 시나리오

서비스 계정의 삭제된 정책 바인딩 복원

Memorystore for Redis는 다음 서비스 계정을 사용하여 Redis 인스턴스를 관리합니다.

  • service-project-number@service-networking.iam.gserviceaccount.com
  • service-project-number@cloud-redis.iam.gserviceaccount.com

이러한 서비스 계정의 정책 바인딩을 삭제하면 새 인스턴스를 만들 수 없습니다.

이 시나리오에서 gcloud를 사용하여 Redis 인스턴스를 만들려고 하면 다음 오류 메시지가 표시될 수 있습니다.

(gcloud.redis.instances.create) FAILED_PRECONDITION: A required IAM policy might be missing. Please run this command:"gcloud projects add-iam-policy-binding <YOUR-PROJECT-ID> --member='serviceAccount:service-<YOUR-PROJECT-NUMBER>@cloud-redis.iam.gserviceaccount.com' --role='roles/redis.serviceAgent'" and try again.

이러한 서비스 계정에 대한 정책 binding을 다시 설정하려면 다음 명령어 중 하나를 실행합니다. 이때 variables를 적절한 값으로 바꿉니다. 삭제된 서비스 계정과 연결된 명령어를 실행합니다.

gcloud projects add-iam-policy-binding project-id --member='serviceAccount:service-project-number@service-networking.iam.gserviceaccount.com' --role='roles/servicenetworking.serviceAgent'
gcloud projects add-iam-policy-binding project-id --member='serviceAccount:service-project-number@cloud-redis.iam.gserviceaccount.com' --role='roles/redis.serviceAgent'

작업 제한 시간 오류

다음과 같은 오류 시나리오로 인해 응답하지 않는 Redis 인스턴스 또는 인스턴스/노드 작업 제한 시간 오류가 발생합니다.

네트워크 파티션 오류

Google Cloud 서버의 네트워크 파티션 오류로 인해 Google Cloud 리소스가 한 리전 내의 영역 간에 통신할 수 없는 경우가 있습니다. 이로 인해 인스턴스 연결이 끊어져 제한 시간 오류가 생길 수 있습니다.

Google Cloud가 인스턴스가 프로비저닝된 리전 또는 영역의 네트워크 파티션 오류를 해결하면 연결이 정상적으로 재개됩니다.

이 시나리오에서는 다음과 같은 연결 오류 메시지가 표시될 수 있습니다.

telnet: Unable to connect to remote host: Connection timed out

제한 시간 오류의 원인을 확인할 수 없는 경우 Google Cloud 지원팀에 문의하세요.

서비스 프로젝트와 호스트 프로젝트가 동일한 VPC 서비스 제어 경계에 없음

공유 VPCVPC 서비스 제어 경계를 사용 중이며 Redis 인스턴스 생성 작업이 시간 초과되면 서비스 프로젝트 및 호스트 프로젝트가 동일한 서비스 경계에 있지 않습니다. Redis 인스턴스가 공유 VPC 네트워크를 통해 연결 클라이언트와 통신하려면 서비스 프로젝트와 호스트 프로젝트가 동일한 경계에 있어야 합니다.

이 문제가 발생하는지 알아보려면 다음 오류가 있는지 Redis 인스턴스의 감사 로그를 확인하세요.

violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

이 문제를 해결하려면 호스트 네트워크와 서비스 네트워크를 동일한 서비스 경계에 배치합니다.

가져오기 및 내보내기 문제해결

이 섹션에서는 Redis용 Memorystore에 가져오기 및 내보내기를 사용할 때 발생할 수 있는 몇 가지 일반적인 문제를 설명합니다.

Google Cloud 콘솔에서 가져오기 및 내보내기 버튼이 사용 중지됨

문제: 콘솔에 로그인한 사용자에게 RDB 파일을 가져오거나 내보내는 데 필요한 redis.instances.import 또는 redis.instances.export 권한이 없습니다.

해결책: 사용자에게 권한을 부여하고 인스턴스 세부정보 페이지를 새로고침합니다.

가져오기 작업이 완료되었지만 데이터가 복원되지 않음

가져오기 작업이 완료되었지만 데이터가 복원되지 않은 경우 먼저 Google Cloud 콘솔 또는 명령줄에서 오류 메시지를 확인하고 오류 메시지에 설명된 문제를 해결합니다.

가져오기 프로세스 중에 오류가 발생하면 빈 RDB 파일을 사용하여 인스턴스가 복구됩니다. 동일한 RDB 파일을 다시 가져오거나 다른 RDB 파일을 사용하여 데이터를 복원할 수 있습니다.

RDB 파일이 너무 커서 가져오기에 실패했습니다.

'RDB 파일 gs://bucket/object.rdb 가져오기의 크기가 최대 메모리인 10GB를 초과합니다'라는 메시지가 표시되면 인스턴스를 확장하고 가져오기를 다시 시도해야 합니다. 인스턴스로 더 작은 크기의 RDB 파일 가져오기를 시도할 수도 있습니다.

Google Cloud CLI 문제 해결

gcloud CLI 명령어를 사용할 수 없거나 명령어가 문서화된 방식과 다르게 작동하는 경우 gcloud CLI를 업데이트해 보세요.

gcloud components update

Redis 인스턴스에서 진행 중인 모든 명령어 및 연결 중지

Memorystore for Redis는 Google 관리형 제품이기 때문에 안전하고 안정적인 환경을 제공하기 위해 Redis 인스턴스에서 차단되는 명령어가 몇 가지 있습니다. 제한된 명령어 중 하나는 CLIENT KILL을 포함한 CLIENT로서 명령어를 중지하는 데 사용됩니다.

Redis 명령어가 CPU/RAM 사용률을 많이 소비하고 프로덕션 환경에 영향을 미치는 경우, (기본 등급 구성의 경우) 인스턴스를 다시 시작하거나 (표준 등급 구성의 경우) 복제본으로 장애 조치해야 합니다. 다시 시작/장애 조치 작업으로 Redis 서버에서 실행 중인 모든 명령어가 중지되며 진행 중인 모든 연결도 종료됩니다.

아래에는 각 Memorystore for Redis 구성을 다시 시작하거나 장애 조치를 수행하는 명령어가 나와 있습니다.

표준 등급 Memorystore for Redis 인스턴스의 명령어 중지

gcloud redis instances failover INSTANCE_NAME --data-protection-mode=limited-data-loss

기본 등급 Memorystore for Redis 인스턴스의 명령어 중지

Memorystore for Redis 인스턴스에서 다시 시작을 수행하는 유일한 방법은 인스턴스 확장과 같은 구성을 변경하는 것입니다. 인스턴스를 다시 시작하기 위해 실행할 수 있는 명령어의 예시는 다음과 같습니다.

gcloud redis instances update INSTANCE_NAME --region REGION_ID --size NUMBER_GB

인스턴스를 다른 크기로 확장한 후에 또 다른 확장 작업을 실행하여 원래 크기로 되돌릴 수 있습니다.

도메인 제한 공유 조직 정책 관련 문제

Redis용 Memorystore는 인스턴스가 생성된 시점에 따라 두 가지 서비스 계정 형식 중 하나를 사용합니다. 인스턴스에서 사용되는 서비스 계정 형식을 식별하려면 Redis용 Memorystore 서비스 계정 형식을 참조하세요.

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com 서비스 계정 형식을 사용하는 Redis용 Memorystore 인스턴스와 함께 사용할 경우 iam.allowedPolicyMemberDomains 조직 정책에서 오류가 발생하는 알려진 문제가 있습니다.

이러한 시나리오에서는 One or more users named in the policy do not belong to a permitted customer. 오류가 발생할 수 있습니다.

이 문제를 해결하는 옵션은 다음 두 가지입니다.

옵션 1

새 인스턴스를 만들 수 있습니다. 새로 생성된 인스턴스에는 조직 정책과 호환되는 적절한 서비스 계정 형식이 사용됩니다. 캐시 콘텐츠를 유지하는 것이 중요한 경우 기존 데이터 백업을 내보내고 새 인스턴스로 가져오기를 수행할 수 있습니다. 새로 만든 인스턴스에는 애플리케이션에서 구성해야 하는 새 서비스 IP 주소가 있습니다.

옵션 2

Memorystore 인스턴스를 다시 만들 수 없는 경우 계정 액세스 강제 해결 방법을 따릅니다.