Exchange是微软公司推出的一款商业版邮件产品,支持多种电子邮件网络协议,如SMTP、IMAP4、POP3等,Exchange提供了电子邮件收发、电子邮件归档、日程管理等多种应用,并且这些应用都可以通过浏览器访问。下面我们一起看下如何在AWS中国云服务上实现Exchange的高可用。
在开始之前,我们先简单介绍下本篇文章中涉及到的AWS服务,以便更好的理解整个架构。
Amazon EC2在AWS云中可以提供可以扩展的计算容量,EC2支持Windows Server、Redhat、Centos、Ubuntu、SUSE等主流操作系统,同时,借助AWS Marketplace,用户可以直接启动AWS合作厂商的产品,如Fortinet、Splunk、F5等等,另外,用户可以制作自己的系统镜像,并上传到AWS上使用。
AMI是EC2服务器的快照,可以用来备份服务器和服务器磁盘上的数据,在服务器发生数据误删、不可恢复故障等情况时,用AMI来恢复数据或恢复服务器。
Application Load Balancer简称ALB,是AWS推出的负载均衡器产品,ALB工作在OSI模型的第七层,支持http和https协议,支持轮询和最少未完成请求算法。ALB支持高可用,同时可以根据流量大小自动扩展。
AWS Cerficate Manger简称ACM,是AWS推出的SSL证书管理服务,使用ACM,用户可以申请由Amazon签发的SSL证书,并将其使用到AWS LB、AWS Cloudfront等服务,以实现web业务的https,使用ACM签发SSL证书无需任何费用,同时,ACM支持SSL证书的自动续订,避免证书到期对业务产生影响。
Amazon Route53是AWS推出的域名系统(DNS)服务,支持目标的运行状况检查,以便只将流量路由到健康的目标,同时,Route53支持地理位置、加权、多值应答等路由策略,可以满足不同业务的需求。
Amazon Cloudwatch是AWS推出的监控服务,可以用来监控AWS云中的应用、服务器、自定义监控项等等,通过Cloudwatch警报,可以在指标到达设置的阈值时向我们发送通知或触发其他操作,以便及时处理。另外,借助Cloudwatch Logs,我们可以将服务器上的日志收集到AWS上统一存储和管理,同时可以在日志中添加过滤规则,比如在日志中出现“Error”等字段时向我们发送通知。
Amazon SNS是AWS推出的一项通知服务,支持使用Amazon SQS、HTTP/S、电子邮件、SMS、AWS Lambda等接收消息和通知,可以和Amazon Cloudwatch无缝集成,以便发生告警时通知我们或者触发一些其他操作,如运行自愈脚本等。
Amazon VPC是AWS中的虚拟网络,包括子网、路由表、安全组、NAT网关等等,使用VPC Peering可以将2个VPC打通,从而在2个VPC之间彼此通信,VPC peering支持同一个AWS账号中的VPC,也支持不同AWS账号之间的VPC。AWS使用VPC的现有基础设施创建连接,该连接不是网关,也不是VPN连接,并且不依赖于单独的物理硬件,所以不存在单点通信故障和宽带瓶颈。VPC Peering的性能及网络延迟,可以参考我们之前的公众号文章:AWS VPC Peering,将北京、宁夏“两地一线牵”
AWS Backup是AWS推出的一项备份服务,支持Amazon EC2、Amazon EBS、Amazon RDS等有存储功能的服务,Backup支持备份生命周期管理,可以在备份到期后自动删除资源,从而可以避免产生额外的费用。同时,Backup支持自动将备份复制到不同的AWS区域,另外,AWS Backup结合AWS Orgnizations服务可以实现跨账号备份的管理。

架构图如下图所示:

业务流说明:
架构图中红色箭头表示业务的流程,红色虚线箭头表示备用。如果我们使Exchange OWA来登录我们的邮箱,整个流就是:
① 在浏览器中访问OWA地址(如http://mail.light2cloud.com/owa),我们的域名服务商会将mail.light2cloud.com的解析交给Route53
② Route53收到请求后,会将请求解析到AWS北京区域(AWS CNN)的ALB,如果北京区ALB无法工作,会将请求发送到AWS宁夏区域(AWS CNW)的ALB
③ 由于是http请求,ALB的80侦听器会接受请求,并将请求发送给ALB上的443侦听器(https),443侦听器收到请求后会使用ACM签发的SSL证书加密请求,并将加密后的请求发送给DAG群集,DAG群集会将请求发送给DAG成员服务器中的某一个(DAG会自动判断成员服务器的状态,确定一个主节点,并在主节点不可用时将另一个成员自动升级成主节点),也就是exchage1和exchange2,exchange服务器收到请求后,会响应该请求,如果我们未登陆Exchange,Exchange会给ALB返回登录页面,要求我们登录
④ exchange1服务器收到我们提交的用户名和密码后,会向dc1服务器发起请求验证账号密码的正确性、该账号的权限等等,如果dc1不正常,会向dc2请求验证,并将验证结果反馈给exchange服务器,exchange服务器根据验证结果做出不同的响应:密码错误、密码到期、允许登录等。
监控及报警说明:
架构图中的绿色箭头表示服务器和LB的监控实现,Cloudwatch支持LB的后端服务器的状态、LB状态码、LB响应时间等指标的监控,同时支持使用cloudwatch agent等工具,可以支持服务器内存、磁盘、磁盘IO、进程、日志已经其他自定义资源的监控。使用SNS可以在第一时间接收到指标的报警、报警恢复等通知,另外SNS可以继承Lambda、SQS等AWS服务,我们可以使用这些服务可以在报警发生时触发一些脚本等,实现某些服务的自愈,如dc服务器上的DNS服务等。
备份及管理说明:
对于EC2,我们可以使用AWS Backup来创建和管理AMI,由于AWS Backup支持 AMI失败重试,我们无需担心AMI创建失败的情况,也无需手动去删除AMI,AWS Backup会在AMI达到保留时间后自动删除AMI,避免产生不必要的费用。
通过AWS Backup服务,将AWS北京区域(AWS CNN)的EC2 AMI复制到AWS 宁夏区域(AWS CNW)保存,这样可以在北京区域的AMI无法使用时,使用宁夏区域的AMI。
实现以上架构时,有些服务和应用配置比较“特殊”,下面我们来一起看下这些比较“特殊”的配置。
在AWS中国区域,Route53目前不支持注册域名和托管我们现有的域名,而我们想实现AWS北京区域和AWS宁夏区域的流量故障转移,必须要借助Route53,也就是Exchange域名(如mail.light2cloud.com)的DNS解析要由Route53来完成,而不是我们的域名服务商。为了实现这一点,我们可以使用DNS中的NS记录,我们可以在域名服务商处为Exchange域名(如mail.light2cloud.com)添加NS记录,记录值指到Route53提供的NS地址。当然,Route53是高可用服务,故对外提供了多个NS地址,我们为Exchange域名(如mail.light2cloud.com)添加多个NS记录即可。
Route53NS示例

使用Route53将流量路由到AWS资源(如LB,Cloudfront,S3、其他Route53记录等)资源时,我们可以使用别名记录,需要注意的是这个别名记录和Cname记录不是一个概念。别名记录只能将流量路由到LB、S3等Route53支持的AWS资源。当然,如果使用Cname记录也可以将流量路由到LB,S3等资源上,但是别名记录相比于Cname,会更加适合。就拿LB来说,我们知道LB是支持高可用的,所以当LB的某个节点故障时,AWS会自动建立新的节点,此时LB的私有IP地址可能会发生改变,如果我们使用别名记录指向LB,IP地址发生改变后,Route53会直接使用新的IP响应;但Cname记录会受到记录值TTL的影响,所以使用别名记录来将流量路由到AWS资源时会更适合。
我们知道,DAG可以用于Exchange邮箱的高可用和恢复等,但创建DAG时需要为DAG分配一个IP,这个IP可以静态分配,也可以DHCP分配,但AWS EC2上不支持使用虚IP,为了给EC2添加一个虚IP,我们可以使用辅助IP的方式。

如上图所示,我们可以使用辅助私有IP10.123.67.4作为DAG的静态IP,当然,我们有2台EC2作为Exchange服务器,所以,另一台EC2上同样添加一个辅助IP,在把另一个辅助IP也配置成DAG的静态IP即可。
Exchange支持SMTP、POP3、IMAP4等协议,可以满足不同的业务场景和需求,但由于这些协议是TCP协议,所以我们无法使用ALB来做负载均衡和代理,为了支持TCP和TLS,可以使用NLB来实现。NLB工作在开放互联模型(OSI)的第四层,支持TCP、TLS、UDP、TCP_UDP。

