分享人:天裴 解决方案架构师
正文:本文从两部分为大家介绍云上网站经典架构的最佳实践。
Ÿ 最佳实践原理讲解
Ÿ 最佳实践系统搭建
一、最佳实践原理讲解
1)云上网站经典架构最佳实践-场景描述
在创业型公司或阿米巴模式经营的公司中,新项目发布初期存在较大的不确定性,既要考虑项目未来的扩展性,又要衡量项目的运营成本。因此需要在成本可控的前提下,快速部署云上业务系统,同时兼顾灵活性和扩展性。
今天我们演示的是一个较为通用的架构,通过对架构的适当裁剪或扩充,可以应用在传统企业、游戏和零售等行业。
在业务和系统发展的初期,业务模式相对简单,用户规模较小,这时简单的系统架构即可满足业务需求。比如将业务系统全部部署在一台服务器上(或者几台服务器做简单集群),另外一台服务器做数据库使用。但是随着业务的高速发展,用户规模快速增大,业务对系统灵活性的要求也越来越高。比如在线游戏,需要具备随用户数增长快速开服的能力,老的基础架构的局限性就逐渐凸显出来:
Ÿ 运维成本高、系统混乱、统一运维难度大。随着功能模块的增加,开发人员可能来自不同的团队,出现问题恢复系统或数据难度大。
Ÿ 用户体验差。单点数据库没有完善的容灾备份机制,宕机丢部分数据是影响客户体验的常见问题,并且宕机造成的业务中断是全局性的,用户影响比较大。
Ÿ 后续系统改造难度大。随着业务的发展,单点数据量越来越大,随之而来的数据库重要性加强、查询效率变差、运维难度加大。现阶段架构未做任何规划,改造难度大,数据打通发挥价值的趋势也会倒逼系统架构的整体架构。
那么系统架构该如何迭代演进呢?
这个架构非常适合具有以下特征的场景:
Ÿ 系统可以按地域等规则拆解成一个个独立小系统单元化部署。
Ÿ 公司以项目为核心组建团队,项目核心系统的主要运维工作由开发兼任。
Ÿ 成本优先,数据打通、数据安全、容灾这样的需求滞后考虑。
2)云上网站经典架构最佳实践-推荐架构
我们推荐的架构结合使用了多种阿里云产品,具有以下优势:
Ÿ 系统分级。核心系统通过多产品组合SLB+ECS+RDS保障服务稳定可靠,分散业务节点在两个可用区实现跨区域容灾,业务节点单元化部署。
Ÿ 灵活。可单元化的应用和数据库集中部署在一台ECS上,节省成本,各节点之间互不干扰,灵活增减业务节点。
Ÿ 静态内容通过CDN加速。CDN通过私有Bucket回源,有效防止资源盗链。
Ÿ SLB、ECS和RDS组成了核心服务集群。
SLB:是阿里云提供全托管式在线负载均衡服务,通过流量分发来提升应用系统的服务能力,通过消除单点故障来提升应用系统的可用性,我们可以在SBL下添加多台ECS实例,当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的实例,将请求分发给正常运行的实例,保证应用系统仍能正常工作。SLB支持同城跨可用区容灾,30秒内实现自动切换。
SLB已在各地域部署了多可用区以实现同地域容灾。当主可用区出现机房故障或不可用时,负载均衡仍然有能力在非常短的时间内切换到另外一个备可用区恢复服务能力。当主可用区恢复时,负载均衡同样会自动切换到主可用区提供服务。
RDS:是一种稳定可靠、可弹性伸缩的在线数据库服务,支持MYSQL、SQLServer、PostgreSQL、MariaDB和PPAS引擎,具备容灾、备份、恢复、迁移等方面的全面解决方案。对比自建数据库,RDS开箱即用,高可用版采用一主一备的双机热备架构,适合80%以上的用户场景。主节点故障时,主备节点秒级完成切换,整个切换过程对应用透明。备节点故障时,RDS会自动新建备节点以保障高可用。根据需要,我们可以把备用节点和主节点部署在同一可用区,也可以部署在同城的另一可用区(我们也可以叫它同城双机房)。除了高可用版以外,RDS还提供了集群版,三节点企业版等更高级别的容灾能力,数据库的异地容灾,可以通过数据传输服务(DTS)实现主实例和异地灾备实例之间的实时同步。
对象存储OSS是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。在此架构中,用来存储网站所需的静态资源。
内容分发网络(CDN)是建立并覆盖在承载网上,由不同区域的服务器组成的分布式网络。阿里云CDN分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问速度。静态内容通过CDN加速,CDN通过OSS私有Bucket回源,有效防止资源盗链。对于可单元化的子系统,我们以游戏的区域服为例,把系统和数据库部署在一台ECS上,然后做成镜像。当需要开新服的时候,可以通过镜像迅速拉起服务。如果单台服务异常,也不会影响到其它区域的服务,当然对子系统也支持高可用的架构,这里不再赘述。
3)云上网站经典架构最佳实践-资源部署
我们今天要操作演示的是刚才推荐架构的一个简易实现,如图所示,我们在杭州可用区中SLB,绑定EIP来与公网通信,这里使用的EIP是阿里云弹性公网IP,是可以独立购买和持有的公网IP资源,相比传统的固定公网IP,EIP更加灵活,不再属于某个云资源,可随时随地与VPC类型的ECS、NAT网关、ENI网卡、SLB进行绑定和解耦,SLB下挂载两台ECS来模拟核心业务服务。一个RDS实例为核心业务系统提供数据库服务,我们把两台ECS、SLB主节点、RDS主库主在同一可用区,实际工作中可根据需要灵活选择多种高可用方案。
在另外一个可用区,我们创建一台ECS模拟单元化的子系统,我们这里以游戏的区域服务器为例,最后部署CDN和OSS来做静态内容加速,演示中我们会部署整套架构的基础环境,不部署实际的业务系统。
本最佳实践主要包含以下几个步骤:
1、通过CADT部署资源
2、配置业务系统ECS环境
3、配置并验证SLB
4、配置RDS并验证内网测试访问
5、部署云上OSS和CDN环境
6、部署区域服务器
通过实践我会验证以下结果:
1、ECS对外提供httpd服务。
2、SLB高可用验证:一台ECS停服后,访问可被自动转发到可用服务器。
3、两台应用服务器可以从内网访问RDS.
4、CDN加速效果,通过浏览器对比测试图片的加载速度。
5、通过镜像快速部署区域服务器。
尽管验证的场景比较简单,但是我们的架构本身具有良好的可扩展性,可以根据情况调整,以匹配复杂的场景。比如引入更强大的高可用方案,做到同城或异地容灾。
二、最佳实践系统搭建
1)通过CADT部署资源
登陆阿里云网站,搜索CADT,云架构设计工具CADT是一款为上云应用提供自助式云架构管理的产品,显著地降低云上管理的难度和时间成本,本产品提供丰富的预置模版,同时也支持自助拖拽方式定义云上架构,用户可以方便地对云上架构的成本部署、运维、回收进行全生命周期地管理。
我们进入CADT控制台,我们已经为这个架构方案准备好了官方模版,大家可以对模版一键拉起所需要的阿里云资源。
我们点击通地官方模版新建,搜索云上网站经典架构这个模版,点击基于方案新建。
系统会基于模版生成架构图,从模版新建的架构图中需要手工填写ECS源密码和RDS帐号密码。
我们双击ecs实例,填写管理员密码,三台ecs都要填好。
双击ecs和rds的连接线,填写帐号和密码。两条连接线都要填写。
oss名称是全区唯一的,使用一个没有重复的名字点,击右上角的保存。
给应用起个名字,确认。保存成功后就可以开始部署了。
首先验证资源,验证通过后,点击下一步价格清单。
这时系统会自动生成评估报告,我们很方便地评估部署资源需要的成本。
我们详细看一下这个报告。里面详细地列出了费用的明细和总费用的架构图。
点击下一步,部署清单,勾选服务条款,创建资源。
资源根据类型,完成创建的时间也不相同,可能需要等待较长的时间,这时我们可以把窗口关掉,重新打开就可以了。
现在可以看到资源已经部署成功了。
2)配置业务系统ECS环境
这里需要安装运行HTTP服务,确保可以通过80端口提供服务。
回到阿里云的控制台,在这里搜索ECS,进入ECS控制台。
我们可以通过实例页面里找到三台实例,有两台app001、app002、regionHZ001,这里是我们的核心应用系统。
我们远程连接,登陆app001,我们需要输入管理员帐号的密码,确认。
登陆成功后需要安装httpd。
安装成功了,我们启动一下服务。
确保80端口已被占用,我们的服务在正常运行。
,
接下来创建一个HTML文件,叫local.html写入这台服务器,这个服务器接下来会被验证slb高可用特性。
需要运行的命令,我们从这里拷过来。
粘贴到这里,我们点击回车,我们要验证一下文件的写入正常。
当用户通过浏览器来访问这个文件的时候,就能看到究竟是哪一台服务器在给它提供服务,这样我们app001就配置好了。
我们用同样的方式来配置app002,首先远程登陆,安装启动。
这样,两台基础业务的环境就搭建完成。
3)配置并验证SLB
回到CADT控制台,点击刚才创建的slb,可以看到一台slb已经在运行当中。
进入默认的服务组,这两台正在被监听的80端口的服务器是app001和002。
我们拷贝slb,绑定弹性公网的IP地址,我们拷贝这个地址,绑定到这里备用。
访问一下这个地址。
然后是我们的文件名,现在可以看到是app001在为我们提供服务。
由于我们在用CADT部署slb的时候,打开的会话保持,所以刷新几次,仍然是app001在为我们提供服务。
下面我们模拟,当app001出现异常时,没办法提供服务,slb是否可以把请求分发给另一台正常运行的app002。
我们重新回到app001,把app002关掉,看一下端口,80端口已经没有被监听了。
我们回到浏览器刷新一下页面,可以看到我们的请求已经被app002响应,slb的高可用功能验证成功。
现在再把app001的服务恢复,再把它的HTTP启动起来,看一下端口,80端口又被监听到了。
4)配置RDS并验证内网测试访问
回到CADT控制台,点击RDS实例。
首先进入帐号的页面,看到数据库帐号appdb_admin已经被创建。
进入数据库管理页面,创建一个新的数据库,名字叫appdb,字符集utf8,授权帐号就是我们刚才创建的帐号,帐号类型读写,点击创建。
这样数据库就创建好了。
我们回到基本信息页面,看一下数据库存的白名单,在这个应用里面,可以看到有两台服务器的私绑地址,这也是CADT帮我们完成添加的。
回到基本信息,点击网络类型里面的查看连接详情。
我们记录一下数据库的内网地址,点击拷贝。
把它放到我们的文档中,以备后续使用。
现在我们就可以去应用服务器上测试登陆了。
我们先找到要运行的命令,把数据库的地址和密码修改一下,复制一下这个命令。
我们接着回到app01,安装一下MySQL,安装好之后,运行我们拷贝的命令,命令运行成功,我们可以看到刚才运行的数据库appdb。
我们重复同样的步骤验证app002对RDS数据库的访问,用同样的命令,可以看到访问成功,这样就验证了可以成功地访问RDS的数据库。
5)配置云上OSS和CDN环境
接下来将静态资源上传到oss并配置定义加速,回到CADT控制台,在资源列表中找到oss,点击进入。
在文件管理页面上传文件,文件的ACL选择继承Bucket。
这里Bucket在创建的时候,我们已经设置为私有的了,点击上传。
上传成功。
下面开启加速,这一步需要经过备案的域名,否则是没有办法开启加速的,演示使用的域名是已经备案成功的。
回到阿里云控制台,我们搜索一下CDN,点击进入CDN控制台。
在域名管理中点击添加域名。
我们加速使用的域名是这个,这个域名是经过备案的。
把域名添加到这里,业务类型是图片小文件,源站信息选oss域名,端口80,加速区域仅中国内地,点击下一步。
加速域名添加完成,但是还需要给这个域名配置记录才可以使用,我们记录一下这个记录,把它粘到我们的文本里,以备后续使用,这个记录值放到这里。
回到阿里云控制台,搜索一下dns。
进入云解析dns控制台,找到已经备案的域名,点击解析设置。
我们需要添加两条记录,一条A记录,一条CNAME,A记录是指向CNAME的公网地址。
我们的主机名就叫bp010,复制一下SLB的公网地址。
主机记录bp010,记录值是我们的公网地址,点击确认。
接下来还要记录一条CNAME值,这个是我们加速域名的前半段。
它的记录值就是CNAME加速的时候系统生成的一个CNAME记录值,复制。
拷贝到这里,点击确认。
添加成功后稍等几分钟,让记录生效,在等待生效的同时,我们先来整理一下目前我们记录的信息,这是slb的地址,叫做域名的A记录,还有备案的域名,在cdn中我们添加了加速域名,在oss中我们上传了测试图片,所以图片的地址就是我们的加速域名,是一个斜杠加图片地址。
我们dnf已经生效了,我们云深度ping一下域名,是可以ping的通的。
我们再ping一下另一个域名,好了,是可以ping的通的,这样dns就添加成功了。
回到cdn控制台,看一下域名的状态为正常运行。
下面设置oss私有Bucket的回源,来授权dns来访问我们的oss,在回源配置页面,我们找到oss私有Bucket的回源,把按钮打开,我们测试一下oss对象可以通过cdn正常访问。
去拷贝一下图片地址。
回到浏览器,去访问一下这个地址,我们可以看到图片可以正常访问。
我们看一下cdn的加速效果,回到oss控制台,在文件管理页面这里,找到这个文件的临时url备用。
复制这个文件的url,注意这是一个临时url,很快会失效,所以我们设置的步骤一定要快,我们把URL记录好。
下面我们将分别在APP001、002上的这个目录下面去创建一个HTML文件,我们通过oss文件的临时url和cdn分别访问几次,来查看对象的载入速度。
我们在最佳实践里拿到的代码里,修改一下,把实例中的的oss临时url替换掉。
cdn访问方式的url也替换掉,这样我们需要的测试代码就已经准备好了。
接着回到eca控制台,远程登陆app001,进入目录。
复制一下目录里的代码。
把文件拷贝过去,粘贴
确认没有问题,导出。
我们在002上重复同样的步骤。
复制一下测试地址。
打开浏览器,为了避免缓存影响,我们打开无痕窗口。
开启一下开发者工具。
打开Network的页面。
访问一下测试地址,这是加载的时间和cdn加速加载的时间。
我们多刷几次,就会发现cdn方式的速度会变得越来越快。
这里因为缓存的原因变成0了,我们再打开一个新的窗口。
同样再刷新一下这个地址,这个cdn加载速度变快了。
6)部署区域服务器
回到ecs控制台,找到CADT创建的区域服务器RegionHZ001。
我们先记录一下它的公网IP留作备用,拷贝到我们的文本中。
远程连接,登陆这台服务器。
我们把应用系统和数据库安装在这台ecs上。
我们打开已经准备好的sampleCode,下面这些就是我们要运行的命令,
我们首先创建和进入安装目录,创建一个MySQL的server。
下载rpm安装包,安装rpm包。
看一下可以安装MySQL的yum源。
安装MySQL程序。
安装成功,我们把服务器启动起来。
服务器起来之后,我们需要初始化MySQL实例。
点击回车,设置一下管理员帐号和密码,把密码输入在这里,删除测试用户,删除root用户的远程登陆权限,只允许本地登陆,删除测试数据库,接着刷新权限表,让新设置的root用户权限生效。
接下来尝试一下从本地登陆一下这个数据库,输入密码,可以看到登陆成功,我们的MySQL server装好了。
下面要安装配置一个PHPMyAdmin。
创建一下安装目录,创建好之后进入目录。
下载安装包,需要等待下载完成。
安装一下所需要的依赖包,接着给PHP做一下升级,把这些命令是一次性地拷贝进来。
可以同时执行,点击确认。
下面安装PHPMyAdmin,
在这之前要安装一个解压软件,如果已经装过可以跳过这个步骤,解压一下这个包。
把解压下来的目录复制到指定目录。
进到这个目录底下,在这个目录文件底下已经有一个配置文件,我们只需要用拷贝的命令改一下名字,谁都可以使用了。
配置文件创建好以后还需要生成一个随机的字符串。
运行这个命令,把生成好的字符串也拷贝一下。
复制好之后贴到文档里。
接着要编辑配置文件,把刚才生成的随机字符串拷贝过去。
粘贴到这个位置,保存退出。
去启动HTTP的服务。
启动完查看一下端口,确认80端口已经被成功占用,服务器正常。
这样我们区域服的基础环境就搭建好了。
接下来登陆一下PHPMyAdmin,去验证我们的数据库管理功能,在浏览器中输入地址,可以看到这个页面。用root帐号登陆。
登陆完我们去点一下information schema。
可以看到数据库的信息就展示出来了,数据库就可以通过图形界面做管理和控制了。这个区域服务器可以复制到其它地区。
为了能够快速地开服,我们要对regionHZ001做系统镜像,新的镜像就可以通过这个服务器快速拉起了。在这个管理控制台中,我们需要先把001关掉。
我们刷新一下,确认它关闭成功之后,就可以制作镜像了。
点击更多,云盘和镜像,创建自定义镜像。
设置一个镜像的名字,叫phpMyAdmin,点击创建。
接着我们到镜像页面,去看一下我们新创建的镜像进展怎么样,可以看到在创建中,创建镜像需要较长的时间,我们再稍等一下。
镜像制作完成之后,我们就可以通过镜像开启服务器了。
购买一台同等配置的服务器,点击上一步,直到基础配置页面。
选择自定义镜像,选择刚才我们创建的PHPMyAdmin。
在系统配置页面。我们的密码使用预设的镜像密码,给它命名叫regionHZ002,确认订单,把实例创建出来,勾选服务协议,点击创建实例。
先刷新一下,我们远程连接,登陆一下这台服务器。
我们需要把MySQL和http都启动起来。
看一下MySQL占用情况,80和3306都已经占用了。
回到控制台,记录一下新的服务器公网IP地址。
通过浏览器去访问一下,看这个页面是不是正常,页面能正常访问,用root帐号来登陆一下。
可以看到新开的服务器也都是正常工作的。