使用crdb-cli创建Active-Active数据库
本节展示如何使用Redis Enterprise Software操作符在Kubernetes上设置一个Active-Active Redis Enterprise数据库。
在Kubernetes上,Redis Enterprise Active-Active 数据库提供从不同Kubernetes集群对同一数据集的读写访问。有关Active-Active的更多一般信息,请参阅Redis Enterprise Software文档。
创建一个Active-Active数据库需要在位于不同Kubernetes集群中的两个Redis Enterprise集群之间路由网络访问。如果没有为每个集群配置适当的访问权限,数据库实例之间的同步将失败。
这个过程包括:
- 记录将在后续步骤中使用的值。确保这些值正确且一致非常重要。
- 编辑Redis Enterprise集群(REC)规范文件以包含
ActiveActive
部分。根据您使用的K8s发行版,这将会有所不同。 - 使用
crdb-cli
命令创建数据库。这些值必须与REC资源规范中的值匹配。
先决条件
在创建Active-Active数据库之前,您需要对两个或更多正常运行的Kubernetes集群具有管理员访问权限,每个集群都需要具备以下条件:
- 使用ingress资源(或在OpenShift上使用route资源)进行外部访问的路由。
- 一个正常工作的Redis Enterprise集群(REC),具有唯一的名称。
- 数据库有足够的内存资源可用(参见硬件要求)。
activeActive
字段和 ingressOrRouteSpec
字段不能在同一 REC 中共存。如果您通过 REC 中的 ingressOrRouteSpec
字段配置了您的 ingress,请使用 RedisEnterpriseActiveActiveDatabase (REAADB) 自定义资源创建您的 Active-Active 数据库。文档所需参数
设置Active-Active数据库时最常见的错误是参数值不正确或不一致。资源文件中列出的值必须与crdb-cli命令中使用的值匹配。
- 数据库名称
<db-name>
:- 描述:与入口后缀结合以创建Active-Active数据库主机名
- 格式:字符串
- 示例值:
myaadb
- 获取方式:您选择
- 数据库名称要求:
- 最多63个字符
- 仅包含字母、数字或连字符(-)
- 以字母开头;以字母或数字结尾
- 数据库名称不区分大小写
您需要为每个参与的Redis Enterprise集群(REC)提供以下信息:
<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>
使用入口控制器
- 如果您的集群使用了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
-
在保存并应用更改后,您可以验证是否为API创建了一个新的入口。
$ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE rec01 api.abc.cde.example.com 225161f845b278-111450635.us.cloud.com 80 24h
-
验证您可以从K8s集群外部访问API。
curl -k -L -i -u <username>:<password> https://<api-hostname>/v1/cluster
如果API调用失败,创建一个DNS别名,将您的API主机名(
<api-hostname>
)解析为入口控制器的LoadBalancer的IP地址。 -
确保您为每个数据库设置了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路由
-
确保您的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
。 -
确保您为每个数据库设置了DNS别名,这些别名将您的API主机名
<api-hostname>
、<ingress-suffix>
、<replication-hostname>
解析为路由IP地址。为了避免输入多个DNS记录,您可以在别名中使用通配符(例如*.ijk.example.com
)。 -
如果您的集群使用OpenShift routes,请将以下内容添加到Redis Enterprise集群(REC)资源文件的
spec
部分。activeActive: apiIngressUrl: <api-hostname> dbIngressSuffix: <ingress-suffix> method: openShiftRoute
-
确保您有DNS别名解析为每个数据库的API主机名(
<api-hostname>
)和复制主机名(<replication-hostname>
)的路由IP。为了避免逐个输入每个数据库,您可以在别名中使用通配符(例如*.ijk.example.com
)。 -
保存并应用更改后,您可以看到为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
。