作者:钟科
tseer产品介绍
一.tseer简介
tseer是一套服务注册发现容错的方案,是对tars名字服务功能的轻量化。在腾讯浏览器、应用宝、管家、手机书城、腾讯文学、广点通等众多业务中广泛采用,目前日均承载百亿级的请求量
tseer轻巧灵便,对业务的侵入性低,非tars服务亦可无缝接入。在服务发现的核心功能之上,tseer还支持多种负载均衡算法,提供可靠的故障容错策略,可有效解决业务跨地区跨机房调用等难题,极大提升服务的可用性和调用质量,是微服务框架中优秀的名字服务解决方案
tseer拥有web管理界面和api接入两种方式可供用户根据需求自由选择,通过代理节点和代理服务器机制为需要频繁发布变更的业务提供透明的服务发现功能,学习成本很低,操作也很方便,对于业务维护人员十分友好。
二.研发背景
在传统的单体式应用中,变更发布相对较少,系统中的网络位置也很少变化,偶尔的变更也可以通过手动更改配置的方式来应对。但是在当前海量服务的大环境下,这种架构已经无法高效稳定的支撑高速增长的业务。越来越庞大的分布式服务集群和微服务框架已经逐渐成为主流。
但是新型架构为业务提供更好支撑的同时,频繁的发布更新与动态伸缩也导致了网络位置的频繁变化,在这种情况下业务维护人员手动更改配置这种大规模重复性工作不仅增大了出错的风险,其低效也会限制业务的高速发展。往往配置还没改完,新的变更就需要发布了。所以就必须要一个自动化的服务发现工具来解决这些问题。
然而这些也并不是问题的全部。在保证访问成功的前提下,响应时间作为服务质量中最重要的指标,是影响业务发展最关键的一环。多业务集之间复杂的调用关系再加上跨地区跨网络调用等其他因素,响应时间达不到预期是持续困扰整个业务发展周期的棘手问题。与此同时,无论是采用物理机还是虚拟机,节点挂掉导致的不可用时有发生,如何有效容错也是亟待解决的问题。
基于这些问题,我们开发了tseer。
三.tseer架构
整个tseer的结构分为四部分:tseerserver、业务客户端(主调)、业务服务端(被调)、web管理。
·tseerserver
tseerserver是整个tseer的枢纽与核心模块。当新节点上线时,需要先通过web管理平台在tseer服务集群注册,将其网络位置信息记录在tseer系统中。当需要对节点进行下线或者其他修改时,也需要在web管理平台就行相关操作。被调节点也会定时上报心跳给tseerserver,server端会屏蔽心跳超时的节点使其无法被调用。
·业务客户端
业务客户端是需要调用其他服务的节点,称之为主调,是服务发现功能的使用者。tseer为业务客户端提供了:安装agent与api调用两种方式来从tseerserver获得需要调用的服务(被调)的地址来完成调用。
·业务服务端
业务服务端是需要被调用的节点,称之为被调,是服务的提供者。当新节点上线时,被调需要在tseerserver注册。不论同一个被调服务集群有多少个节点,注册时该服务集群都需要注册一个统一的名字。主调在调用逻辑中只需要写明需要调用的服务的名字,tseer会根据被调名字来返回被调地址。当被调需要扩容时,只需要把新节点加在该服务对应的名字下面即可。业务人员无需管理被调集群下繁多的服务节点信息,十分方便。
·web管理
业务信息及节点路由信息的增删改查都是通过web管理界面操作,简便快捷直观。甚至agent安装包都可以通过web平台更新发布。详细使用方式可参考github上tseer项目的使用文档。
四.tseer功能的特点
1.负载均衡
当同一业务集群中某些节点被频繁调用而另一些节点没有承担合理的负载时,不仅业务的服务质量和响应时间会大幅下降,同时也会造成资源的浪费。
tseer系统中,当主调发起调用时,会针对被调名字下所有可用节点为调用提供四种负载均衡方式来保障各个节点的合理负载,分别是
·轮询
·随机
·静态权重
·一致性哈希
用户还可以使用调用分组的方式来自定义负载均衡实现,调用分组会在下文中提到。
2.故障容错
为了解决节点故障导致的业务不可用与服务质量降低,tseer还提供了可靠的故障容错机制。
当主调进行一次调用之后,会将调用结果上报。如果调用失败tseer会暂时将该节点屏蔽来避免故障节点被反复调用,tseer会定时探测被屏蔽的节点,当发现故障节点恢复服务时,会重新将其激活。
对于任意被调节点,满足下列条件之一则屏蔽该节点:
1.在一个检测周期(60秒)内调用失败次数达到2次,且调用错误数占总调用次数的50%以上
2.在5秒内连续调用失败5次以上
对于被屏蔽的节点tseeragent/api将每隔30秒对已屏蔽的节点进行重试。
同时当tseer故障时,主调也能根据缓存信息继续调用。
3.调用优化
tseer为调用逻辑提供idc分组、set分组、all三种方式来解决跨地区调用等问题。
·all
为主调提供所有可用被调节点地址
·idc分组
idc分组可以近似的看作就近接入。
该方法按照两个层次进行划分。第一个是物理小组,是最小的组调度单位,即按照节点所在的机房或者区域分配统一的组名。第二个是物理小组组成的逻辑组,可以理解为按照更大的区域来划分的统一的组名。
针对idc的逻辑分组,tseer还定义了调用优先级策略。即部分逻辑组不可用时,会按照优先级策略返回可用被调节点地址列表。
·set分组
idc分组主要是在区域概念上去划分分组,实现就近访问策略,在后台服务架构中,业务规模达到一定数量时,如果要对某几个服务节点实现根据容量、灰度,分区域管理的隔离控制,idc分组是无法满足的,而set分组则是对idc分组的再细化。
set分组的命名规则为:set名.set地区.set组。其中set组是最小区分单元的名称,支持通配符*,表示set地区下的所有分组。比如0,1,2,3,4或者a,b,c,d。
set分组的调用逻辑如下:
1.主调(客户端)和被调(服务端)都启用了set分组,并且set名要一致才认为是启用同set内
2.启用set分组的主调和被调只能访问同set内的节点
3.主调启用set分组,被调没有启用set分组,则默认会走按idc分组查询的逻辑(前提是启用了idc分组)
4.两种接入方式
根据服务客户端是否在其物理机中部署tseeragent,tseer的使用方式可以分为agent和tseerapi两种方式:
·agent方式
名字路由
agent方式下,tseeragent会定期缓存被调方的信息。并根据调用方指定的负载均衡策略将被调节点信息返给调用方。如果调用方希望通过服务特性来实现负载均衡,tseer也支持按照调用方指定的分组策略将被调的组信息返给调用方。
数据上报
每次调用完成后,调用方需要调用tseerapi提供的上报接口上报调用信息,调用信息将由tseerapi即使上报至tseeragent。tseeragent将根据调用信息剔除失效被调节点。
容错使用agent方式时,如果tseeragent失效,tseerapi将会从内存中返回已访问过的节点给主调,如果tseerapi缓存失效,此时tseerapi将会从本地磁盘中的缓存文件恢复缓存信息提供给主调。需要注意的是此时tseerapi提供给主调服务的信息为有损信息,tseerapi不保证节点一定健康。
·tseerapi方式
名字路由
agent方式与tseerapi方式的区别在于是否需要在主调的宿主机中部署tseeragent。tseerapi会直接访问tseerserver。并且被调方信息缓存、负载均衡以及失效节点剔除都在tseerapi中完成。
tseerapi会定时拉取tseerserver的后端信息并屏蔽不可用的被调节点。
容错
tseerserver故障时,tseerapi会将内存中缓存的信息返回给主调。当内存缓存不可用时,tseerapi将会用本地磁盘中的缓存恢复内存缓存。
agentapi方式与tseerapi方式对比
结语
tseer是一套服务注册发现容错的方案,是对tars名字服务功能的轻量化,轻巧灵便,对业务的侵入性低。在服务发现的核心功能之上,tseer还支持多种负载均衡算法,提供可靠的故障容错策略,可有效解决业务跨地区跨机房调用等难题,极大提升服务的可用性和调用质量,是微服务框架中优秀的名字服务解决方案。