Memorystore for Redis:连接、HA 与降级
验证:静态检查 · 核验于 2026-09-28
- 适用版本
- 云环境版本未实测;适用条件见正文
- 验证范围
- 已检查文档构建、链接与脚本语法;未执行云端实验。
私网缓存;权威数据保留在数据库。
推荐做法#
- 本页是 Memorystore for Redis Basic / Standard:AUTH 管客户端认证,TLS 管传输加密;从可达 VPC 的客户端连接并校验服务 CA。
- 需要同 Region 跨 Zone 容错时选择支持的 HA 配置,客户端实现重连。
- 设置 TTL、缓存失效和有界回源;缓存故障不能压垮数据库。
常用操作#
替换为实际资源;本段不依赖 lab.env。
PROJECT_ID='REPLACE_PROJECT_ID'
REGION='REPLACE_REGION'
INSTANCE='REPLACE_REDIS_INSTANCE'
gcloud redis instances describe "$INSTANCE" \
--project="$PROJECT_ID" --region="$REGION"容易踩的坑#
Redis Admin 是管理 API 权限,不是 Redis 数据连接凭据。 数据连接另查 VPC 路径、AUTH 和 TLS;不能通过追加管理角色修复
NOAUTH。
- TTL 不保证一致性;failover 不保证已有连接不断开或数据零丢失。
配置说明与完整示例(按需展开)
对应 ElastiCache Redis 的常见用途。前置:VPC与 lab-vm;需要 Redis Admin。实例空闲也收费,做完即删。
本篇起步实验使用 Basic、专用 VPC 和无 AUTH/TLS 的合成数据;生产示例见下方 Standard + AUTH/TLS。
本页 Memorystore for Redis 的 TLS 只能在创建实例时启用,启用后不能关闭。 不能把无 TLS 的 Basic 实验实例当作稍后可原地开启 TLS 的生产实例;已有数据需另建目标并规划迁移。TLS 配置
source lab.env
gcloud services enable redis.googleapis.com
gcloud redis instances create lab-redis --region="$REGION" --size=1 --tier=basic --network="projects/$PROJECT_ID/global/networks/lab-vpc" --connect-mode=DIRECT_PEERING
export REDIS_HOST=$(gcloud redis instances describe lab-redis --region="$REGION" --format='value(host)')
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command='sudo apt-get update && sudo apt-get install -y redis-tools'
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command="redis-cli -h '$REDIS_HOST' PING"
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command="redis-cli -h '$REDIS_HOST' SET order:demo cached EX 60"
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command="redis-cli -h '$REDIS_HOST' GET order:demo"
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command="redis-cli -h '$REDIS_HOST' TTL order:demo"验收:PING 返回 PONG,TTL 递减,过期后 GET 返回空。Cloud Shell/本机不在这个 VPC,不能直接连接该私有 IP;IAM Redis Admin 控制管理 API,不等于 Redis 数据协议认证。创建实例
在订单项目中,先查缓存,未命中再读 SQL/Storage,成功后写缓存;业务源数据保持在数据库。TTL 不是一致性协议,更新订单后要设计失效策略。缓存不可用时应有明确降级和限流,避免全部请求同时打穿数据库。
生产演练:跨区高可用、认证与 TLS#
下面另建 Standard 实例,保留 Basic 实验便于比较。HA(High Availability,高可用)使用同区域两个可用区;不是跨区域灾备。AUTH 是 Redis 协议密码,TLS(Transport Layer Security,传输层安全协议)验证服务证书;两者都要启用。示例 1 GiB 仅用于合成负载验收,容量需按实际键大小、连接和峰值计算。
export REDIS_ZONE_A="${REGION}-b"
export REDIS_ZONE_B="${REGION}-c"
gcloud redis instances create orders-cache --region="$REGION" --zone="$REDIS_ZONE_A" --alternative-zone="$REDIS_ZONE_B" --size=1 --tier=standard --redis-version=redis_7_2 --network="projects/$PROJECT_ID/global/networks/lab-vpc" --connect-mode=direct-peering --enable-auth --transit-encryption-mode=server-authentication
gcloud redis instances describe orders-cache --region="$REGION" --format='yaml(state,tier,host,port,authEnabled,transitEncryptionMode,currentLocationId)'先确认区域确实有上述两个 zone。等待 READY。以下从本机获取证书与密码,通过 IAP 复制到已有 lab-vm;该 VM 与 Redis 必须位于同一授权 VPC。生产运行身份不需要 Redis Admin,只获得读取指定密码 secret 的权限。
umask 077
export REDIS_HOST=$(gcloud redis instances describe orders-cache --region="$REGION" --format='value(host)')
gcloud redis instances describe orders-cache --region="$REGION" --format=json > redis-instance.json
python3 -c 'import json; x=json.load(open("redis-instance.json")); open("redis-ca.pem","w").write("\n".join(c["cert"] for c in x["serverCaCerts"]))'
gcloud redis instances get-auth-string orders-cache --region="$REGION" --format='value(authString)' > redis-auth
gcloud compute scp redis-ca.pem redis-auth lab-vm:~/ --zone="$ZONE" --tunnel-through-iap
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap在 VM 内执行,填入刚取得的内网 IP:
export REDIS_HOST='REPLACE_REDIS_PRIVATE_IP'
export REDIS_CA="$HOME/redis-ca.pem"
chmod 600 ~/redis-auth
export REDISCLI_AUTH=$(cat ~/redis-auth)
redis-cli -h "$REDIS_HOST" -p 6378 --tls --cacert "$REDIS_CA" PING
env -u REDISCLI_AUTH redis-cli -h "$REDIS_HOST" -p 6378 --tls --cacert "$REDIS_CA" PING验收:第一条 PONG,第二条 NOAUTH;不能只看 redis-cli 退出码。使用服务 CA 校验,不加 --insecure。管理 API 的 IAM 授权与 Redis 数据访问是不同边界。AUTH、TLS 与 6378 端口
故障切换与有界回源#
在 VM 上打开终端 A,记录切换期间成功/失败及恢复时间:
for i in $(seq 1 180); do date -u +%FT%TZ; timeout 2 redis-cli -h "$REDIS_HOST" -p 6378 --tls --cacert "$REDIS_CA" PING; sleep 1; done > redis-failover.log 2>&1本机终端 B 对本实验实例切换;limited-data-loss 不是零丢失保证,不能用 Redis 保存唯一订单账本:
gcloud redis instances failover orders-cache --region="$REGION" --data-protection-mode=limited-data-loss
gcloud redis instances describe orders-cache --region="$REGION" --format='yaml(state,currentLocationId,host)'验收:主区改变、连接可恢复;记录最长连续失败窗口。 endpoint 仍相同不代表已有连接不中断,客户端必须重连。应用写入先保证数据库事务,缓存可失效/重建。手动切换
进一步用 企业订单项目 的已完成合成订单检验缓存降级:将配套 gcp/cache_check.py、合成租户 secrets/token 复制到 lab-vm。VM 通过 NAT 访问 IAM 私有的 Cloud Run HTTPS URL;调用者先在本机生成短期 ID token,复制为 VM 的 cloud-run-id-token,不要上传 SA key。文件设为 600。
# 本机企业项目目录,另一个终端;PROJECT_ID/ZONE 指向 lab-vm 所在项目。
gcloud auth print-identity-token > secrets/cloud-run-id-token
gcloud compute scp gcp/cache_check.py secrets/token secrets/cloud-run-id-token lab-vm:~/ --zone="$ZONE" --tunnel-through-iapVM 上已保留 REDIS_HOST、REDIS_CA、REDISCLI_AUTH。安装探针依赖并执行;两个模式调用的都是实际订单 API,不以 mock 数据源代替数据库:
sudo apt-get install -y python3-venv
python3 -m venv ~/cache-venv
. ~/cache-venv/bin/activate
pip install redis==5.2.1
chmod 600 ~/token ~/cloud-run-id-token
export BASE_URL='REPLACE_ENTERPRISE_CLOUD_RUN_HTTPS_URL'
export ORDER_ID='REPLACE_COMPLETED_SYNTHETIC_ORDER_ID'
export TOKEN_FILE="$HOME/token"
export CLOUD_RUN_ID_TOKEN_FILE="$HOME/cloud-run-id-token"
python3 ~/cache_check.py
CACHE_OUTAGE=1 python3 ~/cache_check.py第一轮应出现 cache-hit;第二轮明确在客户端注入缓存不可用,应出现 origin 和 limited,回源并发不超过 4、每秒预算最多 5 次,账本/投影/订单金额始终相等。limited 在真实 API 中应映射为受控 429/503,而不是无限排队。本脚本是验收工具,不自动给现有订单 API 加缓存。多副本应用必须按总数据库预算分配各实例额度;本地限流不能冒充全局限流。CA 验证保持开启,探针对私网 IP 使用 CA 校验,未假设证书包含该 IP 的主机名。
清理前保存脱敏结果,删除本实验密码和 token 副本;证书轮换时从 API 更新完整 CA 集合。不要通过关闭 AUTH 来“无损轮换”生产密码,那会产生无认证窗口。
# VM 内
unset REDISCLI_AUTH
rm ~/redis-auth ~/token ~/cloud-run-id-token
# 回到本机
gcloud redis instances delete orders-cache --region="$REGION"
gcloud redis instances delete lab-redis --region="$REGION"
rm redis-auth redis-ca.pem redis-instance.jsonPrivate Services Access 与 Direct Peering 是不同连接方式;接入 Shared VPC 前按目标产品支持情况重新选型,不把 peering 当可传递路由。