Nova quota新方案和shadow表的用途




shadow表的用途

今天本来是在看sqlalchemy的用法(过两天会整理下写一篇文章),刚看完相关教程和部分官方文档,想看一下nova里面怎么用的,看到了nova db这部分的逻辑,偶然想到了nova数据库里面有很多shadow开头的表,比如shadow_instances、shadow_instance_system_metadata等等,基本所有正常使用的表都有一个shadow表对应,就网上找了找这些表的用途,发现了一个官方文档介绍nova-manage命令:https://docs.openstack.org/nova/pike/cli/nova-manage.html,里面提到了一个nova-manage db archive_deleted_rows ,可以把已经标记为删除的记录,移动到shadow表里面,所以shadow表的用途应该就是archives,用来归档数据的(bp在这里),比如云主机已经删除了很久,与该云主机相关的数据库记录如果一直保存在nova使用的表里面,就会影响数据库操作性能,而用这个命令归档后,就可以彻底从使用的表里面清理掉,而又不会导致后续想查询记录的时候找不到,但是网上又搜到一个bp,貌似想干掉这些shadow表,说是实际生产环境没人这么玩。看了master分支代码,创建shadow表的方法还在(nova.db.sqlalchemy.utils.create_shadow_table),并且bp还处于drafting状态,应该还没动手干掉。

Nova quota新方案

继续回到quota新方案,看nova-manage命令行的时候,看到两个quota相关的命令都被废弃了:nova-manage quota refresh nova-manage project quota_usage_refresh <project_id> [–user <user_id>] [–key <key>] ,原因是“This command has been deprecated and is now a no-op since quota usage is counted from resources instead of being tracked separately.”。看起来是改了方案了,不再单独统计配额使用量,于是赶紧看了下master分支代码,果然已经都改了,改成了直接从instances表里面统计cores、ram、instances的使用量,而不是在创建、删除、修改规格时都reserve、commit到quota_usages表里面,这正是我很早之前就疑惑的地方,明明可以直接统计数据库为啥还要单独维护一张表?而且neutron项目里面已经这么做了,只不过没有提供查询配额使用量接口而已。现在检查配额也是直接统计instances表或者其他资源的表即可,再也不担心各种异常情况下导致的资源配额使用量统计不准确的各种问题了(之前我们用H版本的时候,是打开了max_age和until_refresh两个选项,强制定期同步配额使用量,同步配额使用量就是查一遍资源记录表,统计一次更新到quota_usages表,既然如此,何必绕一圈到单独的表,而不是直接统计资源记录表?感觉有点多此一举了)。

这是新方案的其中一个commit:https://review.openstack.org/#/c/416521/

相关的bp是:

看bp描述,这个改动是为了更好的支持cell集群才做的,不过也算是给nova配额管理模块做了大贡献了,可以看出改成这种方案之后,配额相关操作就简单了很多,不用在nova/compute/api.py里面reserve资源,在nova/compute/manager.py里面commit或者rollback资源使用量了,完全不需要这部分流程了,创建成功写入instances表就算资源用了一份,检查配额使用量的时候根据project_id sum一下instances表就好了,多简单清晰,再也不怕统计不准了。看下commit的diff就明白了:https://review.openstack.org/#/c/416521/63/nova/compute/api.py

提醒下,新方案是Pike版本merge的。