坚信科学,分享技术

2018全新版本,未来在blog.54chen.com更新博客!

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

Category Archives: 架构研究

大负载网站架构相关的研究记录。

cloud foundry之warden代码解读-part3

简介 cloudfoundry是vmvare推出来的开源PaaS平台,warden是其核心部分的资源管理容器,完成了各种资源分配的事情。 代码位置在: https://github.com/cloudfoundry/warden 根据part2里提到的过程,本节以create命令为例进行追踪。 调用过程: bin/warden-repl >> lib/warden/repl.rb >> Warden::Client >> warden.sock >> lib/warden/server.rb receive_request > process(request) > process_container_request(request, container) > base.rb > dispatch(request, &blk) > send(do_method, request, response, &blk) -> linux.rb > do_xxx > shell script 过程放大 一、进入repl命令行 …

Continue reading

Posted in 架构研究 | Tagged , | Leave a comment

cloud foundry之warden代码解读-part2

简介 cloudfoundry是vmvare推出来的开源PaaS平台,warden是其核心部分的资源管理容器,完成了各种资源分配的事情。 代码位置在: https://github.com/cloudfoundry/warden 代码结构 |-- em-warden-client 基于eventmachine的client 依赖 warden-client与warden-protocol 通过 unix socket来通讯 |-- warden 巨复杂的warden实现,大部分是shell脚本+ruby,还有两个c实现。 |-- warden-client 客户端驱动,提供与warden的阻塞式通讯client。依赖warden-protocol。其中的V1.rb对各自command进行解析之后的处理。这里有一个v1mode的概念, v1mode使用字符串,转为pb后与其他的一起使用protobuf。 `-- warden-protocol 依赖beefcake(protobuf library for Ruby)。protocol下有所有支持的pb生成格式。 小坑:ruby中的send方法 send其实就是动态地根据名字调用函数,传递后面的内容作为调用参数,api函数原型为: obj.send(symbol [, args...]) => obj 在V1.rb中,所能的convert_xxxx_request方法都是这样被调用到的。 专注warden实现 src下四个C程序: |-- clone 用来快速复制一个环境 夹杂一堆的shell在其中运行 …

Continue reading

Posted in 架构研究 | Tagged , | Leave a comment

cloud foundry之warden代码解读-part1

简介 cloudfoundry是vmvare推出来的开源PaaS平台,warden是其核心部分的资源管理容器,完成了各种资源分配的事情。 代码位置在: https://github.com/cloudfoundry/warden 这一部分也是我最想了解细节的地方,因为在一个paas平台中,资源的隔离才是最有价值的部分。 基础知识 rv = unshare(CLONE_NEWNS); unshare这个调用,可以把挂载的文件系统设置成只在新的挂载命名空间(mount namespace)中可见。 execvp(argv[0], argv); execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。 shopt -s nullglob 设置shell环境变量nullglob的值为on,nullglob为on时对于通配符匹配时,若匹配不到时为空(相对应的为通配符本身)。 int stat(const char *restrict pathname, struct stat *restrict buf); 提供文件名字,获取文件对应属性。 build-essential软件包 作用是提供编译程序必须软件包的列表信息,也就是说编译程序有了这个软件包,它才知道 头文件在哪,才知道库函数在哪,还会下载依赖的软件包,最后才组成一个开发环境。 工具debootstrap 可以用于在系统的某个目录中安装一套基本系统,这个基本系统除了一些配置项外,与ubuntu安装程序在安装的第一阶段安装的内容基本相同。

Continue reading

Posted in 架构研究 | Tagged , | Leave a comment

cloud foundry之dea代码解读

简介 cloudfoundry是vmvare推出来的开源PaaS平台,dea(DropletExecution Agent)是其应用运行的环境,一个DEA可以启动多个应用。 代码位置在: https://github.com/cloudfoundry/dea 这一部分也是我最想了解细节的地方,因为在一个paas平台中,资源的隔离才是最有价值的部分。 历史 初始版的dea基本不控制系统资源,然后基于cgroup搞了一个warden(真正的资源隔离是它,下节再述),程序运行容器。cf希望warden运行在多个平台上,所以没有直接使用LXC。 代码 代码入口在lib/dea.rb: EM.epoll EM.run { agent = DEA::Agent.new(config) agent.run() } EM是ruby有名的eventmachine,是一个事件驱动网络框架,从java程序员的角度,可以理解有点像mina,也可以认为有点像erlang的gen_server。 然后进到lib/dea/agent.rb: NATS.start(:uri => @nats_uri) do ... 里面注册了各种各样的收到对应消息干什么活的定义,我们来看其中几条线: 1. 收到update: NATS.subscribe('dea.update') { |msg| process_dea_update(msg) } 上一句是说收到update的指令, process_dea_update里面关键的一句: register_instance_with_router

Continue reading

Posted in 架构研究 | Tagged | Leave a comment

cloud foundry之router代码解读

简介 cloudfoundry是vmvare推出来的开源PaaS平台,router是其所有请求的入口路由,其与nginx进行配合完成各种情况情况下的转发。 代码位置在:https://github.com/cloudfoundry/router 历史 第一版的router直接通过unix sock将http request通过nginx的proxy 发到了router.rb中处理,第二版的时候,因为ruby直接处理请求性能不行,换成了lua脚本来接收请求,再由ruby程序将结果返回。 目录结构 router代码不多,共有下面的一些主要目录。 . ├── bin │ └── router (启用router server的脚本) ├── config │ ├── router2.yml │ └── router.yml (配置文件,指定了服务的端口和消息队列pid等) ├── ext │ └── nginx │ ├── tablesave.lua │ └── uls.lua (这两个lua脚本供nginx conf使用,实现用户第一次访问时生成一个cookies,lua让其去同一个地方) …

Continue reading

Posted in 架构研究 | Tagged | Leave a comment

cloud foundry之cloud_controller代码解读

简介 cloudfoundry是vmvare推出来的开源PaaS平台,cloud_controller是其管理界面的http rest api入口。 补课 rails Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,Rails 为你提供一个纯Ruby的开发环境。 习惯约定大于配置: model类位置app/models/xxx.rb controller位置app/controllers/xxx_controller.rc help位置app/helpers/xxx_helpers.rb view位置app/views/xxx 对应布局app/views/layouts/xxx.rhtml xxx.rxml 开始cloud_controller https://github.com/cloudfoundry/cloud_controller 里面有两个项目,一个是cloud controller另一个是health_manager,今天要研究的是前者,下节说后者。 入口 bin/cloud_controller -> config/boot.rb cloud_controller必需要求ruby1.9以上,因为其中有一个fiber需要ruby支持(传说中的Coroutine)。 如果没有配置 cloud_controller使用nginx,则会启用Thin去启动Rack。(Thin是ruby内置的network server,Rack: a Ruby Webserver Interface) a

Continue reading

Posted in 架构研究 | Tagged , | Leave a comment

cloud foundry之vmc代码解读

简介 cloudfoundry是vmvare推出来的开源PaaS平台,vmc全称是The VMware Cloud CLI,是vmware的应用平台命令行接口。 ubuntu安装vmc sudo gem install vmc 常见的用法 vmc target api.paas.n.xiaomi.net vmc add-user vmc login vmc push vmc其实是使用ruby来实现的一整套的cli命令转化为http restful请求的对应工具。 其代码位于:https://github.com/cloudfoundry/vmc git clone回来代码之后,下面对代码进行半瓶水解析法解析。 入口 bin/vmc 引用了 $github/vmc/lib/cli 直接运行VMC::Cli::Runner.run 位于:lib/cli/runner.rb 看上去run会被执行。 进入到parse_command!方法中 以push为例: when 'push' usage('vmc push [appname] [--path …

Continue reading

Posted in 架构研究 | Tagged , | Leave a comment

senseidb使用手记

下载 https://github.com/downloads/linkedin/sensei/sensei-1.0.0-release.tar.gz 这个版本是2012年1月份发布的,如果您看到此文时时间太久,请到他们的官方网站去寻找:http://senseidb.com 下载kafka kafka:由linkedin开源的高吞吐量的消息系统。 http://people.apache.org/~nehanarkhede/kafka-0.7.0-incubating/kafka-0.7.0-incubating-src.tar.gz 下载中文分词包IKAnalyzer http://code.google.com/p/ik-analyzer/downloads/list 编译sensei tar zxvf sensei-1.0.0-release.tar.gz cd sensei-trunk ./bin/build.sh 或者 mvn package 要是没有maven客户端,需要自行安装(ubuntu下直接apt-get install maven) 编译kafka tar zxvf kafka-0.7.0-incubating-src.tar.gz cd kafka-0.7.0-incubating-src/ ./sbt update pacakge 编译IKA 新建一个jar包,里面只有一个类,内容如下: public class IKAnalyzerFactory implements SenseiPluginFac

Continue reading

Posted in 架构研究 | Tagged | Leave a comment

分布式实时搜索方案介绍-senseidb

名词解释 zoie:由linkedin开源的建立在lucene之上提供实时索引的系统。它利用两 个内存索引一个硬盘索引来实现实时搜索。 bobo-browse:由linkedin开源的基于lucene的分类浏览搜索系统。 zookeeper:一个分布式的,开放源码的分布式应用程序协调服务,常用来做配置服务。 senseidb:开源,分布式,实时,半结构化的数据库(官方网站上如是说)。实际上是一个将zoie、bobo-browse、zookeeper整合起来,提供各种方便的使用办法的一个项目。项目目标是达到简单易用的分布式实时搜索系统。 kafka:由linkedin开源的高吞吐量的消息系统。 norbert:norbert是一个提供分布式集群服务的开发框架,具备集群管理功能,对开发简单的通信架构,易扩展能承受高吞吐量的框架。scala实现,java无缝使用。其原理是:netty+zookeeper+pb。 IKAnalyzer:中文分词较好用的一个。 lucene:这个不用说了。 使用senseidb 1.解决中文分词问题 senseidb支持在配置上进行自定义analyzer。 要做的事情就是,建立一个jar包,里面只要一个类即可,依赖IKA的包。代码如下: public class IKAnalyzerFactory implements SenseiPluginFactory<IKAnalyzer> {       @Override&nb

Continue reading

Posted in 架构研究 | Tagged , | 2 Comments

linkedin高吞吐量分布式消息系统kafka使用手记

kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。 高吞吐量:即使是非常普通的硬件kafka也可以支持每秒数十万的消息。 支持通过kafka服务器和消费机集群来分区消息。 支持Hadoop并行数据加载。 设计侧重高吞吐量,用于好友动态,相关性统计,排行统计,访问频率控制,批处理等系统。大部分的消息中间件能够处理实时性要求高的消息/数据,但是对于队列中大量未处理的消息/数据在持久性方面比较弱。 kakfa的consumer使用拉的方式工作。 安装kafka 下载:http://people.apache.org/~nehanarkhede/kafka-0.7.0-incubating/kafka-0.7.0-incubating-src.tar.gz > tar xzf kafka-.tgz > cd kafka- > ./sbt update > ./sbt package 启动zkserver: bin/zookeeper-server-start.sh config/zookeeper.properties 启动server: bin/kafka-server-start.sh config/server.properties 就是这么简单。 使用kafka import java.util.Arrays;   import java.util.List;   import&nbsp

Continue reading

Posted in 架构研究 | Tagged | 9 Comments
Page 2 of 712345...Last »