OpenStack中的关系型数据库应用
OpenStack中的数据库应用主要是关系型数据库,主要使用的是MySQL数据库。当然也有一些NoSQL的应用,比如Ceilometer项目。就SQL数据库本身的应用而言,OpenStack的项目和其他项目并没有什么区别,也是采用ORM技术对数据进行增删改查而已。
本文的重点是讲解OpenStack项目中对关系型数据库的应用的基础知识,更多的是涉及ORM库的使用。对于数据库的安装和配置,需要读者自己查找一下MySQL的教程,如果只是为了验证ORM的相关知识,也可以使用sqlite数据库。
数据库的选择
OpenStack官方推荐的保存生产数据的是MySQL数据库,在devstack项目(这个项目用于快速搭建OpenStack开发环境)中也是安装了MySQL数据库。不过,因为OpenStack的项目中没有使用特定的只有在MySQL上才能用的功能,而且所采用的ORM库SQLAlchemy也支持多种数据库,所以理论上选择PostgreSQL之类的数据库来替代MySQL也是可行的。
另外,OpenStack项目在单元测试中使用的是sqlite的内存数据库,这样开发者运行单元测试的时候不需要安装和配置复杂的MySQL数据库,只要安装好sqlite3就可以了。而且,数据库是保存在内存中的,会提高单元测试的速度。
ORM的选择
什么是ORM
ORM的全称是Object-Relational Mapping,即对象关系映射,是一种利用编程语言的对象来表示关系数据库中的数据的技术,其更形式化的定义可以参考Wiki页面Orject-relational mapping。简单的说,ORM就是把数据库的一张表和编程语言中的一个对象对应起来,这样我们在编程语言中操作一个对象的时候,实际上就是在操作这张表,ORM(一般是一个库)负责把我们对一个对象的操作转换成对数据库的操作。
Python中的ORM实现
一般来说,各种主流语言都有自己的ORM实现,一般来说也不只一种,比较出名的有Java的Hibernate,Ruby on Rails的ORM,C++的ODB等。在Python中也存在多种ORM的实现,最著名的两种是Django的Model层的ORM实现,以及SQLAlchemy库。这两种ORM实现基本上是Python中ORM的事实上的标准,如果你写Django应用,那么你就用Django自带的实现;不然,你就可以选择SQLAlchemy库。
OpenStack基本上都是Python项目,所以在OpenStack中,ORM主要是使用了SQLAlchemy库(Keystone, Nova, Neutron等);不过使用了Django的Horizon项目(面板)还是使用了Django自带的ORM实现。本文主要是讲解OpenStack中如何使用SQLAlchemy库,这个也是开发OpenStack项目的最基本知识。
SQLAlchemy
SQLAlchemy简介
SQLAlchemy项目是Python中最著名的ORM实现,不仅在Python项目中也得到了广泛的应用,而且对其他语言的ORM有很大的影响。OpenStack一开始选择这个库,也是看中了它足够稳定、足够强大的特点。
SQLAlchemy项目的官网是http://www.sqlalchemy.org/,目前该项目最新的版本是1.0.11,1.0系列是今年刚发的,0.9系列应该还是应用最广泛的版本。对于一般的应用来说,0.9系列和1.0系列差别不大。
关于SQLAlchemy的学习
我个人觉得SQLAlchemy的学习难度会比Django的Model层难一些,因为一个最简单的例子也会有一些不太直观的地方,对于没用过的人来说,会比较难以理解。不过SQLAlchemy官网整理了一些比较不错的入门教程,是一个比较好的学习起点:Tutorials。另外,官方的Reference其实是一个很好的教程,讲了很多基本的概念,有助于理解SQLAlchemy的库的使用。Reference的地址是:http://docs.sqlalchemy.org/en/rel_1_0/,还可以直接下载PDF版本。我个人建议大家直接阅读Reference即可,阅读顺序就按照PDF文件的章节编排顺序进行。虽然这个文档很长,但是我最后发现这么做是最节约时间的。
SQLAlchemy的架构
先让我们来看一下SQLAlchemy这个库的总体架构,如下图(图来自官网)所示:
SQLAlchemy这个库分为两层&#