本文档适用于架构师和从事运营和 行政团队。该文档描述了一个示例模式,您可以使用 用于您自己在 Google Cloud 中的部署。 在此模式中,负载均衡器将流量定向到 计算引擎 中的实例 托管实例组 服务于内容。在中断时,您更新 外部 HTTP(S) 负载平衡 配置并故障转移到静态站点 云储存。 要完成本教程,您需要一个您控制的注册域名 并希望与此文档一起使用。 在生产部署中,您的网站可能包含更多文件和 托管实例组虚拟机上的附加应用程序代码 (虚拟机)比本文档中显示的要多。 Cloud Storage 然后托管更多 提供最少功能的有限静态版本。在热故障转移中 场景,用户看到这个有限的网站直到托管实例组 恢复并可以为完整的网站体验提供流量。 在本教程中,您将部署资源以创建环境,如 下图: 当您需要故障转移时,您更新负载均衡器配置以直接 到 Cloud Storage 的流量,如下图所示: 这种热故障转移模式平衡了运行另一个托管的成本 仅在主要区域时使用的不同区域中的实例组 失败。使用 Cloud Storage 的静态站点的成本低于运行 另一个托管实例组,但在您更新负载时会有短暂的延迟 托管选项之间的平衡器配置。有限的网站 Cloud Storage 中的体验比不可用的网站好,差 客户体验。 对于使用 Cloud DNS 而不是外部的替代方法 HTTP(S) 负载平衡来控制故障转移,请参阅 将 Cloud DNS 与 Compute Engine 和 Cloud Storage 结合使用,部署热可恢复网络服务器。 如果您拥有或想要使用 Cloud DNS,则此模式非常有用。 要在 Google Cloud 中运行可靠的应用程序,我们建议您设计 您的应用程序基础架构来处理中断。取决于您的应用 和业务需求,您可能需要冷故障转移、热故障转移或热故障转移 故障转移模式。有关如何确定最佳方法的更多信息 您自己的应用程序,请参阅 灾难恢复规划指南。 本文档使用一个基本的 阿帕奇网络服务器, 但基础设施部署的相同方法适用于其他 您需要创建的应用程序环境。 ## 目标 - - 使用自定义 VM 映像创建区域托管实例组。 - 创建一个云存储桶。 - 创建和配置外部 HTTP(S) 负载平衡。 - 使用更新的负载均衡器测试暖 Web 服务器故障转移 配置。 - 使用更新的负载平衡器配置测试恢复和故障回复。 ## 费用 本教程使用 Google Cloud 的以下收费组件: - - 计算引擎 - 联网 - 云储存 要根据您的预计使用情况生成成本估算, 使用定价计算器。 ## 在你开始之前 - - 登录您的 Google Cloud 帐户。如果您不熟悉 谷歌云, 创建一个帐户来评估我们的产品在 真实场景。新客户还可获得 300 美元的免费积分 运行、测试和部署工作负载。 - 在 Google Cloud 控制台的项目选择器页面上, 选择或创建一个 Google Cloud 项目。 - 确保为您的 Cloud 项目启用了计费。学习如何 检查项目是否启用了计费。 - 启用计算引擎 API。 - 安装并初始化 Google Cloud CLI。 - 在 Google Cloud 控制台的项目选择器页面上, 选择或创建一个 Google Cloud 项目。 - 确保为您的 Cloud 项目启用了计费。学习如何 检查项目是否启用了计费。 - 启用计算引擎 API。 - 安装并初始化 Google Cloud CLI。 您可以在 无需安装控制台 谷歌云命令行界面。在中运行 gcloud CLI 控制台,使用 Cloud Shell ##准备环境 在本节中,您为资源名称定义了一些变量,并且 位置。这些变量由 Google Cloud CLI 命令在您使用时使用 部署资源。 在整个文档中,除非另有说明,否则您将在以下位置输入所有命令 云壳 或您当地的开发环境。 - 代替 使用您自己的项目 ID。如果需要, 为资源提供您自己的名称后缀,以帮助搜索和识别 他们,比如 项目编号 应用程序 指定两个区域,比如 和 美国西部1 ,以及其中一个区域内的区域,例如 美国西部2 .该区域定义了初始基础 VM 所在的位置 已创建,用于为托管实例组创建映像 us-west1-a 最后,设置一个用于静态网站的域,例如 例子.com PROJECT_ID= 项目编号 NAME_SUFFIX=应用程序 区域 1= us-west1 区域 2= us-west2 ZONE= us-west1-a 域= example.com ## 创建VPC和子网 为了提供对 VM 的网络访问,您创建虚拟私有云 (VPC) 和子网。由于您需要两个区域中的托管实例组,因此您创建一个 每个区域的子网。有关定制优势的更多信息 子网模式来管理环境中使用的 IP 地址范围,请参阅 使用自定义模式 VPC 网络。 - 使用自定义子网模式创建 VPC: gcloud 计算网络创建网络-$NAME_SUFFIX --subnet-mode=custom 现在在新的 VPC 中创建两个子网,每个子网一个 地区。定义您自己的地址范围,例如 和 10.1.0.0/20 , 那 适合您的网络范围: 10.2.0.0/20 gcloud 计算网络子网创建 n subnet-$NAME_SUFFIX-$REGION1 n --network=network-$NAME_SUFFIX n --range= 10.1.0.0/20n --region=$REGION1 gcloud 计算网络子网创建 n subnet-$NAME_SUFFIX-$REGION2 n --network=network-$NAME_SUFFIX n --range= 10.2.0.0/20n --region=$REGION2 ## 创建防火墙规则 要让网络流量在 VPC 中正确流动,请使用 防火墙规则。 - 创建防火墙规则以允许对负载进行 Web 流量和健康检查 平衡器和托管实例组: gcloud compute firewall-rules 创建允许-http-$NAME_SUFFIX n --network=network-$NAME_SUFFIX n --direction=INGRESS n --priority=1000 n --action=ALLOW n --rules=tcp:80 n --源范围=0.0.0.0/0 n --target-tags=http-server gcloud compute firewall-rules create allow-health-check-$NAME_SUFFIX n --network=network-$NAME_SUFFIX n --action=allow n --direction=ingress n --source-ranges=130.211.0.0/22,35.191。 0.0/16 n --target-tags=allow-health-check n --rules=tcp:80 HTTP 规则允许流量流向任何 VM,其中 应用了 http-servertag, 并从任何来源使用 0.0.0.0/0 范围。为了 健康检查规则, Google Cloud 的默认范围设置为允许平台正确 检查资源的健康状况。 要允许 SSH 流量用于基本 VM 映像的初始配置,范围 防火墙规则到您的环境使用 --source-range参数。 您可能需要与您的网络团队合作来确定哪些源范围 您的组织使用 代替 使用您自己的 IP 地址范围: IP_ADDRESS_SCOPE gcloud compute firewall-rules 创建允许-ssh-$NAME_SUFFIX n --network=network-$NAME_SUFFIX n --direction=INGRESS n --priority=1000 n --action=ALLOW n --rules=tcp:22 n --源范围= IP_ADDRESS_SCOPE 创建防火墙规则后,验证三个规则是否已 添加: gcloud 计算防火墙规则列表 n --project=$PROJECT_ID n --filter="NETWORK=network-$NAME_SUFFIX"以下示例输出显示三个规则已正确 创建: 名称网络方向优先允许 允许健康检查应用程序网络应用程序入口 1000 tcp:80 允许-http-app 网络-app 入口 1000 tcp:80 允许 ssh-app 网络应用入口 1000 tcp:22 ## 创建和配置基本 VM 映像 要创建无需额外配置即可部署的相同 VM,您 使用自定义 VM 映像。此图像捕获操作系统和 Apache 配置,以及 用于在后续步骤中创建托管实例组中的每个 VM。 在 VM 上,您创建一个基本的 永久磁盘上的 index.html 文件和 安装到 /var/www/example.com。 Apache 配置文件位于 /etc/apache2/sites-available/example.com.conf 提供来自 挂载的永久性磁盘位置 下图显示了存储在 Apache 中的基本 HTML 页面 在永久性磁盘上: 您可以按照以下步骤构建此环境。 - 创建一个附加了永久性磁盘的基础虚拟机: gcloud 计算实例创建 vm-base-$NAME_SUFFIX n --zone=$ZONE n --machine-type=n1-standard-1 n --subnet=subnet-$NAME_SUFFIX-$REGION1 n --tags=http-server n --image=debian-10-buster-v20210420 n --image-project=debian-cloud n --boot-disk-size=10GB n --boot-disk-type=pd-balanced n --boot-disk-设备名称=vm-base-$NAME_SUFFIX n --create-disk=type=pd-ssd,name=disk-base-$NAME_SUFFIX,size=10GB,device-name=disk-base-$NAME_SUFFIX 您使用本文档开头定义的参数来命名 VM 和 连接到正确的子网。名称也从参数中分配 启动盘和数据盘。 要安装和配置简单网站,请使用 SSH: gcloud compute ssh vm-base-$NAME_SUFFIX --zone=$ZONE 在与 VM 的 SSH 会话中,创建一个脚本来配置 VM 您选择的编辑器。下面的例子使用 纳米 作为编辑: 纳米配置-vm。 将以下配置脚本粘贴到文件中: bin/bash NAME_SUFFIX= 应用程序 # 为基本网站文件创建目录 sudo mkdir -p /var/www/example.com sudo chmod a+w /var/www/example.com sudo chown -R www-data: /var/www/example.com # 找到磁盘名称,然后格式化并挂载它 DISK_NAME="google-disk-base-$NAME_SUFFIX"DISK_PATHfind /dev/disk/by-id -name DISK_NAME}"| xargs -Ireadlink -f n 须藤 mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard $DISK_PATH sudo mount -o 丢弃,默认 $DISK_PATH /var/www/example.com # 安装阿帕奇 sudo apt-get 更新&& sudo apt-get -y 安装 apache2 # 将一个基本的 HTML 文件写入挂载的永久磁盘 sudo tee -a /var/www/example.com/index.html >/dev/null EOF' HA / DR 示例

欢迎来到 Compute Engine 网站,热故障转移到 Cloud Storagep>

*:80> ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/example.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined 结尾 # 启用 Apache 配置文件并重新加载服务 sudo a2dissite 000-默认 sudo a2ensite example.com.conf sudo systemctl 重新加载 apache2 更新 变量以匹配设置的值 本文档的开头,例如 NAME_SUFFIX 应用。 写出文件并退出编辑器。例如,在 Nano 中你使用 Ctrl-O 写出文件,然后退出 Ctrl-X。 使配置脚本可执行,然后运行它: chmod +x 配置虚拟机../配置虚拟机。 退出与 VM 的 SSH 会话: 出口 获取 VM 的 IP 地址并使用 curl查看基本网页: curl $(gcloud compute instances describe vm-base-$NAME_SUFFIX n --zone $ZONE n --format="value(networkInterfaces.accessConfigs.[0].natIPn 返回基本网站,如以下示例输出所示: HA / DR 示例

欢迎来到 Compute Engine 网站,热故障转移到 Cloud Storagep>

gcloud compute images 创建图像磁盘-$NAME_SUFFIX n --source-disk=disk-base-$NAME_SUFFIX n --source-disk-zone=$ZONE # 创建实例模板 gcloud compute instance-templates 创建模板-$NAME_SUFFIX-$REGION1 n --machine-type=n1-standard-1 n --subnet=projects/$PROJECT_ID/regions/$REGION1/subnetworks/subnet-$NAME_SUFFIX-$REGION1 n --region=$REGION1 n --tags=http-server n --metadatastartup-script /bin/bashn'echo\ UUIDblkid\ -s\ UUID\ -o\ value\ /dev/sdb /var/www/example. com\ ext4\ 丢弃、默认、nofail\ 0\ 2 ee\ -a\ /etc/fstabn'mount\ -a n --image=image-$NAME_SUFFIX n --create-disk=image=image-disk-$NAME_SUFFIX ,自动删除=是 gcloud compute instance-templates 创建模板-$NAME_SUFFIX-$REGION2 n --machine-type=n1-standard-1 n --subnet=projects/$PROJECT_ID/regions/$REGION2/subnetworks/subnet-$NAME_SUFFIX-$REGION2 n --region=$REGION2 n --tags=http-server n --metadatastartup-script /bin/bashn'echo\ UUIDblkid\ -s\ UUID\ -o\ value\ /dev/sdb /var/www/example. com\ ext4\ 丢弃、默认、nofail\ 0\ 2 ee\ -a\ /etc/fstabn'mount\ -a n --image=image-$NAME_SUFFIX n --create-disk=image=image-disk-$NAME_SUFFIX ,自动删除=是 # 为 VM 实例创建健康检查 gcloud compute health-checks 创建 http http-basic-check-$NAME_SUFFIX n --port 80 # 创建托管实例组 gcloud 计算实例组管理创建实例组-$NAME_SUFFIX-$REGION1 n --template=template-$NAME_SUFFIX-$REGION1 n --size=2 n --region=$REGION1 n --health-check=http-基本检查-$NAME_SUFFIX gcloud 计算实例组管理创建实例组-$NAME_SUFFIX-$REGION2 n --template=template-$NAME_SUFFIX-$REGION2 n --size=2 n --region=$REGION2 n --health-check=http-基本检查-$NAME_SUFFIX ## 创建和配置负载均衡器 为了让用户访问您的网站,您需要允许流量通过虚拟机 在托管实例组中运行。你还想自动重定向 如果托管实例组中出现区域故障,则将流量转移到新虚拟机。 在下一节中,您将创建一个 外部负载平衡器 为端口上的 HTTP 流量提供后端服务 80、使用前面步骤创建的健康检查,并映射一个外部IP 地址通过后端服务。 有关详细信息,请参阅 如何设置简单的外部 HTTP 负载平衡器。 - 为您的应用程序创建和配置负载均衡器: # 配置HTTP端口80的端口规则 gcloud 计算实例组 set-named-ports n instance-group-$NAME_SUFFIX-$REGION1 n --named-ports http:80 n --region $REGION1 gcloud compute instance-groups set-named-ports n 实例组-$NAME_SUFFIX-$REGION2 n --named-ports http:80 n --region $REGION2 # 创建后端服务并向其添加托管实例组 gcloud 计算后端服务创建 n web-backend-service-$NAME_SUFFIX n --protocol=HTTP n --port-name=http n --health-checks=http-basic-check-$NAME_SUFFIX n --global gcloud compute backend-services 添加后端 n web-backend-service-$NAME_SUFFIX n --instance-group=instance-group-$NAME_SUFFIX-$REGION1 n --instance-group-region=$REGION1 n --global gcloud compute backend-services 添加后端 n web-backend-service-$NAME_SUFFIX n --instance-group=instance-group-$NAME_SUFFIX-$REGION2 n --instance-group-region=$REGION2 n --global # 为后端服务创建一个URL映射 gcloud compute url-maps 创建 web-map-http-$NAME_SUFFIX n --default-service web-backend-service-$NAME_SUFFIX # 为 HTTP 流量配置转发 gcloud compute target-http-proxies 创建 n http-lb-proxy-$NAME_SUFFIX n --url-map web-map-http-$NAME_SUFFIX gcloud compute forwarding-rules 创建 n http-content-rule-$NAME_SUFFIX n --global n --target-http-proxy=http-lb-proxy-$NAME_SUFFIX n --ports=80 获取网络流量转发规则的 IP 地址: IP_ADDRESSgcloud 计算转发规则描述 http-content-rule-$NAME_SUFFIX n --global n --format="value(IPAddressn 使用 curl,或者打开浏览器,查看网站使用的IP 上一步中负载均衡器的地址: 卷曲 $IP_ADDRESS 负载均衡器需要几分钟才能完成部署并 正确地将流量定向到您的后端。如果返回 HTTP 404 错误 负载均衡器仍在部署中。如果需要,请等待几分钟,然后尝试 再次访问该网站。 返回基本网站,如以下示例输出所示: HA / DR 示例

欢迎来到 Compute Engine 网站,热故障转移到 Cloud Storagep>

托管实例组恢复并可以为整个网站提供流量 经验。 - 验证域 您想要与您的 Cloud Storage 存储桶一起使用的。 创建一个 Cloud Storage 存储桶以匹配您拥有的域名 并想使用: gsutil mb gsstatic-web.$DOMAIN 这 使用本文档开头定义的 DOMAIN 变量,例如 .此示例将静态文件存储在 例子.com static-web.example.com。 创建一个本地文件,您将其复制到 Cloud Storage 存储桶中 下一步: cat< index.html HA / DR example

Welcome to a test static web server with warm failover from Cloud Storagep>

HA / DR example

Welcome to a test static web server with warm failover from Cloud Storagep>

curlagain, or open your web browser, to access the IP address of the load balancer: curl $IP_ADDRESS It might take a few minutes for the load balancer to update the configuration and to correctly direct traffic back to your managed instance groups. If needed, wait a few minutes and try to access the website again. The main website from the managed instance groups is returned, as shown in the following example output: HA / DR example p>Welcome to a Compute Engine website with warm failover to Cloud Storagep> ## Clean up To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources. To delete the individual resources created in this document, complete the following steps: - Delete the Cloud Storage bucket: gsutil rm -r gsstatic-web.$DOMAIN Delete the load balancer configuration: gcloud compute forwarding-rules delete n http-content-rule-$NAME_SUFFIX --global --quiet gcloud compute target-http-proxies delete n http-lb-proxy-$NAME_SUFFIX --quiet gcloud compute url-maps delete web-map-http-$NAME_SUFFIX --quiet gcloud compute url-maps delete web-map-http-bucket-$NAME_SUFFIX --quiet gcloud compute backend-services delete n web-backend-service-$NAME_SUFFIX --global --quiet gcloud compute backend-buckets delete web-bucket-$NAME_SUFFIX --quiet Delete the managed instance groups and health check: gcloud compute instance-groups managed delete n instance-group-$NAME_SUFFIX-$REGION1 n --region=$REGION1 --quiet gcloud compute instance-groups managed delete n instance-group-$NAME_SUFFIX-$REGION2 n --region=$REGION2 --quiet gcloud compute health-checks delete http-basic-check-$NAME_SUFFIX --quiet Delete the instance templates, images, base VM, and persistent disks: gcloud compute instance-templates delete n template-$NAME_SUFFIX-$REGION1 --quiet gcloud compute instance-templates delete n template-$NAME_SUFFIX-$REGION2 --quiet gcloud compute images delete image-$NAME_SUFFIX --quiet gcloud compute images delete image-disk-$NAME_SUFFIX --quiet gcloud compute instances delete vm-base-$NAME_SUFFIX n --zone=$ZONE --quiet Delete the firewall rules. gcloud compute firewall-rules delete n allow-health-check-$NAME_SUFFIX --quiet gcloud compute firewall-rules delete n allow-ssh-$NAME_SUFFIX --quiet gcloud compute firewall-rules delete n allow-http-$NAME_SUFFIX --quiet Delete the subnet and VPC. gcloud compute networks subnets delete n subnet-$NAME_SUFFIX-$REGION1 --region=$REGION1 --quiet gcloud compute networks subnets delete n subnet-$NAME_SUFFIX-$REGION2 --region=$REGION2 --quiet gcloud compute networks delete network-$NAME_SUFFIX --quiet ## What's next - - For an alternative approach that uses Cloud DNS instead of external HTTP(S) Load Balancing to control the failover, see Deploy a warm recoverable web server using Cloud DNS with Compute Engine and Cloud Storage. This pattern is useful if you have, or want to use, Cloud DNS. - To learn how how to determine the best approach for your own applications and which recovery method to use, see the Disaster recovery planning guide. - To see other patterns for applications, such as cold and hot failover, see Disaster recovery scenarios for applications. - For more ways to handle scale and availability, see the Patterns for scalable and resilient apps. - Explore reference architectures, diagrams, tutorials, and best practices about Google Cloud. Take a look at our Cloud Architecture Center.