Redis

Redis lock 组件的详细信息

组件格式

要设置 Redis lock,请创建一个类型为 lock.redis 的组件。请参阅此指南了解如何创建 lock。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: lock.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword #可选。
    value: <PASSWORD>
  - name: useEntraID
    value: <bool> # 可选。允许值:true, false。
  - name: enableTLS
    value: <bool> # 可选。允许值:true, false。
  - name: failover
    value: <bool> # 可选。允许值:true, false。
  - name: sentinelMasterName
    value: <string> # 可选
  - name: maxRetries
    value: # 可选
  - name: maxRetryBackoff
    value: # 可选
  - name: redeliverInterval
    value: # 可选
  - name: processingTimeout
    value: # 可选
  - name: redisType
    value: # 可选
  - name: redisDB
    value: # 可选
  - name: redisMaxRetries
    value: # 可选
  - name: redisMinRetryInterval
    value: # 可选
  - name: redisMaxRetryInterval
    value: # 可选
  - name: dialTimeout
    value: # 可选
  - name: readTimeout
    value: # 可选
  - name: writeTimeout
    value: # 可选
  - name: poolSize
    value: # 可选
  - name: poolTimeout
    value: # 可选
  - name: maxConnAge
    value: # 可选
  - name: minIdleConns
    value: # 可选
  - name: idleCheckFrequency
    value: # 可选
  - name: idleTimeout
    value: # 可选

规范元数据字段

字段必填详情示例
redisHostYRedis 主机的连接字符串。如果 "redisType""cluster",它可以是多个以逗号分隔的主机,也可以是单个主机。当使用 Redis Sentinel("failover""true")时,也可以提供多个 sentinel 地址,以逗号分隔的值的形式。localhost:6379, redis-master.default.svc.cluster.local:6379, sentinel1:26379,sentinel2:26379,sentinel3:26379 主机
redisPasswordNRedis 主机的密码。默认无。可以是 secretKeyRef 以使用 secret 引用"", "KeFg23!"
redisUsernameNRedis 主机的用户名。默认为空。请确保您的 redis 服务器版本为 6 或更高版本,并且已正确创建 acl 规则。"", "default"
useEntraIDN为 Azure Cache for Redis 实现 EntraID 支持。在启用此功能之前:
  • redisHost 名称必须以 "server:port" 的形式指定
  • 必须启用 TLS
创建 Redis 实例 > Azure Cache for Redis下了解有关此设置的更多信息
"true", "false"
enableTLSN如果 Redis 实例支持具有公共证书的 TLS,可以配置为启用或禁用。默认为 "false""true", "false"
maxRetriesN放弃前的最大重试次数。默认为 35, 10
maxRetryBackoffN每次重试之间的最大退避时间。默认为 2 秒;"-1" 禁用退避。3000000000
failoverN用于启用故障转移配置的属性。需要设置 sentinelMasterName。启用后,redisHost 应包含 sentinel 地址。默认为 "false""true", "false"
sentinelMasterNameNSentinel 主节点名称。请参阅 Redis Sentinel 文档"mymaster"
sentinelPasswordNRedis Sentinel 的密码。默认无。仅当 “failover” 为 true 且 Redis Sentinel 已启用身份验证时适用"", "KeFg23!"
redeliverIntervalN检查待重新传递的消息之间的间隔。默认为 "60s""0" 禁用重新传递。"30s"
processingTimeoutN消息在尝试重新传递之前必须待处理的时间量。默认为 "15s""0" 禁用重新传递。"30s"
redisTypeNRedis 的类型。有两个有效值,一个是 "node" 用于单节点模式,另一个是 "cluster" 用于 redis 集群模式。默认为 "node""cluster"
redisDBN连接到 redis 后选择的数据库。如果 "redisType""cluster",此选项将被忽略。默认为 "0""0"
redisMaxRetriesNmaxRetries 的别名。如果设置了两个值,则忽略 maxRetries"5"
redisMinRetryIntervalN每次重试之间 redis 命令的最小退避时间。默认为 "8ms""-1" 禁用退避。"8ms"
redisMaxRetryIntervalNmaxRetryBackoff 的别名。如果设置了两个值,则忽略 maxRetryBackoff"5s"
dialTimeoutN建立新连接的拨号超时时间。默认为 "5s""5s"
readTimeoutN套接字读取的超时时间。如果达到超时,redis 命令将因超时而失败,而不是阻塞。默认为 "3s""-1" 表示无超时。"3s"
writeTimeoutN套接字写入的超时时间。如果达到超时,redis 命令将因超时而失败,而不是阻塞。默认为 readTimeout。"3s"
poolSizeN套接字连接的最大数量。默认为运行时报告的每个 CPU 10 个连接(NumCPU)`“20”
poolTimeoutN如果所有连接都忙,客户端等待连接的时间,然后返回错误。默认为 readTimeout + 1 秒。"5s"
maxConnAgeN客户端停用(关闭)连接的连接年龄。默认是不关闭旧连接。"30m"
minIdleConnsN保持打开的空闲连接的最小数量,以避免与创建新连接相关的性能下降。默认为 "0""2"
idleCheckFrequencyN空闲连接清理器执行的空闲检查频率。默认为 "1m""-1" 禁用空闲连接清理器。"-1"
idleTimeoutN客户端关闭空闲连接之后的时间量。应小于服务器的超时时间。默认为 "5m""-1" 禁用空闲超时检查。"10m"

设置 Redis

Dapr 可以使用任何 Redis 实例:容器化的、在本地开发机器上运行的,或托管的云服务。

当您运行 dapr init 时,会自动创建一个 Redis 实例作为 Docker 容器

您可以使用 Helm 在我们的 Kubernetes 集群中快速创建 Redis 实例。此方法需要安装 Helm

  1. 将 Redis 安装到您的集群中。请注意,我们显式地设置了一个镜像标签以获得大于 5 的版本,这是 Dapr 的发布/订阅功能所要求的。如果您打算仅将 Redis 用作状态存储(而不用于发布/订阅),则不必设置镜像版本。

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install redis bitnami/redis --set image.tag=6.2
    
  2. 运行 kubectl get pods 以查看 Redis 容器现在在您的集群中运行。

  3. 在您的 redis.yaml 文件中添加 redis-master:6379 作为 redisHost。例如:

        metadata:
        - name: redisHost
          value: redis-master:6379
    
  4. 接下来,获取 Redis 密码,这根据我们使用的操作系统略有不同:

    • Windows:运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" > encoded.b64,这将创建一个包含编码密码的文件。接下来,运行 certutil -decode encoded.b64 password.txt,这会将您的 redis 密码放入名为 password.txt 的文本文件中。复制密码并删除这两个文件。

    • Linux/MacOS:运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode 并复制输出的密码。

    将此密码作为 redisPassword 值添加到您的 redis.yaml 文件中。例如:

        metadata:
        - name: redisPassword
          value: lhDOkwTlp0
    
  1. 使用官方 Microsoft 文档创建 Azure Cache for Redis 实例。

  2. 创建实例后,从 Azure 门户获取主机名(FQDN)和您的访问密钥。

    • 对于主机名:
      • 导航到资源的概览页面。
      • 复制主机名值。
    • 对于您的访问密钥:
      • 导航到设置 > 访问密钥
      • 复制并保存您的密钥。
  3. 将您的密钥和主机名添加到 Dapr 可以应用于您的集群的 redis.yaml 文件中。

    • 如果您正在运行示例,请将主机和密钥添加到提供的 redis.yaml 中。
    • 如果您是从头开始创建项目,请按照组件格式部分中的说明创建 redis.yaml 文件。
  4. redisHost 键设置为 [上一步中的主机名]:6379,将 redisPassword 键设置为之前保存的密钥。

    注意: 在生产级应用程序中,请遵循 secret 管理 说明来安全管理您的 secret。

  5. 启用 EntraID 支持:

    • 在您的 Azure Redis 服务器上启用 Entra ID 身份验证。这可能需要几分钟时间。
    • useEntraID 设置为 "true" 以为 Azure Cache for Redis 实现 EntraID 支持。
  6. enableTLS 设置为 "true" 以支持 TLS。

注意:useEntraID 假定您的 UserPrincipal(通过 AzureCLICredential)或 SystemAssigned 托管标识具有 RedisDataOwner 角色权限。如果使用用户分配的标识,您需要指定 azureClientID 属性

Redis Sentinel 行为

连接到 Redis Sentinel 时,请使用 redisType: "node"。此外,将 failover 设置为 "true",并将 sentinelMasterName 设置为主节点的名称。可以在 redisHost 字段中以逗号分隔的列表形式指定多个 sentinel 地址以实现冗余。

故障转移特征:

  • 故障转移期间的锁丢失:如果锁在原始主节点故障之前未复制到提升的副本,则在主节点故障转移期间可能会丢失锁
  • 故障转移窗口:自动主节点提升期间服务器短暂不可用(通常为几秒)
  • 一致性:所有操作都路由到当前主节点,保持锁一致性

相关链接