AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

一个人的DevOps-ffme的从0到1 by yinhm

发布者 devops
发布于 1437883175715  浏览 6229 关键词 开源, DevOps 
分享到

第1页

一个人的DevOps

ffme的从0到1



第2页

关于我

● Golang, Python, Ruby, PHP ● Linux服务器管理 > 10年 ● 私募基金经理,程序化交易系统,

Research平台 ● @yinhm ● https://github.com/yinhm



第3页

演讲内容

● 是运维 Operations ● 更是开发 Development ● 是ffme从 0 到 1 的故事 ● 是一个人的 DevOps ● 是一群人的寂寞……



第5页

ffme背景

● FriendFeed关站还有一个月…… ● 我是最后一小撮死守的用户之一 ● A FriendFeed Clone ● 开源: https://github.com/yinhm/friendfeed ● 着手迁移到关站只有4个星期不到 ● 一个人的Dev



第6页

二十天上线



第7页

不可能的任务?



第8页

怎么破

● 尽快上线,持续更新 ● 用够敏捷的语言 ● 借力各种开源库 ● 云服务器,云存储 ● 一开始就面向服务



第9页

Dev不停 Ops不止



第10页

可一天十次……部署



第11页

一个人的开发 Dev



第12页

Go



第13页

为什么是Golang

● 开发简单!

o 利器,够工程化 o 第三方库充足:db, rpc, protobuf, cloud(storage)

● 部署简单!

o 单个文件(Single binary) o go-bindata打包各种资源文件

● 性能够用! ● 唯快不破!



第14页

Rocksdb数据库

● 内嵌 k-v 数据库 ● 演化自 leveldb,特性更丰满 ● 速度非常快 ● RAM is the new disk! ● 大内存,SSD优化 ● 磁盘空间占用合理(1/10 mongodb?) ● Facebook 出品 ● 内嵌带来的部署优势



第15页

RPC

● Google的gRPC库 ● 基于 http/2,Bidirectional Streaming ● 可能是最好的RPC库 ● Proto Buffer作为程序接口定义语言 ● 数据直接protobuf3序列化存储到 RocksDB ● 纯 Go 实现grpc-go,具有部署上优势



第16页

服务化

● 一开始就服务化:server, client, webserver ● Cloud有的自己就不要做:gcs(S3/七牛) ● 浑然天成:

o 数据同步自FriendFeed接口 o 同IP连接过多会被ban掉 o 同步采集数据的client必须分布到多台机器

● 部署上难度实际是增加了 ● 好处是可以分开独立部署



第17页

一个人的部署Ops



第18页

一个人的部署Ops

● 尽量减小部署压力,专注开发 ● 代码托管到 Github ● 开始就考虑部署:操作系统、开发环境、语

言选择、存储、框架 ● 借力云:Google Cloud Engine、Storage ● 一个人就用 Fabric,自动化部署利器 ● 快速迭代,一天十次部署



第19页

服务器和开发机环境一致

No time for mistakes



第20页

Fabric自动化部署

No time for mistakes



第21页

Fabric

● 部署就是写 Python 代码,No magic ● 内建支持:ssh, env, sudo ● 服务器构建过程管理起来:

o fab production bootstrap

● 服务器配置文件管理起来:如nginx配置 ● 项目配置文件管理起来:

o fab production deploy o upstart scripts o 甚至是 crontab

● 幂等



第22页

fabric task example

@task def bootstrap():

sudo("apt-get update") sudo("apt-get -y install git-core") sudo("apt-get -y install tmux")

$fab production bootstrap



第23页

fabric task example

@task def deploy():

... upload_template(template, '/etc/init/ffme.conf',

context=context, backup=False, use_sudo=True)

if not exists(code_root): run('git clone %s %s' % (env.repository, code_root))

... sudo("start ffme")

$fab production deploy



第24页

未来?

● 借助云:构造统一 Image ● 通过docker统一环境 ● 监控还没有 ● ffme项目用了很新很酷的技术:

Go/RocksDB/gRPC/protobuf3/React ● 欢迎一起完善: github.com/yinhm/friendfeed



第25页

Thanks & QA



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。