你当前正在访问 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 命令配置混合群集。 如果本地或自承载环境中已有数据中心,可以使用适用于 Apache Cassandra 的 Azure 托管实例将这些数据中心添加到这些群集并维护这些数据中心。

先决条件

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

  • 与自承载环境或本地环境连接的 Azure 虚拟网络。 有关将本地环境连接到 Azure 的详细信息,请参阅 将本地网络连接到 Azure

配置混合群集

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

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

    屏幕截图显示了选择加入并将新子网添加到虚拟网络的选项。

    注意

    Azure 托管实例用于 Apache Cassandra 的部署需要互联网访问。 在限制 Internet 访问权限的环境中,部署将失败。 确保不会阻止虚拟网络中访问以下重要的 Azure 服务,这些服务是托管 Cassandra 正常工作所必需的。 有关 IP 地址和端口依赖项的列表,请参阅 所需的出站网络规则

    • Azure 存储
    • Azure KeyVault
    • Azure 虚拟机规模集
    • Azure 监视
    • Microsoft Entra 身份识别系统
    • Azure 安全性
  3. 使用 Azure CLI 将某些特殊权限应用于 Cassandra 托管实例所需的虚拟网络和子网。 使用 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-----。 通常,可以通过两种方式实现证书:

    • 自签名证书。 每个节点的专用和公共(无 CA)证书。 在这种情况下,需要所有公共证书。

    • 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 isn't 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 脚本设置证书的格式,并为每个证书创建单独的 pem 文件。 若要下载 Bash 脚本,请参阅适用于平台的 下载 jq

    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

    警告

    并非所有区域都支持可用性区域。 如果选择不支持可用性区域的区域,则部署会失败。 有关支持的区域,请参阅 Azure 区域列表

    可用性区域的成功部署还受限于给定区域内所有区域中的计算资源的可用性。 如果选择的 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 适用于 Apache Cassandra 的托管实例中的自动修复。

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

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

    只有在执行所有以前的步骤后,才应运行此命令。 此方法应确保所有历史数据都复制到 Azure 托管实例 (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 托管实例强制实施此要求。

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

  6. 为每个旧的数据中心节点运行 节点工具停用

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

  8. 重启自动修复:

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

疑难解答

如果使用 Azure CLI 将权限应用到虚拟网络时遇到错误,可以从 Azure 门户手动应用相同的权限。 此类错误的示例是 “e5007d2c-4b13-4a74-9b6a-605d99f03501”的图形数据库中找不到用户或服务主体。 有关详细信息,请参阅 使用 Azure 门户添加 Azure Cosmos DB 服务主体

注意

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

清理资源

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

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

后续步骤