8月11日,首届OpenStack亚太技术大会(OSAC)进入第二天。作为OpenStack社区在亚太区的 首次技术大会,地区覆盖中 国、日本和韩国,数十位国外的OpenStack核心企业及国内前沿开发者将齐 聚OSAC。此次大会由全球最大中文IT技术社区CSDN和中国 OpenStack用户组COSUG联合举办, CSDN将对大会做全程报道,进入直播专题。
在8月11日北京站第二天的活动中,分论坛的第一场是由新浪SAE存储工程师杨雨带来的主题为《Swift架构与实践》的精彩分享。他与大家分享了OpenStack中的Swift组件,第一个是Swift的原理和架构,将通过分析Swift的原理,然后一步一步介绍它的架构实践。第二个就是Swift在新浪云计算的实践。第三个就是我们在使用和部署过程中遇到的一些问题,以及一些改进的建议。
存储有文件存储,块存储还有一些其他的存储。Swift属于一个对象存储,它使用一个FPP协议,然后有一个接口。存储有三个指标,一个是高性能,一个高可靠性以及低廉的成本,Swift对象存储选择了两个指标,一个是高的可靠性和一个低廉的成本。Swift的社区目标是什么?首先是高的可靠性,高的可靠性主要有两个指标,一个是数据是一个高持久的,而且数据的存储服务是高可用的。如果数据很持久,但是服务经常宕机的话,高可用性就达不到,那么高可靠性也就不能实现。
首先谈一下高持久性,这个数据存储在机器上,磁盘上,因为磁盘是有损坏的概率,机器也有宕机的概率,怎么保证数据的持久性呢?通常的方案就是把数据做一个副本,分布在不同的机器上,当机器的副本出现了损坏或者数据不一致,就需要一个恢复的过程,就需要副本和恢复这两个机制来保证数据的持久性。然后高可用性也是一样的,数据做多个副本以后,放在不同的网络分区或者是主机上,这样就能容忍一个主机或者磁盘、网络的损坏,整个副本在不同的数据中心就能容忍IDC之间的一个故障。那么就可以实现一个高的可用性。还有一个低廉的成本,这个就是说通过使用一些普通的硬件存储来实现,避免使用一些价格很昂贵的商业存储。
然后还有一个目标就是横向扩展的能力。首先先介绍一下Swift里面的对象是如何分布到数据库上以及物理集群上的,其实一个对象分布到一个物理机上有很多的方法,可以按数据范围和数据量来分布。现在做的就是一致性hash,这个图上蓝色的结点就是一个物理主机。那么对象存储也可以hash到这个上面,hash算法可以取一个比较均匀的算法。像对象Hash完善之后就变成一个小红点,然后又顺时针被分配到物理结点上,这就是一个物理主机或者是一块磁盘。现在有这么多物理主机了,但是也不太能够保证数据分配的均匀,因为物理主机毕竟很少,有一千台,但是分配也是不均匀的,就弄了一个虚结点的概念,使用更多的虚结点来代替物理主机,然后虚结点就映射到物理主机。
至于Swift在新浪的部署情况,我们的部署方案每台机器都具有一样的部署,然后前端有一个负载均衡。但是这可能并不是一个最优的存储的部署。然后我们还做了Ring1操作系统,其他的盘做了一些存储。然后介绍一下我们怎么用Swift做的一些事?首先我们开发了一个认证模块,这个认证模块就是为了支持SAE的认证方式,然后用户通过可以访问Swift存储,然后来请求授权,哪些权限可以获得哪些资源。然后第二个工作SAE也可以使用周边的工具,比如说java,PHP等,这些SDK我们可以直接拿过来用,客户端也可以直接通过SAE的帐户体系直接使用。第三个就是一个模块,做一个SAE的控制,可以给这个对象添加一个规则,规则用户就可以按需求来定,这个可以来缓解我们的压力,用户获取以后,很长一段时间之后它的图片是不会更新的,用户根据自己的需求来设计一个规则,比如说图片要保持多久等。,还有一个存储配额的东西,我们不可能为每一个用户提供无限的存储,如果用户增长过快的话,就会对存储有一个冲击,所以要对用户存储做限制。
下面就是Swift的一些问题,第一个问题保持进程的一致性,这些进程是很低效的,这些进程的工作方式是什么呢?它会循环磁盘上所有的文件,然后循环每一个目录的后缀目录,然后把后缀目录的hash值然后又请求其他的结点,比较这个值,如果不一致,就把数据继续推进,然后把所有的记录同不同步也询问一遍,当存储量很小的时候,是看不到这个问题的,但是随着存储量越来越大,那么这个过程是很耗时的,然后带来的结果是什么?一个是整个读写变慢了,而且还有很高的占用率。然后怎么来改善呢?首先第一个方式就是通过运维的方式,平时把线上的那些复制更新进程关掉,在业务比的低峰期就可以把这个打开跟数据同步,这就保证要有监控系统,如果出现了副本不一致的情况,数据没写成功的情况,就需要探测到这个情况,把这个数据尽快地恢复到一致,这样
才能保证用户数据的安全持久。然后第二个方式就是说一种更合适的部署方案。第三个就是来保证副本一致性的协议,它是知道哪些数据是写失败了,通过
一个消息并列把这些任务分布,它们就不用再去轮询整个磁盘,来决定应该同步哪些数据,这个可能是我们后续考虑改进的方案。









