网站seo优化包括哪些方面,什么叫门户类网站,网站平台建设工作总结,怎么做网站省钱2019独角兽企业重金招聘Python工程师标准 2018年下半年#xff0c;UCloud首尔数据中心因外部原因无法继续使用#xff0c;需要在很短时间内将机房全部迁走。为了不影响用户现网业务#xff0c;我们放弃了离线迁移方案#xff0c;选择了非常有挑战的机房整体热… 2019独角兽企业重金招聘Python工程师标准 2018年下半年UCloud首尔数据中心因外部原因无法继续使用需要在很短时间内将机房全部迁走。为了不影响用户现网业务我们放弃了离线迁移方案选择了非常有挑战的机房整体热迁移。经过5个月的多部门协作终于完成了既定目标在用户无感知下将所有业务完整迁移到同样位于首尔的新机房内。 本文将详述这个大项目中最有难度的工作之一公共组件与核心管理模块迁移的方案设计和实践历程。 计划 整个项目划分为四个大阶段准备阶段、新机房建设、新旧迁移、旧机房裁撤下线。正如一位同事的比喻机房的热迁移相当于把一辆高速行驶高铁上的用户迁移到另一辆高速行驶的高铁上高铁是我们的机房高铁上的用户是我们的业务。要让迁移可行需要两辆高铁相对静止一个方法是把两辆高铁变成一辆如此两者速度就一致了。UCloud机房热迁移采用类似方案把两个机房在逻辑上变成一个机房。为此上层的业务逻辑要在新老机房间无缝迁移下面的管理系统也要统一成一套。 其中我们SRE和应用运维团队主要负责以下几个工作1机房核心zookeeper服务的扩缩容服务2核心数据库中间层udatabase服务的部署和扩容3大部分管理服务的部署和迁移4核心数据库的部署和迁移。以上涉及到前期规划、方案设计、项目实施、稳定性保证、变更校验等所有方面。 挑战 我们刚接到机房整体热迁移需求时着实有些头疼首尔机房属于较早期部署的机房之一相关的技术架构比较老旧。而核心数据库、核心配置服务zookeeper、核心数据库中间层udatabase等几个服务都是比较重要的基础组件老旧架构可能会因为基础层面的变动发生复杂的大范围异常从而影响到存量用户的日常使用。 幸好SRE团队在过去一年里针对各种服务的资源数据进行了全面的梳理我们开发了一套集群资源管理系统Mafia-RMS) 该系统通过动态服务发现、静态注册等多种手段对存量和增量的服务资源进行了整理每一个机房有哪些服务、集群某个集群有哪些服务器每一个实例的端口、状态、配置等信息都记录到了我们的资源管理系统中如下图所示 图1 UCloud SRE资源管理系统-集群管理功能 通过SRE资源管理系统可以清楚地知道首尔机房存量内部服务的集群信息、每个实例的状态。我们基于SRE资源系统还构建了基于Prometheus的SRE监控体系通过上图右侧Monitor按钮就可以跳转到监控页面获取整个业务的实时运行状况。 有了这些资源数据之后剩下的就是考虑怎么进行这些服务的扩容和迁移工作。 ZooKeeper服务的扩缩容 首先是内部服务注册中心zookeeper的扩缩容。 UCloud内部大规模使用zookeeper作为内部服务注册和服务发现中心大部分服务的互访都是通过使用zookeeper获取服务注册地址UCloud内部使用较多的wiwo框架C) 和 uframework (Golang) 都是基于主动状态机定时将自己的Endpoint信息注册到zookeeper中相同Endpoint前缀的服务属于同一个集群因此对于某些服务的扩容新节点使用相同的Endpoint前缀即可。wiwo和uframework两个框架的客户端具备了解析zookeeper配置的能力可以通过对Endpoint的解析获取到真实的IP和端口信息。然后通过客户端负载均衡的方式将请求发送到真实的业务服务实例上去从而完成服务间的相互调用。如下图所示 图2UCloud 首尔机房部署调用及服务注册/发现路径图 首尔老机房的zookeeper集群是一个具有3个节点的普通集群当时规模相对较小3个节点足够。 然而首尔新机房的规模要大很多因此新机房zookeeper的集群规模也要扩充经过我们的评估将新机房的zookeeper集群扩充到5个节点基本上可以满足所需。 其实一个理想的迁移架构应该是如图3所示整个新机房使用和老机房相同的技术架构架构和版本统一新架构完全独立部署与老机房并没有数据交互工作而用户的业务服务如UHost/UDB/EIP/VPC等通过某种方式平滑的实现控制和管理面的迁移以及物理位置的迁移工作。 图3理想状态下的老旧机房服务迁移示意图 但是理想状态在现实中无法达到内部架构和代码逻辑的限制导致业务实例无法平滑实现逻辑和控制层面的迁移更何况物理层面的迁移。新部署的管理服务需要和老机房的管理服务进行通信因此我们调整了新机房服务的部署架构并适配实际情况分别使用两种部署模式如图4和图5所示 图4 同集群扩容模式的跨机房服务部署 图5 新建集群灰度迁移模式的跨机房服务部署 无论是图4的同集群扩容模式还是图5的新建集群灰度迁移模式在zookeeper层面必须让新旧机房的zookeeper集群处于一体的状态需要两个集群的数据一致、实时同步。因此在zookeeper的技术层面必须将这两个集群变成一个集群将原有的3节点的zookeeper集群经过异地机房扩容的方式扩充到8个节点1个leader7个follower只有这种模式下数据才能够保持一致性和实时性。 而对于新机房新部署的需要注册的服务来说他们的配置文件中对于zookeeper地址的配置却不是新建的8个ip的列表而是只配置新机房5个IP的列表。这样新老机房的后端服务使用同一套zookeeper但是配置的却是不同的IP这样做的目的是为了后续老机房下线裁撤时所有新机房的服务不需要因为zookeeper集群的缩容而重启更新配置只要将集群中老机房所在的3个节点下线剩余5个节点的配置更新重新选主即可。 因此在zookeeper的机房扩容方案上我们采用了先同集群扩容后拆分的模式。zookeeper的扩容是整个机房扩建的第一步后续所有的服务都会依托于该操作新建的5个节点的zookeeper配置而zookeeper集群的缩容是最后的操作待所有的服务都扩容完成所有业务实例迁移完成之后将zookeeper集群进行缩容重新选主这样即可完成整个机房的裁撤。 数据库中间层udatabase的迁移 接下来是数据库中间层udatabase的迁移工作。 图4和图5两种模式对于zookeeper的处理方式是相同的不同点在于后端对于内部管理和控制面服务的扩容迁移方式。udatabase迁移使用图4模式这种模式下相当于在原有的集群进行异地机房扩容扩容的新实例使用和原有集群相同的Endpoint前缀也就是说它们是属于同一个集群当服务启动后新扩容的实例的状态会与原有集群的实例相同框架wiwo或uframework层会通过客户端方式从zookeeper中发现到该集群节点的变化新增同时使用某种负载均衡算法将请求流量路由到新的节点上。这样属于同一个集群但却处于两个地址位置的实例都有部分流量而进行缩容的方式就是直接将老机房同集群的服务下线即可这样客户端就会将所有该集群的流量都转发到新机房扩容的节点上从而完成平滑的服务扩容。udatabase通过这样的方式完成了集群的迁移过程。 新建集群灰度迁移模式 其实图4模式对于大部分服务来说都是可行的但为什么还出现了图5所示的新建集群灰度迁移模式呢因为某些场景下图4会有一定的不可控性。假如新建的实例如图4中Service A Instance 2存在软件稳定性和可靠性的问题比如配置异常、软件版本异常、网络异常可能导致路由到新节点的请求出现问题会直接影响在线业务影响的规模由扩容的节点占集群总节点的比例决定像我们这种11的扩容方式如果服务有问题可能50%的请求就直接异常了。udatabase使用图4方案是因为其代码的稳定性比较高功能和配置比较简单主要依托于其高性能的转发能力。 而对于某些功能逻辑都比较复杂的业务来说如ULB/CNAT就使用了更稳妥的图5模式由于业务层面支持跨集群迁移因此可以新建一个全新的无业务流量的集群该集群在zookeeper中的Endpoint路径前缀和原有的集群不相同使用一个全新的路径然后在业务层面通过迁移平台或工具将后端服务或实例按需迁移整个过程可控出现问题立刻回滚是最安全的迁移方案。我们通用的灰度迁移平台SRE-Migrate如图6所示。 图6UCloud内部通用业务迁移系统SRE-Migrate 机房部署平台SRE-Asteroid UCloud产品线和产品名下服务数量繁多无论是图4还是图5的方案都需要大量的服务部署工作。SRE团队在2018年中推进的机房部署优化项目意在解决UCloud新机房建设国内及海外数据中心、专有云、私有云等交付时间长和人力成本巨大的问题2018年底该项目成功产品化落地覆盖主机、网络等核心业务近百余服务的部署管理解决了配置管理、部署规范、软件版本等一系列问题。首尔机房迁移也正是利用了这一成果才能够在很短的时间内完成近百个新集群的部署或扩容工作图7所示就是我们的新机房部署平台 SRE-Asteroid。 图7UCloud内部机房部署平台SRE-Asteroid 核心数据库的部署和迁移 最后是核心数据库层面的部署和迁移工作如何进行。UCloud内部服务所使用的数据库服务为MySQL 内部MySQL集群采用物理机/虚拟机在管理网络内自行建设以一个主库、一个高可用从库、两个只读从库和一个备份库的方式部署使用MHAVIP的方式解决主库的高可用问题使用BGP/ECMPVIP的方式解决从库的负载均衡和高可用问题大体的架构如图8所示 图8UCloud内部MySQL服务架构图 首尔新老机房使用的内部MySQL数据库集群的架构跟上图类似为了进行新老机房的集群切换我们设计了如下的方案如图9所示 图9首尔集群内部数据库集群迁移示意图 整体来说为了保证核心数据库集群能够稳定完成迁移工作我们抛弃了双主库、双写的切换方案防止因为网络或其他因素导致新老集群的数据不一致、同步异常等问题。我们采用了最简单的解决方案在业务低峰期停止console服务直接修改数据库中间层配置切换的方案。 在部署阶段我们在首尔新机房部署了相同高可用架构的MySQL集群老机房的数据库逻辑备份导入将新老机房的集群做成级联模式图9中绿色虚线新机房的主库作为老机房的从库通过MySQL异步同步的方式binlog进行数据同步。我们使用pt-table-checksum工具定期对两个集群的数据一致性进行校验以保证新老机房的数据完全一致。与此同时使用内部开发的拓扑分析工具将所有调用老集群数据库主从库的业务情况确认清楚主要是哪些udatabase集群。 部署完成后数据一致性和实时性通过级联得到保障udatabase仍然访问老机房的MySQL主库的VIP图9蓝色虚线此时并没有业务通过直连的方式写入新机房的主库为保证数据的一致性新机房的主库暂时设置成只读模式。 在确定迁移时间和迁移方案之后在某个业务低峰期的时间点公告用户后首尔机房整个console的操作停止一段时间期间首尔机房的API请求可能会失败在确定流量很低的前提下通过修改数据库中间层udatabase cluster中数据库主从库VIP的配置将业务从老机房MySQL集群切换到新机房MySQL集群此时该业务所有的请求都会流入到新集群图9红色虚线。为了防止老集群仍然有业务写入或读取我们将老集群主库设置为只读然后继续通过tcpdump抓包分析老集群上可能存在的请求并手动处理最终保证所有业务都使用新的MySQL集群。 由于需要对主机、网络、存储和监控等几个业务都进行集群切换为保证不互相影响使用逐个集群处理的方式整体切换加检测的时间耗时近1个小时。 在整个机房切换的过程中只有数据库集群是有状态的业务因此重要性和危险性也比较高该服务切换完成后最重要的一个环节也宣告完成剩下的业务层面UHost/UDB/EIP等的迁移工作由各个业务团队自行完成即可。 收尾 最终所有业务实例完成迁移后理论上就可以完成本次机房迁移工作了不过还是要对老机房仍然运行的实例进行流量监测确认没有流量后进行下线停止服务。最后对老机房的zookeeper集群老机房的3个zookeeper节点进行请求监测和连接监测确认没有本机房以及新机房发来的请求排除zookeeper集群自主同步的情况在完成确认后进行最后的zookeeper集群变更将整个集群8个节点拆分成老机房3个节点和新机房5个节点老机房的集群直接停止服务而新机房的新的zookeeper集群完成新的选主操作确认同步正常和服务正常。 写在最后 经历了上文所述的一切操作后整个首尔机房的迁移工作就完成了整个项目历经5个月其中大部分时间用于业务实例的迁移过程主要是针对不同的用户要确定不同的迁移策略和迁移时间内部管理服务的迁移和部署所花费的时间还是比较少的。UCloud内部针对本次迁移的每一个步骤都制定了详细的方案规划包括服务依赖分析、操作步骤、验证方式、切换风险、回滚方案等为了完成如此巨大的新机房热迁移工作团队投入了充足的人力和时间。首尔新机房具有更好的建设规划、硬件配置和软件架构能够为用户提供更好的服务我们相信这一切都是很有价值的。 转载于:https://my.oschina.net/u/3675312/blog/3006762