使用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 Software文档

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

这个过程包括:

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

先决条件

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

注意:
activeActive 字段和 ingressOrRouteSpec 字段不能在同一 REC 中共存。如果您通过 REC 中的 ingressOrRouteSpec 字段配置了您的 ingress,请使用 RedisEnterpriseActiveActiveDatabase (REAADB) 自定义资源创建您的 Active-Active 数据库。

文档所需参数

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

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

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

注意:
您需要创建DNS别名来将您的API主机名<api-hostname><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后缀 <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. 如果您的集群使用了ingress controller,请将以下内容添加到您的REC资源文件的spec部分。

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主机名<api-hostname><ingress-suffix><replication-hostname>解析为入口控制器的LoadBalancer的IP地址。为了避免输入多个DNS记录,您可以在别名中使用通配符(例如*.ijk.example.com)。

如果使用 Istio Gateway 和 VirtualService

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

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

对于每个集群,验证VirtualService资源在tls部分有两个- match:块。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主机名<api-hostname><ingress-suffix><replication-hostname>解析为路由IP地址。为了避免输入多个DNS记录,您可以在别名中使用通配符(例如*.ijk.example.com)。

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

    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创建一个Active-Active数据库

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

RATE THIS PAGE
Back to top ↑