数据中心网络监控小结

  最近调研了一些关于数据中心网络监控的论文和解决方案,主要关于丢包和延时的定位排查,写点东西小结一下,越来越懒得写博客了,写的不是很详细,特别是后面几篇,也可能有理解不到位的地方,欢迎指正。 1. Pingmesh   Pingmesh是微软在2015年提出的,其架构模式在那之前已经在微软的数据中心运行了超过4年,采用商用交换机,每天收集10TB的延迟数据。它能够解决以下三个问题: 定位业务的延迟是否因为网络 提供并且跟踪当前网络服务水平(service level agreement ) 自动排除障碍   微软数据中心采用CLOS架构,如下图所示。拥有的规模如下:服务器规模在10万级别,交换机规模为万,服务器上联万兆。论文中阐述的一些统计和架构如下:时延统计采用端到端,中控系统为微软自己的Autopilot系统,采用Cosmo…

Read more

OpenDaylight中DataStore Tree Notification示例

  DataStore有三种监听事件DataChangeListener、DataTreeChangeListener和DOMDataTreeChangeListener,他们具体的区别可以参考这篇博客,本文主要介绍一下DataTreeChangeListener。DataTreeChangeListener可以用来监听整棵树或者某个子树,子树结点的改变将引发由该子节点递归到根结点整个支路结点都发生改变,原理是version号的变化,具体可以参考我之前的博客。 实验 yang文件   包含多级container的yang文件定义如下: container threshold { description "Threshold configuration"; container temperature {…

Read more

memcpy, memmove和copy/copy_if/copy_n/copy_backward的区别

  在C++中有多种方式可以进行数据拷贝,但它们实现的方式略有不同。 memcpy   memcpy原型如下,其以字节为单位,可以用来拷贝非重合区域。也就是说如果拷贝的源、目的有重合部分的话,结果是undefined,意味着可能偶尔也是对的。但最好不要这么做,原则上memcpy是一种后向拷贝机制:从区间的最后一个元素开始进行拷贝,直到第一个元素。 void* memcpy( void* dest, const void* src, std::size_t count ); memmove   memmove可以支持重合区域的拷贝,其实现可以理解为memmove用另外一块buffer缓存src数据,然后往dst拷贝。但实际上并不是这样,代码在输入时会进行判断:如果src地址小于dst地址,进行后向拷贝;反之如果src地址大于ds…

Read more

OpenDaylight DataStore分析

  网上关于DataStore内部架构和实现细节太少了,大部分都是讲如何使用DataStore,而很少有分析从client开始读写到内存到硬盘的数据流,也没有相关性能分析之类的。由于不能满足『知其所以然』的需求,我只能自己看了。然而,官方的文档真的是杂而乱,在社区问了几个问题也没有反馈……无力吐槽了。以下是我吐血看文档和源码总结的,版本为Beylium,如果有不当之处,希望各位指出。   本文首先简单讲一下MD-SAL的大体架构,然后介绍DataStore内容,包括其内存db和硬盘db。内存db也就是所谓的In-Memory-DataStore主要存储两棵树:Operational Tree和 Config Tree。硬盘db对内存db序列化后写入硬盘,包括snapshot和journal两部分,用于重启后恢复内存db。 1.MD-SAL &emsp…

Read more

NeXt UI Tutorial Supplement

  NeXt is an awesome toolkit developed by Cisco. It is an HTML5/JavaScript based toolkit for network web application which can be used to draw network topology, e.g., data center, laboratory network experiment. It has been added in OpenDaylight community which is an open source community of SDN controller.   There are some tutorials that we can follow online like Next-Tutorials…

Read more

Python json格式化输出

  输出json格式时默认没有换行,不便于查看json结果,可以采用这样进行输出:json.dumps(ret, sort_keys = True, indent = 4, separators=(',', ': ')),进行缩进和换行,方便查看结果。 参考 http://stackoverflow.com/questions/16318543/cant-pretty-print-json-from-python…

Read more

Codeforces 374 Div 2解题报告

  codeforces越打越差,我都无力吐槽了,脑子真的赶不上当年了T_T。 A. One-dimensional Japanese Crossword   题意:挨个输出连续的B的个数。   解题:暴力即可。 B. Passwords   题意:给定一堆密码,Vanya 忘记密码,需要不断尝试,尝试的规则是:长度小的先试,长度一样的顺序不定。求Vanya 最长和最短的尝试次数,尝试k次失败后需要暂停5秒。   解题:暴力即可,注意边界情况的考虑。 C. Journey   题意:给定一个有向图,给定时间约束T,每条边有个时间长度,求在给定时间内经过点的最大值。   解题:简单的爆搜题,需要剪枝的是dist[x][node_nr] != -1 &am…

Read more

How to get return code and return data from Restangular

  Use response.status to get return code when failed and use response.plain() or Restangular.stripRestangular(response) to get return clean data without any Restangular methods. Pay attention that the .plain() attribution is supported after 1.4.0 version of Restangular. Here comes the example: Restangular.all(xxx).post(cmd).then(function(response) { //console.log(response.plain()…

Read more

在OpenDaylight DLUX中添加新的模块

  本文主要介绍如何在DLUX中添加一个模块,加完后我们可以通过http://[host-ip]:8181/index.html的左边侧导航栏访问到我们的页面。添加过程需要对ODL,DLUX和一堆前端的框架比较熟悉,否则会碰到一堆问题,折腾了我好长一段时间,现记录如下,也给有同样问题的人一点帮助。   以下是我从头开始操作的过程以及遇到的问题,注意,本文不是直接安装,而是通过源码编译进行安装。 提前安装软件:grunt、npm、bower。 在github上下载controller,dlux和odlparent,切换到同一分支,然后执行mvn clean install -DskipTests进行分别编译,需要首先安装odlparent,再controller和dlux。此处,注意分支要一致。对于controller和odlparent编译错误较少,…

Read more

STL中的关联式容器

  STL中的关联容器分为set和map两大类,以及他们的衍生体multiset和multimap,这些容器均由红黑树(RB-tree)实现。另外,STL还提供了不在标准之外的关联式容器:hashtable以及以此为底层机制的hash_set,hash_map和他两的multi衍生体。   以红黑树和哈希表为底层结构构造的容器最大的不同是前者为直接排序而后者不是。 1.红黑树   我的这篇博客介绍了红黑树和AVL树的大概轮廓,具体插座和查找细节可以参考《算法导论》,此处不介绍这些细节了。红黑树是一种接近平衡的平衡二叉搜索树,拥有良好的查找、插入复杂度。   STL中的RB-tree提供了两种插入操作:insert_unique()和insert_equal(),前者表示被插入节点的key值独一无二,后者表示ke…

Read more

树状数组小结

  退役好久了,惭愧的是一直没搞过树状数组和线段树,以前都是队友搞的,最近刷codeforeces被树状数组卡了好几次,遂决定怒刷树状数组。 0.算法   本来想写写长篇的算法过程,从如何建树到如何维护更新,结果发现这篇博客写的很赞了,我也就不写了,就写写个人对算法的理解以及刷的题目吧。   树状数组的优点就在于维护了一个前序和树,算法的核心就是『前序和』,碰到的各种题目也都是将各种模型转换为前序和,然后再进行查找和插入操作。   其时间复杂度如下:查找和插入/更新都是O(log MaxVal),其中MaxVal表示树的最大下标,非常适合插入频繁的操作。以下read(x)表示查找x的前序和,update(x, p)表示更新x下标对应的数组的数值为p,以下BIT为表示树状数组的简称。   模板…

Read more

STL中的序列式容器

  在STL中,有以下几个序列式容器:array、vector、heap、priority_queue、list、slist、deque、stack、queue。其中vector、list、deque为三个标准容器(container);stack和queue是在deque上进行封装而成的,专有名词叫做配接器(adapter);array是C++内建容器,不对外使用;heap是基于vector封装的,priority_queue是基于heap封装的;slist是非标准的单向链表。 1.vector   vector是C++中的动态数组,可以动态增删,而不需要类似静态数组自己维护空间的分配,其维护的也是一个连续线性空间,支持随机存取,良好的特性使得其成为STL中最常用的容器之一。   vector中有几个需要注意的概念: vecto…

Read more

后台进程读/写控制台触发SIGTTIN/SIGTTOU信号量

  Unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发SIGTTIN(读)和SIGTTOU(写)信号量,接着,进程将会暂停(linux默认情况下),read/write将会返回错误。这个时候,shell将会发送通知给用户,提醒用户切换此进程为前台进程,以便继续执行。由后台切换至前台的方式是fg命令,前台转为后台则为CTRL+Z快捷键。   那么问题来了,如何才能在不把进程切换至前台的情况下,读写控制器不会被暂停?答案:只要忽略SIGTTIN和SIGTTOU信号量即可:signal(SIGTTOU, SIG_IGN)。   stty stop/-stop命令是用于设置收到SIGTTOU信号量后是否执行暂停,因为有些系统的默认行为不一致,比如mac是默认忽略,而linux是默认启用。stty -a可以查看当前…

Read more

Pid file和进程副本

  在守护进程(daemon)中,经常需要向/var/run/中写入pid文件:xxx.pid,该文件里的内容是xxx进程的进程号。 1.如何防止启动多个副本   为了防止启动一个进程的多个副本,需要在写的时候申请文件锁,一个进程一旦申请文件锁后,会一直锁住该pid文件,直到进程退出,这样也就达到了只启动一个副本的目的。   实例代码如下: const string LOCKFILE = "/var/run/agent.pid"; const mode_t LOCKMOD = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); int lockfile (int fd) { struct flock fl; fl.l_type = F_WRLCK; fl.l_sta…

Read more

Automake中的BUILT_SOURCES

  BUILT_SOURCES变量作用是自动化编译依赖文件。   举个例子,比如我需要编译A.c代码,而A.c代码依赖A.h和B.h、B.c,A.h是实际存在的,而B.h和B.c是需要通过调用gen二进制程序生成的,我不想每次都先执行gen生成B.h和B.c,再执行Makefile.am,而是想要集成化操作,一步到位,那么就需要用到BUILT_SOURCES了。相当于在Makefile.am里面加上下面这三行就行,其中$(EXEEXT)标识gen为可执行程序,当然,不加也可以。 BUILT_SOURCES = B.h B.c $(BUILT_SOURCES): Makefile gen$(EXEEXT)   需要注意的是,BUILT_SOURCES只支持make all,make check和make install,…

Read more

PortLand数据中心架构

  PortLand是2009年提出的一种数据中心架构模式,它解决了传统架构的几种不足,具有以下几个优点:虚机迁移IP不变且原连接正常;部署前不需要人工配置交换机;任意主机可达;无环;链路失败检测。PortLand采用的是二层架构模式,方便扩容、迁移,同时解决了二层ARP,广播等带来的问题。   下图是几个胖树拓扑(Fat tree)的例子,也是PortLand采用的拓扑。拓扑为三层拓扑,从上而下分别是核心层、汇聚层和边缘层。边缘交换机下连主机,上连汇聚层,一个主机连接一个边缘交换机。几个汇聚层交换机(文中为2个)和几个边缘交换机(文中为2个)互连组成一个Pod。每个汇聚层上连2条链路到核心层,注意一个Pod上连的核心交换机各不相同,这是为了充分负载和容错的考虑。 1.Fabric Manager   Fabric Mana…

Read more

VL2数据中心架构

  VL2数据中心架构由微软在2009年提出,它是一种新型的架构方式,使得数据中心在节约成本的同时,保证资源的灵活动态分配。它支持数据数据中心内服务器之间均匀的高容量(uniform high capacity)、不同服务带宽互相隔离(performance isolation between services)、二层环境(Ethernet layer-2 semantics)。它采用了: 扁平化地址管理,使得不同的服务可以位于数据中心内部不同的位置。 Valiant Load Balancing(VLB)的负载均衡方式。 方便扩容。   通过在小型数据中心的实验,证明了VL2的可用性。本文部分用语可能翻译不是特别恰当,我根据自己的理解进行表述。 1.传统数据中心架构的缺点   传统数据中心架构具有以下几个缺点: 数据中心…

Read more

Valiant Load-Balancing学习

  第一次接触Valiant Load-Balancing (VLB)的时候,对这个意思揣摩了半天,难道是『英勇的负载均衡』?Oh, no...后来才知道,是一个名叫Valiant推出的Load-Balancing方案。本文主要介绍了以下五点内容: 传统网络状况 VLB的算法思想 VLB的扩展,应对不同容量的链路 VLB如何应对链路断开情况 两个VLB网络之间如何连接 1.传统网络的不足   目前的网络流量很难估计和预测,充满了不确定性,这就导致了网络很容易拥塞。举个例子,比如不同数据中心流量传输,可能存在部分链路网络拥塞导致丢包,而部分链路仍然未满载(满流);也可能在平时的时候链路都未满载,而在高峰期就拥塞。所以链路的设计就不断的扩大链路的容量,以满足高峰期流量,降低丢包率,而这种方式的弊端是成本越来越高,且链路空闲导致带宽浪费。…

Read more

Switch python version and solve this problem: Fatal Python error: PyThreadState_Get: no current thread

  Switch python version in MAC-OS is a confused problem, so i use pyenv to switch python version, it works very well: vinllen@ ~$ python --version Python 2.7.11 vinllen@ ~$ pyenv global <tab> --help 2.7.10 3.4.0 system vinllen@ ~$ pyenv global 3.4.0 --help 2.7.10 3.4.0 system vinllen@ ~$ python --version Python 3.4.0   Problem occurs when i using cmak…

Read more

vxlan科普

  vxlan的出现是为了解决vlan的几个局限性:二层网络边界的限制、vlan数量不足、在多租户场景下的不适应。   vxlan定义了vtep(VXLAN Tunnel End Point--虚拟扩展本地网络隧道终结节点)的实体,vtep将虚机产生的数据封装到UDP包头内再发送出去,虚机本身的MAC地址和vlan信息在经过封装后已经不作为数据转发的依据。vtep可以是软件、硬件服务器或网络设备,其实现形式非常灵活,如果将vtep的功能直接集成到虚机Hypervisor内,则所有的虚机流量在进入交换机之前已经被打上新的vxlan标签和udp包头,相当于建立了任意两点之间的隧道。   因为虚机本身的vlan信息对外不可见,因此vxlan添加了一个新的标签VNI (VXLAN Network Identifer--虚拟扩展本地网络标识…

Read more