又拍云git:https://github.com/upyun
- 使用Nginx、OpenResty开发了云处理、云存储业务及平台,并使用ngx_lua作为反向代理服务。又拍云 OpenResty / Nginx 服务优化实践
- 日志服务基于ngx_lua。日志服务架构设计和实践
- 自研缓存组件 BearCache 之路自研缓存组件 BearCache 之路
- 基于 ngx_lua 的动态服务路由方案基于 ngx_lua 的动态服务路由方案
基于 ngx_lua 的动态服务路由方案
动态服务路由,就是在服务更新时不让自己的服务挂掉。服务路由主要三个方面:服务注册、服务发现、负责均衡。
服务发现方案有etc、consul、zookeeper等。又拍云选择的是consul。
负责均衡方法有nginx、lvs、ha_proxy。nginx专注于http,后续也支持了tcp。又拍云选择的是nginx。
又拍云主要遇到的问题是consul里的服务如何同步更新到nginx,在这里他们探讨了一些方案。
- Consul_template 监听consul中服务变动,去重新生成配置文件,最后执行nginx reload操作。缺点是reload性能损失,reload后进程内缓存失效。
- 内部DNS方案 域名映射多个ip地址 缺点是多了一层DNS解析以及DNS存在缓存。
- Ngx_http_dyups_module 通过HTTP接口,动态修改nginx的上游服务列表。缺点是依赖nginx本身的负载均衡算法,二次开发效率低,纯lua方案无法使用。
所以结合以上方案的优缺点,又拍云根据自身业务造了自己的轮子Slardar。
Slardar
主要是基于lua_resty_checkups模板。???这里还没看明白,要花点时间???动态修改upstream,这是一个技术点,可以深入学习下。 1)动态upstream管理 2)负载均衡 3)动态lua加载
跟 Kong 的策重点不同,Kong 是 API 网关,着重于解决通用的 API 网关逻辑,比如权限控制、日志收集、请求频率控制、访问控制等,当然也有请求的路由。比较适合作为网关使用,并且有插件机制,方便开发特殊的控制逻辑,跟业务相关性比较大一点。你需要配合数据库来完成权限控制这些操作。
而 Slardar 策重的是请求的动态路由和负载均衡,对后端服务进行健康检查,比较适合于内网的服务代理。比较轻薄,完全没有业务依赖性。
日志服务基于ngx_lua
又拍云每天产生50T左右日志,需要对这些日志文件进行处理。 首先为用户提供日志归档服务,比如用户了解自己服务商今天访问最热门的资源。
其次是提供实时、多维度的日志分析,包括问题排查,对接内部报警系统。
第三是日志离线分析功能,进行复杂数据模型计算分析。比如为用户提供各城市访问情况报表。
又拍云的日志是通过CDN的边缘节点产生的CDN边缘节点,可以了解下,服务基于ngx_lua。这些日志在边缘节点进行一定的缓冲后,通过公网上传到数据中心的日志服务代理层。日志代理层是由lvs进行四层负载均衡。这层会根据日志类型将日志进行一致性哈希,保存到不同的Kafka topic中。
日志会在kafka集群暂存,由上千个日志消费者进行消费。根据不同kafka topic将日志转换成用户所要的格式。
在日志服务中,遇到些问题。
- 上传问题-边缘节点通过公网上传失败、丢失。
- 日志消费堆积-消费赶不上生产,导致kafka队列堆积。
针对以上两个主要常见问题,又拍云给出了解决方案:
日志上传:
- CDN边缘节点使用nginx的日志发送方案lua-resty-logger-socket,将日志发送到本机的log agent服务;
- 由本机的log agent服务将日志发送到日志服务代理层。
日志消费:
- 自研Morgans系统
- 容器化
Morgans其实相当于在kafka消费者上加了一个中间层
- Input module:从kafka或其他日志源消费原始格式的日志
- Filter module:根据需求转换成目标类型的日志
- Output module:根据需求转发或暂存到目标服务
- Core module:消费者框架代码
自研缓存组件 BearCache 之路
CDN行业两个核心组件:web服务器和缓存组件。CDN就是内容分发,必然就有内容缓存,所以缓存组件在CDN行业非常重要。
又拍云web服务器是用Marco,基于OpenResty项目上实现的。
现有缓存组件:Squid和ATS。又拍云2013年前使用Squid,2013年后用ATS(Traffic Server),2017年用自研的BearCache。
Squid和ATS存在问题:
- 内存泄漏
- 连接数增长
- 不支持热升级,要定时重启
又拍云 OpenResty / Nginx 服务优化实践
又拍云在云处理、云存储业务大量使用Nginx、OpenResty,并在CDN平台中使用ngx_lua作为反向代理。
又拍云从2013年开始关注和使用OpenResty。这篇文章介绍了2017年又拍云引入了Kong,作为公司的统一入口网关,这跟上面的Slardar有没业务冲突?