生活服务多机房方案
做多机房部署的目的在于提升业务可用性,结合智能DNS,GSLB使用户可以就近访问提升体验,并避免DNS劫持.
生活服务数据情况分析
数据使用情况
- 运营配置数据保存在mysql使用redis缓存
- VirtualType等保存在mysql的枚举数据,本地缓存并使用MetaQ进行广播同步
- 订单回调数据,实时写入mysql,客户端用户重新可以查看数据,要求实时性较高
- 活动状态数据(奖品库存数量,用户中奖信息等等)
- 用户提交的意见反馈,活动中奖后提交的地址等联系方式信息
- 团购,电影等同步CP的数据,由定时任务进行更新,低实时性,一致性要求
- yard配置数据.
- 分布式SESSION,记录登陆用户数据
数据特性
- 订单数据基本是读写均衡的
- yard,运营配置枚举,用户意见反馈,地址联系方式等数据明显是读多写少,可以接受一定延迟.
- 活动状态数据必须保障强一致性才能防止奖品超发
- 团购和电影数据通过定时任务跟CP保持同步
基础设施的跨机房同步方案及问题分析
MySQL
支持跨机房的主从同步.在网络层面支持专线和公网v*n切换,对上层应用程序透明.
专线可用时,同步延迟基本和同机房一致,切换为公网v*n延迟会略提示.
只支持主机房单边写入.
当南沙机房(主机房)不可用时,可以让DBA手动将其他机房的mysql实例设置为主,程序的Datasource可以自动切换写入节点,保证写入.(切换过程还是有中断时间)
MetaQ
MetaQ主题支持跨机房订阅/发布.根据设计和网络情况可能有延时,和消息重复情况.以南沙机房为主节点,不保障跨机房高可用.(南沙不可用时,整体不可用)
Redis
并没有现成的同步方案,作为缓存的部分不需要同步.
Mongodb
每个机房可以独立执行定时任务来同步CP的团购,电影数据.多机房的数据延迟或者轻量不一致并不影响业务可用性.
Yard配置中心
yard支持为每个机房独立配置.
Zookeeper
由于跨机房选举效率差,故没有提供完整的跨机房可用性保障.现在的部署方案,是以南沙机房为主节点,其他机房做同步复制.南沙机房内部可以进行选举,但是南沙机房挂掉,其他机房无法选主,故zk集群不可用.
设计概要
针对数据特性和基础设施的支持情况,无法做到完全异地多活.南沙机房作为大部分基础设施的主机房,当南沙机房崩溃时,其他机房只能提供降级的服务.
需要保证用户可以正常下单.订单服务的部分需要做降级措施,当zk,mq,mysql不可用时可以正常接收.
- 每个机房单独部署metaq,zk,redis.只对mysql进行跨机房部署,所有写操作全部通过数据源配置路由到南沙机房,其他机房数据库作为Slave进行同步.
- 针对LifeEnum的支持需要配置跨机房metaq,此处不是核心逻辑不影响主体业务.
- 活动通过配置开关,限制在单独的机房进行(需要修改业务代码增加开关).使用独立的域名限制用户访问同一个机房.
- 团购和电影数据通过每个机房独立的数据同步任务进行更新同步
架构如下图所示:
状态一
有机房可用时,所有机房可以同时提供服务
主机房可以提供所有的业务,其他机房提供数据一致性/延迟要求不高的服务.
- 订单回调,运营活动等业务使用独立域名DNS解析到主机房.
- 其他服务将流量通过智能DNS,GSLB等方式动态分配到多个机房
状态二
非主机房不可用时,不影响主机房业务可用性
- 通过DNS配置将流量路由到主机房
状态三
主机房不可用时,非主机房可以提供降级的服务
非主机房只提供不依赖非异地高可用的第三方接口的服务
此时主机房数据库不可写.
- 通过DNS配置将所有流量路由到可用机房
- 将本地mysql服务器设置为master支持写入
切换之前对于关键的订单回调数据写入MQ. - 对不可用的第三方服务的依赖进行降级
- 记录数据日志待主机房恢复后进行数据同步
- 后台运营配置和运营活动不可用
针对跨机房的开发工作
- 订单回调业务检测数据库可用性,当数据库写入不可用时重新从队列中读取消息
- 针对业务功能在yard配置上增加开关配置,控制其在某个机房是否启用
- 确认调用的第三方服务的跨机房支持(搜索, 用户画像, 用户中心, 推送平台, 优惠券, 积分中心)
- 搜索服务需要多机房部署,依赖生活服务数据库
- 用户中心,有多机房部署,在每个机房单独调用
- 用户画像,推送平台,积分中心没有多机房部署,只能在南沙通过kiev调用,需要在业务层面做调用转发工作.
- 对所有需要访问主机房的调用需要有验证机制,可以发现主机房不可用,进行服务降级逻辑.例如主机房不可用时,发现订单无法写入数据库,重新从队列中读取订单消息.停止场景服务的推送调用.
运维成本
- 每个机房需要完整的硬件设施(数据库,业务服务器,搜索服务器)
- 对每个机房增加单独的监控
预演方法
- 在单个机房部署修改后的业务程序包,在主机房正常提供服务
- 部署在多个机房,通过绑定host验证两个机房的服务均可用
- 通过配置错误的ip地址模拟机房宕机的情况,验证当南沙机房宕机时,其它机房可以提供主要服务