本文字数:2746

精读时间:10分钟

也可在5分钟内完成速读

作者韩亮,饿了么CI框架工具部缓存组 后端专家

在饿了么,一个应用如果要访问MySQL、Redis、MQ等基础组件,都是通过一个本地的透明代理来完成的。该代理将基础组件服务化,屏蔽了分布式环境中的集群发现、健康检查和负载均衡等细节,让应用使用起来如单机时一样简单,能够直接使用各语言现有的 SDK,无需任何改动。

01

背景

在内部最初迁移至 SOA 架构的时候,我们在应用的每台机器上部署了 HAProxy,用于代理到基础组件的流量。起初由于内部服务的数量和变更都比较少,这个方案工作的还不错;但随着服务的增多和实例频繁的变更发布,这种方案的弊端逐渐显现出来,主要是如果一个服务的实例有增加或删除,就需要更新依赖该服务的所有机器上的配置文件并重启 HAProxy 。

这些变更和重启的运维工作在当时占据了我们大量的工作时间,除此之外因为主要依赖人的手工操作,极其容易出现错误;还有每次重启会有一小段时间的服务不可用。这些问题在当时迫切地需要解决掉,不然就会影响到大家的订餐体验。

经过一番调研之后,发现有很多公司遇到同样的问题,甚至 Aribnb 和 Qubit 还开源了自己的解决方案 Synapse 和 Bamboo,这两个项目的思路比较类似,简单说是通过自动生成配置文件 + 管理 HAProxy 进程。方案简单明了,无需改造侵入 HAProxy, 开发和维护成本都可控,但每次重启进程还是会影响到服务的可用性,尤其在变更比较频繁的时候就更加明显。

我们希望能够有更好的方案,比如: 服务节点发生变更的时候,不用重启进程能立即生效,不会影响到服务的可用性。经过内部的讨论和交流,最终我们决定编写自己的面向 SOA 的 Load Balancer (这个决定在当时是非常大胆冒险的), 用于替代 HAProxy, 它就是 Samaritan, 为了简单我们在内部也称之为 Sam。

之所以用 Samaritan 命名这个项目,也是希望通过它能够把我们从繁重的运维工作中解救出来:

A charitable or helpful person (with reference to Luke 10:33). "suddenly, miraculously, a Good Samaritan leaned over and handed the cashier a dollar bill on my behalf"

https://www.lexico.com/definition/samaritan

02

介绍

Samaritan 是一个工作在客户端模式下面向 SOA 的透明代理,有着良好的性能和可用性。它被广泛应用于饿了么的生产环境,部署在每一个 container 或者 vm 上,代理了全网到基础组件的所有流量包括 Redis、MySQL 和 MQ等,当前在生产环境运行着的实例数有 5w+。

它具有如下特性:

  • 轻量,高性能

使用 Go 编写而成,有着比较高的性能,资源占用比较少,作为一个单独的进程与应用程序一起运行。

  • 支持热更新配置,无需重启

在运行时能够从远端获取代理策略和服务实例信息的实时变更,并且立即生效。这意味着配置变更无需额外的重启,也就不会有因重启导致的服务不可用。另外也大大地降低了运维的成本,使得其能够大规模部署和适应云环境成为可能。

  • 故障的自动检测、处理和恢复

Sam 会定期对服务的节点实例进行健康检查,支持 TCP、ATCP、MySQL 和 Redis 等,能够自动剔除故障节点并转移对应流量,当节点恢复后会再次加入。

  • RESTful Admin API

提供了 RESTful Admin API,支持获取运行时信息包括 config 和 stats, 调整日志等级,性能分析 pprof 等。

  • 良好的观测性

在 Sam 内部,会记录与连接和请求有关的频次、耗时和成功失败等指标并进行上报,当前支持 statsd 和 prometheus。这些指标可以帮助我们了解服务和网络的实时状况,并在需要的时候作出决策。

03

如何工作

  • Sam 订阅代理配置和服务实例的变更,并按照配置的策略在用户端对流量进行转发。

  • Sash 是一个管理服务器,提供代理配置和服务实例变更的实时推送,以及一些基础的运维工具如部署升级等。

备注:

1. Sash 是 Sam 和 Dashboard 的组合

2. Sash 只是一个管理服务器的实现,不强制绑定,如有需要可自行实现

04

演进

在早期的时候,Sam 只有四层代理即简单的流量拷贝,虽然工作地蛮好,也的的确确解决了最初我们遇到的问题,但是比较缺少有效的应用层指标,无法为业务提供更多行之有效的帮助。

另外很多人知道,在饿了么我们是使用 Redis Cluster 作为缓存的,为了兼容已有的的 Redis SDK 和应用(不支持集群协议), 我们构建了一个支持集群协议的代理 Corvus,用于将 Redis 2 的请求透明地翻译成 Redis 3 请求。

Corvus 是一个非常出色的项目,很快地在生产环境落地,也被很多其他互联网公司使用。但随着公司业务的快速发展,Corvus 在生产环境部署的实例越来越多,随之而来的机器成本和维护成本都越来越高, 迫切的需要想个办法来解决。

基于上面提到的两点,我们想既然 Sam 代理了到基础组件的所有流量,那是不是可以把 Corvus 的功能做进去,这样一方面可以节省掉 Corvus 的成本,另外一方面可以让 Sam 往七层应用层方面发展,更好地服务于业务。如果能够实现的话,整个请求的路径将变成下面的样子:

看起来是挺简单的,但改造的难度和挑战还是蛮大的,比如:

  1. 如何保证与 corvus 命令兼容,并性能相差不大?

  2. 支持了七层,会不会占用较多的资源影响到业务应用?

  3. 四层到七层,复杂度大幅度提升,如何保持项目质量与稳定?

  4. 生产环境有上千个 corvus集群,如何悄无声息地下线掉并且不影响业务?

这些展开来每个都可以单独写成一篇文章,篇幅问题这里就先不做讨论了,后面有机会的话会专门写。让人可喜的是经过团队成员的不懈努力和配合,在19年中期的时候我们就下线了全网的 corvus, 全部 Redis Cluster 的代理替换为 Sam,至此不但解决了一直上升的成本问题,也让 Sam 支持了七层代理。

05

开源

19年下半年的时候,我们团队内部讨论决定开源 Sam,主要考虑的因素如下:

  1. 回馈社区: 我们通过开源项目构建了很多内部的系统和平台,也希望能够尽自己的力量,通过 Sam 的开源来分享我们的解决方案,如果在这个过程中能够帮助其他公司和个人解决问题就更好了。

  2. 更好的发展: 当前我们虽然完成了 Redis Cluster 代理的开发,但还有很多东西可以优化,可以适配支持更多的协议如 MySQL、MQ等,希望大家可以参与进来一起完善共建。

通过一段时间内部依赖的剥离和一些地方的重新设计,项目已经开源了,地址是: https://github.com/samaritan-proxy/samaritan 欢迎大家踊跃 star、提 pr 和使用。

06

Q&A

1.有没有更详细的文档介绍?

所有的文档都可以在 https://samaritan-proxy.github.io/docs/ 找到,除了基本的介绍外还有架构、实现细节、数据指标和配置管理等, 后面我们也会随着项目的演讲及时更新。

2. 除了兼容 corvus 的命令外,有什么不一样的地方吗?

除了最基本的命令兼容外,在 sam 里面我们还实现了一些比较有意思且能够切实解决业务痛点的功能, 比如:

命令级别打点: 统计每种命令的执行时间P99、请求参数和返回结果长度等

集群级 scan: 通过普通的 scan 命令可以对整个集群进行数据扫描

透明(解)压缩: 对大 key 进行透明压缩,节省缓存空间和机器带宽占用

热 key 实时收集: 实现了 hotkey 命令,使得业务可以快速定位热点 key

3. 社区已经有了 Envoy, 为啥要自己造 Sam?

主要原因其实是那时候没有 Enovy, 后面有了后更换的 ROI 比较低,然后 Enovy 本身也有复杂度。

4. 除了开源 sam 外,后续还有其他的动作没?

后续我们会把内部的分布式缓存系统 FlexiCache (同样用 Go 开发)进行开源,并且这个已经在进行中了,这两个项目的结合是非常紧密的,到时候欢迎大家一起使用。

最后的最后,由于个人能力和经验的有限,不可避免地会有或多或少的错误,项目也不是百分百完美的,有很多可以改进优化的地方,欢迎大家一起交流共建。

聪明又努力的 Gophers,让我知道你“在看”

详解 Samaritan——饿了么最新开源的透明代理相关推荐

  1. 详解 AMBA APB 5.0 最新标准协议(1)引言

    详解 AMBA APB 5.0 最新标准协议(1)引言 引言

  2. 一文详解SLAM的主要任务和开源框架

    01 Slam概述  SLAM是Simultaneous localization and mapping缩写,意为"同步定位与建图". SLAM的典型应用领域: 机器人定位导航领 ...

  3. 百度智能云章淼:详解企业级七层负载均衡开源软件BFE

    随着云计算和云原生的发展,七层负载均衡得到了越来越多的关注,同时也出现了很多不同的解决方案.BFE是基于Go语言编写的七层负载均衡开源软件,在2020年6月被CNCF接受为"沙盒项目&quo ...

  4. 详解何恺明团队最新作品:源于Facebook AI的RegNet

    2020-06-18 14:50:24 机器之心转载 来源:计算机视觉研究院 作者:Edison_G 前段时间,何恺明组的研究者提出了一种新的网络设计范式.与以往研究不同,他们没有专注于设计单个网络实 ...

  5. 一文详解之江实验室-之江天枢人工智能开源平台

    数据驱动的智能技术是智能化浪潮的核心引擎,其关键在于大数据和高算力支撑的深度学习机制.开发并开源高性能的人工智能平台,是推动新一轮人工智能跨越发展的核心和基础. 由之江实验室联合北京一流科技.中国信通 ...

  6. html 任务控件,Html基础知识详解-DbManager-WinFrom控件库|.net开源控件库|HZHControls官网...

    一定要做的符合客户要求,不是自己认为对的. 一.基础标签 1.1 大小颜色位置 Html和CSS的关系 Hello World! 1.2 强调 如在网上商城中,某产品的打折后的价格是需要强调的.如下图 ...

  7. 详解常用的设计模式——单例模式、工厂模式、代理模式

    设计模式遵循的原则有6个: 开闭原则(Open Close Principle) 对扩展开放,对修改关闭. 里氏代换原则(Liskov Substitution Principle) 只有当衍生类可以 ...

  8. 详解js中EventListener监听器(事件委托/事件代理)

    监听器: 语法: addEventListener(event,function,userCapture) 方法 第一个参数写事件句柄,不需要加"on",直接写时间名就可以(如:c ...

  9. Zookeeper客户端Curator使用详解

    http://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 简介 Curator是Netflix公司开源的一套zookeeper客户端框 ...

最新文章

  1. PLM(产品生命周期管理)的前世今生
  2. 新职业风口已至!人社部宣布这10个职业缺口近千万!
  3. linux用户管理常用命令
  4. 如何做到免驱打印_道滘镇彩色打印机租赁公司,长安镇办公室绿植安装
  5. 28.特性trait.rs
  6. 操作系统:第四章 文件管理1 - 文件逻辑结构,物理结构,文件目录,软硬连接,文件系统
  7. MySQL报错this is incompatible with sql_mode=only_full_group_by
  8. Smart Client Software Factory 初试
  9. [译] 为什么需要在 React 类组件中为事件处理程序绑定 this
  10. Java se 基础
  11. JAVA笔试题常见坑_java笔试常见的选择题(坑你没商量)
  12. 架构设计——ID生成器
  13. 最大流 Ford-Fulkerson 算法
  14. EasyExecl导出模板,实现动态下拉列
  15. 软路由安装openwrt
  16. 最近邻搜索算法flann Marius Muja and David G. Lowe
  17. 手机b站封面提取网站_【软件分享】B站视频提取器
  18. 树莓派超详细基础开发教程
  19. vue有纵向和横向表头表格
  20. Android存储空间总结

热门文章

  1. 计算机显卡怎样安装方法,电脑装机小知识,新手如何正确安装好独立显卡
  2. 大数开根 高精度 平方根
  3. ...的Comparator和Compa
  4. zabbix纯内网环境监控服务器发送邮件报警
  5. java 电子实时看板,物理看板还是电子看板?
  6. Bootstrap 导航元素( tab导航)标签页
  7. 60岁还在写代码的程序员大师,Delphi、C#、TypeScript之父Anders Hejlsberg(安德斯·海尔斯伯格):编程符合10000小时定律
  8. 渝粤题库 国家开放大学 学前儿童艺术教育(音乐) 期末考试复习资料
  9. Verilog HDL三种描述方式
  10. OneNET麒麟座应用开发之九:与SD卡通讯并保存数据