DAE系统的设计


DAE PyCon China 2013 About Me • 洪强宁 / hongqn • 2002年开始接触 Python • 2004年开始完全使⽤ Python⼯ 作 • 2006年加⼊⾖瓣,现任⾸席架 构师 • www.douban.com/people/ hongqn/ • hongqn@douban.com 议程 • DAE是什么 • 为什么要开发 DAE • DAE的架构 • DAE的特点 • DAE的未来 DAE是什么 Douban Adorable Engineers Douban Adorable Engineers Douban App Engine Douban Adorable Engineers Douban App Engine PaaS Platform as a Service (PaaS) PaaS PaaS Private PaaS Private Python Current State 427 apps 427 apps 126 对外应⽤ bubbler.labs.douban.com m.douban.com douban.fm movie.douban.com group.douban.com code up 花名册 精灵宝钻 …等等 每天处理 2.4 亿动态请求 5K 峰值 qps on 32 nodes 为什么要开发 DAE 代码拆分 代码拆分 1 big svn repo (17万提交 ) 代码拆分 1 big svn repo (17万提交 ) 4602 git repo (2881 fork) 重⽤基础设施 Proj A Proj B Proj C Proj D MySQL, BeansDB, Memcache, MQ … 简化新项⺫启动 $ dae create $ dae serve $ dae deploy 最佳实践对 每个 app开箱即⽤ 最佳实践对 每个 app开箱即⽤ 持续集成 最佳实践对 每个 app开箱即⽤ 持续集成 分级上线 最佳实践对 每个 app开箱即⽤ 持续集成 分级上线 状态收集 最佳实践对 每个 app开箱即⽤ 持续集成 分级上线 状态收集 故障报告 Scale SA Scale SA 4 DAE的架构 基础公共服务 运⾏环境 路由系统 依赖 管理 部署系统 资源管理 系统 app.yaml pip-req.txt $ dae install flask pip-req.txt $ dae install flask PyPI 镜像 pypi.douban.com pip-req.txt $ dae install flask Instance Instance • web Instance • web • gunicorn Instance • web • gunicorn • service Instance • web • gunicorn • service • gunicorn + customized worker Instance • web • gunicorn • service • gunicorn + customized worker • daemon Instance • web • gunicorn • service • gunicorn + customized worker • daemon • zookeeper 预定义 handler • 预定义 URL • 预定义 query parameter • 预定义 message queue 两级结构 Load Balancer (nginx) Gateway (nginx) App (gunicorn) App Starter unix socket fallback startNode 1 Gateway (nginx) App (gunicorn) App Starter Node 2 基础服务 API • mysql • memcache • doubandb, doubanfs • moosefs • beanstalkd • cdn • statsd + graphite • mail • elastic search • irc waylife 监控 API调⽤ 部署 部署界⾯ 部署服务 控制命令 部署进度 节点 Load Balancer 节点 (via websocket) ⽣成配置 更新路由 节点 应⽤⾃检 更新代码 重启应⽤ DAE升级 dev集群 (master branch) beta集群 (beta branch) stable集群 (release branch) 测试应⽤ 对内应⽤ 对外应⽤ 持续集成 DAE的特点 Low Overhead Low Overhead • 资源分配 — 进程 Low Overhead • 资源分配 — 进程 • 资源隔离 — UNIX帐号 Low Overhead • 资源分配 — 进程 • 资源隔离 — UNIX帐号 • 资源限制 — 外部监控 Customizable Customizable • 每个应⽤从模板⽣成 nginx配置 Customizable • 每个应⽤从模板⽣成 nginx配置 • 使⽤ hook point 定制 Customizable • 每个应⽤从模板⽣成 nginx配置 • 使⽤ hook point 定制 • 或者只使⽤⽣成的 nginx 配置⽚段 ⾃依赖 ⾃依赖 • 通过⼀个应⽤部署应⽤ ⾃依赖 • 通过⼀个应⽤部署应⽤ • 通过⼀个应⽤管理应⽤ ⾃依赖 • 通过⼀个应⽤部署应⽤ • 通过⼀个应⽤管理应⽤ • ⼀个应⽤ scale 所有应⽤ ⾃依赖 • 通过⼀个应⽤部署应⽤ • 通过⼀个应⽤管理应⽤ • ⼀个应⽤ scale 所有应⽤ • ⼀个应⽤ serve 跨应⽤的静态⽂件 ⾃依赖 • 通过⼀个应⽤部署应⽤ • 通过⼀个应⽤管理应⽤ • ⼀个应⽤ scale 所有应⽤ • ⼀个应⽤ serve 跨应⽤的静态⽂件 • DAE 的代码托管在⼀个 DAE 应⽤上 gevent gevent • 默认启⽤ gevent • 默认启⽤ • ⽀持⻓连接,如 websocket gevent • 默认启⽤ • ⽀持⻓连接,如 websocket • 节省内存 gevent • 默认启⽤ • ⽀持⻓连接,如 websocket • 节省内存 • 很多坑 gevent • 默认启⽤ • ⽀持⻓连接,如 websocket • 节省内存 • 很多坑 greenify 已开源 github.com/douban/greenify gevent • 默认启⽤ • ⽀持⻓连接,如 websocket • 节省内存 • 很多坑 Service 是⼀等公民 Service 是⼀等公民 • Thrift Service 是⼀等公民 • Thrift • 在线客户端⽣成 Service 是⼀等公民 • Thrift • 在线客户端⽣成 • 依赖注册 Service 是⼀等公民 • Thrift • 在线客户端⽣成 • 依赖注册 • 升级通知 Service 是⼀等公民 • Thrift • 在线客户端⽣成 • 依赖注册 • 升级通知 thriftclient 即将开源 Service 是⼀等公民 • Thrift • 在线客户端⽣成 • 依赖注册 • 升级通知 收集⼤量状态数据 内置最佳实践 内置最佳实践 • 错误收集 - sentry 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 • 打包发布 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 • 打包发布 • 分级上线 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 • 打包发布 • 分级上线 • 服务地址实时推送 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 • 打包发布 • 分级上线 • 服务地址实时推送 cfgpusher 即将开源 内置最佳实践 • 错误收集 - sentry • 在线 profile ⼯具 • 预发布环境 • 持续集成 • Code集成 • 打包发布 • 分级上线 • 服务地址实时推送 不受限的 Python环境 不受限的 Python环境 • 可⽤ C扩展 不受限的 Python环境 • 可⽤ C扩展 • 可⽤ fork, subprocess, multiprocessing… 不受限的 Python环境 • 可⽤ C扩展 • 可⽤ fork, subprocess, multiprocessing… 曹娥已开源 github.com/douban/CaoE 不受限的 Python环境 • 可⽤ C扩展 • 可⽤ fork, subprocess, multiprocessing… DAE的未来 ⾖瓣所有应⽤的平台 cgroups 离线⼤数据计算 更好的 service 体系 跨 IDC QoS 公有云服务? 开源? 开源 ! 开源 ! 谢谢!
还剩119页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

longyang

贡献于2013-12-15

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf