你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Azure Managed Instance for Apache Cassandra 配置混合群集

Azure Managed Instance for Apache Cassandra 是针对纯开源 Apache Cassandra 群集的完全托管服务。 该服务还允许根据每个工作负载的具体需求来替代配置,从而在需要时实现最大的灵活性和控制。

本快速入门演示如何使用 Azure CLI 命令配置混合群集。 如果你的现有数据中心位于本地或自承载环境中,则可使用 Azure Managed Instance for Apache Cassandra 将其他数据中心添加到该群集并对其进行维护。

先决条件

  • 本文需要 Azure CLI 2.30.0 或更高版本。 如果你使用的是 Azure Cloud Shell,则表示已安装最新版本。

  • 与自承载环境或本地环境连接的 Azure 虚拟网络。 若要详细了解如何将本地环境连接到 Azure,请参阅将本地网络连接到 Azure 一文。

配置混合群集

  1. 登录 Azure 门户并导航到你的虚拟网络资源。

  2. 打开“子网”选项卡并创建新的子网。 若要详细了解“添加子网”窗体中的字段,请参阅虚拟网络一文:

    将新子网添加到虚拟网络中。

    注意

    部署 Azure Managed Instance for Apache Cassandra 需要 Internet 访问权限。 在限制 Internet 访问权限的环境中,部署将失败。 请确保未在 VNet 中阻止对以下关键 Azure 服务(托管 Cassandra 需要这些服务才能正常工作)的访问权限。 还可以在此处找到 IP 地址和端口依赖项的广泛列表。

    • Azure 存储
    • Azure KeyVault
    • Azure 虚拟机规模集
    • Azure 监视
    • Microsoft Entra ID
    • Azure 安全性
  3. 现在,我们将使用 Azure CLI 对 Cassandra 托管实例所需的 VNet 和子网应用一些特殊权限。 使用 az role assignment create 命令,将 <subscriptionID><resourceGroupName><vnetName> 替换为适当的值:

    az role assignment create \
      --assignee a232010e-820c-4083-83bb-3ace5fc29d0b \
      --role 4d97b98b-1d4f-4787-a291-c67834d212e7 \
      --scope /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>
    

    注意

    上一命令中的 assigneerole 值分别是固定的服务主体和角色标识符。

  4. 接下来,我们将为混合群集配置资源。 你已经有一个群集,所以此处的群集名称将仅作为用于标识现有群集名称的逻辑资源。 在以下脚本中定义 clusterNameclusterNameOverride 变量时,请务必使用现有群集的名称。

    你还至少需要来自现有数据中心的种子节点,以及节点到节点加密所需的 gossip 证书。 Azure Managed Instance for Apache Cassandra 需要将节点到节点加密用于数据中心之间的通信。 如果在现有群集中未实现节点到节点加密,则需要实现它 - 请参阅此处的文档。 应提供证书位置的路径。 每个证书都应采用 PEM 格式,例如 -----BEGIN CERTIFICATE-----\n...PEM format 1...\n-----END CERTIFICATE-----。 通常,可以通过两种方式实现证书:

    1. 自签名证书。 这意味着每个节点都有一个专用和公用(无 CA)证书 - 在这种情况下,我们需要所有公用证书。

    2. CA 签名的证书。 这可以是自签名 CA,甚至是公用 CA。 在这种情况下,我们需要根 CA 证书(请参阅有关为生产准备 SSL 证书的说明)以及所有中介(如果适用)。

    (可选)如果还要实现客户端到节点证书身份验证或互相传输层安全性 (mTLS),则需要按创建混合群集时相同的格式提供证书。 请参阅下面的 Azure CLI 示例 - 证书在 --client-certificates 参数中提供。 这会将你的客户端证书上传到你的 Cassandra 托管实例群集的信任存储(你无需编辑 cassandra.yaml 设置)。 应用后,群集将要求 Cassandra 在客户端连接时验证证书(请参阅 Cassandra client_encryption_options 中的 require_client_auth: true)。

    注意

    你将在下面提供的 delegatedManagementSubnetId 变量的值与你在上面的命令中提供的 --scope 的值完全相同:

    resourceGroupName='MyResourceGroup'
    clusterName='cassandra-hybrid-cluster-legal-name'
    clusterNameOverride='cassandra-hybrid-cluster-illegal-name'
    location='eastus2'
    delegatedManagementSubnetId='/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/<subnetName>'
    
    # You can override the cluster name if the original name is not legal for an Azure resource:
    # overrideClusterName='ClusterNameIllegalForAzureResource'
    # the default cassandra version will be v3.11
    
    az managed-cassandra cluster create \
      --cluster-name $clusterName \
      --resource-group $resourceGroupName \
      --location $location \
      --delegated-management-subnet-id $delegatedManagementSubnetId \
      --external-seed-nodes 10.52.221.2 10.52.221.3 10.52.221.4 \
      --external-gossip-certificates /usr/csuser/clouddrive/rootCa.pem /usr/csuser/clouddrive/gossipKeyStore.crt_signed
      # optional - add your existing datacenter's client-to-node certificates (if implemented):
      # --client-certificates /usr/csuser/clouddrive/rootCa.pem /usr/csuser/clouddrive/nodeKeyStore.crt_signed
    

    注意

    如果群集已具有节点到节点和客户端到节点加密,则你应知道现有客户端和/或 gossip SSL 证书的保存位置。 如果你不确定,你应该能够运行 keytool -list -keystore <keystore-path> -rfc -storepass <password> 来打印证书。

  5. 创建群集资源后,运行以下命令获取群集设置详细信息:

    resourceGroupName='MyResourceGroup'
    clusterName='cassandra-hybrid-cluster'
    
    az managed-cassandra cluster show \
       --cluster-name $clusterName \
       --resource-group $resourceGroupName \
    
  6. 上述命令会返回托管实例环境的相关信息。 你将需要 gossip 证书,以便可将它们安装在现有数据中心内节点的信任存储上。 以下屏幕截图显示了上一命令的输出和证书的格式:

    从群集获取证书详细信息。

    注意

    以上命令返回的证书包含以文本形式表示的换行符,例如 \r\n。 你应将每个证书都复制到一个文件中,并在尝试将其导入现有数据中心的信任存储之前对其进行格式化。

    提示

    将上面屏幕截图中显示的 gossipCertificates 数组值复制到文件中,使用以下 bash 脚本(需要为平台下载并安装 jq)格式化证书,并为每个证书创建单独的 pem 文件。

    readarray -t cert_array < <(jq -c '.[]' gossipCertificates.txt)
    # iterate through the certs array, format each cert, write to a numbered file.
    num=0
    filename=""
    for item in "${cert_array[@]}"; do
      let num=num+1
      filename="cert$num.pem"
      cert=$(jq '.pem' <<< $item)
      echo -e $cert >> $filename
      sed -e 's/^"//' -e 's/"$//' -i $filename
    done
    
  7. 接下来,在混合群集中创建新的数据中心。 请务必将变量值替换为群集详细信息:

    resourceGroupName='MyResourceGroup'
    clusterName='cassandra-hybrid-cluster'
    dataCenterName='dc1'
    dataCenterLocation='eastus2'
    virtualMachineSKU='Standard_D8s_v4'
    noOfDisksPerNode=4
    
    az managed-cassandra datacenter create \
      --resource-group $resourceGroupName \
      --cluster-name $clusterName \
      --data-center-name $dataCenterName \
      --data-center-location $dataCenterLocation \
      --delegated-subnet-id $delegatedManagementSubnetId \
      --node-count 9
      --sku $virtualMachineSKU \
      --disk-capacity $noOfDisksPerNode \
      --availability-zone false
    

    注意

    可以从以下可用 SKU 中选择 --sku 的值:

    • Standard_E8s_v4
    • Standard_E16s_v4
    • Standard_E20s_v4
    • Standard_E32s_v4
    • Standard_DS13_v2
    • Standard_DS14_v2
    • Standard_D8s_v4
    • Standard_D16s_v4
    • Standard_D32s_v4

    另请注意,--availability-zone 设置为 false。 若要启用可用性区域,请将此设置为 true。 可用性区域将提高服务的可用性 SLA。 有关更多详细信息,请在此处查看 SLA 的完整详细信息。

    警告

    并非所有区域都支持可用性区域。 如果选择不支持可用性区域的区域,部署将会失败。 有关支持的区域的信息,请参阅此处。 可用性区域的成功部署还受限于给定区域内所有区域中的计算资源的可用性。 如果你选择的 SKU 或容量在所有区域中均不可用,则部署可能会失败。

  8. 现已创建新的数据中心,接下来运行 show datacenter 命令查看其详细信息:

    resourceGroupName='MyResourceGroup'
    clusterName='cassandra-hybrid-cluster'
    dataCenterName='dc1'
    
    az managed-cassandra datacenter show \
      --resource-group $resourceGroupName \
      --cluster-name $clusterName \
      --data-center-name $dataCenterName
    
  9. 上述命令会输出新数据中心的种子节点:

    如何获取数据中心详细信息的屏幕截图。

  10. 现在将新数据中心的种子节点添加到现有数据中心在 cassandra.yaml 文件中的种子节点配置。 对每个证书使用 keytool 命令,将之前收集的托管实例 gossip 证书安装到现有群集中每个节点的信任存储中:

    keytool -importcert -keystore generic-server-truststore.jks -alias CassandraMI -file cert1.pem -noprompt -keypass myPass -storepass truststorePass
    

    注意

    若要添加更多数据中心,可重复以上步骤,但只需要种子节点。

    重要

    如果你的现有 Apache Cassandra 群集只有一个数据中心,并且这是首次添加数据中心,请确保将 cassandra.yaml 中的 endpoint_snitch 参数设置为 GossipingPropertyFileSnitch

    重要

    如果现有应用程序代码使用 QUORUM 保持一致性,则应确保在更改以下步骤中的复制设置之前,现有应用程序代码使用 LOCAL_QUORUM 连接到现有群集(否则,更改以下步骤中的复制设置后,实时更新将失败)。 更改复制策略后,可根据需要还原为 QUORUM。

  11. 最后,使用以下 CQL 查询更新每个密钥空间中的复制策略,使其包含整个群集中的所有数据中心:

    ALTER KEYSPACE "ks" WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'on-premise-dc': 3, 'managed-instance-dc': 3};
    

    还需要更新几个系统表:

    ALTER KEYSPACE "system_auth" WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'on-premise-dc': 3, 'managed-instance-dc': 3}
    ALTER KEYSPACE "system_distributed" WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'on-premise-dc': 3, 'managed-instance-dc': 3}
    ALTER KEYSPACE "system_traces" WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'on-premise-dc': 3, 'managed-instance-dc': 3}
    

    重要

    如果现有群集中的数据中心不强制实施客户端到节点加密 (SSL),并且你打算让应用程序代码直接连接到 Cassandra 托管实例,则还需要在应用程序代码中启用 SSL。

使用混合群集进行实时迁移

上述说明提供有关配置混合群集的指导。 但是,这也是实现无缝零停机时间迁移的好方法。 如果你有一个本地或其他 Cassandra 环境,并希望在零停机时间的情况下停用它,以支持在适用于 Apache Cassandra 的 Azure 托管实例中运行工作负载,请务必按此顺序完成以下步骤:

  1. 配置混合群集(请按照上述说明操作)。

  2. 在迁移期间,在 Azure Managed Instance for Apache Cassandra 中暂时禁用自动修复:

    az managed-cassandra cluster update \
      --resource-group $resourceGroupName \
      --cluster-name $clusterName --repair-enabled false
    
  3. 在 Azure CLI 中运行以下命令,在新 Azure Managed Instance for Apache Cassandra 数据中心的每个节点上执行 nodetool rebuild,将 <ip address> 替换为节点的 IP 地址,并将 <sourcedc> 替换为现有数据中心(要从其进行迁移的数据中心)的名称:

    az managed-cassandra cluster invoke-command \
      --resource-group $resourceGroupName \
      --cluster-name $clusterName \
      --host <ip address> \
      --command-name nodetool --arguments rebuild="" "<sourcedc>"=""
    

    只有在执行上述所有步骤后,才应运行此操作。 这应确保所有历史数据都复制到 Azure Managed Instance for Apache Cassandra 中的新数据中心。 可以同时在一个或多个节点上运行重新生成。 一次在一个节点上运行,以降低对现有群集的影响。 当群集可以处理额外的 I/O 和网络压力时,在多个节点上运行。 对于大多数安装,只能并行运行一两个安装,以免重载群集。

    警告

    运行 nodetool rebuild 时,必须指定源数据中心。 如果在首次尝试时未正确提供数据中心,则会导致为非系统表复制令牌范围,而不是复制数据。 即使正确提供了数据中心,后续尝试也会失败。 可以通过目标 Cassandra MI 数据中心的 cqlsh 查询工具删除 system.available_ranges 中每个非系统键空间的条目来解决此问题:

    delete from system.available_ranges where keyspace_name = 'myKeyspace';
    
  4. 直接转换应用程序代码,以便指向 Azure Managed Instance for Apache Cassandra 数据中心中的种子节点。

    重要

    如混合设置说明中所述,如果现有群集中的数据中心不强制实施客户端到节点加密 (SSL) ,则需要在应用程序代码中启用此加密,因为 Cassandra Managed Instance 强制需要此加密。

  5. 以与之前相同的方式为每个密钥空间运行 ALTER KEYSPACE,但现在删除旧数据中心。

  6. 针对每个旧数据中心节点运行 nodetool decommission

  7. 将应用程序代码切换回仲裁(如果需要/愿意)。

  8. 重启自动修复:

    az managed-cassandra cluster update \
      --resource-group $resourceGroupName \
      --cluster-name $clusterName --repair-enabled true
    

疑难解答

如果在使用 Azure CLI 将权限应用到虚拟网络时遇到错误(例如,“无法在‘e5007d2c-4b13-4a74-9b6a-605d99f03501’的图形数据库中找到用户或服务主体”),则可以在 Azure 门户中手动应用相同的权限。 通过此处了解如何执行此操作。

注意

Azure Cosmos DB 角色分配仅用于部署目的。 Azure Managed Instanced for Apache Cassandra 对于 Azure Cosmos DB 不存在后端依赖关系。

清理资源

如果不打算继续使用此托管实例群集,请按照以下步骤删除它:

  1. 从 Azure 门户的左侧菜单中选择“资源组”。
  2. 从列表中选择为本快速入门创建的资源组。
  3. 在资源组的“概述”窗格上,选择“删除资源组” 。
  4. 在下一窗口中输入要删除的资源组的名称,然后选择“删除” 。

后续步骤

在本快速入门中,你了解了如何使用 Azure CLI 和 Azure Managed Instance for Apache Cassandra 创建混合群集。 现在你可开始使用该群集了。