Google B4 广域网SDN 的前世今生 - sdnlab

这篇的原文链接:https://www.sdnlab.com/22346.html

1 Google 网络架构

随着云计算的发展,Internet 从最早承载海量文本/图片/视频,演变到高清直播占据Internet 主要流量(Netfliex/AWS, Youtube/Google, Facebook Live/Facebook)。随着AR 相机 和社交VR(SocialVR)的等新应用的到来,互联网的流量还会持续高速增长。大部分的流量增长没有体现在运营商SP 的网络中,而是主要集中在OTT 网络中。 Google/Facebook/AWS/Microsoft/Apple 为代表五大 OTT 都构建了全球规模的骨干网,很多人也称之为『Private Internet』。OTT 的数据中心/WAN/PoP流量快速增长,带来OTT 网络架构的快速迭代和升级。传统的设备形态和网管工具无法适应流量和业务的快速发展。OTT 纷纷采用自研设备,引入SDN 来管理全球骨干网。

img

Google 的SDN 网络大概可以分为四个主要部分:

云平台Andromeda(仙女座)/数据中心 Jupiter(木星)/Peering Espresso SDN(意式咖啡)/DCI 互联WAN SDN(B4)

Google 的广域网实际上分为B4(DCI)数据中心互联和B2 骨干网。如下图所示。B4 作为Google全球数据中心互联采用自研交换机设备,运行纯IP 网络。B2 连接数据中心和POP 点,采用厂家路由器设备,并且运行MPLS RSVP-TE 进行流量工程调节,还没有进行SDN 改造。简单的说B2负责数据中心到用户的流量转发(Machine to User),B4 负责数据中心到数据中心的流量转发(Machine to Machine)。

B4 的流量增长率远远高于B2,容量每9 个月就要翻倍(Double),5 年时间,流量增长了100倍。没有商用单机路由器可以支持这么大容量的业务增长。所以Google 决定利用交换机芯片来自定义自己的『超级核心路由器』

img

Google 在2012 年部署全球SDN 广域网络B4,基于自研设备 Saturn(土星),2013 年8 月在香港 SIGCOMM 发表B4 SDN 控制器白皮书。《B4: Experience with a Globally-Deployed Software Defined WAN》 ,2018 年发表《B4 and After: Managing Hierarchy, Partitioning, and Asymmetry for Availability and Scale in Google Software-Defined WAN》。描述B4 的演进,更新了自研设备Stargate(星关)和层次化的TE 控制器。2012 年B4 部署在全球12 个站点,到2018 年1 月B4 站点增加到33 个。 如下图所示,红色图标中的数字,说明在位置附近有多少个站点(sites)

img

业界对于B4 的理解仅仅停留在两篇晦涩的白皮书上。本文从一个架构师的视角试图解析B4 的自研设备,网络架构,SDN 控制和部署中碰到的难题。对于Google 如何构建云计算平台GCP 请参考作者的另一篇关于混合云/多云网络的文章 云网融合的多云网络。对于 OTT 网络架构的深入理解,基本上来源于 SIGCOM 的白皮书和一些公开视频和讨论。


对计算机体系结构研究的一点认识 - 钱学海

本文是计算机学会通讯专栏的一篇文章,第 10 卷  第 6 期  2014 年 6 月。只做片段摘抄。

编者按:美国斯坦福大学最近在一份报告中分析了过去20年间出现的几乎所有的处理器,发现处理器性能提高了约1万倍。这使得像深度学习等20多年前还是遥不可及的技术,在今天强大的计算能力的支持下,释放出巨大的潜力。该报告进一步指出,在1万倍的性能提升中,半导体工艺贡献了100多倍,计算机体系结构贡献了80多倍。由于处理器在信息领域的基础性与普适性,计算机体系结构技术的进步对整个信息领域的快速发展起到了重要的推动作用。而该领域的四大国际顶级会议(ISCA,HPCA,MICRO,ASPLOS)1则是技术进步的思想源泉,几乎所有计算机体系结构领域的重大技术突破都是最早发表在这四大会议上。加州大学伯克利分校的钱学海博士是体系结构领域的新星,过去5年在四大会议上发表了7篇论文,对计算机体系结构研究有相当的理解和造诣。为此,本期专栏特邀钱学海与读者分享他对计算机体系结构研究的认识。

… …

研究心得

什么是好的研究?这可以从两个方面衡量,首先看研究的问题是否重要,其次看是否提出了有挑战性或者新颖的解决方案,若具备两者之一就是好的研究。对于什么是“重要”的问题,不同学者有不同的看法,但我们可以用一个通俗的标准来概括,即解决方案能否提高“效益”(提高性能或降低能耗)。这个标准相对简单,也得到大家认可。在第二个标准中,同行对于有挑战性的问题通常都有统一的认识,解决方案的新颖性也不难被专家发现。

谈到研究方法,最重要的是对研究问题有深刻的认识。这不仅意味着对现有工作了如指掌,知道它们的不同和不足,还需要思考它们为何会有这些差异和不足?做研究和心理分析有相似之处,一篇论文读的次数多了,往往可以从字里行间发现作者的思维方式,如果能做到这一步,就离自己做出成果不远了。

相信读者有类似的体会,在开始读论文时常常觉得复杂或者难以分辨差别,但如果有了更深层次认识,即了解了作者为什么这样想,就可以相对轻松地提出更好的方案。这里不妨做一个类比,我们可以把对一个问题的解决空间看成是一个从根节点开始的有很多分支的程序,而发表的论文看成是叶节点的集合。如果只关注表象,就只能看到不同叶节点集合之间的重叠和差异。但是如果关注本质,回溯到离根节点较近的分支,就会发现虽然同一个人写了不同的论文,但其思路大都是从一个分支出发的。而不同的人写论文往往从最初就选择不同的分支。

在理解现有工作的过程中,我们要尽量离根节点更近些,即看到论文的本质,然后从这个节点寻找不同的分支(解法)。这样做出的研究就不会过于增量(incremental)。类似的原则也应用于软件测试中,好的测试需要尽量保证覆盖靠近根节点的分支,以免造成许多测试都集中于一个子分支的叶节点(或底层节点)的情况。

读论文要涉猎广泛,不要局限于本领域,这样才能对一些问题有更深刻的认识,或发现一些其他领域的解决方法并应用在自己的研究问题上。计算机科学有很多领域,每个领域的研究方法有各自的特点。也许有些问题是类似的甚至是等价的,如果能够广泛的阅读,就可以让自己站得更高、看得更远。此外,衡量一个领域的好坏,往往可以根据有多少重要原创方法出自该领域来判断。读者可以在广泛的阅读后给出自己心中认为重要的领域。

最后,做研究一定要选择自己感兴趣的课题,这样工作才能持久并容易做出成果。

附文

HPCA

HPCA全称高性能计算架构国际研讨会(International Symposium on High-Performance Computer Architecture),是计算机体系结构的顶会之一。

ISCA

ISCA全称计算机体系结构国际研讨会(The International Symposium on Computer Architecture)是计算机体系结构新思想和新研究成果发现的重要会议。

MICRO

MICRO全称微架构国际研讨会(International Symposium on Microarchitecture),是计算机体系结构的著名会议,关注高级计算和通信系统创新微架构思想和技术,与 ISCA、HPCA 并列体系结构三大顶会。

ASPLOS

ASPLOS全称ACM International Conference on Architectural Support for Programming Languages and Operating Systems,也是体系结构的顶会之一。ASPLOS涉及的领域包括计算机体系结构和硬件、编程语言和编译器、操作系统和网络。


使用 Loki 搭建个人日志平台

背景

Loki的第一个稳定版本于2019年11月19日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。 Grafana 对 Loki 的描述如下:

Loki: like Prometheus, but for logs. Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost effective and easy to operate. It does not index the contents of the logs, but rather a set of labels for each log stream.

简单说,Loki 是专门用于聚集日志数据,重点是高可用性和可伸缩性。与竞争对手不同的是,它确实易于安装且资源效率极高。

血衫目前运维大概上百个节点,虽然系统是统一的基线版本且使用docker运行应用,平时相安无事,但变更后的问题排查仍有点心有余悸。对一个火热的日志系统elk也有浅尝辄止,奈何对于非核心应用,多耗散一份算力意味着成本增加和利润的减少,elk对于小团队来说,还是过于笨重。趁着近日的疫情无法外出,调研后将 Loki 上线了生产,可以说是完美契合了中小团队对日志平台的需求。

介绍

与其他日志聚合系统相比,Loki具有下面的一些特性:

  • 不对日志进行全文索引(vs ELK技)。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
  • 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  • 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。
  • 受 Grafana 原生支持。

Loki 由以下3个部分组成:

  • loki是主服务器,负责存储日志和处理查询。
  • promtail是代理,负责收集日志并将其发送给 loki 。
  • Grafana用于 UI 展示。

一、安装

Docker-compose.yml 可以参考Loki文档介绍,开箱即用。

version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/docker-config.yaml
    networks:
      - loki

  grafana:
    image: grafana/grafana:master
    ports:
      - "3000:3000"
    networks:
      - loki

然后直接使用 docker-compose 启动即可:

$ docker-compose up -d

二、使用

安装完成后,访问节点的 3000 端口访问 grafana,默认情况下使用(admin:admin)访问 -> 选择添加数据源:

grafana-loki-dashsource

在数据源列表中选择Loki,配置 Loki 源地址:

grafana-loki-dashsource-configgrafana-loki-dashsource-config

源地址配置http://loki:3100即可,保存。

保存完成后,切换到 grafana 左侧区域的Explore,即可进入到Loki的页面,点击Log labels就可以把当前系统采集的日志标签给显示出来,可以根据这些标签进行日志的过滤查询:

image-20200202180915479

图中显示的label是我自定义的 label,大家可以根据自己的业务需求定义自己的label。

三、配置

从上面的步骤已经可以一窥使用方法了,如果要使用起来,我们还需要了解如下信息:

Loki 的配置

Loki的详细配置,可查看官方文档:https://github.com/grafana/loki/blob/master/docs/README.md

配置相关文档: https://github.com/grafana/loki/blob/v1.3.0/docs/configuration/README.md

我目前均保留了保留默认配置。

promtail的配置

promtail 是 Loki 的官方支持的日志采集端,在需要采集日志的节点上运行采集日志,再统一发送到 Loki 进行处理。我们编写的大多是这一部分。

官方配置说明: https://github.com/grafana/loki/blob/v1.3.0/docs/clients/promtail/configuration.md

除了使用Promtail,社区还有很多采集日志的组件,比如fluentd、fluent bit等,都是比较优秀的。

这里是我的promtail配置,bj1是我的节点,在address等配置会域名解析成ip的方式。

server:
  http_listen_address: bj1
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /etc/promtail/positions.yaml
  sync_period: 10s

clients:
  - url: http://bj1:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: system
      app: system
      node: bj1
      __path__: /var/log/*log
- job_name: cron
  static_configs:
  - targets:
      - localhost
    labels:
      job: cron
      app: cron
      node: bj1
      __path__: /var/local/log/cron/*log

四、选择器

对于查询表达式的标签部分,将其包装在花括号中{},然后使用键值对的语法来选择标签,多个标签表达式用逗号分隔,比如:

{app="mysql",name="mysql-backup"}

目前支持以下标签匹配运算符:

  • =等于
  • !=不相等
  • =~正则表达式匹配
  • !~不匹配正则表达式

比如:

{name=~"mysql.+"}
{name!~"mysql.+"}

适用于Prometheus标签选择器规则同样也适用于Loki日志流选择器。

参考资料