openstack nova 基础知识——Quota(配额管理)
很久没有写博客了,之前在学校的一段时间比较堕落,坐着火车从南到北,穿越长江黄河,来到了一片新的天地。在这里,不管男的女的,老的少的,在吃饭,在路上,我听到的不再是“游戏”这个永久不变的话题,更多的是在讨论“内核”、“高效”、“这段代码”、“这个算法”等等这些技术性的话题。我的想法是对的,我的选择是对的,很喜欢现在的环境,在这样的环境里,会让我成长更快。
正文:
一、什么是配额(quota)管理
简单的讲就是控制用户资源的数量。在openstack里,管理员为每一个工程(project)分配的资源都是有一定限制的,这些资源包括实例(instance)、cpu、内存、存储空间等等,不能让一个工程无限制的使用资源,所以配额管理针对的单位是工程(project)。先来个感性的认识,看一下dashboard里的一个工程的overview:
管理员给这个工程的资源配额是最多创建10个实例,最多使用20个vcpu,最多使用5G的内存==,只要达到某一个资源的使用上限,就会出现异常,这就是配额管理。
二、如何实现
nova里配额管理是在~/nova/quota.py中实现的,首先来看一下这个模块的静态类图:
使用时是直接调用QuotaEngine类中的方法,而真正实现功能的是DbQuotaDriver这个类,在DbQuotaDriver类中比较重要的是reserve(), commit(), rollback()这三个方法,这三个方法共同构成了配额管理一个很重要的特性:事务性,这里所说的事务性,就是当资源分配失败或者已达到配额上限等这些异常情况发生时,对已经修改过的数据库,回滚到分配之前的状态,如果不设置成这种特性,那配额管理就乱套了。
资源在配额管理中封装成了一个简单的类体系,资源被分为三类:ReservableResource, AbsoulteResource, CountableResource,至于这三种分类的区别,我现在还不是很清楚,在nova中,是这样来分类的:
$ free -m total used free shared buffers cachedMem: 1974 1824 150 0 20 404-/+ buffers/cache: 1400 574Swap: 2382 355 2027
五、问题
写blog之前本来有很多疑问的,但是在写的过程中思考,竟然把一些疑问想明白了,但是还是有一些:
1. quotas和quota_classes表为空,我想这可能是因为没有配置的原因吧,因为程序中如果没有从这两个表中得到配额(hard_limit),那么就使用默认的值,所以我的测试里这两个表为空,但是程序正常执行,是因为使用了默认的值。
2. 关于那几个资源分类的,为什么要那样分,他们之间有什么区别,我还不明白。
3. dashboard界面的问题,它的quota界面的限额值是写死了的,还是会根据配置的值来变化,这个我还没有验证过。
4. 关于expire的,我看程序中参数的传递,expire始终为空,但是不知道怎么回事,到数据库中就变成有值的了,而且这个值很奇怪,即使删除了实例,它还是有,为什么呢?
5. 关于quota_usages表中的reserved值,它究竟是干什么用的呢?它的值,在一个事务之外,始终是为0,不为0的情况只在一个事务当中,这种情况只有调试才会看到,难道它就是只起一个回滚的作用?
6. quota_classes表不知道是用来做什么的,难道用一个quotas表还不够吗?难道说这个表保存的是每个资源的整体情况?
7. 还有就是一些资源不知道是什么资源,比如injected_file
六、想法
1. 实习第一天,经理跟我说是要吃苦的,有1/4的人都没坚持下去,走了,唉,当时压力也还挺大的,甚至怀疑起自己的能力,我到底行不行啊?但是每每当我看起代码时,就会有一种莫名的自信,代码也是人写的,我能把握住它。至于吃苦,我不认为学习是一种吃苦,学习就好像吃馒头一样,不动嘴嚼两下,怎么知道它的甜呢?
2. 公司的牛人真的很多,我要好好向他们学习。
3. 云计算,这是我选择的路,这也是我的梦想,也是我实现自己价值的地方,我会坚持下去的。
七、我的不足
1. 首要的不足,效率太低,一个知识点,要弄很久才能搞清楚,要提高效率啊。
2. 还不会openstack的调试,不会调试,不能深刻理解。
===============================over====================================