使用 crdb-cli 创建 Active-Active 数据库

本节介绍如何使用 Redis Enterprise Software 操作员在 Kubernetes 上设置 Active-Active Redis Enterprise 数据库。

笔记:
6.4.2 及更高版本支持 Active-Active 数据库控制器。此控制器允许您使用自定义资源创建 Redis Enterprise Active-Active 数据库 (REAADB) 和 Redis Enterprise 远程集群 (RERC)。我们建议使用 REAADB方法创建 Active-Active 数据库

在 Kubernetes 上,Redis Enterprise Active-Active数据库提供从不同 Kubernetes 集群对同一数据集的读写访问。有关 Active-Active 的更多常规信息,请参阅Redis Enterprise 软件文档

创建主动-主动数据库需要在位于不同 Kubernetes 集群中的两个 Redis Enterprise 集群之间路由网络访问。如果没有为每个集群配置适当的访问权限,数据库实例之间的同步将失败。

该过程包括:

  1. 记录后续步骤中要使用的值。这些值的正确性和一致性非常重要。
  2. 编辑 Redis Enterprise 集群 (REC) 规范文件以包含该ActiveActive部分。根据您使用的 K8s 发行版,这会略有不同。
  3. 使用命令创建数据库crdb-cli。这些值必须与 REC 资源规范中的值匹配。

先决条件

在创建 Active-Active 数据库之前,您需要具有两个或更多个正在运行的 Kubernetes 集群的管理员访问权限,每个集群都具有以下配置:

笔记:
字段activeActiveingressOrRouteSpec字段不能共存于同一 REC 中。如果您通过ingressOrRouteSpecREC 中的 字段配置了入口,请使用 RedisEnterpriseActiveActiveDatabase (REAADB) 自定义资源创建 Active-Active 数据库。

记录所需参数

设置 Active-Active 数据库时最常见的错误是参数值不正确或不一致。资源文件中列出的值必须与 crdb-cli 命令中使用的值匹配。

  • 数据库名称 <db-name>
    • 描述:与入口后缀结合创建主动-主动数据库主机名
    • 格式:字符串
    • 示例值:myaadb
    • 如何获得:您选择
    • 数据库名称要求是:
      • 最多 63 个字符
      • 仅限字母、数字或连字符 (-)
      • 以字母开头;以字母或数字结尾。
      • 数据库名称不区分大小写

您需要获取每个参与 Redis Enterprise 集群 (REC) 的以下信息:

笔记:
您需要创建 DNS 别名<api-hostname>,以将 API 主机名 解析<ingress-suffix><replication-hostname>每个数据库的入口控制器的 LoadBalancer(或 Openshift 中的路由)的 IP 地址。为避免输入多个 DNS 记录,您可以在别名中使用通配符(例如 *.ijk.example.com)。
  • REC 主机名 <rec-hostname>
    • 描述:用于在crdb-cli命令中标识您的 Redis Enterprise 集群的主机名。这必须与其他参与集群不同。
    • 格式:<rec-name>.<namespace>.svc.cluster.local
    • 示例值:rec01.ns01.svc.cluster.local
    • 如何获取:列出所有 Redis Enterprise 集群
      kubectl get rec
      
  • API 主机名 <api-hostname>
    • 描述:用于从 K8s 集群外部访问 Redis Enterprise 集群 API 的主机名
    • 格式:字符串
    • 示例值:api.ijk.example.com
  • 入口后缀 <ingress-suffix>
    • 描述:结合数据库名称创建 Active-Active 数据库主机名
    • 格式:字符串
    • 示例值:-cluster.ijk.example.com
  • REC 管理员凭证 <username> <password>
    • 描述:机密中存储的 REC 的管理员用户名和密码
    • 格式:字符串
    • 示例值:用户名:user@example.com,密码:something
    • 如何获取:
      kubectl get secret <rec-name> \
        -o jsonpath='{.data.username}' | base64 --decode
      kubectl get secret <rec-name> \
        -o jsonpath='{.data.password}' | base64 --decode
      
  • 复制主机名 <replication-hostname>
    • 描述:入口处用于数据库的主机名
    • 格式:<db-name><ingress-suffix>
    • 示例值:myaadb-cluster.ijk.example.com
    • 如何获取:结合<db-name><ingress-suffix>您上面记录的值。
  • 复制端点 <replication-endpoint>
    • 描述:用于外部联系数据库的端点
    • 格式:<db-name><ingress-suffix>:443
    • 示例值:myaadb-cluster.ijk.example.com:443
    • 如何获取:<replication-hostname>:443

activeActive向 REC 资源文件添加部分

从 K8s 集群内部,编辑 Redis Enterprise 集群 (REC) 资源以将以下内容添加到spec部分。对每个参与集群执行此操作。

操作员使用 API 主机名 ( <api-hostname>) 创建 Redis Enterprise 集群 API 的入口;每个集群仅发生一次。每次在此集群上创建新的 Active-Active 数据库实例时,操作员都会使用入口后缀 ( <ingress-suffix>) 创建到数据库的新入口路由。每个新数据库的主机名将采用以下格式<db-name><ingress-suffix>

使用入口控制器

  1. 如果您的集群使用入口控制器,请将以下内容添加到specREC 资源文件的部分。

Nginx的:

activeActive:
  apiIngressUrl: <api-hostname>
  dbIngressSuffix: <ingress-suffix>
  ingressAnnotations:
     kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
  method: ingress

HAproxy:

activeActive:
  apiIngressUrl: <api-hostname>
  dbIngressSuffix: <ingress-suffix>
  ingressAnnotations:
    kubernetes.io/ingress.class: haproxy
     ingress.kubernetes.io/ssl-passthrough: "true"
  method: ingress
  1. 保存并应用更改后,您可以验证是否为 API 创建了新的入口。

    $ kubectl get ingress
    NAME   HOSTS                            ADDRESS                                 PORTS   AGE
    rec01  api.abc.cde.example.com  225161f845b278-111450635.us.cloud.com   80      24h
    
  2. 验证您是否可以从 K8s 集群外部访问 API。

    curl -k -L -i -u <username>:<password> https://<api-hostname>/v1/cluster
    

    如果 API 调用失败,请创建一个 DNS 别名,将您的 API 主机名 ( <api-hostname>) 解析为入口控制器的 LoadBalancer 的 IP 地址。

  3. 确保每个数据库都有 DNS 别名<api-hostname>,用于将 API 主机名 解析<ingress-suffix><replication-hostname>入口控制器的 LoadBalancer 的 IP 地址。为避免输入多个 DNS 记录,您可以在别名中使用通配符(例如*.ijk.example.com)。

如果使用 Istio Gateway 和 VirtualService

如果您使用Istio代替入口控制器,则无需更改 REC 规范。activeActive上面添加的部分创建了入口资源。用于配置 Istio 的两个自定义资源(Gateway 和 VirtualService)取代了对入口资源的需求。

警告:
这些自定义资源不受运营商控制,需要手动配置和维护。

对于每个集群,验证 VirtualService 资源- match:在部分中是否有两个块tls。下面的主机名sniHosts:应与您的相匹配<replication-hostname>

使用 OpenShift 路由

  1. 确保您的 Redis Enterprise 集群 (REC) 的名称 ( <rec-name.namespace>) 与其他参与集群不同。如果不是,您需要手动重命名 REC 或将其移动到其他命名空间。您可以使用以下命令检查新的 REC 名称:

    oc get rec -o jsonpath='{.items[0].metadata.name}'
    

    如果 rec 名称被修改,请将scc.yaml重新应用到命名空间以重新建立安全权限。

    oc apply -f scc.yaml
    oc adm policy add-scc-to-group redis-enterprise-scc-v2  system:serviceaccounts:<namespace>
    

    6.4.2-6 之前的版本使用 SCC 的早期版本,名为redis-enterprise-scc

  2. 确保每个数据库都有 DNS 别名<api-hostname>,用于将 API 主机名 解析<ingress-suffix><replication-hostname>路由 IP 地址。为避免输入多个 DNS 记录,您可以在别名中使用通配符(例如*.ijk.example.com)。

  3. 如果您的集群使用OpenShift 路由,请将以下内容添加到specRedis Enterprise 集群 (REC) 资源文件的部分。

    activeActive:
      apiIngressUrl: <api-hostname>
      dbIngressSuffix: <ingress-suffix>
      method: openShiftRoute
    
  4. 确保您的 DNS 别名能够解析每个数据库的 API 主机名 ( <api-hostname>) 和复制主机名 ( <replication-hostname>) 的路由 IP。为避免单独输入每个数据库,您可以在别名中使用通配符(例如*.ijk.example.com)。

  5. 保存并应用更改后,您可以看到为 API 创建了一条新路由。

    $ oc get route
    NAME    HOST/PORT                       PATH    SERVICES  PORT  TERMINATION   WILDCARD
    rec01   api-openshift.apps.abc.example.com rec01   api             passthrough   None
    

使用以下方式创建主动-主动数据库crdb-cli

crdb-cli命令可以从任何参与的 K8s 集群上托管的任何 Redis Enterprise pod 运行。您需要每个 Redis Enterprise 集群所需参数的值。

crdb-cli crdb create \
  --name <db-name> \
  --memory-size <mem-size> \
  --encryption yes \
  --instance fqdn=<rec-hostname-01>,url=https://<api-hostname-01>,username=<username-01>,password=<password-01>,replication_endpoint=<replication-endpoint-01>,replication_tls_sni=<replication-hostname-01> \
  --instance fqdn=<rec-hostname-02>,url=https://<api-hostname-02>,username=<username-02>,password=<password-02>,replication_endpoint=<replication-endpoint-02>,replication_tls_sni=<replication-hostname-02>

要创建在两个以上实例之间同步的数据库,请添加其他--instance参数。

请参阅crdb-cli参考资料以了解更多选项。

测试数据库

测试 Active-Active 数据库的最简单方法是在一个数据库中设置一个键值对,并从另一个数据库中检索它。

您可以按照管理数据库中的说明连接到您的数据库。在第一个数据库中设置一个测试密钥SET foo bar。如果您的 Active-Active 部署正常运行,则在连接到第二个数据库时,GET foo应该会输出bar

给此页面评分
返回顶部 ↑